Як мені керувати і запам'ятовувати багато скорочень у моєму vimrc?


10

У файлі vimrc з Java, PHP, C / C ++ та Latex у мене понад 500 скорочень ( iabbr, abbr) та деякі відображення.

Запам'ятати це не просто відразу, коли я певний час не користуюся мовами.

Мені цікаво, чи можу я виконати завершення назви абревіатури. Чи є кращий спосіб отримати доступ / керувати усіма цими абревіатурами?

Відповіді:


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прапор.


фантастична і всебічна відповідь. you Rock
1234

\ v% (^ | \ n) \ s * i?% (nore)? ab% [brev] \ s +% (% (\ <expr \> | \ <буфер \>) \ 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

Порада 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 абревіатур", я не знаю, які ви використовуєте, але, можливо, вам було б цікаво ознайомитись із концепцією фрагментів, якщо ви не знайомі з ними. Оскільки це шаблони, які спрацьовують введенням ключового слова та натисканням швидкої клавіші, вони більш гнучкі, ніж абревіатури, вони можуть дозволяти вам зменшити кількість скорочень, які ви використовуєте. Дивіться тут цікавий вступ.


1

Як щодо групування абревіатур за філейтипом?

Замість того, щоб усі вони були у вашому ~/.vimrcфайлі, розбийте їх і помістіть їх у відповідні місця у вашому каталозі виконання, який знаходиться ~/.vimв операційних системах, схожих на Unix.

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

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

Про це я вперше дізнався із чудової статті Від .vimrc до .vim у календарі пригод Vimways з тематикою Vim .

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.