And*_*Ray 2 vim keyboard-shortcuts ack
我有一个映射,我可以(leader)av使用Ack.vim为我的视觉选择选择文本和输入ack :
" Visual ack, used to ack for highlighted text
function! s:VAck()
let old = @"
norm! gvy
let @z = substitute(escape(@", '\'), '\n', '\\n', 'g')
let @" = old
endfunction
" Ack for visual selection
vnoremap <Leader>av :<C-u>call <SID>VAck()<CR>:exe "Ack! ".@z.""<CR>
Run Code Online (Sandbox Code Playgroud)
但是,我经常想要重新查找我搜索到的最后一件事,所以我键入:up以向后搜索我的命令历史记录.问题是,这种方法没有填充历史!
我的问题是我该如何做以下其中一项:
我完全了解打开并浏览到旧的quickfix列表(Ack.vim填充)的命令:copen和:colder命令,但我想知道如何解决我的上述问题,因为我想在同样的事情上重新做同样的事情.我知道我的部分源代码已经改变了.
当它们是映射的一部分时,命令不会添加到命令历史记录中.
使用以下histadd()功能将项目添加到特定历史记录:
call histadd("cmd", "e $MYVIMRC")
Run Code Online (Sandbox Code Playgroud)
见:help histadd().
您可以从使函数返回搜索模式而不是破坏寄存器开始:
function! VAck()
let old = @"
norm! gvy
let pat = substitute(escape(@", '\'), '\n', '\\n', 'g')
let @" = old
return pat
endfunction
Run Code Online (Sandbox Code Playgroud)
这将允许您简化基本映射:
vnoremap <Leader>av :<C-u>exe "Ack! " . VAck()<CR>
Run Code Online (Sandbox Code Playgroud)
我们现在可以修改以将命令添加到历史记录中:
vnoremap <Leader>av :<C-u>let cmd = "Ack! " . VAck() <bar> call histadd("cmd", cmd) <bar> execute cmd<CR>
Run Code Online (Sandbox Code Playgroud)
你在哪里:
建立你的命令, let cmd = "Ack! " . VAck()
将该命令添加到历史记录中 call histadd("cmd", cmd)
执行命令execute cmd.
最终结果与您实际输入的结果完全相同:Ack! foo.
一些评论......
我认为这是一个好主意,我将相应地更改我的配置(我已经有类似的功能和映射).
您应该使用xnoremap而不是vnoremap限制映射到实际的可视模式.
在VAck(),如果你clipboard=unnamed的配置中有类似的东西,那么对未命名的寄存器进行处理会破坏你的系统剪贴板.您应该使用特定的寄存器:
function! VAck()
let old = @z
norm! gv"zy
let pat = substitute(escape(@z, '\'), '\n', '\\n', 'g')
let @z = old
return pat
endfunction
Run Code Online (Sandbox Code Playgroud)