Я не знаю, как лучше управлять более чем 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
флаг.
\vi?abbr\s+(\k+)
? Не могли бы вы дать мне ссылку с выдержкой из ваших сокращений, чтобы посмотреть, смогу ли я воспроизвести вашу проблему?n
флаг к вызову замены (я отредактировал ответ, чтобы включить его). Если вы выполняете поиск в своем приложенииvimrc
и копируете\v^\s*i?%(nore)?ab%[brev]\s+%(%(\<expr\>|\<buffer\>)\s+){,2}\zs\k+
его, выделяет ли оно ваши сокращения?Анонимный наконечник предлагается метод выборочного отображения сокращений:
Вы можете перечислить все свои сокращения с
(заменить
ab
наiab
к списку только режим вставки сокращений)И вы можете перечислить все сокращения с одинаковым префиксом с
Это не так идеально, как завершение сокращений, но это может быть хорошим способом быстрого получения списка существующих сокращений.
Чтобы сделать это решение более эффективным, хорошей практикой будет создание аббревиатуры, специфичной для типа файла. Например, это сокращение полезно только в буфере Java:
Так что хорошо бы определить это так:
Часть автокоманды позволяет создавать аббревиатуру только тогда, когда вы находитесь в буфере Java, и
<buffer>
опция делает аббревиатуру доступной только из этого буфера.Этот способ
:iab
будет отображать сокращение только тогда, когда вы находитесь в буфере Java. Если у вас много сокращений, было бы интересно создать функцию по типу файла, которая бы определяла все сокращения и позволяла автокоманде вызывать функцию. Что-то вроде:Другим решением может быть создание собственной функции автозаполнения с использованием списка ваших сокращений в качестве источника ключевых слов.
Наконец, я должен сказать, что на меня произвели большое впечатление «более 500 сокращений», я не знаю, какие вы используете, но, возможно, вам было бы интересно взглянуть на концепцию фрагментов, если вы не знакомы с ними. Поскольку они являются шаблонами, которые запускаются путем ввода ключевого слова и нажатия горячей клавиши, они более гибкие, чем сокращения, это может позволить вам сократить количество используемых сокращений. Смотрите здесь для интересного введения.
источник
Как насчет группировки сокращений по типу файла?
Вместо того, чтобы
~/.vimrc
хранить их все в вашем файле, разбейте их и поместите в правильные места в вашем каталоге времени выполнения, который находится~/.vim
в Unix-подобных операционных системах.Например, ваши сокращения Markdown будут находиться в файле
~/.vim/after/ftplugin/markdown.vim
, который Vim проверяет после загрузки плагина типа файла Markdown.Оказывается, у нас не должно быть огромных
.vimrc
файлов; Вы получаете больше гибкости, используя$VIMRUNTIME
. Путь выполнения описан в справочной системе Vim в::h 'runtimepath'
.Впервые я узнал об этом из прекрасной статьи От .vimrc до .vim в Vimways, посвященной Vimways .
источник