Frage Wie fügt man in VIM automatisch eine Zeichenfolge in den Kopf einer neu erstellten Datei ein?


Um zu spezifizieren, was ich machen möchte ist:

  • wenn ich erstelle xxx.php,#!/usr/bin/env php wird die erste Zeile der Datei sein
  • wenn ich erstelle xxx.py,#!/usr/bin/env python wird zuerst hinzugefügt.

Wie kann ich das erreichen? Danke!


4
2018-06-25 03:10


Ursprung




Antworten:


Nach einigem Suchen finde ich Ein Eintrag in SO, die mein Problem mit Templates lösen kann. Hoffentlich ist es hilfreich für euch.

Erstellen Sie Vorlagen pythontmp.txt und phptmp.txt in einigen Verzeichnissen (Beispiel:~/.vim/templates/)Wie unten

#!/usr/bin/env python(php)

Fügen Sie folgende Einstellung hinzu .vimrc

autocmd bufnewfile *.py :0r ~/.vim/templates/pythontmp.txt
autocmd bufnewfile *.php :0r ~/.vim/templates/phptmp.txt

9
2018-06-25 07:47



+1 Selbstantworten sind gut für SU (das ist auch der richtige Weg). - msw


Ich bin mir nicht sicher, ob Sie vim so einrichten können, dass Sie dies ohne Hilfe tun. Sie können jedoch ein Hilfsskript erstellen, um es für Sie zu tun.

Angenommen, eine Linux-Umgebung ... Dieses Skript überprüft die Dateierweiterung und erstellt bei Bedarf vor dem Aufruf von vim die Datei mit der Kopfzeile.

#/bin/bash

type=`expr "\$1" : ".*\.\(.*\)"`   # Check the file extension

case "$type" in
    py) 
    interpreter=python;
    ;;
    php)
    interpreter=php;
    ;;
esac

if test ${interpreter+defined}; then echo "#!/usr/bin/env $interpreter" > $1 && /usr/bin/vim $1;
else /usr/bin/vim $1;
fi

Sie könnten dann dieses Skript alias ausführen, um anstelle von vim zu laufen.

alias vim='/path/to/script.sh'

1
2018-06-25 07:02



Sie könnten auch vim plugins / scripts untersuchen - Tim Kane
Yeah, ich bin jetzt dabei ${interpreter+defined} Ich muss löschen +defined und lass es funktionieren. - SpawnST
Es ist ein Mechanismus (mit Parametererweiterung), um zu testen, ob die Variable $ interpreter definiert wurde. Sie könnten genauso einfach $ {interpreter + blah} schreiben, um den gleichen Effekt zu erzielen. $ {var + word} # Wenn var definiert ist, benutze "word"; sonst nichts - Tim Kane
Oh ich hab dich, danke :) - SpawnST


Es gibt viele Plugins das bieten diese Funktion. Einige lassen Sie sogar automatisch verschiedene Dinge ableiten, oder sogar die Kopfzeile abhängig von dem Ordner, in dem Sie Ihre neue Datei erstellen (mu-Vorlage).


1
2018-06-25 09:25



+1 ja, viele Plugins, die das eingebaute "autocmd" einfacher machen. Alles läuft unter den Begriffen "Vorlagen" und "Skelette". - akira


Ich mag den Ansatz, eine vim-Funktion zu definieren, um die Arbeit zu erledigen, auf diese Weise wird es viel einfacher, kompliziertere Dinge zu tun. Zum Beispiel, wenn der eingefügte Text vom Namen der Datei abhängig ist, wie es bei C / C ++ üblich ist. Mein C / C ++ sieht so aus:

autocmd BufNewFile *.{h,hpp} call <SID>insert_c_gates() 

...

function! s:insert_c_gates()
   let gatename = <SID>get_gate_name()
   execute "normal i#ifndef " . gatename
   execute "normal o#define " . gatename
   execute "normal Go#endif /* " . gatename . " */"
   normal kk
endfunction

Die Funktion get_get_name () bildet den Namen des Gatters aus dem Namen der zu bearbeitenden Datei und hängt von dem Projekt ab, an dem ich gerade arbeite, da einige Projekte eine bestimmte Formatierung wünschen.


1
2018-06-25 14:05



Ich spüre, dass Ihre Lösung leistungsfähiger ist, aber die Funktion nicht ganz versteht. - SpawnST
Eigentlich mit spielen :exe+:normal (/:put) ist relativ mühsam im Vergleich zu Lösungen wie mu-template (vgl code.google.com/p/lh-vim/source/browse/mu-template/trunk/after/...). Das Extrahieren der Header-Funktion ist sehr einfach, solange das Template Expander Plugin Aufrufe an "externe" viml-Funktionen unterstützt. - Luc Hermitte
Ja, der Punkt ist nicht die Ausführung und normale Kombinationen (ich habe das vor vielen Jahren geschrieben und seitdem nicht geändert) ... aber nur die Tatsache, dass Sie mit einem Funktionsaufruf Zugriff auf alle Skript-Möglichkeiten von vim haben Anstatt nur eine Vorlage einzufügen. Plugins bieten definitiv einige nette Benutzerfreundlichkeit, aber wenn Sie Ihre eigene Lösung ohne ein Plugin haben wollen, ist der Funktionsansatz ein guter Ausgangspunkt für alle Lösungen. - Neg_EV
Was in meiner Funktion passiert, ist, dass ich eine Funktion get_gate_name habe, die abhängig vom Pfad der Datei den Namen bestimmt (ich lasse meine Projekte in einem Projektordner so organisiert, dass ich das tun kann). Sobald ich den Namen habe, füge ich die Tore (auf sehr primitive Weise) ein, indem ich die normalen Befehle ausführe. Ein weiterer Grund, warum ich dies tue, ist, dass ich eine UpdateGates-Funktion geschrieben habe, die eine Datei mit vorhandenen Gates aktualisiert, damit ich sie nach Belieben aktualisieren kann (zum Beispiel, wenn ich eine Datei umbenenne). Dies erlaubt mir, die Funktionen wiederzuverwenden, bei denen eine Template / Plugin-Lösung nicht so einfach zu machen ist. - Neg_EV