Nie wiem, jak najlepiej zarządzać ponad 500 skrótami. Być może w dłuższej perspektywie, jak wyjaśnił @statox, możesz rzucić okiem na fragmenty, aby zmniejszyć tę liczbę.
A jeśli chcesz automatycznie uzupełniać skróty, możesz wypróbować następujący kod:
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
Aby go użyć, musisz trafić C-x C-u
po początku skrótu.
Autocmd ustawia zmienną, s:abbrev_list
która powinna zawierać wszystkie twoje skróty.
Funkcja CompleteAbbrev()
powinna zwrócić listę kandydatów na podstawie słowa przed kursorem.
Wartość 'completefunc'
opcji mówi Vimowi, do której funkcji należy zadzwonić po naciśnięciu C-x C-u
.
Zauważ, że opcja jest lokalna dla bufora, więc nadal możesz używać innych funkcji w różnego rodzaju buforach, FileType
na przykład używając autocmd i zdarzenia.
Zobacz :h complete-functions
więcej informacji na temat działania tej funkcji.
Innym rozwiązaniem byłoby użycie uzupełniania synonimów. Od :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.
Aby skorzystać z tego rozwiązania, musisz zrobić 3 rzeczy:
- Napisz
{lhs}
wszystkie swoje skróty w dedykowanym pliku.
Na przykład /home/user/mysynonyms.txt
. I zgrupuj je wokół podobnych tematów.
Dodaj ścieżkę do tego pliku do opcji 'thesaurus'
:
set thesaurus+=/home/user/mysynonyms.txt
Hit C-x C-t
po początku nazwy dowolnego skrótu w grupie.
Załóżmy na przykład, że masz następujące skróty:
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
Możesz pogrupować je według języka programowania, do którego należą.
W środku /home/user/mysynonyms.txt
napiszesz:
cpp cfa cfb cfc
php pfa pfb pfc
java jfa jfb jfc
Teraz, za każdym razem, gdy naciskasz C-x C-t
na nazwę skrótu (lub tylko jego początku), Vim powinien wyświetlać w menu podręcznym wszystkie skróty, które znajdują się w tej samej linii.
Oto jak by to wyglądało:
Pamiętaj, że skróty nie muszą zaczynać się od tych samych znaków, aby je pogrupować, mogą być zupełnie inne. Dopóki znajdują się w tej samej linii w pliku synonimów, Vim pokaże je wszystkie.
I nie musisz używać języka programowania, aby zdecydować, w której grupie umieścić skrót. Możesz je pogrupować według dowolnych znaczących podobieństw / tematów / kategorii.
Jeśli więc zapomnisz określony skrót, możesz wpisać pierwsze litery kategorii, nacisnąć C-x C-t
i wybrać odpowiednią w menu.
Edycja:
aby zrzucić wszystkie skróty /home/user/mysynonyms.txt
, możesz użyć 3 poleceń 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')
Edycja2:
Dodałem flagę, n
gdy substitute()
funkcja jest wywoływana, ponieważ nie potrzebujesz żadnego podstawienia. Jego jedynym celem jest dodanie skrótu do listy, gdy tylko zostanie znaleziona.
Ale ponieważ masz wiele skrótów, może to spowodować bezużyteczne spowolnienie procesu, nie wiem. Początkowo nie umieściłem tego, ponieważ nie wiem, jakiej wersji Vima używasz. Jeśli twoja wersja jest nowsza niż 7.3.627 , powinna być w porządku, w przeciwnym razie będziesz musiał usunąć n
flagę.
\vi?abbr\s+(\k+)
? Czy możesz podać mi link z fragmentem skrótów, aby sprawdzić, czy mogę odtworzyć Twój problem?n
flagę do wywołania zastępczego (zredagowałem odpowiedź, aby ją uwzględnić). Jeśli przeprowadzasz wyszukiwanievimrc
i kopiujesz-wklejasz to\v^\s*i?%(nore)?ab%[brev]\s+%(%(\<expr\>|\<buffer\>)\s+){,2}\zs\k+
, czy podświetla to twoje skróty?Wskazówka typu wiki sugeruje metodę selektywnego wyświetlania skrótów:
Możesz wymienić wszystkie swoje skróty za pomocą
(zamień
ab
na,iab
aby wyświetlić tylko skróty trybów wstawiania)I możesz wymienić wszystkie skróty z tym samym prefiksem z
To nie jest tak idealne jak uzupełnienie skrótów, ale może to być dobry sposób, aby szybko uzyskać listę istniejących skrótów.
Aby uczynić to rozwiązanie bardziej wydajnym, dobrą praktyką byłoby utworzenie skrótu specyficznego dla rodzaju pliku. Na przykład ten skrót jest użyteczny tylko w buforze Java:
Warto więc zdefiniować to w ten sposób:
Część autocommand pozwala na tworzenie skrótu tylko wtedy, gdy jesteś w buforze java, a
<buffer>
opcja udostępnia skrót tylko z tego bufora.W ten sposób
:iab
wyświetli się skrót tylko w buforze Java. Jeśli masz wiele skrótów, interesujące może być utworzenie funkcji według rodzaju pliku, która zdefiniowałaby wszystkie skróty i pozwoliłaby, aby funkcja automatycznego wywoływania wywoływała tę funkcję. Coś jak:Innym rozwiązaniem może być utworzenie własnej funkcji autouzupełniania przy użyciu listy skrótów jako źródła słów kluczowych.
Wreszcie muszę powiedzieć, że jestem pod wrażeniem „ponad 500 skrótów”, nie wiem, których używasz, ale być może byłoby interesujące, gdybyś zapoznał się z koncepcją fragmentów, jeśli nie znasz z nimi. Ponieważ są to szablony uruchamiane po wprowadzeniu słowa kluczowego i naciśnięciu klawisza skrótu, są one bardziej elastyczne niż skróty, dzięki czemu możesz zmniejszyć liczbę używanych skrótów. Zobacz tutaj ciekawe wprowadzenie.
źródło
Co powiesz na pogrupowanie skrótów według rodzaju pliku?
Zamiast umieszczać je wszystkie w
~/.vimrc
pliku, podziel je i umieść w odpowiednich miejscach w katalogu wykonawczym, który znajduje się~/.vim
w systemach operacyjnych typu Unix.Na przykład skróty Markdown będą znajdować się w pliku
~/.vim/after/ftplugin/markdown.vim
, który Vim sprawdza po załadowaniu wtyczki typu pliku Markdown.Okazuje się, że nie powinniśmy mieć wielkich
.vimrc
plików; zyskujesz większą elastyczność użytkowania$VIMRUNTIME
. Ścieżka wykonawcze jest udokumentowane w systemie pomocy Vima::h 'runtimepath'
.Po raz pierwszy dowiedziałem się o tym z doskonałego artykułu Od .vimrc do .vim w kalendarzu adwentowym Vimways o tematyce Vim .
źródło