Я не знаю, який найкращий спосіб керувати понад 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
прапор.