Answers:
我不知道什么是管理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.
要使用此解决方案,您必须做三件事:
{lhs}
所有缩写写在专用文件中。/home/user/mysynonyms.txt
。并将它们围绕相似的主题分组。将这个文件的路径添加到选项中'thesaurus'
:
set thesaurus+=/home/user/mysynonyms.txt
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
标志。
\vi?abbr\s+(\k+)
吗?您能给我链接您的缩写词,看看我是否可以重现您的问题?
n
标记添加到替代调用中(我已经编辑了答案以包括它)。如果您在自己的位置进行搜索vimrc
并复制粘贴\v^\s*i?%(nore)?ab%[brev]\s+%(%(\<expr\>|\<buffer\>)\s+){,2}\zs\k+
,它会突出显示您的缩写吗?
Wikia 提示建议一种有选择地显示您的缩写的方法:
您可以使用列出所有缩写
:ab<CR>
(替换ab
用iab
只列出插入模式的缩写)。
您可以列出所有带有相同前缀的缩写
: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多个缩写”给我留下了深刻的印象,我不知道您使用的是哪些缩写,但是如果您不熟悉这些代码段的概念,也许对您来说很有趣跟他们。由于它们是通过输入关键字并按热键触发的模板,因此它们比缩写词更灵活,因此可以减少使用的缩写词的数量。看到这里有趣的介绍。
如何按文件类型对缩写进行分组?
不要将它们全部保存在~/.vimrc
文件中,而是将它们分解并放在运行时目录中的适当位置,该目录~/.vim
在类似Unix的操作系统上。
例如,您的Markdown缩写词将位于file中~/.vim/after/ftplugin/markdown.vim
,Vim会在 Markdown文件类型插件加载后检查该文件。
原来我们不应该有大.vimrc
文件;使用可获得更多的灵活性$VIMRUNTIME
。运行时路径记录在Vim的帮助系统中::h 'runtimepath'
。
我首先从以 Vim为主题的日历Vimways上出色的从.vimrc到.vim的文章中学到了这一点。