Я не знаю, как лучше управлять более чем 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
.
Обратите внимание, что эта опция является локальной для буфера, поэтому вы все равно можете использовать другие функции в буферах другого типа, например, используя autocmd и FileType
событие.
Смотрите :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.
Чтобы использовать это решение, вам нужно сделать 3 вещи:
- Запишите
{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
флаг.