如何在Vim中为命令创建别名?
Vim是我编程时首选的文本编辑器,因此我总是遇到一个特别恼人的问题 通常,当我需要快速保存缓冲区并继续执行其他一些杂项任务时,我会执行典型的如何在Vim中为命令创建别名?,vim,alias,command,Vim,Alias,Command,Vim是我编程时首选的文本编辑器,因此我总是遇到一个特别恼人的问题 通常,当我需要快速保存缓冲区并继续执行其他一些杂项任务时,我会执行典型的 :w 然而,我总是——似乎有超过50%的时间是这样的——设法把那:w资本化。Vim自然会对我大喊大叫,因为W是无效命令: E492: Not an editor command: W 我的问题是如何在Vim中使用别名冒号命令。特别是,您能否举例说明如何将W别名为W 我知道将键映射到某些命令的过程,但这不是我要寻找的。通过补充搜索,我发现有人的请求与我的
:w
然而,我总是——似乎有超过50%的时间是这样的——设法把那:w
资本化。Vim自然会对我大喊大叫,因为W
是无效命令:
E492: Not an editor command: W
我的问题是如何在Vim中使用别名冒号命令。特别是,您能否举例说明如何将W
别名为W
我知道将键映射到某些命令的过程,但这不是我要寻找的。通过补充搜索,我发现有人的请求与我的请求几乎相同
:命令指出,用户命令必须以大写字母开头。也许您想将其中一个功能键(F1..F12)映射到:w?然后将其放入您的.vimrc中:
noremap <f1> :w<return>
inoremap <f1> <c-o>:w<return>
noremap:w
inoremap:w
(插入模式中的ctrl-o会暂时切换到正常模式)。若要保持完成状态不变,请尝试使用
cnoreabbrev W w
它将命令行中的W
替换为W
,但前提是它既不后跟单词字符,也不后跟单词字符,因此:W
将替换为:W
,但:Write
不会。(请注意,这会影响任何匹配的命令,包括您可能不期望的命令。例如,命令:saveas W Z
将替换为:saveas W Z
,因此请小心。)
更新
下面是我现在要写的内容:
cnoreabrev W((getcmdtype()是#':'&&getcmdline()是#'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")
有趣!SetupCommandAlias(从、到)
执行官'cnoreabrev'。答:从
\“((getcmdtype()是#”):“&&getcmdline()是#”'.a:from'.”
\“?”(“.a:to.”):(“.a:from.”)
结束
调用SetupCommandAlias(“W”、“W”)
这将检查命令类型是否为:
,命令是否为W
,因此它比只处理cnoreabrev W
更安全。最佳解决方案是处理仅发生在命令栏开头的缩写
为此,在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
"}}}
我在一些地方发现了这些东西:
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")
调用Cabbrev('/','/\v'))
调用Cabbrev(“?”,“?\v”)
调用Cabbrev('s/','s/\v'))
调用Cabbrev(“%s/”,“%s/\v”)
呼叫Cabbrev('s#','s#\v')
调用Cabbrev(“%s”;“%s”\v”)
呼叫Cabbrev('s@','s@\v'))
调用Cabbrev(“%s@”,““%s@\v”)
呼叫Cabbrev('s!','s!\v'))
调用Cabbrev(“%s!”,“%s!\v”)
调用Cabbrev('s%','s%\v'))
调用Cabbrev(“%s%”,“%s%\v”)
调用Cabbrev(“'假设您要在gvim中为tabnew命令添加别名。您只需在.vimrc文件中键入以下命令(如果不在主文件夹中,则创建一个命令)
我发现将;
键映射到:
将是一个更好的解决方案,并且可以让您更高效地键入其他命令
nnoremap ; :
vnoremap ; :
最安全和最简单的是一个插件,如或我的最新更新,它考虑到
- 前面的空格或修饰符,如
:sil(ent)(!)
或:redi(r)
- 范围修饰符,如
“此答案对我来说是最安全和最可靠的。如果您使用推荐的解决方案,请注意以下两个命令都将作为较低的命令使用,这可能会根据实际缓冲区内容和VIM设置呈现意外结果::%s/W/foo/g
:%s/W/foo/g
实际首先,这意味着W将在命令栏中的任何位置被替换,例如在搜索中,因此s/W foo/bar/g将被转换为s/W foo/bar/g。这可能会很快变得令人讨厌。请参阅我的答案以获得全面的解决方案。绝对;这是一个可怕的想法。您永远不应该这样做。:cnoreabrev W getcmdtype()==':'&&getcmdline()=~#“^W”?“W”:“W”
使用:command是一个很好的解决方案。:cnoreabrev不理解cmd1 | cmd2,:command理解。一种不太容易混淆的编写方法是,:命令别名要别名的命令字符串
这不会处理/转发任何命令
参数,如-nargs
,-complete
等。关于:Q!
或:W!
?简单地说:在.vimrc
文件中放入:命令W
。有一个内置函数string()
,它与您的单引号()
。可能重复的以避免:W
您可以映射一个键来执行保存。如果您习惯于使用Ctrl-s保存的某些程序,则$VIM/mswin.VIM中有这些映射:”同样在插入模式下,使用CTRL-S进行保存
noremap:update
vnoremap:update
inoremap:update
关于Vi堆栈交换的类似问题:这是vim最好的提示。我现在已经习惯了,每次遇到正常行为时,我都会尝试几次重新训练自己的思维。这是这不是问题的答案。@Flimm不,但这会使OP的问题消失。当使用t
或f
时,通常可以使用;
转到下一个事件。即使将分号映射到冒号,也可以安全地用另一种方式映射。不会有别名循环。nnoremap:;
这很完美,谢谢。这是我将使用:saveas tabnew example
替换像:saveas t example
这样的命令
" 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')
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")
cabbrev t tabnew
nnoremap ; :
vnoremap ; :