【问题标题】:Abbreviate Import and Drop command of Golang in VimVim 中 Golang 的缩写 Import 和 Drop 命令
【发布时间】:2013-09-26 16:55:38
【问题描述】:

我已经使用 Vim 编写 Go 脚本一个月了,在导入和取消导入任何包时,我对 :Import:Drop vim 命令非常满意。

但是,我越来越厌倦了如此频繁地输入包含大写字母的长单词,所以我开始想如果我可以使用:i:d而不是:Import和@987654327 @,我会更满意的。但是,我不确定是否可以在 Vim 中定义这样的命令,因为它涉及 1) 进入命令行模式,以及 2) 采用在键入时动态确定的变量。

例如,如果我导入encoding/csv 包,我只想输入:i encoding/csv 等...我可以定义这些命令吗?

我偶然发现了this question,但我不知道它在做什么,也不确定答案是否首先适用于这个问题。我可以通过将链接帖子上的所有wW 替换为id 来解决此问题吗?

另外,它与不带变量的情况有什么不同(例如,Fmt 命令格式化脚本)?

谢谢。

【问题讨论】:

  • 如果您的输入过多,请使用制表符完成::I<Tab>:Dr<Tab>:F<Tab>

标签: vim go


【解决方案1】:

编辑 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 命令,您想用它来覆盖默认的 :e 命令。您可以执行以下操作:

:cabbrev e <c-r>=(getcmdtype()==':' && getcmdpos()==1 ? 'E' : 'e')<CR>

(getcmdtype()==':' && 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,使用函数似乎是一种方法。

【讨论】:

  • 只使用:cabbr i Import 是个坏主意。它也适用于搜索命令行,也适用于输入:s/i/x/g 之类的内容。你应该默认使用:cnoreabbr,而不是:cabbr。最好按照this answer 中的说明进行操作。
【解决方案2】:

cmdalias.vim - Create aliases for Vim commands 插件允许您设置小写别名,例如:

:Alias i Import

【讨论】:

    【解决方案3】:

    一个简单的解决方案:

    nnoremap <leader>i :Import<Space>
    nnoremap <leader>d :Drop<Space>
    

    在正常模式下,&lt;leader&gt;i 在命令行中填充

    :Import | <--- cursor
    

    准备好输入或&lt;tab&gt;-complete 参数。

    更好:

    nnoremap <leader>i :Import <C-d>
    nnoremap <leader>d :Drop <C-d>
    

    &lt;leader&gt;i

    填充命令行
    :Import | <--- cursor
    

    并显示可能完成的列表。

    更好:

    set wildcharm=<C-z>
    nnoremap <leader>i :Import <C-z>
    nnoremap <leader>d :Drop <C-z>
    

    假设您已经设置了wildmenu&lt;leader&gt;i 会在命令行中填充

    :Import firstpackagenameinthelist
    

    打开wildmenu并准备好&lt;tab&gt;bing。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-01-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多