搜索体验改进尝试

WebSecurity
• 阅读 2460

包含工具:git,ag,bash,vim

增强版 git grep

  • --no-index --exclude-standard 支持搜索未加入版本控制但是忽略 gitignore 的文件

  • 通过 sed awk 的处理让 git grep 支持显示列,后面会需要

#! /bin/bash
git --no-pager grep --no-color --no-index --exclude-standard -n $1 | while read git_grep; do

  file_and_line=$(echo "$git_grep" | cut -d : -f 1,2)
  match=$(echo "$git_grep" | sed 's/[^:]*:[^:]*:\(.*\)/\1/')
  column=$(echo "$match" | awk "{print index(\$0, \"$1\")}")

  echo "$file_and_line:$column:$match"
done

保存为 grepprg

让 vim 使用 grepprg 做 grep

    set grepprg=grepprg\ $*
    set grepformat=%f:%l:%c:%m

让 vim 使用 ag 做 grep

    set grepprg=ag\ --vimgrep\ $*
    set grepformat=%f:%l:%c:%m

通过映射命令灵活切换 ag 和 grep

nnoremap <leader>ag :call <SID>SwitchGrepCmd()<cr>
let g:g:grep_using_git = 0
function! s:SwitchGrepCmd()
  if g:grep_using_git
    set grepprg=ag\ --vimgrep\ $*
    let g:grep_using_git = 0
    echohl Identifier | echon 'grep by ag' | echohl None
  else
    set grepprg=grepprg\ $*
    let g:grep_using_git = 1
    echohl Identifier | echon 'grep by git' | echohl None
  endif
endfunction

添加快捷命令搜索完成时自动弹出 quickfix 列表

用自定义 Ag 命令执行 vim grep

command! -nargs=+ -bar -complete=file Ag silent! grep! <args>|cwindow|redraw!

自定义操作命令快速搜索

可以减少搜索所需输入

vnoremap <leader>g :<C-u>call <SID>GrepFromSelected(visualmode())<cr>
nnoremap <leader>g :<C-u>set operatorfunc=<SID>GrepFromSelected<cr>g@

function! s:GrepFromSelected(type)
  let saved_unnamed_register = @@
  if a:type ==# 'v'
    normal! `<v`>y
    let g:grep_word = @@
  elseif a:type ==# 'char'
    normal! `[v`]y
    let g:grep_word = '\b' . @@ . '\b'
  else
    return
  endif
  silent execute "Ag '" . g:grep_word ."'"
  let @@ = saved_unnamed_register
endfunction
  • <leader>giw 可搜索光标下单词

  • v***<leader>g 可搜索选中字符串

使用 Unite 控制 quickfix 列表

首先需要安装 unite-location 插件

修改自定义 Ag 命令为:

command! -nargs=+ -bar -complete=file Ag silent! grep! <args>|execute "Unite -buffer-name=quickfix quickfix"

让 Unite 的 quickfix 列表选中后不要退出

call unite#custom#profile('quickfix', 'context', {
  \  'no_quit': 1
  \ })

添加映射快速控制 Unite 列表

function! s:ToggleUnite()
  for i in range(1, winnr('$'))
    let name = bufname(winbufnr(i))
    if match(name, '^\[unite\]') == 0
      UniteClose
      return
    endif
  endfor
  UniteResume
endfunction

" <space>u 显示/关闭列表
nmap <silent> <space>u :call <SID>ToggleUnite()<cr>

" [count]<space>j/[count]<space>k  在上/下 count(默认为 1) 个列表项上执行默认操作,对于 quickfix 来说就是跳转
nmap <space>j :<C-u>call <SID>Jump(v:count1, 'Next')<cr>
nmap <space>k :<C-u>call <SID>Jump(v:count1, 'Previous')<cr>

function! s:Jump(count, dir)
  execute a:count . 'Unite' . a:dir
endfunction

简单些可以直接配置 unite 的 grep 使用 ag 命令,我放弃那种用法是因为不想再为它做单独的搜索设置,另外vim-qargs 这样的插件来对搜索结果做快速替换等操作。

点赞
收藏
评论区
推荐文章
Wesley13 Wesley13
3年前
.gitignore被Git忽略
问题:_My.gitignorefileseemstobebeingignoredbyGitcouldthe.gitignorefilebecorrupt?_我的.gitignore文件似乎已被Git忽略.gitignore文件是否已损坏?_Whichfileformat,loc
Wesley13 Wesley13
3年前
FLV文件格式
1.        FLV文件对齐方式FLV文件以大端对齐方式存放多字节整型。如存放数字无符号16位的数字300(0x012C),那么在FLV文件中存放的顺序是:|0x01|0x2C|。如果是无符号32位数字300(0x0000012C),那么在FLV文件中的存放顺序是:|0x00|0x00|0x00|0x01|0x2C。2.  
Stella981 Stella981
3年前
Git 对已经加入版本控制的文件,修改后希望不被提交办法
问题举例:假设网站有一个数据库配置文件db.php,通过git做版本控制,已经将这个文件提交到git库中。但是本地的数据库配置是读取的本地数据库,所以希望这个db.php文件在每次提交代码的时候不被提交。说明:通过.gitignore是无法办到的,因为db.php已经加入版本控制了解决办法:复制代码执行命令将db.php加入不提交队列
Stella981 Stella981
3年前
Git忽略文件 gitignore
1.安装Git后,在项目文件夹内右击,选择'GitBashHere',如下图!(https://static.oschina.net/uploads/img/201709/29002350_ZhCr.png)2.输入vim.gitignore回车!(https://static.oschina
Stella981 Stella981
3年前
Git 忽略一些文件不加入版本控制
在git中如果想忽略掉某个文件,不让这个文件提交到版本库中,可以使用修改.gitignore文件的方法。这个文件每一行保存了一个匹配的规则例如:\此为注释–将被Git忽略\.a      忽略所有.a结尾的文件           !lib.a   但lib.a除外           /T
Stella981 Stella981
3年前
Git gitignore文件忽略规则以及不生效解决方案
在git中如果想忽略掉某个文件,不让这个文件提交到版本库中,可以使用修改根目录中.gitignore文件的方法(如无,则需自己手工建立此文件)。这个文件每一行保存了一个匹配的规则例如:1234567此为注释–将被Git忽略.a忽略所有.a结尾的文件!lib.a但li
Stella981 Stella981
3年前
Git 版本控制管理(一)
  Git是一个分布式版本控制工具,它的作者 LinusTorvalds 是这样给我们介绍Git —— Thestupidcontenttracker(傻瓜式的内容跟踪器)关于Git的产生背景在此不做讲解,有兴趣的可以搜索一下。先介绍一下Git的特点,主要有两大特点:版本控制:可以解决多人同时开发的代码问题,也可以解决找
Wesley13 Wesley13
3年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
子桓 子桓
1年前
多功能文件搜索软件 HoudahSpot补丁中文版
HoudahSpot是一款针对Mac系统的高级文件搜索工具。它能够提供强大且灵活的搜索功能,帮助用户快速、准确地找到他们需要的文件。HoudahSpot的主要特点包括:强大的搜索功能:HoudahSpot能够在整个Mac系统中进行全文搜索,并支持各种高级搜
赵融 赵融
1年前
InDesign 2024 for Mac(ID 2024)v19.0中英文已发布,最新介绍
ID2024是一款功能强大的页面设计和排版软件,具有丰富的工具和功能,适用于各种出版需求。它提供了高级的排版和布局工具,支持快速创建和调整页面布局,以及精确的文字处理和段落样式控制。新版本还引入了字体管理的改进、变量字体的支持和云端文档的同步和共享功能。此
美凌格栋栋酱 美凌格栋栋酱
5个月前
Oracle 分组与拼接字符串同时使用
SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(