Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/vim/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在Vim中为命令创建别名?_Vim_Alias_Command - Fatal编程技术网

如何在Vim中为命令创建别名?

如何在Vim中为命令创建别名?,vim,alias,command,Vim,Alias,Command,Vim是我编程时首选的文本编辑器,因此我总是遇到一个特别恼人的问题 通常,当我需要快速保存缓冲区并继续执行其他一些杂项任务时,我会执行典型的 :w 然而,我总是——似乎有超过50%的时间是这样的——设法把那:w资本化。Vim自然会对我大喊大叫,因为W是无效命令: E492: Not an editor command: W 我的问题是如何在Vim中使用别名冒号命令。特别是,您能否举例说明如何将W别名为W 我知道将键映射到某些命令的过程,但这不是我要寻找的。通过补充搜索,我发现有人的请求与我的

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

通常,当我需要快速保存缓冲区并继续执行其他一些杂项任务时,我会执行典型的

: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 ; :