我的vimrc文件中有来自Java,PHP,C / C ++和Latex的500多个缩写(iabbrabbr)和一些映射。

不使用时不容易马上记住语言有一段时间了。

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

#1 楼

我不知道什么是管理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


另一种解决方案是使用同义词补全。来自:h complete-functions

                            *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.


要使用此解决方案,您需要做3件事:


写所有您的缩写放在一个专用文件中。
例如:h i_^x^t。并将它们围绕相似的主题分组。

将此文件的路径添加到选项{lhs}中:

set thesaurus+=/home/user/mysynonyms.txt


在开始后点击/home/user/mysynonyms.txt组中任何缩写的名称。例如,假设您具有以下缩写:

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


您可以根据它们所属的编程语言。
'thesaurus'内,您将这样写:开始),Vim应该在弹出菜单中显示同一行中的所有缩写。

这是它的外观:



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

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

因此,当忘记特定缩写时,可以键入类别的首字母,按C-x C-t并选择菜单中相关的一个。

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

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


Edit2:
我在调用C-x C-t函数时添加了标记C-x C-t,因为您不需要任何替换。唯一的目的是在找到列表时在列表内添加缩写。
但是由于您有很多缩写,所以这可能会使过程变得毫无用处,我不知道。最初,我没有输入它是因为我不知道您使用的是哪个Vim版本。如果您的版本高于7.3.627,则应该可以,否则必须删除/home/user/mysynonyms.txt标志。

评论


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

– 1234
16年5月12日在17:52

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

– 1234
16年5月12日在19:06



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

–user9433424
16年5月12日在19:12



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

–user9433424
16年5月12日在19:26



#2 楼

Wikia提示提出了一种有选择地显示您的缩写的方法:仅列出插入模式缩写)

并且可以列出所有具有相同前缀的缩写,并带有

:ab<CR>


缩写的完成,但这可能是快速列出现有缩写的一种好方法。

要使此解决方案更有效,一种好的做法是创建特定于文件类型的缩写。例如,此缩写仅在Java缓冲区中有用:

:ab prefix<CR>


因此最好这样定义:

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


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

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

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


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

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

#3 楼

如何将缩写按文件类型分组?

不是将所有缩写都放在您的~/.vimrc文件中,而是将它们分解并放在运行时目录中的适当位置,在类似Unix的操作中为~/.vim系统。例如,您的Markdown缩写将位于文件~/.vim/after/ftplugin/markdown.vim中,该文件将在Markdown文件类型插件加载后由Vim检查。

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

我是从以主题为Vim的日历Vimways上出色的从.vimrc到.vim的优秀文章中学到这一点的。