我有一个映射,我可以选择文本并输入(leader) a v 来确认我的视觉选择{{3 }}:
" 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 来向后搜索我的命令历史记录。问题是,这种方法不会填充历史记录!
我的问题是如何执行以下操作之一:
我完全了解:copen
和:colder
命令打开并浏览到较旧的quickfix列表(Ack.vim填充),但我想知道如何解决我上面的问题是因为当我知道部分源代码发生了变化时,我想重新做同样的事情。
答案 0 :(得分:7)
当它们是映射的一部分时,命令不会添加到命令历史记录中。
使用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()
将该命令添加到历史记录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