在vim中别名命令

时间:2010-10-07 04:31:48

标签: vim alias command

我编程时,

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

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

:w

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

E492: Not an editor command: W

我的问题是如何在vim 中使用别名冒号命令。特别是,您能举例说明如何将W别名变为w

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

7 个答案:

答案 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)
  • 范围修饰符,例如'<,'>,用于当前视觉选择
  • 转义特殊字符,例如引号和
  • 检查所选别名是否是有效的命令行缩写。