我已经使用Vim编写了一个月的Go脚本代码,在导入和导入任何软件包时,我对:Import
和:Drop
vim命令很满意。
但是,我越来越厌倦了如此频繁地输入包括大写字母在内的这么长的单词,所以我开始认为如果我可以使用:i
和:d
而不是{{ 1}}和:Import
,我会更满意。但是,我不确定我是否可以在Vim中定义这样的命令,因为它涉及1)转入命令行模式,2)获取在键入时动态确定的变量。
例如,如果我导入:Drop
包,我要输入的所有内容都是encoding/csv
等等...我可以定义这些命令吗?
我偶然发现this question,但我无法得到它正在做的事情,我也不确定答案是否适用于这个问题。我可以通过将关联帖子中的所有:i encoding/csv
和w
替换为W
或i
来解决问题吗?
此外,它是否与不采用变量(例如,d
命令来格式化脚本)的情况不同?
感谢。
答案 0 :(得分:2)
编辑2:正如下面glts所指出的,最好使用cnoreabbrev
or cnorea
中指出的this answer。
更好的工作示例(粘贴到~/.vimrc
):
cnorea <expr> i ((getcmdtype() is# ':' && getcmdline() is# 'i')?('Import'):('i'))
cnorea <expr> d ((getcmdtype() is# ':' && getcmdline() is# 'd')?('Drop'):('d'))
编辑:简单回答。只使用cabbrev
or ca
(command abbreviation)似乎有效:
工作示例(将其粘贴到~/.vimrc
):
ca i Import
ca d Drop
使用vim 7.3,Ubuntu 64位。
原始答案(更复杂):
根据http://vim.wikia.com/wiki/Replace_a_builtin_command_using_cabbrev:
您可以使用:command来定义自己的命令,但是用户定义的命令必须以大写字母开头,以避免与内置命令混淆。
因此,使用:command
,您可以使用:I
和:D
,但不能使用:i
和:d
。
接着说:
假设您有一个用户定义的:E命令,您希望用它来覆盖default:e命令。您可以执行以下操作:
:cabbrev e <c-r>=(getcmdtype()==':' && getcmdpos()==1 ? 'E' : 'e')<CR>
(getcmdtype()==':'&amp;&amp; getcmdpos())确保替换只发生在命令行的第一列(即不在行的后面,很可能不是意图用作命令,而不是在搜索行,也受到cabbrev的影响 如果你这么做了,定义一个函数为你做这件事会很有用。使用此选项可以快速轻松地为所需的任何命令定义小写缩写:
function! CommandCabbr(abbreviation, expansion)
execute 'cabbr ' . a:abbreviation . ' <c-r>=getcmdpos() == 1 && getcmdtype() == ":" ? "' . a:expansion . '" : "' . a:abbreviation . '"<CR>'
endfunction
command! -nargs=+ CommandCabbr call CommandCabbr(<f-args>)
" Use it on itself to define a simpler abbreviation for itself.
CommandCabbr ccab CommandCabbr
这不仅创建了函数,还提供了(小写!)命令:ccab“动态”定义这样的缩写。
因此,如果您想使用小写:i
和:d
,使用函数看起来就是一种方法。
答案 1 :(得分:0)
cmdalias.vim - Create aliases for Vim commands插件允许您设置小写别名,例如:
:Alias i Import
答案 2 :(得分:0)
一个简单的解决方案:
nnoremap <leader>i :Import<Space>
nnoremap <leader>d :Drop<Space>
在正常模式下,<leader>i
使用
:Import | <--- cursor
准备好输入或<tab>-complete
参数。
更好:
nnoremap <leader>i :Import <C-d>
nnoremap <leader>d :Drop <C-d>
<leader>i
使用
:Import | <--- cursor
并显示可能的完成列表。
更好:
set wildcharm=<C-z>
nnoremap <leader>i :Import <C-z>
nnoremap <leader>d :Drop <C-z>
假设您已设置wildmenu
,<leader>i
使用
:Import firstpackagenameinthelist
野性菜单打开并准备好<tab>
bing。