Wie verwalte und erinnere ich mich an viele Abkürzungen in meinem vimrc?

10

Ich habe über 500 Abkürzungen ( iabbr, abbr) und einige Zuordnungen in meiner vimrc-Datei von Java, PHP, C / C ++ und Latex.

Es ist nicht leicht, sich sofort zu erinnern, wenn ich die Sprachen einige Zeit nicht benutze.

Ich frage mich, ob ich den Abkürzungsnamen vervollständigen kann. Gibt es eine bessere Möglichkeit, auf all diese Abkürzungen zuzugreifen / sie zu verwalten?

1234
quelle

Antworten:

10

Ich weiß nicht, wie ich über 500 Abkürzungen am besten verwalten kann. Vielleicht könnten Sie sich, wie @statox erklärte, auf lange Sicht Schnipsel ansehen, um diese Zahl zu reduzieren.

Wenn Sie Abkürzungen automatisch vervollständigen möchten, können Sie den folgenden Code ausprobieren:

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

Um es zu verwenden, müssten Sie C-x C-unach dem Beginn einer Abkürzung drücken.


Das Autocmd richtet die Variable ein, s:abbrev_listdie alle Ihre Abkürzungen enthalten soll.

Die Funktion CompleteAbbrev()sollte eine Liste von Kandidaten basierend auf dem Wort vor dem Cursor zurückgeben.

Der 'completefunc'Wert der Option teilt Vim mit, welche Funktion beim Drücken aufgerufen werden soll C-x C-u.
Beachten Sie, dass die Option lokal für den Puffer ist, sodass Sie weiterhin andere Funktionen in verschiedenen Puffertypen verwenden können, FileTypez. B. mit einem Autocmd und dem Ereignis.

Sehen Sie :h complete-functionsfür weitere Informationen darüber , wie die Funktion arbeitet.


Eine andere Lösung wäre die Verwendung der Synonymvervollständigung. Von :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.

Um diese Lösung zu verwenden, müssten Sie drei Dinge tun:

  1. Schreiben Sie {lhs}alle Ihre Abkürzungen in eine dedizierte Datei.
    Zum Beispiel /home/user/mysynonyms.txt. Und gruppieren Sie sie um ähnliche Themen.
  2. Fügen Sie der Option den Pfad zu dieser Datei hinzu 'thesaurus':

    set thesaurus+=/home/user/mysynonyms.txt
    
  3. Treffen Sie C-x C-tnach dem Beginn des Namens einer Abkürzung innerhalb einer Gruppe.

Angenommen, Sie haben die folgenden Abkürzungen:

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

Sie können sie nach der Programmiersprache gruppieren, zu der sie gehören.
Im Inneren /home/user/mysynonyms.txtwürden Sie schreiben:

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

Wenn Sie jetzt C-x C-tnach dem Namen einer Abkürzung (oder nur nach dem Anfang) klicken, sollte Vim im Popup-Menü alle Abkürzungen anzeigen, die sich in derselben Zeile befinden.

So würde es aussehen:

Geben Sie hier die Bildbeschreibung ein

Beachten Sie, dass die Abkürzungen nicht mit denselben Zeichen beginnen müssen, um gruppiert zu werden. Sie können völlig unterschiedlich sein. Solange sie sich in Ihrer Synonymdatei in derselben Zeile befinden, zeigt Vim alle an.

Und Sie müssen nicht die Programmiersprache verwenden, um zu entscheiden, in welche Gruppe eine Abkürzung eingefügt wird. Sie können sie nach jeder sinnvollen Ähnlichkeit / Thema / Kategorie gruppieren, die Sie sich vorstellen.

Wenn Sie also eine bestimmte Abkürzung vergessen, können Sie die ersten Buchstaben einer Kategorie eingeben C-x C-t, die entsprechende im Menü drücken und auswählen.

Bearbeiten:
Um alle Ihre Abkürzungen darin abzulegen /home/user/mysynonyms.txt, können Sie diese 3 Ex-Befehle verwenden:

: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:
Ich habe das Flag hinzugefügt, nwenn die substitute()Funktion aufgerufen wird, da Sie keine Ersetzung benötigen. Der einzige Zweck besteht darin, eine Abkürzung in eine Liste einzufügen, wenn eine gefunden wird.
Aber weil Sie viele Abkürzungen haben, könnte dies den Prozess nutzlos verlangsamen, ich weiß es nicht. Anfangs habe ich es nicht gesagt, weil ich nicht weiß, welche Vim-Version Sie verwenden. Wenn Ihre Version neuer als 7.3.627 ist , sollte dies in Ordnung sein, da Sie sonst das nFlag entfernen müssten .

user9433424
quelle
fantastische und umfassende Antwort. you Rock
1234
\ v% (^ | \ n) \ s * i?% (nore)? ab% [brev] \ s +% (% (\ <Ausdruck \> | \ <Puffer \>) \ s +) {, 2} ( \ k +) funktioniert nicht an meiner vimrc-Datei
1234
@JoobLee Es funktioniert auf meinem System. Haben Sie eine Fehlermeldung? Funktioniert es mit einem einfacheren (aber weniger zuverlässigen) Regex wie \vi?abbr\s+(\k+)? Könnten Sie mir einen Link mit einem Auszug Ihrer Abkürzungen geben, um zu sehen, ob ich Ihr Problem reproduzieren kann?
user9433424
@JoobLee Wenn Ihre Vim-Version aktuell genug ist, fügen Sie dem nErsatzanruf das Flag hinzu (ich habe die Antwort so bearbeitet, dass sie sie enthält). Wenn Sie in Ihrem suchen vimrcund dies kopieren und einfügen \v^\s*i?%(nore)?ab%[brev]\s+%(%(\<expr\>|\<buffer\>)\s+){,2}\zs\k+, werden Ihre Abkürzungen hervorgehoben?
user9433424
9

Ein Wikia- Tipp schlägt eine Methode vor, um Ihre Abkürzungen selektiv anzuzeigen:

Sie können alle Ihre Abkürzungen mit auflisten

:ab<CR>

(Ersetzen abdurch, iabum nur Abkürzungen für den Einfügemodus aufzulisten.)

Und Sie können alle Abkürzungen mit dem gleichen Präfix mit auflisten

:ab prefix<CR>

Dies ist nicht so ideal wie eine Vervollständigung von Abkürzungen, aber dies könnte eine gute Möglichkeit sein, schnell eine Liste Ihrer vorhandenen Abkürzungen zu erhalten.

Um diese Lösung effizienter zu gestalten, empfiehlt es sich, eine für einen Dateityp spezifische Abkürzung zu erstellen. Zum Beispiel ist diese Abkürzung nur in einem Java-Puffer nützlich:

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

Es ist also gut, es so zu definieren:

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

Der Autocommand-Teil ermöglicht das Erstellen der Abkürzung nur, wenn Sie sich in einem Java-Puffer befinden, und die <buffer>Option macht die Abkürzung nur über diesen Puffer zugänglich.

Auf diese Weise :iabwird die Abkürzung nur angezeigt, wenn Sie sich in einem Java-Puffer befinden. Wenn Sie viele Abkürzungen haben, kann es interessant sein, eine Funktion nach Dateityp zu erstellen, die alle Abkürzungen definiert und den automatischen Befehl die Funktion aufrufen lässt. Etwas wie:

autocmd! FileType latex call CreateLatexAbbrev()

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

Eine andere Lösung könnte darin bestehen, eine eigene Funktion zur automatischen Vervollständigung zu erstellen, bei der eine Liste Ihrer Abkürzungen als Quelle für Schlüsselwörter verwendet wird.

Abschließend muss ich sagen, dass ich von "über 500 Abkürzungen" ziemlich beeindruckt bin. Ich weiß nicht, welche Sie verwenden, aber vielleicht wäre es für Sie interessant, sich das Konzept der Snippets anzuschauen, wenn Sie nicht vertraut sind mit ihnen. Da es sich um Vorlagen handelt, die durch Eingabe eines Schlüsselworts und Drücken eines Hotkeys ausgelöst werden, sind sie flexibler als Abkürzungen. Dadurch können Sie möglicherweise die Anzahl der verwendeten Abkürzungen reduzieren. Sehen Sie hier für eine interessante Einführung.

statox
quelle
1

Wie wäre es mit einer Gruppierung der Abkürzungen nach Dateityp?

Anstatt alle in Ihrer ~/.vimrcDatei zu haben, teilen Sie sie auf und platzieren Sie sie an den richtigen Stellen in Ihrem Laufzeitverzeichnis, das sich ~/.vimauf Unix-ähnlichen Betriebssystemen befindet.

Beispielsweise befinden sich Ihre Markdown-Abkürzungen in der Datei ~/.vim/after/ftplugin/markdown.vim, die Vim nach dem Laden des Markdown-Dateityp-Plugins überprüft .

Es stellt sich heraus, dass wir keine großen .vimrcDateien haben sollten. Sie erhalten mehr Flexibilität mit $VIMRUNTIME. Der Laufzeitpfad ist im Hilfesystem von Vim dokumentiert : :h 'runtimepath'.

Das habe ich zum ersten Mal aus dem ausgezeichneten Artikel Von .vimrc bis .vim im Vim-Adventskalender Vimways erfahren .

Alwillis
quelle