“当我在Vim中指责写命令时,做我的意思,而不是我所说的”

时间:2012-11-10 01:20:30

标签: vim save

即使我是一个相对精确的打字员,但是当我去Vim的马车回来时,我常常会遇到撇号字符。当我尝试输入:w<CR>wq<CR>时,会发生这种情况。我最后输入了:w'<CR>,甚至更糟糕的是,:wq'<CR>,除了没有按照我的意图行事之外,还会发出一些大的红色错误消息。是否有可用于克服此问题的映射或其他技术?我无法想象为什么我会想要写一个名为'的文件,所以我并不担心完全阻止这种可能性。

4 个答案:

答案 0 :(得分:4)

你可以做cnoremap '<cr> <cr>。我无法想象很多次命令模式命令会在'中结束。通常如果需要引号我使用双引号。如果有的话,只需等一下,然后按Enter键或''<bs><cr>或其他东西。

答案 1 :(得分: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

只有满足以下所有条件时,缩写才会展开并看起来“吃”一个引号:

  • 处于正常的ex模式:getcmdtype() == ':'
  • 在命令的开头:getcmdline() ==# 'w'

否则缩写将扩展为与{lhs}相同,即wwq

这种方法的缺点:

  • 表达式缩写需要vim 7 +
  • 如果由于某种原因您确实要键入:w',则必须输入两次引号,使用空格将命令与文件名分开,或者键入 Ctrl + < kbd> v 后跟'
  • 必须为每个胖指法senario创建一个额外的缩写

有关详细信息,请参阅:

:h abbreviations
:h :map-<expr>
:h getcmdtype(
:h getcmdline(
:helpg Eatchar

答案 2 :(得分:2)

这是一种解决方法:

cnoremap w'<CR> w<CR>
cnoremap wq'<CR> wq<CR>

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

  1. 这意味着必须在其他字符之后直接键入撇号。如果有暂停然后我连接 Enter 键,按下撇号键,我将遇到同样的问题。
  2. 在此期间,虽然Vim给你一个时间来输入撇号,但光标不会被提前(这是映射的典型行为)。如果你是一个看着你正在打字的命令的人,这可能会让你陷入其他方式。

答案 3 :(得分:2)

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

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

Z Z 将保存文件(如果已修改),然后退出窗口。

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

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

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