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-u
nach dem Beginn einer Abkürzung drücken.
Das Autocmd richtet die Variable ein, s:abbrev_list
die 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, FileType
z. B. mit einem Autocmd und dem Ereignis.
Sehen Sie :h complete-functions
fü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:
- Schreiben Sie
{lhs}
alle Ihre Abkürzungen in eine dedizierte Datei.
Zum Beispiel /home/user/mysynonyms.txt
. Und gruppieren Sie sie um ähnliche Themen.
Fügen Sie der Option den Pfad zu dieser Datei hinzu 'thesaurus'
:
set thesaurus+=/home/user/mysynonyms.txt
Treffen Sie C-x C-t
nach 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.txt
würden Sie schreiben:
cpp cfa cfb cfc
php pfa pfb pfc
java jfa jfb jfc
Wenn Sie jetzt C-x C-t
nach 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:
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, n
wenn 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 n
Flag entfernen müssten .
\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?n
Ersatzanruf das Flag hinzu (ich habe die Antwort so bearbeitet, dass sie sie enthält). Wenn Sie in Ihrem suchenvimrc
und dies kopieren und einfügen\v^\s*i?%(nore)?ab%[brev]\s+%(%(\<expr\>|\<buffer\>)\s+){,2}\zs\k+
, werden Ihre Abkürzungen hervorgehoben?Ein Wikia- Tipp schlägt eine Methode vor, um Ihre Abkürzungen selektiv anzuzeigen:
Sie können alle Ihre Abkürzungen mit auflisten
(Ersetzen
ab
durch,iab
um nur Abkürzungen für den Einfügemodus aufzulisten.)Und Sie können alle Abkürzungen mit dem gleichen Präfix mit auflisten
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:
Es ist also gut, es so zu definieren:
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
:iab
wird 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: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.
quelle
Wie wäre es mit einer Gruppierung der Abkürzungen nach Dateityp?
Anstatt alle in Ihrer
~/.vimrc
Datei zu haben, teilen Sie sie auf und platzieren Sie sie an den richtigen Stellen in Ihrem Laufzeitverzeichnis, das sich~/.vim
auf 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
.vimrc
Dateien 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 .
quelle