1

尽管我是一个相对精确的打字员,但当我在 Vim 中敲回车时,经常会碰到撇号字符是一个常见的错误。尤其是当我尝试键入:w<CR>或时会发生这种情况wq<CR>。我最终输入了:w'<CR>,甚至更糟的是,:wq'<CR>除了没有按照我的意图进行操作之外,它还会给出几个大的红色错误消息。有没有可以用来克服这个问题的映射或其他技术?我无法想象我为什么要写一个名为 的文件',所以我不担心完全阻止这种可能性。

4

4 回答 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}iewwq

这种方法的缺点:

  • 表达式缩写需要 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>

这会创建一个命令模式映射,将我错误的命令转换成我想要的。但是,它有两个缺点:

  1. 这意味着撇号必须直接在其他字符之后输入。如果有一个暂停,然后我连枷Enter键,击中撇号键,我会遇到同样的问题。
  2. 在此期间,当 Vim 给你一点时间来输入撇号时,光标不会前进(这是映射的典型行为)。如果您是观看您正在输入的命令的人,这可能会以其他方式使您感到困惑。
于 2012-11-10T01:20:29.553 回答
2

我知道这不是您要的确切答案,但我可能会为您提供不同的解决方案。

在您的情况下,您正在询问保存文件以及保存和退出。也许使用其他方法之一来完成这些任务对你来说会更好。

ZZ如果修改,将保存文件,然后退出窗口。

为了保存文件,我做了一个领导者命令来缩短我必须按下的键数

nnoremap <silent> <leader><leader> :write<cr>

您只需按两次前导键即可保存文件。我的领导是,。所以我只是点击,,并保存了文件。

于 2012-11-10T07:28:14.140 回答