2010-10-20 12 views
6

le -w e -W opzioni di vim hanno teoricamente il seguente effetto:utilizzando l'opzione -W di vim

-w {scriptout} Tutti i caratteri che viene registrato nel "scriptout" File , finché non esci da Vim. Questo è utile se si desidera creare un file di script da utilizzare con "vim -s" o ": source!". Quando il file "scriptout" esiste già, i nuovi caratteri vengono aggiunti. Vedi anche | ripetizione complessa |. {scriptout} non può iniziare con una cifra. {not in Vi}

-W {scriptout} Come -w, ma non aggiungere, sovrascrivere un file esistente. {non in Vi}

Ma quando faccio questo, il file {} scriptout sarà sempre iniziare con una sequenza esadecimale come 80 fd 60 (a volte è 80 fd 62).

Sto usando gvimportable.exe 7.3 da portableapps.com. Con lo switch -u NONE, fa lo stesso.

A cosa serve questo "numero magico"? Sotto Windows con gvim.exe non riesco a riprodurre il mio scriptout fino a quando non ho rimosso quei tre byte principali ...

Sembra che questa funzione, che potrebbe essere molto utile, sia scarsamente documentata.

Grazie per le vostre risposte.

+0

Quando ho eseguito il test utilizzando l'opzione '-W', vim non ha aggiunto caratteri aggiuntivi all'inizio del file. Dovresti riprovare senza il tuo '.vimrc' usando' vim -u NONE -W somefile' –

+0

Questo è quello che ho fatto ... ancora, 'vim -u NONE -W scriptout', ZQ e' xxd' my_scriptout mostrerà '80fd 605a 51 '(..'ZQ) – Benoit

+0

Ho guardato questo un paio di settimane fa e non sono riuscito a riprodurlo su Linux ... ora che so che stai usando il mio gVim Portable (yay!) Proverò di nuovo su Windows e vedere se riesco a capirlo. (Domani, non oggi.) –

risposta

6

(Questa risposta è probabilmente frammentata in modo significativo, mi ci è voluto un po 'di tempo a giocare - volevo trovare una soluzione anche perché mi incuriosiva - non solo la taglia di 200: P. Più o meno mostra il mio pensiero e sperimentazione.)

Posso ora riprodurlo con gvim su Linux, che è /usr/bin/vim.gnome -g; correndo come vim -g fa lo stesso.


Scavando nel codice: (inutile in questo caso, ma divertente da fare e di imparare come fare)

Ho guardato attraverso il codice sorgente e ora posso spiegarlo un po ' (ma non utilmente!); ottiene il set outfile FILE (src/globals.h:1004) (src/main.h:2275); questo viene quindi scritto in src/getchar.h:1501, nel metodo updatescript utilizzato da gotchars (riga 1215) utilizzato da vgetorpeek, utilizzato da vgetc e vpeekc ... (no, non so dove sta andando!) poi questi sono usati in un numero di posti.

In ogni caso, suppongo che la chiave sia da qualche parte nello src/gui.c, ma non so dove sia al momento! È anche possibile che alcune sequenze di tasti vengano "inviate" (fisicamente o virtualmente, non lo so), ma dal momento che il problema è lo stesso su tutte le piattaforme, sembra che sia più probabile che si tratti di un problema di Vim.


situazioni interessanti portando ad una probabile spiegazione:

E 'anche la pena notare che se si esce automaticamente, gvim -u NONE -w scriptout -c quit (:quit dopo il caricamento) o gvim -u NONE -w scriptout -c quit (instant :quit, non mostra mai GUI), il il file scriptout è lasciato vuoto.

Inoltre, se si gvim aperta e poi vicino utilizzando il tasto X, premere nessun tasto:

0000000: 80fd 6280 fd63 80fd 62     ..b..c..b 

Se si apre gvim, click di distanza, scegliere Indietro e utilizzare :q:

0000000: 80fd 6280 fd63 80fd 6280 fd2c 80fd 2e3a ..b..c..b..,...: 
0000010: 710d          q. 

Quindi penso che gli eventi della finestra siano tradotti internamente in qualcos'altro. 80 fd 62 è la sequenza aperta e 80 fd 63 80 fd 62 è la sequenza chiusa.

Ho trovato un altro modo di attivare lo 80fd, il che mi porta alla cosa è una sorta di "utente ha accesso alla finestra"; di default con GNOME in Ubuntu, Ctrl + Alt + S fa qualcosa con la finestra (non ricorda come si chiama, fa scorrere tutto nella barra del titolo, l'app all'interno perde il controllo della tastiera ecc.). gvim ... (si sa gli argomenti!), i<Ctrl + Alt + S (contratta) Ctrl + Alt + S (espanso) >EscZ Q produce questo per me:

0000000: 80fd 6269 3c80 fd63 80fd 623e 1b5a 51 ..bi<..c..b>.ZQ 

Sommario: quindi non abbiamo quello che credo sia la soluzione; gVim cattura i messaggi della finestra in qualche modo e - se dovrebbe o non dovrebbe - li mette nel suo scriptout. Se pensi che non dovrebbe (o vorresti sapere il motivo per cui sono stati lasciati o se sono nemmeno destinati a esserlo o se dovresti averne a cuore), chiedi sulla lista di Vim, credo.

+0

Si noti che questo test è stato fatto interamente su Linux una volta scoperto che il problema si stava manifestando sia lì che su Windows. Se vuoi, posso giocarci in modo simile su Windows, o puoi farlo. Penso che troverai approssimativamente la stessa cosa: fare le cose con la finestra stessa mette le cose nello scriptout. –

1

La mia ipotesi migliore è che questo sia un bug nel codice GUI di gVim.

Utilizzo di gVim 7.3, se eseguo gvim -u NONE -W scriptout, viene visualizzato il problema, ma se eseguo vim -u NONE -W scriptout, i byte indesiderati non sono presenti.

Ho anche provato Vim 7.2 dalla shell in Linux, la versione di Vim incluso in Snow Leopard (7.2), e l'interfaccia grafica e le versioni dei terminali di MacVim 7.2 (rispettivamente con mvim -W e /Applications/MacVim/Contents/MacOS/Vim -W,) e tutti hanno lavorato in modo corretto.

+0

grazie per la risposta.Probabilmente sono obbligato a cercare nel codice per trovare il motivo per cui lo fa. Potresti provare anche sotto Linux? – Benoit

+0

@Benoit Yup, funziona bene su Linux e sia dal terminale che dalla GUI su OS X. Ho modificato la mia risposta per mostrarlo. – Rich