VIM - Dies ist nicht nur ein Editor, sondern eine Integration in Ihre gesamte Arbeitsumgebung

Warum ist Vim / Neovim besonders gut? Die Tatsache, dass Ihr Toolkit nicht nur ein Editor ist (der selbst mit Plugins sehr erweiterbar ist und über umfangreiche Grundfunktionen verfügt und im Bereich der Anpassung sehr flexibel ist), sondern auch Ihre gesamte Arbeitsumgebung mit dem gesamten Unix-Way-Toolkit aus gnu / coreutils und Nicht nur. Sie können jedes Programm oder jeden Interpreter aufnehmen, ohne den Editor zu verlassen, und direkt im Editor verwenden.


Vorwort


Dieser Beitrag wurde in Eile für einen privaten Personenkreis geschrieben, aber ich entschied, dass es durchaus möglich ist, ihn auf Habr zu posten. Für manche kann es eine Inspiration sein, jemand wird helfen, die Philosophie von Vim besser zu verstehen, und jemand wird ein paar Tricks für sich selbst übernehmen. Nur für den Fall, dass ich eine Reservierung mache, von der ich nicht erwarten sollte, dass ich jemandem in den Kommentaren etwas beweise, um Sie beispielsweise davon zu überzeugen, dass Sie auf jeden Fall Ihre fette IDE aufgeben und Vim verwenden müssen, interessiert mich das überhaupt nicht.


Zum Geschäft


Nehmen Sie hier zum Beispiel einen solchen Code (aus der Haskell-Projektkonfiguration), eine Liste von Paketabhängigkeiten (Beispiel in einem Vakuum):


build-depends: X11 , base , directory , extra , GLFW-b , safe , aeson , containers , data-default , text , process , time , dbus 

Was wollen wir


  1. Abhängigkeiten alphabetisch sortieren
  2. Groß- und GLFW-b nicht GLFW-b ( X11 und GLFW-b sollten nicht über alles stehen)
  3. Kommas aeson ( aeson steht ganz oben und es sollte kein Komma mehr auf der linken Seite sein, aber X11 sollte ein Komma auf der linken Seite haben)
  4. Einrückung wiederherstellen (damit Sie den Befehl auch aus dem Verlauf abrufen und in einer anderen Konfiguration mit einer anderen Verschachtelungsebene wiederverwenden oder sogar den Hotkey-Befehl in der Vim-Konfiguration binden können)

Lösung


Wählen Sie zunächst (durch visuelles Hervorheben) die Liste der Abhängigkeiten mit Ausnahme der ersten Zeile der build-depends . Sie können natürlich auch einfach V drücken (visueller Modus mit zeilenweiser Auswahl) und die erforderlichen Zeilen mit jk oder den Aufwärts- und jk auswählen. In meinem Fall mache ich das mit einer Handbewegung und benutze einen benutzerdefinierten Hotkey für den visuellen Modus:


 xn iz <esc>[zV]z 

Da ich mich beispielsweise in der Liste der Abhängigkeiten viz drücke ich einfach auf und alle Abhängigkeiten werden hervorgehoben, weil Die gesamte Falte wird hervorgehoben, was wiederum der aktuelle Verschachtelungsblock ist (da ich die foldmethod als indent definiert foldmethod ). Sie können [zV]z aber auch manuell nacheinander ohne einen benutzerdefinierten Hotkey [zV]z ( [z springt zum Anfang der Falte, a ]z zum Ende), aber seitdem Für mich wird eine solche Operation oft verwendet, dann habe ich sie auf " viz gekürzt. Es gibt keine Modifikatoren wie "Shift" und sie komprimiert Reflexe im Handumdrehen (das nächstgelegene Standardanalog ist " vip , um einen Block zu den nächstgelegenen Leerzeilen auszuwählen).


Drücken Sie dann : (Doppelpunkt), um in den Befehlsmodus zu wechseln und einen Befehl in Bezug auf die aktuelle visuelle Hervorhebung auszuführen. Tatsächlich ist der übliche Befehlsmodus, jedoch mit sofort hinzugefügten Auswahlmarkierungen, d.h. wird so aussehen :'<,'> wobei '<,'> der Auswahlbereich ist, wobei '< die erste Zeile der visuellen Auswahl ist und '> die letzte.


Nachdem wir geklickt haben ! (Ausrufezeichen) auf der Tastatur bedeutet dies, dass alles, was weitergeht, ein Shell / Bash-Befehl (abhängig von den Einstellungen) ist. Es wird so aussehen :'<,'>! . Tatsächlich können Sie nach dem Hervorheben sofort klicken ! und erhalte das gleiche Ergebnis - :'<,'>! .


Diese Operation leitet die hervorgehobenen Zeilen zum Befehl STDIN um und ersetzt die hervorgehobenen Zeilen durch den STDOUT-Auslass aus diesem Befehl. Zum Beispiel können Sie den Befehl sort nur zur Überprüfung verwenden, das Ergebnis ist nicht das, was wir brauchen - '<,'>!sort und drücken Sie die Eingabetaste , wir erhalten:


  build-depends: , aeson , base , containers , data-default , dbus , directory , extra , GLFW-b , process , safe , text , time X11 

Mode mit Coreutils und General Tower


Stellen Sie die vorherige Auswahl wieder her (Sie können gv drücken, um die letzte Auswahl wiederherzustellen) und drücken Sie ! und dann den Aufwärtspfeil - dies stellt den letzten Befehl aus dem Verlauf wieder her, sodass wir nicht noch einmal schreiben müssen. Wir extrahieren einfach den vorherigen Befehl aus dem Verlauf und ändern ihn. Um das Bearbeiten des Befehls zu vereinfachen, können Sie Ctrl + f drücken. Dies wird zusätzlich geöffnet. In einem Fenster mit normaler Standardbearbeitung des Befehls mit allen Funktionen von Vim werden übrigens alle vorherigen Befehle aus dem Verlauf als separate Zeilen angezeigt, die auch ausgewählt, bearbeitet und ausgeführt werden können.


Was ist das Richtige? Sie können sich einen Fund vorstellen. Mein Punkt ist: Zuerst entfernen wir die Kommas, sortieren sie ohne sie (ohne Berücksichtigung der Groß- / Kleinschreibung), dann geben wir die Kommas zurück, mit Ausnahme der allerersten Zeile.


Zuerst entfernen wir die Kommas (und die erste Zeile hat einen zusätzlichen Einzug, damit alle Zeilen den gleichen Einzug haben), indem wir den sed Befehl mit einem regulären Ausdruck ( [, ] - ein Komma oder ein Leerzeichen, und dann ein anderes Leerzeichen, bei dem Klammern durch ein Escape- \(\w\) hervorgehoben werden Block für die Ersetzung, damit es dann als \1 verfügbar ist, \w ist das erste alphabetische Zeichen, bei der Ersetzung stellen wir das alphabetische Zeichen durch Ersetzen von \1 ) wieder her:


 :'<,'>!sed 's/[, ] \(\w\)/\1/' 

Wir bekommen folgendes:


  build-depends: X11 base directory extra GLFW-b safe aeson containers data-default text process time dbus 

Als Nächstes leiten wir (durch das Symbol | das ein Merkmal von bash ist) den Befehl sort sort indem wir den -f für Groß- und Kleinschreibung übergeben:


 :'<,'>!sed 's/[, ] \(\w\)/\1/' | sort -f 

Wir bekommen:


  build-depends: aeson base containers data-default dbus directory extra GLFW-b process safe text time X11 

Fast geschafft Es bleiben nur Kommas und die erste Zeile - ein paar Leerzeichen. Wir werden das gleiche sed , in der Syntax seiner Operationen können Sie Strings und Bereiche von Strings angeben (wie in Vim selbst ist die Syntax die gleiche, gut oder fast die gleiche). Das Präfix 1 bedeutet die erste Zeile, 2,$ bedeutet den Bereich von der 2. Zeile bis zum Ende ( $ bedeutet wie ^ den Anfang der Datei, analog zu den gleichen Zeichen in regulären Ausdrücken, die das Ende und den Anfang der Zeile bedeuten). Mit \w überspringen wir den Einzug und wählen sofort das erste alphabetische Zeichen aus: 1s/\w/ &/ - hier ersetzen wir die erste Zeile, stellen das erste alphabetische Zeichen mit & (ähnlich wie bei \1 bedeutet nur & alles) Während \1 den ersten Block in Klammern bedeutet, werden ein paar Leerzeichen davor eingefügt. Fügen Sie für die verbleibenden Zeilen anstelle von zwei Leerzeichen ein Komma und ein Leerzeichen hinzu, gefolgt von: 2,$s/\w/, &/ . Der gesamte Befehl sieht folgendermaßen aus: sed -e '1s/\w/ &/' -e '2,$s/\w/, &/' , - -e wir, um 2 Operationen voneinander zu trennen. In Vim sieht die gesamte Operation folgendermaßen aus:


 :'<,'>!sed 's/[, ] \([^, ]\)/\1/' | sort -f | sed -e '1s/\w/ &/' -e '2,$s/\w/, &/' 

Wir bewerben uns und bekommen:


  build-depends: aeson , base , containers , data-default , dbus , directory , extra , GLFW-b , process , safe , text , time , X11 

Fertig Es ist nicht mehr erforderlich, ein zweites Mal zu schreiben. Geben Sie einfach die ersten Zeichen ein, zum Beispiel: :'<,'>!se (Sie müssen nur !se drücken), und verwenden Sie den Aufwärtspfeil, um den gewünschten Befehl aus dem Verlauf abzurufen. Auf die eine oder andere Weise empfehle ich oft, solche Dinge sofort zu üben. Auf diese Weise können Sie sowohl Ihre täglichen Arbeitsfähigkeiten in bash als auch in Vim selbst verbessern Im Grunde machst du das Gleiche.


Am Ende kann dieser gesamte Befehl einem Hotkey zugewiesen oder in eine Funktion abstrahiert und überall für einen oder zwei wiederverwendet werden.


Verwendung von PL von Drittanbietern


Anstatt etwas von coreutils aus zu starten, können Sie den Interpreter in einer für Sie geeigneten Sprache ausführen. Ich mache solche Dinge gerne über Perl6 (es wurde kürzlich in Raku umbenannt):


 :'<,'>!perl6 -e 'my @x=lines.map(*.subst(/<[,\s]>\s(\w)/,{$0})).sort(*.lc); @x.shift.subst(/\w/,{q/ /~$_}).say; .subst(/\w/,{q/, /~$_}).say for @x' 

Ja, zumindest im Zoskoscript (node.js):


 :'<,'>!node -e 'let fs=require("fs"), x=fs.readFileSync(process.stdin.fd).toString().replace(/\n$/,'').split(/\n/).map(x=>x.replace(/[, ] (\w)/,"$1")).sort((a,b)=>a.toLowerCase().localeCompare(b.toLowerCase())); console.log(x.shift().replace(/(\w)/," $1")); process.stdout.write(x.map(x=>x.replace(/(\w)/,", $1")).join("\n"))' 

Dies kann auch mit VimL / Vimscript in Vim selbst durchgeführt werden, ohne externe Befehle aufzurufen. Aber in diesem Beitrag geht es nicht darum.


Natürlich können Sie, wie Sie vielleicht erraten haben, Ihr Skript leicht in einer separaten Datei speichern oder sogar ein eigenes Programm kompilieren, das STDIN verwendet, etwas ausgibt, das in STDOUT verarbeitet wurde, und es in Vim einfach durch Aufrufen von (which kann wiederum einem Hotkey zugewiesen werden):


 :'<,'>!~/my-program-or-script 

Wenn Sie also Code in Vim schreiben, steht Ihnen nicht nur Vim selbst zur Verfügung, sondern auch Ihre gesamte Arbeitsumgebung.


Eines der einfachsten Beispiele ist das Zurückweisen einer JSON-Datei:


 :%!jq 

Nur ein paar Tastatureingaben, warum sollten Sie den AST-Parser und -Prettifayer für JSON für jeden neuen Editor / jede neue IDE neu erfinden, wenn Sie einfach eine Datei über jq erstellen und jq ohne Vim zu verlassen? Ich spreche nicht von der Tatsache, dass Sie über jq Ihre große JSON-Datei verarbeiten können, ohne Vim zu verlassen, beispielsweise den gewünschten Schlüssel im Baum zu finden, zu sortieren, nur die erforderlichen Daten zu hinterlassen usw.

Source: https://habr.com/ru/post/de483580/


All Articles