Vim:如何将命令插入命令历史记录?

时间:2014-10-17 22:56:54

标签: vim keyboard-shortcuts ack

我有一个映射,我可以选择文本并输入(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 来向后搜索我的命令历史记录。问题是,这种方法不会填充历史记录!

我的问题是如何执行以下操作之一:

  • 使用Vimscript - 或 -
  • 在条目行历史记录中插入一个条目
  • 使其构建的命令实际执行为冒号命令,以便自动填充历史记录吗?

我完全了解:copen:colder命令打开并浏览到较旧的quickfix列表(Ack.vim填充),但我想知道如何解决我上面的问题是因为当我知道部分源代码发生了变化时,我想重新做同样的事情。

1 个答案:

答案 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>

你在哪里:

  1. 构建您的命令let cmd = "Ack! " . VAck()

  2. 将该命令添加到历史记录call histadd("cmd", cmd)

  3. 执行命令execute cmd

  4. 最终结果与您实际输入: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