在vim中别名命令

Sea*_*ean 145 vim alias command

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

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

:w
Run Code Online (Sandbox Code Playgroud)

然而,我 - 似乎超过50%的时间 - 总是设法利用它:w.当然,vim对我大吼大叫,因为这W是一个无效的命令

E492: Not an editor command: W
Run Code Online (Sandbox Code Playgroud)

我的问题是如何在vim中为冒号命名.尤其是,你能举例说明如何别名Ww.

我知道将键映射到某些命令的过程.不幸的是,这不是我想要的.

ZyX*_*ZyX 121

要完成保持不变,请尝试使用

cnoreabbrev W w
Run Code Online (Sandbox Code Playgroud)

,它将W在命令行中替换w,但只有当它既没有被跟随也没有前面的单词字符时,所以:W<CR>将替换为:w<CR>,但:Write不会.(请注意,这会影响任何匹配的命令,包括您可能不期望的命令,例如命令:saveas W Z将被替换:saveas w Z,因此请小心.)

更新

这是我怎么会写现在:

cnoreabbrev <expr> W ((getcmdtype() is# ':' && getcmdline() is# 'W')?('w'):('W'))
Run Code Online (Sandbox Code Playgroud)

作为一个功能:

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

这将检查命令类型是否:为命令W,因此它比仅更安全cnoreabbrev W w.

  • 绝对; 这是一个*可怕的想法.你应该*永远*,******,***永远***做到这一点. (4认同)
  • `:cnoreabbrev <expr> W getcmdtype()==':'&& getcmdline()=〜#'^ W'?'w':'W' (4认同)
  • 这个答案对我来说是最安全和最可靠的. (2认同)
  • 实际上,这意味着W将在命令栏中的“任何位置”被替换,例如在搜索中,因此s / W foo / bar / g将被转换为s / w foo / bar / g。这会变得非常烦人。查看我的答案以获取全面的解决方案。 (2认同)
  • 如果您使用推荐的解决方案,请注意以下两个命令都将作为较低的命令,可能会出现意外的结果,具体取决于实际的缓冲区内容和VIM设置:`:%s/W/foo/g < CR>``:%s/w/foo/g <CR>` (2认同)

Sea*_*ean 93

通过补充搜索,我发现有人问了几乎和我一样的问题.

:command <AliasName> <string of command to be aliased>
Run Code Online (Sandbox Code Playgroud)

会做的.

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

  • OP要求将`:W`映射到`:w`,所以它确实有效. (8认同)
  • 这不会处理/转发任何`command`参数,比如`-nargs`,`-complete`等. (8认同)
  • 使用:命令是很好的解决方案.:cnoreabbrev不理解cmd1 | cmd2 ,:命令. (5认同)
  • 只是非常文字:在`.vimrc`文件中输入`:command W w`. (4认同)
  • 这不起作用,用户定义的命令必须以大写字母开头. (2认同)

fen*_*ent 19

我发现将;键映射到:更好的解决方案,并且可以使您更有效地键入其他命令.

nnoremap ; :
vnoremap ; :
Run Code Online (Sandbox Code Playgroud)

  • @Flimm不,但这会让OP的问题消失. (5认同)
  • 当使用“t”或“f”时,通常可以使用“;”转到下一个出现的位置。即使您将分号映射到冒号,也可以安全地以另一种方式映射。不会出现别名循环。`不再映射:;` (5认同)
  • 这是 vim 的最佳技巧。我现在已经习惯了,每次遇到正常行为时,我都需要几次尝试才能重新训练自己的思维。 (3认同)
  • 这不是问题的答案。 (3认同)

And*_*rra 9

最佳解决方案涉及编写自定义函数来处理仅在命令栏开头发生的缩写.

为此,请添加以下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
"}}}
Run Code Online (Sandbox Code Playgroud)

 

" 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')
Run Code Online (Sandbox Code Playgroud)

从源材料中找到一些有用的缩写:

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")
Run Code Online (Sandbox Code Playgroud)

  • 有一个内置函数“string()”与您的“Single_quote()”执行相同的操作。 (2认同)

Ben*_*oit 6

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

noremap  <f1> :w<return>
inoremap <f1> <c-o>:w<return>
Run Code Online (Sandbox Code Playgroud)

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


小智 6

假设您要在gvim中为tabnew命令添加别名.您只需在.vimrc文件中键入以下命令(如果不在主文件夹中而不是创建一个)

cabbrev t tabnew
Run Code Online (Sandbox Code Playgroud)

  • 这将导致像“:saveas t example”这样的命令被替换为“:saveas tabnew example” (3认同)

小智 5

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

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