Как мне управлять и запоминать многие сокращения в моем vimrc?

10

У меня более 500 сокращений ( iabbr, abbr) и некоторые сопоставления в моем файле vimrc из Java, PHP, C / C ++ и Latex.

Нелегко сразу вспомнить, когда я некоторое время не использую языки.

Мне интересно, смогу ли я сделать завершение по сокращению имени. Есть ли лучший способ получить доступ / управлять всеми этими сокращениями?

1234
источник

Ответы:

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

  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флаг.

user9433424
источник
фантастический и исчерпывающий ответ. ты Рок
1234
\ v% (^ | \ п) \ S * я% (Nore) аб% [Brev] \ S +% (% (\ <выражение \> | \ <буфера \>) \ S +)? {2} ( \ k +) не работает с моим файлом vimrc
1234
@JoobLee Это работает в моей системе, у вас есть какие-либо сообщения об ошибках? Работает ли это с более простым (но менее надежным) регулярным выражением \vi?abbr\s+(\k+)? Не могли бы вы дать мне ссылку с выдержкой из ваших сокращений, чтобы посмотреть, смогу ли я воспроизвести вашу проблему?
user9433424
@JoobLee Если ваша версия Vim достаточно свежая, добавьте nфлаг к вызову замены (я отредактировал ответ, чтобы включить его). Если вы выполняете поиск в своем приложении vimrcи копируете \v^\s*i?%(nore)?ab%[brev]\s+%(%(\<expr\>|\<buffer\>)\s+){,2}\zs\k+его, выделяет ли оно ваши сокращения?
user9433424
9

Анонимный наконечник предлагается метод выборочного отображения сокращений:

Вы можете перечислить все свои сокращения с

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

statox
источник
1

Как насчет группировки сокращений по типу файла?

Вместо того, чтобы ~/.vimrcхранить их все в вашем файле, разбейте их и поместите в правильные места в вашем каталоге времени выполнения, который находится ~/.vimв Unix-подобных операционных системах.

Например, ваши сокращения Markdown будут находиться в файле ~/.vim/after/ftplugin/markdown.vim, который Vim проверяет после загрузки плагина типа файла Markdown.

Оказывается, у нас не должно быть огромных .vimrcфайлов; Вы получаете больше гибкости, используя $VIMRUNTIME. Путь выполнения описан в справочной системе Vim в: :h 'runtimepath'.

Впервые я узнал об этом из прекрасной статьи От .vimrc до .vim в Vimways, посвященной Vimways .

alwillis
источник