在vim中混淆了一个命令

当我编程时, Vim是我的首选文本编辑器,所以我总是遇到一个特别恼人的问题。

当我很快需要保存缓冲区并继续执行其他一些任务时,我经常做这个典型的工作

 :w 

但是,我似乎有超过50%的时间 – 总是能够把这个资本化:w 。 当然,vim大叫我,因为W是一个无效的命令

 E492: Not an editor command: W 

我的问题是如何可以在VIM别名冒号命令 。 特别是,你能举例说明如何将W别名为w

我知道将键映射到某些命令的过程 。 不幸的是,那不是我正在寻找的。

要保持完好无损,请尝试使用

 cnoreabbrev W w 

,它将用wreplace命令行中的w ,但是只有当它既没有被跟随也没有字符前面时, :W<CR>将被replace为:w<CR> ,但是:Write不会。

更新

以下是我现在要写的内容:

 cnoreabbrev <expr> W ((getcmdtype() is# ':' && getcmdline() is# 'W')?('w'):('W')) 

作为一个function:

 fun! SetupCommandAlias(from, to) exec 'cnoreabbrev <expr> '.a:from \ .' ((getcmdtype() is# ":" && getcmdline() is# "'.a:from.'")' \ .'? ("'.a:to.'") : ("'.a:from.'"))' endfun call SetupCommandAlias("W","w") 

通过补充search,我发现有人问我几乎同样的问题 。

 :command <AliasName> <string of command to be aliased> 

会做的伎俩。

请注意,正如Richo指出的,用户命令必须以大写字母开头。

我发现映射的; 关键:将是一个更好的解决scheme,并会使你更有效地input其他命令。

 nnoremap ; : vnoremap ; : 

假设你想在gvim中为tabnew命令添加别名。 您只需在.vimrc文件中input以下命令(如果不在主文件夹中,则不会创build一个)

 cabbrev t tabnew 

也许你想将你的一个function键(F1..F12)映射到:w? 然后把这个放到你的.vimrc中:

 noremap <f1> :w<return> inoremap <f1> <co>:w<return> 

(ctrl-o在插入模式下暂时切换到正常模式)。

最好的解决scheme是编写一个自定义函数来处理只在命令栏开始处出现的缩写。

为此,添加以下您的vimrc文件或其他任何地方。

 " cabs - less stupidity {{{ fu! Single_quote(str) return "'" . substitute(copy(a:str), "'", "''", 'g') . "'" endfu fu! Cabbrev(key, value) exe printf('cabbrev <expr> %s (getcmdtype() == ":" && getcmdpos() <= %d) ? %s : %s', \ a:key, 1+len(a:key), Single_quote(a:value), Single_quote(a:key)) endfu "}}} 
 " use this custom function for cabbrevations. This makes sure that they only " apply in the beginning of a command. Else we might end up with stuff like " :%s/\vfoo/\v/\vbar/ " if we happen to move backwards in the pattern. " For example: call Cabbrev('W', 'w') 

从我find这个东西的源材料几个有用的缩写 :

 call Cabbrev('/', '/\v') call Cabbrev('?', '?\v') call Cabbrev('s/', 's/\v') call Cabbrev('%s/', '%s/\v') call Cabbrev('s#', 's#\v') call Cabbrev('%s#', '%s#\v') call Cabbrev('s@', 's@\v') call Cabbrev('%s@', '%s@\v') call Cabbrev('s!', 's!\v') call Cabbrev('%s!', '%s!\v') call Cabbrev('s%', 's%\v') call Cabbrev('%s%', '%s%\v') call Cabbrev("'<,'>s/", "'<,'>s/\v") call Cabbrev("'<,'>s#", "'<,'>s#\v") call Cabbrev("'<,'>s@", "'<,'>s@\v") call Cabbrev("'<,'>s!", "'<,'>s!\v") 

在我的.vimrc我有:

 nmap :W :w nmap :Q :q nmap :wQ :wq nmap :WQ :wq 

这对我来说是一个挑战

最安全和最简单的是一个插件,如cmdalias.vim或我最近更新的vim-alias ,它考虑到

  • 前面的空格或修饰符,例如:sil(ent)(!):redi(r)
  • 范围修饰符例如用于当前视觉select的'<,'>
  • 转义特殊字符如引号和
  • 检查所选的别名是否是有效的命令行缩写。