在vim中混淆了一个命令
当我编程时, Vim
是我的首选文本编辑器,所以我总是遇到一个特别恼人的问题。
当我很快需要保存缓冲区并继续执行其他一些任务时,我经常做这个典型的工作
:w
但是,我似乎有超过50%的时间 – 总是能够把这个资本化:w
。 当然,vim大叫我,因为W
是一个无效的命令
E492: Not an editor command: W
我的问题是如何可以在VIM别名冒号命令 。 特别是,你能举例说明如何将W
别名为w
。
我知道将键映射到某些命令的过程 。 不幸的是,那不是我正在寻找的。
要保持完好无损,请尝试使用
cnoreabbrev W w
,它将用w
replace命令行中的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的
'<,'>
- 转义特殊字符如引号和
- 检查所选的别名是否是有效的命令行缩写。