Intermediate VimScript

Im Tutorial Grundlegende Vim-Konfiguration, Ich habe Ihnen die Grundlagen der Konfiguration von a gezeigt Vim Editor. Jetzt ist es Zeit mehr zu lernen. VimScript ist eine vollständige Programmiersprache, mit der Sie ein beliebiges Automatisierungsprogramm erstellen können, das Sie möglicherweise benötigen. Dieses Tutorial bringt Ihr Wissen auf die nächste Ebene, mit einem Projektverzeichnis-Struktur-Ersteller Autobefehle, und einen Blick auf die Maximum-Awesome Erweiterung für MacVim.

Autobefehle

Autobefehle sind Befehle zu haben Vim Führen Sie eine Aktion aus, wenn eine bestimmte Bedingung zutrifft: Erstellen einer neuen Datei, Schreiben in eine Datei usw..

Dies ist eine großartige Möglichkeit, einige der Aufgaben, die Sie in einem Projekt erledigen müssen, zu automatisieren. Zum Beispiel, wenn Sie ein speichern SASS Datei, eine autobefehl kann es normal kompilieren CSS für dich.

Das Format für eine autobefehl ist:

autocmd    

woher ist die Editoraktion, auf die der Befehl warten soll. Sie können auch mehrere Aktionen gleichzeitig angeben, indem Sie sie durch ein Komma trennen.

Mit 86 möglich Ich werde sie hier nicht alle beschreiben. Um die vollständige Liste anzuzeigen, können Sie eingeben : help autocmd-events-abc. Dadurch wird ein anderer Puffer mit der vollständigen Liste geöffnet. Für das Demonstrationsprogramm werde ich die verwenden BufNewFile Aktion, um die Funktion auszuführen, um nach einer Ordnerstruktur für ein Projektverzeichnis zu suchen und diese zu erstellen.

Das ist ein regulärer Ausdruck, auf den der Dateiname angewendet werden soll.

Das ist der eigentliche Befehl in VimScript ausführen, wenn die passiert, dass das passt . Es muss mit einem Doppelpunkt beginnen, :, wie Sie es in der Statuszeile des Editors sehen würden.

Da ich viele Websites entwickle, erstellt die Helper-Funktion die erforderliche Projektstruktur für eine neue Website. deshalb, die autobefehl muss auslösen HTML Dateierstellung. Das benötigte Format ist:

Funktion! CreateProject (Datei) echo "Speichern" a: file endfunc autocmd BufNewFile * .html: CreateProject aufrufen (erweitern ('%: p')) 

Die Funktion für das Projekt ist nur das Skelett. Im Verlauf des Tutorials füge ich dieser Funktion weitere hinzu.

Mit diesem in der .vimrc Datei, wird der Dateiname in der Statusleiste angezeigt, wenn Sie eine neue öffnen HTML Datei in einem Puffer. Sie können dies tun, indem Sie die :Neu Befehl zum Erstellen eines neuen Puffers mit dem angegebenen Dateinamen oder beim Öffnen Vim mit einem Dateinamen in der Befehlszeile.

Das erweitern ('%: p') Makro gibt den vollständigen Pfad zur neuen Datei an, wenn die autobefehl löst aus. So funktioniert die Funktion Projekt erstellen erhält den Namen der Datei und das Verzeichnis.

Dies funktioniert gut beim einfachen Öffnen und Schließen Vim ohne die Konfigurationsdatei jemals neu zu laden. In manchen Fällen müssen Sie jedoch die Konfigurationsdatei anpassen und ohne Beenden neu laden. Vim wird dann die durchführen autocmd mehrmals pro neuem Puffer. Das könnte ein Durcheinander verursachen.

Sie müssen also das setzen autocmd In ein Augroup zum Autocomand Group. Löschen Sie dann die Gruppe, bevor Sie einen neuen Befehl hinzufügen. Das autocmd Zeile wird zu:

augroup CreateProject autocmd! autocmd BufNewFile * .html: Rufen Sie CreateProject (expand ('%: p')) auf. augroup END 

Das autocmd! erzählt Vim zu vergessen, was vorher in dieser Gruppe war. Verwenden Sie diesen Block anstelle von autocmd Zeile in der letzten Liste. Dies ist eine gute Praxis beim Schreiben autocmds.

Mit dem bisher erstellten Skript in geladen Vim, wieder öffnen Vim mit dieser Kommandozeile: vim test.html. Das Bild oben ist das, was Sie erhalten. Es wird der Pfad zur neuen Datei angegeben. Wenn Sie dasselbe tun, aber bei einer bereits vorhandenen Datei, erhalten Sie diese Aufforderung nicht in der unteren Zeile.

Datenstrukturen

VimScript hat mehr als nur Variablen. Sie können auch Listen verwenden. Eine Liste ist eine Gruppierung von Objekten zu einer Variablen. Die Liste eignet sich hervorragend zum Speichern verwandter Informationen. Beim Erstellen einer Dateistruktur gibt es zwei Listen: Liste der zu erstellenden Verzeichnisse und eine Liste der zu erstellenden Dateien.

Mit dem geben Sie eine Liste an []. Dazu erstellen Sie zwei Listen wie folgt:

let dirs = ["/ js", "/ js / final", "/ css", "/ css / final", "/ doc"] let files = ["/ js / base.js", "/ css / base.css "," /doc/help.html "] 

Dadurch werden zwei Listen erstellt: eine aufgerufen dirs und die anderen "Dateien". Wenn Sie überprüfen möchten, was in einer Liste enthalten ist, können Sie es mit einem Index referenzieren. Merken, VimScript hat null basierte Indizierung. Um das erste Element zu erhalten, müssen Sie den Index von Null verwenden. Sobald dies in deinem ist .vimrc Datei und Sie laden es neu, Sie können sie mit diesem sehen:

: Echo-Dateien [0] 

Dadurch wird „/js/base.js“ in der Statuszeile angezeigt. Sie können die Werte auch ausgehend vom rechten Wert mit einem negativen Index referenzieren. Deshalb,

: Echo-Dateien [-2] 

"/css/base.css" wird in der Statuszeile angezeigt. Sie können sogar eine Untergruppe von Elementen wie diese erhalten:

: Echo-Dateien [1: 2] 

Dies wird die Zeichenfolge verursachen ['/css/base.css', '/doc/help.html'] in der Statuszeile anzeigen. Eine Untermenge einer Menge ist immer noch eine Menge!

Ich hatte die beiden Listendefinitionen außerhalb der Funktion nur zu Demonstrationszwecken. Es ist am besten, keine Variablen in der zu erstellen global Gültigkeitsbereich (dh außerhalb einer Funktion). Aufgrund der vielen globalen Variablen ist der globale Gültigkeitsbereich unübersichtlich. Es kann auch mit anderen Skripten auf der Straße kollidieren.

Programmablaufsteuerung

Um jedes Element in den Listen zu bearbeiten, verwende ich ein zum-Schleifenstruktur. EIN zum-Die Schleife führt den eingeschlossenen Code wiederholt aus, bis eine Bedingung eintritt. Um jedes Element in der Liste zu durchlaufen, wird der Code wie folgt:

Funktion! CreateProject (Datei) let dirs = ["/ js", "/ js / final", "/ css", "/ css / final", "/ doc"] let files = ["/ js / base.js", "/css/base.css", "/doc/help.html"] für dir in dirs endfor für den Namen in Dateien end für endfunc autocmd BufNewFile * .html: CreateProject (expand ('%: p')) 

Die beiden Listen befinden sich jetzt in der Funktion und zwei zum Schleifen durchlaufen jede Liste. Beachten Sie, dass vor dem eine neue Variable steht im Anweisung und die Liste nach dem im Aussage. Die neue Variable erhält jedes Element im Array sequentiell.

Es gibt eine andere Schleifenstruktur in VimScript nannte das während-Schleife. Die Grundform ist:

lass index = 0 während index < len(dirs) echo l:dirs[index] l:index += 1 endwhile 

Dieser Code durchläuft jedes Element in der dirs liste und sende es an die Statuszeile. Beachten Sie die neue Variable Index. Diese Variable dient dazu, die Anzahl der Wiederholungen der Schleife zu verfolgen und nacheinander jedes Element in der Liste abzurufen. Für das Arbeiten mit Listen ist das zum-Schleife ist effektiver.

Funktion beenden

Mit den Datenstrukturen und Schleifen werde ich jetzt den Code fertigstellen. Der Rest des Codes sieht so aus:

Funktion! CreateProject (Datei) let dirs = ["/ js", "/ js / final", "/ css", "/ css / final", "/ doc"] let files = ["/ js / base.js", "/css/base.css", "/doc/help.html"] let parent = fnamemodify (a: file, ": p: h") für dir in dirs let newdir = l: parent. dir if! isdirectory (l: newdir) Aufruf mkdir (l: newdir) endif endfür den Namen in Dateien let newfile = l: parent. name if! filereadable (newfile) Aufrufsystem ("touch". l: newfile) endif endfor endfunc autocmd BufNewFile * .html: CreateProject aufrufen (expand ('%: p')) 

Ich habe eine neue Variable hinzugefügt Elternteil Dies ist die übergeordnete Verzeichnisstruktur der der Funktion übergebenen Datei. Der Befehl modifizieren ermöglicht das Extrahieren verschiedener Teile eines Pfads über Plattformen hinweg. Sie können mehr über das lesen Vim Hilfesystem: : help fnamemodify (). Beachten Sie, um auf das zu verweisen Datei Variable übergeben an die Funktion musste ich mit der ein:. Das ein: Geltungsbereich bezieht sich auf die einArgumente.

In jeder Schleife habe ich eine Variable erstellt, die das übergeordnete Verzeichnis mit dem neuen Verzeichnis oder Dateinamen verknüpft. Ich überprüfe dann auf ihre Existenz und erstelle sie, wenn sie nicht existieren. Um auf Existenz zu prüfen, die isDirectory () Funktion prüft das Verzeichnis und filereadable () prüft, ob Dateien vorhanden sind. Ich benutze ein ! um den Rückgabewert der Funktionen zu negieren. Zum Erstellen von Verzeichnissen rufen Sie die mkdir () Befehl. Um leere Dateien zu erstellen, müssen Sie den Systembefehl verwenden berühren.

Beachten Sie auch in jeder Schleife, und wenn ich die Anweisung hätte, musste ich die Variablen, die sich im oberen Bereich befinden, mit der l: Umfang. Das l: Gültigkeitsbereich bezieht sich auf eine beliebige Stelle in der Funktionsdefinition. Untere Bereiche erben die oberen Bereiche nicht automatisch! Das fängt mich die ganze Zeit an.

Maximum-Awesome

Jetzt, wo Sie sich intensiv mit einlassen Vim, Maximum-Awesome ist ein Setup-Paket, das viele großartige Standardeinstellungen und Pakete zur Verwendung lädt Vim auf der Mac. Es ist Ruby on Rails zentrisch, ist aber für jede Art von Programmierung nützlich.

Öffnen Sie das Termialprogramm in einem Verzeichnis, in dem Sie das Paket installieren möchten. Geben Sie dann diese Befehle ein:

git clone https://github.com/square/maximum-awesome.git cd Maximum-Awesome Rake 

Wenn es fertig ist, öffnen Sie es Vim wieder und Sie werden eine schöne Arbeitsumgebung sehen.

Es gibt viele interessante Pakete in diesem Setup. Viel Spaß beim Erkunden!

Fazit

Jetzt wissen Sie, wie Sie Automatisierungsskripts erstellen, um Ihren Arbeitsablauf zu erleichtern, und mit anderen hilfreichen Funktionen experimentieren.

Wenn Sie a Vim In dieser Umgebung werden Sie mehr Kontrolle ausüben und mehr tun können. Denken Sie daran, dass das Üben, was Sie lernen, der einzige Weg ist, sich zu verbessern und sich daran zu erinnern. Machen Sie also weiter und üben Sie die Erstellung Ihrer eigenen Automatisierungsskripte VimScript!