我有一个映射,可以在其中选择文本并输入 (leader)av 来确认我的视觉选择 Ack.vim :
" 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>
但是,我经常想要重新确认我搜索的最后一个内容,因此我输入 :up 在我的命令历史记录中向后搜索它。问题是,此方法不会填充历史记录!
我的问题是我该如何执行以下操作之一:
- 使用 Vimscript 在命令行历史记录中插入一个条目-或-
- 使其构建的命令实际上作为冒号命令执行,以便自动填充历史记录?
我完全了解 :copen
和 :colder
命令来打开并浏览到较旧的快速修复列表(其中 Ack.vim 填充),但我会我想知道如何解决我的上述问题,因为当我知道我的部分源代码已更改时,我想重新确认同一件事。
最佳答案
当它们是映射的一部分时,命令不会添加到命令历史记录中。
使用 histadd()
函数将项目添加到特定历史记录:
call histadd("cmd", "e $MYVIMRC")
参见:help histadd()
。
您可以首先让函数返回搜索模式,而不是破坏寄存器:
function! VAck()
let old = @"
norm! gvy
let pat = substitute(escape(@", '\'), '\n', '\\n', 'g')
let @" = old
return pat
endfunction
这将允许您简化基本映射:
vnoremap <Leader>av :<C-u>exe "Ack! " . VAck()<CR>
我们现在可以修改该命令以将命令添加到历史记录中:
vnoremap <Leader>av :<C-u>let cmd = "Ack! " . VAck() <bar> call histadd("cmd", cmd) <bar> execute cmd<CR>
您在哪里:
构建您的命令,
let cmd = "Ack! "。 VAck()
将该命令添加到历史记录中,
调用 histadd("cmd", cmd)
执行命令,
执行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
关于Vim:如何将命令插入命令历史记录?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26434525/