如何管理和记住vimrc中的许多缩写?


10

我有超过500缩写(iabbrabbr)和从Java,PHP,C / C ++和乳胶我的vimrc文件中的一些映射。

当我一段时间不使用语言时,要立即记住是不容易的。

我想知道我是否可以对缩写名称进行补全。有没有更好的方法来访问/管理所有这些缩写?

Answers:


10

我不知道什么是管理500多个缩写的最佳方法。也许从长远来看,正如@statox解释的那样,您可以看看摘要以减少此数目。

如果您想自动完成缩写,可以尝试以下代码:

augroup GetAbbrev
    autocmd!
    autocmd VimEnter * let s:abbrev_list = [] |
                \ call substitute(join(readfile($MYVIMRC), "\n"), '\v%(^|\n)\s*i?%(nore)?ab%[brev]\s+%(%(\<expr\>|\<buffer\>)\s+){,2}(\k+)', '\=add(s:abbrev_list, submatch(1))', 'gn')
augroup END

set completefunc=CompleteAbbrev
function! CompleteAbbrev(findstart, base)
    if a:findstart
        return searchpos('\<\k', 'bcnW', line('.'))[1] - 1
    else
        return filter(copy(s:abbrev_list), 'v:val =~ "^" . a:base')
    endif
endfunction

要使用它,您必须C-x C-u在缩写开始后点击。


autocmd设置变量s:abbrev_list,该变量应包含所有缩写。

该函数CompleteAbbrev()应基于光标之前的单词返回候选列表。

'completefunc'选项的值告诉Vim当您点击时要调用哪个函数C-x C-u
请注意,该选项在缓冲区本地,因此您仍然可以在其他种类的缓冲区中使用其他功能,FileType例如使用autocmd和event。

有关:h complete-functions功能如何工作的更多信息,请参见。


另一种解决方案是使用同义词补全。来自:h i_^x^t

                            *i_CTRL-X_CTRL-T*
CTRL-X CTRL-T       Works as CTRL-X CTRL-K, but in a special way.  It uses
                    the 'thesaurus' option instead of 'dictionary'.  If a
                    match is found in the thesaurus file, all the
                    remaining words on the same line are included as
                    matches, even though they don't complete the word.
                    Thus a word can be completely replaced.

                    For an example, imagine the 'thesaurus' file has a
                    line like this:
                            angry furious mad enraged
                    Placing the cursor after the letters "ang" and typing
                    CTRL-X CTRL-T would complete the word "angry";
                    subsequent presses would change the word to "furious",
                    "mad" etc.
                    Other uses include translation between two languages,
                    or grouping API functions by keyword.

要使用此解决方案,您必须做三件事:

  1. {lhs}所有缩写写在专用文件中。
    例如,/home/user/mysynonyms.txt。并将它们围绕相似的主题分组。
  2. 将这个文件的路径添加到选项中'thesaurus'

    set thesaurus+=/home/user/mysynonyms.txt
    
  3. C-x C-t组内任何缩写名称的开头后打。

例如,假设您具有以下缩写:

iab cfa CFuncA
iab cfb CFuncB
iab cfc CFuncC

iab jfa JavaFuncA
iab jfb JavaFuncB
iab jfc JavaFuncC

iab pfa PhpFuncA
iab pfb PhpFuncB
iab pfc PhpFuncC

您可以根据它们所属的编程语言对它们进行分组。
在内部/home/user/mysynonyms.txt,您将编写:

cpp cfa cfb cfc
php pfa pfb pfc
java jfa jfb jfc

现在,只要您C-x C-t在缩写名称(或其开头)之后打,Vim就会在弹出菜单中显示所有在同一行的缩写。

外观如下:

在此处输入图片说明

请注意,缩写不必以相同的字符开始进行分组,它们可以完全不同。只要它们在同义词文件中位于同一行,Vim就会显示所有它们。

而且,您不必使用编程语言来决定将缩写放在哪个组中。您可以根据要考虑的任何有意义的相似度/主题/类别对它们进行分组。

因此,当您忘记特定的缩写时,可以键入类别的首字母,然后单击C-x C-t并在菜单内选择相关的字母。

编辑:
要在其中转储所有缩写/home/user/mysynonyms.txt,可以使用以下3个Ex命令:

:let abbrev_list = []
:call substitute(join(readfile($MYVIMRC), "\n"), '\v%(^|\n)\s*i?%(nore)?ab%[brev]\s+%(%(\<expr\>|\<buffer\>)\s+){,2}(\k+)', '\=add(abbrev_list, submatch(1))', 'gn')
:call writefile(abbrev_list, '/home/user/mysynonyms.txt')

Edit2:
我在调用函数n时添加了标志,substitute()因为您不需要任何替换。它的唯一目的是在找到列表时在列表内添加缩写。
但是,由于您有很多缩写,这可能会使过程变得毫无用处的缓慢,我不知道。最初,我没有输入它,因为我不知道您使用的是哪个Vim版本。如果您的版本比7.3.627更新,则应该可以,否则必须删除该n标志。


绝佳而全面的答案。你摇滚
1234年

\ v%(^ | \ n)\ s * i?%(nore)?ab%[brev] \ s +%(%(\ <expr \> | \ <buffer \>)\ s +){,2}( \ k +)在我的vimrc文件上不起作用
1234年

@JoobLee它在我的系统上有效,您是否有任何错误消息?它可以使用更简单(但可靠性较差)的正则表达式\vi?abbr\s+(\k+)吗?您能给我链接您的缩写词,看看我是否可以重现您的问题?
user9433424 '16

@JoobLee如果您的Vim版本足够新,请将n标记添加到替代调用中(我已经编辑了答案以包括它)。如果您在自己的位置进行搜索vimrc并复制粘贴\v^\s*i?%(nore)?ab%[brev]\s+%(%(\<expr\>|\<buffer\>)\s+){,2}\zs\k+,它会突出显示您的缩写吗?
user9433424

9

Wikia 提示建议一种有选择地显示您的缩写的方法:

您可以使用列出所有缩写

:ab<CR>

(替换abiab只列出插入模式的缩写)。

您可以列出所有带有相同前缀的缩写

:ab prefix<CR>

这不如缩写词的完成那么理想,但这可能是快速列出现有缩写词的好方法。

为了使该解决方案更有效,一个好的实践是创建特定于文件类型的缩写。例如,此缩写仅在java缓冲区中有用:

iabbrev syso System.out.println("");

因此,最好这样定义它:

autocmd! FileType java :iabbrev <buffer> syso System.out.println("");

仅当您位于Java缓冲区中时,自动命令部分才允许创建缩写,并且该<buffer>选项使缩写只能从该缓冲区访问。

:iab仅当您在Java缓冲区中时,这种方式才会显示缩写。如果您有很多缩写,那么按文件类型创建一个函数会很有趣,该函数将定义所有缩写并让自动命令调用该函数。就像是:

autocmd! FileType latex call CreateLatexAbbrev()

function! CreateLatexAbbrev()
    iabbrev <buffer> something something else
    " All the other latex abbreviations
endfunction

另一个解决方案可能是使用您的缩写列表作为关键字源来创建自己的自动完成功能。

最后,我不得不说,“ 500多个缩写”给我留下了深刻的印象,我不知道您使用的是哪些缩写,但是如果您不熟悉这些代码段的概念,也许对您来说很有趣跟他们。由于它们是通过输入关键字并按热键触发的模板,因此它们比缩写词更灵活,因此可以减少使用的缩写词的数量。看到这里有趣的介绍。


1

如何按文件类型对缩写进行分组?

不要将它们全部保存在~/.vimrc文件中,而是将它们分解并放在运行时目录中的适当位置,该目录~/.vim在类似Unix的操作系统上。

例如,您的Markdown缩写词将位于file中~/.vim/after/ftplugin/markdown.vim,Vim会 Markdown文件类型插件加载检查该文件。

原来我们不应该有大.vimrc文件;使用可获得更多的灵活性$VIMRUNTIME。运行时路径记录在Vim的帮助系统中::h 'runtimepath'

我首先从以 Vim为主题的日历Vimways上出色的从.vimrc到.vim的文章中学到了这一点

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.