Domanda

Ho un file dove memorizzare i frammenti di comandi Vim. Quando ho bisogno di un frammento, ho Yank e poi eseguirlo con @". I frammenti vengono memorizzati come una sceneggiatura, una linea per ogni comando, in questo modo:

:s/foo/bar/g
:echo "hello"
:s/1/2/g

Edit: ho tolto normali comandi della modalità dall'esempio, in quanto non erano parte del problema

.

Ora, questa procedura non funziona più: quando si esegue il frammento, si ferma solo alla prima linea come in attesa di una nuova riga.

C'è una qualche possibilità che colpisce come viene eseguito @? Sono abbastanza sicuro che lavoravo qualche tempo fa ...

Sostituendo il ritorno a capo con un ^ opere di carattere M, ma rende il file più difficile da gestire.


Ulteriori informazioni:

Ecco un altro sintomo: quando ho Yank un frammento, se eseguo con @" si ferma alla prima linea, come ho appena spiegato. Ma se eseguo con :@ funziona. Ma il file di aiuto non sembra implicare alcuna differenza nel modo in cui i due comandi trattano il contenuto del registro ...

È stato utile?

Soluzione 2

Finalmente ho trovato il colpevole. In qualche modo ho avuto una mappatura dei comandi sul <C-J> nel mio file .vimrc. Quando viene letto con l'cpoptions impostazione predefinita, questa si trasformò in una mappatura su <NL>.

Come ho scoperto: Ho notato che quando si avvia vim con -u ~/.vimrc, sarebbe davvero eseguire frammenti uno strattone. Ho generato un file di sessione con e senza l'opzione di comando e li rispetto. In questo modo ho scoperto che un diverso insieme di cpoptions dove utilizzato per leggere lo stesso file .vimrc, in modo che in un caso la mappatura era davvero il <C-J>, nell'altro è stato trasformato in una mappatura su <NL>!

Se qualcuno ha un problema simile, vi consiglio di guardare con attenzione le mappature dei comandi attualmente impostati, con :cmap.

Altri suggerimenti

Non credo che il problema è ^M vs ^J. macro Vim trattare uno dei due come un carattere valido end-of-line per le macro registrate. Credo che il problema è a capo in più.

Nel tuo esempio, c'è almeno un ritorno a capo dopo spurio 2j, e se non siete particolarmente attenti quando si copia il frammento, c'è probabilmente un altro dopo 10k pure. Queste nuove righe supplementari sono come premendo <Enter> in modalità normale -. Si muovono il cursore in basso di una riga

Ecco quello che penso si desidera che il frammento di assomigliare a:

:s/foo/bar/g
2j:s/1/2/g
10k

(Anche questo è un po 'fuorviante -. Dovreste comunque stare attenti a non copiare il ritorno a capo dopo la 10k)

Perché questi ritorni a capo in più fanno una grande differenza? Beh, per prima cosa, che provocano di essere almeno una linea di distanza da dove ci si aspetta di essere, che getta via tutto quello che vuoi fare su una particolare linea (come eseguire il comando :s//).

Ancora più importante, però - e questo è quello che penso che sta accadendo nel vostro esempio - è che Vim interrompe la riproduzione macro se la macro tenta di utilizzare <Enter> sull'ultima riga di un buffer. (Sto cercando di indovinare Vim considera un errore e ogni errore provoca una macro per interrompere l'esecuzione.)

Ecco un esempio. Supponiamo che hai questo frammento di codice memorizzato nel registro x:

4j
:echo "Done"

(Notare il ritorno a capo dopo 4j.)

Inoltre, si supponga di avere le seguenti cinque linee (e solo queste cinque righe) in un buffer:

line 1
line 2
line 3
line 4
line 5

Se ora si stampa sul @x line 1, il :echo "Done" mai eseguito. Vim sposta il cursore giù 4 linee a line 5, quindi tenta di spostare in basso di una linea più a causa della nuova riga supplementare, ma non può. Le fermate macro esecuzione a quel punto, prima che il comando :echo ha la possibilità di eseguire.

Tuttavia, funziona se si modificano le x registrati per questo:

4j:echo "Done"

Quindi, per tornare al tuo esempio originale, scommetto quello che sta succedendo è che il ritorno a capo in più dopo 2j sta tentando di spostare il cursore da qualche parte non si può andare, e che causa la macro per fermata. La linea di fondo dello schermo contiene l'ultimo comando eseguito (:s/foo/bar/g), che lo fa apparire come Vim vi aspetta a premere Invio.

Infine, vi consiglio vivamente di utilizzare un altro metodo per memorizzare ed eseguire sequenze di comandi Vim. La tecnica che si sta utilizzando è tollerabile per i casi semplici, ma è fragile e non scala bene. Vim ha un linguaggio di scripting completo che include funzioni e comandi personalizzati, e può essere usato per fare tutte le cose che stai facendo ora, ma in un modo molto più robusto. script Vim è un grande argomento, ma mi piacerebbe iniziare qui:

:help script

Assicurarsi di leggere sul comando :normal, che consente di eseguire comandi in modalità Normale (come 2j e 10k) all'interno di script.

In bocca al lupo!

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top