Jak zarządzać i zapamiętać wiele skrótów w moim vimrc?


10

Mam ponad 500 skrótów ( iabbr, abbr) i kilka mapowań w moim pliku vimrc z Java, PHP, C / C ++ i Latex.

Nie jest łatwo zapamiętać od razu, kiedy nie używam języków przez pewien czas.

Zastanawiam się, czy mogę uzupełnić nazwę skróconą. Czy istnieje lepszy sposób na dostęp do tych skrótów i zarządzanie nimi?

Odpowiedzi:


10

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-upo początku skrótu.


Autocmd ustawia zmienną, s:abbrev_listktó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, FileTypena przykład używając autocmd i zdarzenia.

Zobacz :h complete-functionswię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:

  1. Napisz {lhs}wszystkie swoje skróty w dedykowanym pliku.
    Na przykład /home/user/mysynonyms.txt. I zgrupuj je wokół podobnych tematów.
  2. Dodaj ścieżkę do tego pliku do opcji 'thesaurus':

    set thesaurus+=/home/user/mysynonyms.txt
    
  3. Hit C-x C-tpo 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.txtnapiszesz:

cpp cfa cfb cfc
php pfa pfb pfc
java jfa jfb jfc

Teraz, za każdym razem, gdy naciskasz C-x C-tna 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:

wprowadź opis zdjęcia tutaj

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-ti 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ę, ngdy 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ąć nflagę.


fantastyczna i wyczerpująca odpowiedź. ty Rock
1234

\ v% (^ | \ n) \ s * i?% (nore)? ab% [brev] \ s +% (% (\ <wyrażenie \> | \ <bufor \>) \ s +) {, 2} ( \ k +) nie działa na moim pliku vimrc
1234

@ JoobLee Działa w moim systemie, czy masz jakiś komunikat o błędzie? Czy działa z prostszym (ale mniej niezawodnym) wyrażeniem regularnym \vi?abbr\s+(\k+)? Czy możesz podać mi link z fragmentem skrótów, aby sprawdzić, czy mogę odtworzyć Twój problem?
user9433424

@JoobLee Jeśli twoja wersja Vima jest wystarczająco aktualna, dodaj nflagę do wywołania zastępczego (zredagowałem odpowiedź, aby ją uwzględnić). Jeśli przeprowadzasz wyszukiwanie vimrci kopiujesz-wklejasz to \v^\s*i?%(nore)?ab%[brev]\s+%(%(\<expr\>|\<buffer\>)\s+){,2}\zs\k+, czy podświetla to twoje skróty?
user9433424

9

Wskazówka typu wiki sugeruje metodę selektywnego wyświetlania skrótów:

Możesz wymienić wszystkie swoje skróty za pomocą

:ab<CR>

(zamień abna, iababy wyświetlić tylko skróty trybów wstawiania)

I możesz wymienić wszystkie skróty z tym samym prefiksem z

:ab prefix<CR>

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:

iabbrev syso System.out.println("");

Warto więc zdefiniować to w ten sposób:

autocmd! FileType java :iabbrev <buffer> syso System.out.println("");

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 :iabwyś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:

autocmd! FileType latex call CreateLatexAbbrev()

function! CreateLatexAbbrev()
    iabbrev <buffer> something something else
    " All the other latex abbreviations
endfunction

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.


1

Co powiesz na pogrupowanie skrótów według rodzaju pliku?

Zamiast umieszczać je wszystkie w ~/.vimrcpliku, podziel je i umieść w odpowiednich miejscach w katalogu wykonawczym, który znajduje się ~/.vimw 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 .vimrcplikó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 .

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.