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

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以向后搜索我的命令历史记录.问题是,这种方法没有填充历史!

我的问题是我该如何做以下其中一项:

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

我完全了解打开并浏览到旧的quickfix列表(Ack.vim填充)的命令:copen:colder命令,但我想知道如何解决我的上述问题,因为我想在同样的事情上重新做同样的事情.我知道我的部分源代码已经改变了.

rom*_*inl 7

当它们是映射的一部分时,命令不会添加到命令历史记录中.

使用以下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)

你在哪里:

  1. 建立你的命令, let cmd = "Ack! " . VAck()

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

  3. 执行命令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)