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

Vim:如何在命令历史记录中插入命令?,vim,keyboard-shortcuts,ack,Vim,Keyboard Shortcuts,Ack,我有一个映射,在该映射中,我可以选择文本并键入(引线)av到ack以进行视觉选择: “视觉确认,用于确认突出显示的文本 函数!s:VAck() 让old=@“ 标准gvy 让@z=替换(转义(@“,'\'),'\n','\\n','g') 让"老", 端功能 “视觉选择确认” vnoremap av:call VAck():exe“确认!“@z.” 但是,我经常想重新确认我搜索的最后一个内容,所以我键入:up以通过我的命令历史向后搜索它。问题是,此方法不会填充历史 我的问题是我该如何做以下一项

我有一个映射,在该映射中,我可以选择文本并键入(引线)av到ack以进行视觉选择:

“视觉确认,用于确认突出显示的文本
函数!s:VAck()
让old=@“
标准gvy
让@z=替换(转义(@“,'\'),'\n','\\n','g')
让"老",
端功能
“视觉选择确认”
vnoremap av:call VAck():exe“确认!“@z.”
但是,我经常想重新确认我搜索的最后一个内容,所以我键入:up以通过我的命令历史向后搜索它。问题是,此方法不会填充历史

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

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

我完全了解
:copen
:colder
命令,可以打开并浏览到较旧的快速修复列表(会填充),但我想知道如何解决上述问题,因为当我知道部分源代码已更改时,我想重新确认相同的问题。

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

使用
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>exe "Ack! " . VAck()<CR>
vnoremap <Leader>av :<C-u>let cmd = "Ack! " . VAck() <bar> call histadd("cmd", cmd) <bar> execute cmd<CR>
function! VAck()
    let old = @z
    norm! gv"zy
    let pat = substitute(escape(@z, '\'), '\n', '\\n', 'g')
    let @z = old
    return pat
endfunction