2013-04-25 2 views
35

Questa domanda è un seguito del Work Around che uso per "salvare i file in vim senza dover aggiungere forzatamente la fine riga del file" fastidio.Perché ho bisogno di vim in modalità binaria perché "noeol" funzioni?

Fondamentalmente non posso usare set noeol nel mio .vimrc perché non fa nulla!

Fa ciò che deve fare se si modifica il file in modalità binaria. (vim -b file invece di vim file)

Perché?

In ogni caso per avere una semplice preferenza in .vimrc NON aggiungere newline in ogni singolo file che modifica?

Inoltre, che tipo di problemi riscontrerò se inizio a modificare tutti i file in modalità binaria? Finora non ho visto alcuna differenza.

risposta

84

Cosa Vim "aggiunge" al fine dell'ultima riga nel file è il carattere "a capo", che non deve essere confusa con una "nuova linea".

Il carattere "newline" o più precisamente "fine riga" (<EOL>) significa "tutto ciò che viene dopo questo punto deve essere considerato su un'altra linea". Con questa interpretazione - <EOL> è una terminazione terminatore - l'ultima riga del file è effettivamente l'ultima con <EOL>.

Il problema è che la maggior parte degli editori e IDE hanno una diversa interpretazione - <EOL> è una linea separazione - e, logicamente, di default a non aggiungere un <EOL> alla fine dell'ultima riga di un nuovo file e, quando incontrano uno <EOL>, aggiungi una "nuova linea" superflua dopo l'ultima riga reale.

In breve, Vim non aggiunge una "nuova linea": altri editori interpretano (erroneamente) la sua "nuova linea" come una "nuova linea".

Tuttavia, è possibile risolvere il problema attenendosi alla seguente procedura: prima di scrivere il file, fare :set binary noeol se si desidera che rimanga "<EOL> -free".

Tuttavia, :h 'binary' ha molto da dire sui pericoli dello :set binary quindi direi che girarlo su "tutto il tempo sembra una cattiva idea.

per illustrare i diversi comportamenti, questo è ciò che succede quando si tenta di concatenare due file con <EOL>:

$ cat file1 $ cat file2   $ cat file1 file2 

lorem ipsum Le tramway jaune lorem ipsum 
dolor sit  avance lentement dolor sit 
amet   dans le    amet 
            Le tramway jaune 
            avance lentement 
            dans le 

e questo è ciò che accade quando si tenta di concatenare due file senza <EOL>:

$ cat file1 $ cat file2   $ cat file1 file2 

lorem ipsum Le tramway jaune lorem ipsum 
dolor sit  avance lentement dolor sit 
amet   dans le    ametLe tramway jaune 
            avance lentement 
            dans le 

Il primo comportamento è in qualche modo il comportamento previsto e il motivo per cui Vim e molti (se non la maggior parte) programmi UNIX-y predefiniti nell'interpretazione terminatore e aggiungere un carattere <EOL> alla fine dell'ultima riga.

L'immagine seguente mostra un file semplice con <EOL> creato con nano (sarebbe lo stesso con Vim) e aperto in Eclipse, TextMate, Sublime Text, Vim, XCode e TextEdit.

<EOL>

(edit) non esiste una linea 4 in questo file e l'unico editore del gruppo che consente di visualizzare il file in modo corretto è Vim. L'unico scopo della colonna del numero di riga è fornire informazioni sul buffer. Mostrare 4 righe dove ci sono solo 3 è un errore grossolano. (terminato)

Questa immagine mostra un altro file semplice senza <EOL> creato con Testo Sublime e aperto negli stessi editor/IDE.

No <EOL>

+3

e upvote per l'eccellente spiegazione EOL. ma il problema è avere il controllo su questo. Voglio decidere, non lasciare che vim. – gcb

+2

Penso che sia sufficiente scrivere una piccola funzione che temporaneamente "imposta binary noeol" e associ l'evento 'BufWritePre'. – romainl

+1

Anche meglio di 'set binary noeol' sarebbe' setl binary noeol'. – bdesham

2

Secondo il vimdoc noeol non fa nulla a meno che la modalità binary sia attiva.

  *'endofline'* *'eol'* *'noendofline'* *'noeol'* 
'endofline' 'eol' boolean (default on) 
      local to buffer 
      {not in Vi} 
    When writing a file and this option is off and the 'binary' option 
    is on, no <EOL> will be written for the last line in the file. This 
    option is automatically set when starting to edit a new file, unless 
    the file does not have an <EOL> for the last line in the file, in 
    which case it is reset. Normally you don't have to set or reset this 
    voption. When 'binary' is off the value is not used when writing the 
    file. When 'binary' is on it is used to remember the presence of a 
    <EOL> for the last line in the file, so that when you write the file 
    the situation from the original file can be kept. But you can change 
    it if you want to. 
3

hanno una semplice preferenza in Vimrc di non aggiungere nuove righe ad ogni singolo file modifico

Puoi usare il mio PreserveNoEOL plugin per questo. Con questa semplice impostazione, hai finito; In alternativa, è anche possibile influenzare questo per buffer:

:let g:PreserveNoEOL = 1 
+0

interessante. ma il tuo script non è qualcosa che posso facilmente aggiungere al mio vimrc :) e non molto fan del modo in cui funziona. non è ancora mi dà un controllo pratico. probabilmente cercherò di renderlo più semplice e in un modo che aggiunga semplicemente una nuova riga se il file ha un EOL e lo salva solo se il buffer viene salvato con una nuova riga. Il tuo codice è pulito e pieno di commenti, sarà un buon punto di partenza! – gcb

+0

Beh, basta installarlo come qualsiasi altro plugin. Non capisco appieno le tue critiche; se tu lasci g: PreserveNoEOL = 1', dovrebbe "funzionare", cioè conservare i file esistenti senza EOL finale e lasciare da solo tutti gli altri file (regolari). Ad ogni modo, è open source, quindi sei libero di (ri) utilizzare qualsiasi cosa tu ritenga opportuno. Sono anche aperto a feedback e suggerimenti generali, via email. –

+0

va tutto bene quando si lavora da una macchina. ma sto lavorando da 2 a 12 macchine diverse ogni giorno al lavoro. Anche copiare i miei 'bashrc' e' vimrc' è già un dolore:/ho semplicemente dovuto imparare a vivere senza plugin. Non è una critica al tuo lavoro. Sto solo dicendo che non posso avere il lusso, sfortunatamente. – gcb

7

dalla versione 7.4.785 Vim ha fixendofline impostazione. È possibile evitare binary con alcuni effetti collaterali e semplicemente impostare

set noendofline 
set nofixendofline