Wie kann ich das Ergebnis einer ".w" -Bewertung am Ende einer Zeile in Vim einfügen?

1134
brilliantlyInsane

Ich möchte in der Lage sein, eine Zeile Javascript (oder anderen Code) in Vim auszuwerten und das Ergebnis in einem Kommentar am Ende der Zeile anzeigen zu lassen.

Zum Beispiel, wenn ich eine Datei wie:

console.log(4 + 5); 

Wenn sich der Cursor in dieser Zeile befindet und ich den Befehl verwende :.w !node -e, wird das Ergebnis " 9" im Puffer unten angezeigt. Wenn ich verwende :. !node -e, wird die gesamte Zeile durch das Ergebnis ersetzt 9.

Wie kann ich stattdessen einen Befehl erstellen, der das Ergebnis in einem Kommentar an das Ende der Zeile anfügt, z.

console.log(4 + 5); // 9 

Bemerkenswert ist auch, dass mit :rgedruckt wird, was in der nächsten Zeile weitergegeben wird. r !echo "This is text."fügt " This is text." in die Zeile unter dem Cursor ein. Jedoch ein Befehl wie ...

:r ". !node -e" 

... wird versuchen, ". !node -e"als Datei anstelle eines Befehls zu lesen ; Ich verstehe dieses Verhalten nicht wirklich, aber es macht die Dinge ein bisschen weniger intuitiv.

Ich möchte, dass das Endergebnis ein wenig an die Art und Weise erinnert, wie der Atom-Texteditor mit Wasserstoff-Kerneln umgeht, wobei das Ergebnis der Codeevalierung auf der linken Seite des Codes erscheint. Es ist geplant, eine Tastenkombination ( <C-Enter>oder <F5>) zu erstellen, um die aktuelle Zeile automatisch auszuwerten und das Ergebnis anzuzeigen.

5

2 Antworten auf die Frage

3
Horst

Wenn Ihre Zeilen wie folgt aussehen: 4 + 5 = könnten Sie Folgendes verwenden:

 : map "_ay / = ^ Mo ^ [!! echo ^ Ra \ | bc ^ MkJ 
  1. _ ............... um zum Anfang der aktuellen Zeile zu springen
  2. "ay / = ^ M ... bis in Puffer a reißen
  3. o ^ [ ........... eine neue leere Zeile erstellen
  4. !! .............. Starten Sie ein Shell-Programm, um das Ergebnis in diese neue Zeile zu schreiben
  5. ^ Ra .......... fügt den Inhalt von Puffer a in das Kommando ein: echo ^ Ra \ | bc ^ M
  6. k .............. gehe zur vorübergehenden Linie
  7. J .............. Nächste Zeile (Ergebnis) mit aktual-Zeile verbinden
  8. Vielleicht möchten Sie ein Leerzeichen aus der Verknüpfung mit x löschen

Ich hoffe, dass du es bist.

Oh wow, das funktioniert fast perfekt! Jetzt muss ich nur einen Weg finden, um ihn an die Analyse von Code anzupassen. Gibt es eine Möglichkeit, dies bis zum Ende der Zeile lesen zu lassen und dann die Zeile an `node` oder` python3` weiterzuleiten? Ich werde als akzeptierte Antwort festlegen, sobald ich herausgefunden habe, wie das geht, da dies meine Frage technisch nicht genau beantwortet. Das heißt, es ist ziemlich nah dran! brilliantlyInsane vor 5 Jahren 0
Ich glaube, Sie haben die ersten beiden Zeichen des Befehls vertauscht. es sollte "_" ay / ... "sein. brilliantlyInsane vor 5 Jahren 0
2
brilliantlyInsane

Dank Horsts Vorschlag konnte ich analysieren, wie man Vim dazu bringt, dies mit jeder Sprache zu tun, die eine Befehlszeilenoption "auswerten" hat. Für JavaScript lautet der Befehl wie folgt:

imap <F5> ^[_"ay$o//^[kJo^[!!node -e "^Ra"^MkJi nmap <F5> _"ay$o//^[kJo^[!!node -e "^Ra"^MkJ 

Für eine Panne:

  1. Beim INSERTModus-Mapping ^[kehrt Escape ( ) zum normalen Modus zurück.
  2. _"ay$setzt die gesamte Zeile in das Register ein a.
  3. o//^[kJ fügt das "//" für einen Kommentar hinzu.
  4. o^[ beginnt eine neue Zeile.
  5. !!node -e "^Ra"^M führt das Register (die Zeile) durch Node.js und gibt das Ergebnis in der aktuellen Zeile zurück.
  6. Zum Schluss wird kJdiese neue Zeile wieder in die erste Zeile gezogen, um zum Kommentar zu werden.
  7. (Für INSERTModus igibt den Modus aus, NORMALum INSERTwieder.)

Das gleiche kann für Python mit ein paar kleinen Änderungen durchgeführt werden:

imap <F5> ^[_"ay$o#^[kJo^[!!python -c "import math; ^Ra"^MkJi nmap <F5> _"ay$o#^[kJo^[!!python -c "import math; ^Ra"^MkJ 

Dafür wird der //Kommentar durch Python's ersetzt #. Außerdem importiere ich das mathModul automatisch, da es für schnelle Berechnungen auf diese Weise sehr nützlich sein kann.

Meine Empfehlung ist, jede dieser Zuordnungen in ihre eigenen ~/.vim/ftplugin/<language>.vimDateien zu platzieren und set ftplugin onin Ihre .vimrc. Dadurch kann sich das Mapping ändern, je nachdem, mit welcher Sprache Sie arbeiten.

Ich hoffe, dass jeder, der interaktiv Code in Vim ausführen möchte, dies finden und möglicherweise sogar verbessern kann. Ein riesiges Dankeschön! geht an Horst für die Beantwortung dieser Frage und den Anstoß für dieses kleine Projekt!