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

标签 vim keyboard-shortcuts ack

我有一个映射,可以在其中选择文本并输入 (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>

您在哪里:

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

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

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

相关文章:

c# - wpf 菜单项的键盘快捷键

installation - 如何在 OS X (10.8.4) 上安装 ack?

linux - 带有空 .vimrc 的退格键的 Vim 怪异行为

vim - 更改 vimrc 的默认位置

android - 如何通过 Android Studio 中的键盘快捷键覆盖方法

自动生成属性的 VB.Net 键盘快捷键

regex - 为什么我的 ack 正则表达式会得到额外的、意想不到的结果?

grep/ack -o 带有上下文字符(不是行)

Vim: "And"行的 cucumber 缩进

git - 我怎样才能区分两个分支与 Fugitive ?