VimScript intermedio

Nel tutorial Configurazione Vim di base, Ti ho mostrato le basi della configurazione di a Vim editore. Ora è il momento di saperne di più. VimScript è un linguaggio di programmazione completo con cui è possibile creare qualsiasi tipo di programma di automazione che potrebbe essere necessario. Questo tutorial porterà le tue conoscenze al livello successivo con un creatore della struttura di directory del progetto, esplorando autocomandi, e uno sguardo al Maximum-Impressionante estensione per MacVim.

autocomandi

autocomandi sono comandi da avere Vim eseguire un'azione quando si applica una condizione particolare: nuova creazione di file, scrittura in un file e così via.

È un ottimo modo per automatizzare parte del lavoro che devi svolgere in un progetto. Ad esempio, quando si salva a SASS file, un autocomando puoi compilarlo alla normalità CSS per te.

Il formato per un autocomando è:

autocmd    

dove è l'azione dell'editor che il comando deve attendere. Puoi anche specificare più di un'azione alla volta separandoli con una virgola.

Con 86 possibili per aggrapparmi, non li descriverò tutti qui. Per vedere l'elenco completo, puoi digitare : aiuto autocmd-events-abc. Questo apre un buffer diverso con l'elenco completo. Per il programma dimostrativo, userò il BufNewFile azione per eseguire la funzione per verificare e creare una struttura di cartelle di directory del progetto.

Il è un'espressione regolare per il nome del file su cui agire.

Il è il comando attuale in VimScript da eseguire quando il succede che corrisponde al . Deve iniziare con i due punti, :, come vedresti nella riga di stato dell'editor.

Dal momento che faccio molto sviluppo di siti Web, la funzione di supporto creerà la struttura di progetto necessaria per un nuovo sito web. quindi, il autocomando deve attivarsi HTML creazione di file. Il formato necessario è:

funzione! CreateProject (file) echo "Salvataggio" a: file endfunc autocmd BufNewFile * .html: chiamata CreateProject (expand ('%: p')) 

La funzione per il progetto è solo lo scheletro. Mentre il tutorial progredisce, aggiungerò altro a questa funzione.

Con questo nel .vimrc file, vedrai il nome del file echo sulla barra di stato quando apri un nuovo HTML file in un buffer. Puoi farlo usando il :nuovo comando per creare un nuovo buffer con il nome del file specificato o quando si apre Vim con un nome di file sulla riga di comando.

Il ampliare ( '%: p') la macro fornisce il percorso completo al nuovo file quando il file autocomando trigger. In questo modo, la funzione CreateProject otterrà il nome del file e la sua directory.

Questo funziona bene per la semplice apertura e chiusura Vim senza mai ricaricare il file di configurazione. A volte, tuttavia, ti consigliamo di modificare il file di configurazione e ricaricarlo senza uscire. Vim eseguirà quindi il autocmd più volte per ogni nuovo buffer. Questo potrebbe causare un casino.

È necessario, quindi, per mettere il autocmd in un augroup per Gruppo Autocomand. Quindi cancellare il gruppo prima di aggiungere un nuovo comando. Il autocmd la linea diventa:

augroup CreateProject autocmd! autocmd BufNewFile * .html: chiama CreateProject (espandi ('%: p')) augroup END 

Il autocmd! dice Vim per dimenticare cosa c'era prima in questo gruppo. Usa questo blocco al posto di autocmd linea nell'ultimo elenco. Questa è una buona pratica durante la scrittura autocmdS.

Con lo script finora creato caricato in Vim, riaprire Vim con questa linea di comando: vim test.html. L'immagine sopra è ciò che otterrai. Darà il percorso al nuovo file. Se fai la stessa cosa, ma con un file già esistente, non otterrai questo prompt nella riga di fondo.

Strutture dati

VimScript ha più di semplici variabili. Puoi anche usare le liste. Una lista è un raggruppamento di oggetti in una variabile. Le liste sono ottime per contenere informazioni correlate. Nel caso di creazione di una struttura di file, ci saranno due elenchi: elenco di directory da creare e un elenco di file da creare.

Si specifica una lista con il []. Pertanto, crea due liste come questa:

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

Questo crea due liste: una chiamata dirs e gli altri "file". Se si desidera esaminare ciò che è in una lista, è possibile fare riferimento ad esso con un indice. Ricorda, VimScript ha l'indicizzazione basata su zero. Per ottenere il primo elemento, devi usare l'indice di zero. Una volta che è nella tua .vimrc file e tu lo ricarichi, puoi vederli con questo:

: file echo [0] 

Questo farà eco "/js/base.js" alla riga di stato. È inoltre possibile fare riferimento ai valori che iniziano dal valore più a destra con un indice negativo. Perciò,

: file echo [-2] 

farà eco "/css/base.css" alla riga di stato. Puoi anche ottenere un sottogruppo di elementi come questo:

: echo files [1: 2] 

Questo causerà la stringa ['/css/base.css', '/doc/help.html'] per mostrare nella riga di stato. Un sottoinsieme di un set è ancora un set!

Ho avuto le due definizioni di lista al di fuori della funzione solo a fini dimostrativi. È meglio non creare variabili nel globale ambito (es: fuori da una funzione). Avere un sacco di variabili globali rende l'ambito globale disordinato. Può anche scontrarsi con altri script lungo la strada.

Controllo del flusso del programma

Per elaborare ogni elemento negli elenchi, userò a per-struttura del ciclo. UN per-loop esegue ripetutamente il codice allegato fino a quando non si verifica una condizione. Per eseguire il loop su ciascun elemento nell'elenco, il codice diventa questo:

funzione! CreateProject (file) lascia dirs = ["/ js", "/ js / final", "/ css", "/ css / final", "/ doc"] let files = ["/ js / base.js", "/css/base.css", "/doc/help.html"] per dir in dirs endfor per nome nei file endforuncfunc autocmd BufNewFile * .html: chiamata CreateProject (expand ('%: p')) 

Le due liste sono ora all'interno della funzione e due per loop itera su ogni lista. Nota, c'è una nuova variabile prima del nel dichiarazione e la lista dopo il nel dichiarazione. La nuova variabile acquisisce ogni elemento nell'array in sequenza.

C'è un'altra struttura di loop in VimScript chiamato il mentre-ciclo continuo. La sua forma di base è:

lasciare index = 0 mentre index < len(dirs) echo l:dirs[index] l:index += 1 endwhile 

Questo codice scorre su ogni elemento nel dirs elencalo ed eseguilo nella riga di stato. Notare la nuova variabile indice. Questa variabile è stata utilizzata per tracciare il numero di volte trascorso il ciclo e per ottenere sequenzialmente ciascun elemento nell'elenco. Per lavorare con le liste, il per-il ciclo è più efficace.

Finire la funzione

Con le strutture dati e i loop in atto, ora finirò il codice. Il resto del codice assomiglia a questo:

funzione! CreateProject (file) lascia dirs = ["/ js", "/ js / final", "/ css", "/ css / final", "/ doc"] let files = ["/ js / base.js", "/css/base.css", "/doc/help.html"] lascia genitore = fnamemodify (a: file, ": p: h") per dir in dirs lascia newdir = l: parent. dir if! isdirectory (l: newdir) chiama mkdir (l: newdir) endif endfor per nome nei file let newfile = l: parent. name if! filereadable (newfile) call system ("touch". l: newfile) endif endfor endfunc autocmd BufNewFile * .html: chiama CreateProject (expand ('%: p')) 

Ho aggiunto una nuova variabile genitore questa è la struttura di directory principale del file assegnato alla funzione. Il comando fnamemodify ti consente di estrarre parti diverse di un percorso attraverso le piattaforme. Puoi leggere di più a riguardo usando il Vim sistema di aiuto: : aiuto fnamemodify (). Si noti, per fare riferimento al file variabile passata alla funzione ho dovuto scope con il un:. Il un: ambito si riferisce al unARGOMENTI DELLE PARTI.

In ogni ciclo, ho creato una variabile che concatena la directory padre con la nuova directory o il nome del file. Quindi controllo la loro esistenza e li creo se non esistono. Per verificare esistenza, il isDirectory () controlli di funzione per la directory, e filereadable () controlla la presenza di file. Io uso a ! per negare il valore restituito dalle funzioni. Per creare directory, si chiama il mkdir () comando. Per creare file vuoti, devi usare il comando di sistema toccare.

Inoltre, notate all'interno di ogni ciclo e se l'istruzione dovevo scope le variabili che sono negli ambiti superiori con il l: scopo. Il l: ambito si riferisce ovunque nella definizione della funzione. Gli ambiti inferiori non ereditano automaticamente gli ambiti superiori! Questo mi sorprende tutto il tempo.

Maximum-Impressionante

Ora che stai entrando in un uso intenso con Vim, Maximum-Impressionante è un pacchetto di installazione che carica molti grandi valori predefiniti e pacchetti per l'utilizzo Vim sul Mac. È Ruby on Rails centrico, ma è utile per qualsiasi tipo di programmazione.

Aprire il programma termial in una directory in cui si desidera installare il pacchetto. Quindi digitare questi comandi:

git clone https://github.com/square/maximum-awesome.git cd rake massimo eccezionale 

Al termine, quindi aprire Vim di nuovo e vedrai un bel ambiente di lavoro.

Ci sono molti pacchetti interessanti in questa configurazione. Divertiti ad esplorare!

Conclusione

Ora che sai come creare script di automazione per aiutare il tuo flusso di lavoro, vai avanti e sperimenta altre utili funzioni.

Quando personalizzi un Vim ambiente, si riempirà di più in controllo e in grado di fare di più. Ricorda, praticare ciò che impari è l'unico modo per migliorarlo e ricordarlo. Quindi, continua e fai pratica nel creare i tuoi script di automazione VimScript!