尽管我是一个相对精确的打字员,但当我在 Vim 中敲回车时,经常会碰到撇号字符是一个常见的错误。尤其是当我尝试键入:w<CR>
或时会发生这种情况wq<CR>
。我最终输入了:w'<CR>
,甚至更糟的是,:wq'<CR>
除了没有按照我的意图进行操作之外,它还会给出几个大的红色错误消息。有没有可以用来克服这个问题的映射或其他技术?我无法想象我为什么要写一个名为 的文件'
,所以我不担心完全阻止这种可能性。
问问题
207 次
4 回答
4
你可以这样做cnoremap '<cr> <cr>
。我无法想象命令模式命令会以'
. 通常如果需要引号,我会使用双引号。如果有,请稍等片刻,然后再按 Enter''<bs><cr>
或其他东西。
于 2012-11-10T01:24:17.300 回答
4
您必须小心使用命令映射(和缩写),它们通常会在不应该触发时触发,例如在搜索期间或在命令参数中间。我通常更喜欢使用表达式缩写。
将以下内容放入您的~/.vimrc
:
cnoreabbrev <expr> w getcmdtype() == ':' && getcmdline() ==# 'w' ? 'w' . EatChar("'") : 'w'
cnoreabbrev <expr> wq getcmdtype() == ':' && getcmdline() ==# 'wq' ? 'wq' . EatChar("'") : 'wq'
function! EatChar(pat)
let c = nr2char(getchar(0))
return (c =~ a:pat) ? '' : c
endfunction
此缩写使用一个名为的函数,该函数EatChar
采用在缩写展开后将被“吃掉”或忽略的模式。有关:helpg Eatchar
其用法的不同示例,请参阅。
仅当满足以下所有条件时,缩写词才会扩展并寻找“吃”报价:
- 处于正常前模式:
getcmdtype() == ':'
- 在命令的开头:
getcmdline() ==# 'w'
否则缩写扩展为与{lhs}
iew
或wq
这种方法的缺点:
- 表达式缩写需要 vim 7+
- 如果出于某种原因您确实要键入
:w'
,则必须键入两次引号,请使用空格将命令与文件名分开,或键入Ctrl+v后跟' - 必须为每个胖指法场景创建一个额外的缩写
有关更多信息,请参阅:
:h abbreviations
:h :map-<expr>
:h getcmdtype(
:h getcmdline(
:helpg Eatchar
于 2012-11-10T05:05:57.270 回答
2
这是一种解决方法:
cnoremap w'<CR> w<CR>
cnoremap wq'<CR> wq<CR>
这会创建一个命令模式映射,将我错误的命令转换成我想要的。但是,它有两个缺点:
- 这意味着撇号必须直接在其他字符之后输入。如果有一个暂停,然后我连枷Enter键,击中撇号键,我会遇到同样的问题。
- 在此期间,当 Vim 给你一点时间来输入撇号时,光标不会前进(这是映射的典型行为)。如果您是观看您正在输入的命令的人,这可能会以其他方式使您感到困惑。
于 2012-11-10T01:20:29.553 回答
2
我知道这不是您要的确切答案,但我可能会为您提供不同的解决方案。
在您的情况下,您正在询问保存文件以及保存和退出。也许使用其他方法之一来完成这些任务对你来说会更好。
ZZ如果修改,将保存文件,然后退出窗口。
为了保存文件,我做了一个领导者命令来缩短我必须按下的键数
nnoremap <silent> <leader><leader> :write<cr>
您只需按两次前导键即可保存文件。我的领导是,。所以我只是点击,,并保存了文件。
于 2012-11-10T07:28:14.140 回答