![如何以编程方式更改 Vim 的命令类型模式?](https://linux22.com/image/44391/%E5%A6%82%E4%BD%95%E4%BB%A5%E7%BC%96%E7%A8%8B%E6%96%B9%E5%BC%8F%E6%9B%B4%E6%94%B9%20Vim%20%E7%9A%84%E5%91%BD%E4%BB%A4%E7%B1%BB%E5%9E%8B%E6%A8%A1%E5%BC%8F%EF%BC%9F.png)
有没有一种简单的方法可以从一种命令类型模式切换到另一种命令类型模式而不丢失当前命令行?
在我的~/.vimrc
文件中,我将<space>
和<c-space>
字符重新映射到:
- N、V、O => :
- 我=>:
- : => / => ?
完成上述行为的代码是:
function! s:ModMapSpaceChar()
noremap <unique> <space> :
map <unique> <nul> <c-space>
map! <unique> <nul> <c-space>
noremap <unique> <c-space> /
inoremap <unique> <c-space> <c-o>:
cnoremap <unique> <c-space> <c-\>eg:ToggleCmdTypes()<cr><c-c>@"
let g:CmdTypes={':' : '/', '/' : '?', '?': ':'}
function! g:ToggleCmdTypes()
let a=getcmdtype()
let b=get(g:CmdTypes, a, a)
let c=getcmdline()
let @"=b . c
return ''
endfunction
endfunction
call s:ModMapSpaceChar()
我的方法中令我困扰的是不纯的函数g:ToggleCmdTypes
。理想情况下,它应该返回当前分配给寄存器的命令"
。然后应执行生成的命令。
答案1
您也可以使用此方法,而不是绕过寄存器,feedkeys()
以避免破坏寄存器。这唯一的缺点是当作为宏录制和重放时它不起作用。
总的来说,我建议重新考虑你的总体方法;我不明白切换这样的命令行模式有什么用。谁开始搜索只是在中途意识到他希望将其作为命令执行?!