Vim
是我首选的文本编辑器,因此我总是遇到一个特别恼人的问题。
通常,当我很快需要保存缓冲区并继续执行其他一些其他任务时,我会做典型的
:w
然而,我 - 似乎超过50%的时间 - 总是设法将:w
大写。当然,vim对我大吼大叫,因为W
是一个无效的命令
E492: Not an editor command: W
我的问题是如何在vim 中使用别名冒号命令。特别是,您能举例说明如何将W
别名变为w
。
我知道将映射键映射到某些命令的过程。不幸的是,这不是我想要的。
答案 0 :(得分:113)
要完成保持不变,请尝试使用
cnoreabbrev W w
,它会在命令行中用W
替换w
,但只有在它既没有被跟随也不以字符开头的情况下,:W<CR>
将替换为:w<CR>
,但:Write
不会。 (请注意,这会影响任何匹配的命令,包括您可能不期望的命令,例如命令:saveas W Z
将被:saveas w Z
替换,因此请小心。)
以下是我将如何编写现在:
cnoreabbrev <expr> W ((getcmdtype() is# ':' && getcmdline() is# 'W')?('w'):('W'))
作为一项功能:
fun! SetupCommandAlias(from, to)
exec 'cnoreabbrev <expr> '.a:from
\ .' ((getcmdtype() is# ":" && getcmdline() is# "'.a:from.'")'
\ .'? ("'.a:to.'") : ("'.a:from.'"))'
endfun
call SetupCommandAlias("W","w")
这将检查命令类型是否为:
且命令为W
,因此它比cnoreabbrev W w
更安全。
答案 1 :(得分:86)
通过补充搜索,我发现有人问我几乎和我一样question。
:command <AliasName> <string of command to be aliased>
会做到这一点。
请注意,正如Richo所指出的那样,用户命令必须以大写字母开头。
答案 2 :(得分:19)
我发现将;
键映射到:
将是一个更好的解决方案,并且可以提高您输入其他命令的效率。
nnoremap ; :
vnoremap ; :
答案 3 :(得分:8)
最佳解决方案涉及writing a custom function,用于处理仅在命令栏开头发生的缩写。
为此,请添加以下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')
我找到了这些东西的useful abbreviations from the source material:
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")
答案 4 :(得分:6)
也许你想将你的一个功能键(F1..F12)映射到:w?然后将它放入你的.vimrc:
noremap <f1> :w<return>
inoremap <f1> <c-o>:w<return>
(插入模式下的ctrl-o暂时切换到正常模式)。
答案 5 :(得分:6)
假设您要在gvim中为tabnew命令添加别名。您只需在.vimrc文件中键入以下命令(如果不在主文件夹中而不是创建一个)
cabbrev t tabnew
答案 6 :(得分:3)
最安全,最简单的是cmdalias.vim或我最近更新vim-alias的插件,其中考虑了
:sil(ent)(!)
或:redi(r)
,'<,'>
,用于当前视觉选择