Come rendere vim aggiungere automaticamente una nuova riga alla fine di un file?


16

Vim normalmente scrive <EOL>per l'ultima riga solo quando ce n'era una nel file originale.

Come fare in modo che vim scriva sempre una nuova riga alla fine di un file (quando il file non è binario e non ce n'è già uno)?

Ho testato l' eolopzione, ma non ha funzionato come previsto.

Vedi anche: Mantieni fine riga mancante alla fine dei file di testo , ma al contrario. E: Perché i file dovrebbero terminare con una nuova riga?

Risposte:


17

Informazioni basilari

Vim non mostra la nuova riga più recente nel buffer, ma in realtà vim posiziona sempre EOL alla fine del file quando lo scrivi, perché è standard per i file di testo nei sistemi Unix. Puoi trovare maggiori informazioni al riguardo qui . In breve, non devi preoccuparti dell'assenza di una nuova riga alla fine del file in vim.

Esperimento 1

Puoi fare questo piccolo esperimento per verificare questo comportamento. Nel terminale eseguire:

$ vim test_test

Inserisci il carattere 1e salva il file :wq.

Hai solo un personaggio nel file, giusto? In realtà no :) Ora hai nel tuo file 1e LFcaratteri. Controlliamolo, con l'utilità hexdump:

$ hexdump test_test
0000000 31 0a
0000002

31è il codice ASCII per il carattere 1, ed 0aè il codice ASCII per il carattere non stampabile LFche per l'UNIX, poiché potresti già conoscere il codice per la fine della riga.

Esperimento 2

E se apriremo un file che non ha un eolsimbolo alla fine del file. Controlliamo anche noi. Creiamo il file senza eol alla fine, ad esempio in questo modo:

$ echo -n "1" > test_without_eol

Quindi diamo un'occhiata al suo interno con hexdump:

$ hexdump test_without_eol
000000 31
0000001

Quindi non ci sono eolpersonaggi qui. Apriamo questo file in vim:

$ vim test_without_eol

Nella parte inferiore dell'editor vedrai:

"test_without_eol" [noeol] 1L, 1C

E se salverai questo eolcarattere di file verrà inserito automaticamente.

Cosa possiamo fare al riguardo?

Se hai davvero bisogno di vedere la fine del file. Prova a usare questo comando:

:set listchars=eol:$

mostrerà tutti i eolpersonaggi come $segno.


Grande. Sono arrivato alla stessa conclusione dopo la mia confusione, perché Vim non mi stava effettivamente mostrando questa nuova linea, ma era lì dopo il salvataggio.
Kenorb,

1
@kenorb dal modo in cui puoi mostrare tutti i personaggi EOL usando questo :set listchars=eol:$
comando

"in realtà non mi stava mostrando questa nuova linea" - in Unix non esiste una linea. Una riga è definita come "numero di caratteri non LF, terminanti con un carattere LF". Se pensi a LF non come "vai alla riga successiva" ma "fine della linea", quello che Vim fa improvvisamente ha molto più senso.
Amadan,

8

Vim omette l'EOL solo se il file viene aperto come 'binary' e l' 'endofline'opzione viene ripristinata (quando il file binario non aveva una EOL all'apertura o se si ripristina esplicitamente l'opzione). In altre parole, Vim onora solo un EOL mancante per i file binari. Per i file di testo, scrive sempre con un EOL (aggiunto). (Ecco perché hai bisogno di soluzioni come il mio plugin PreserveNoEOL per conservare i file di testo senza EOL.) Puoi trovare tutti i dettagli su :help 'endofline'.

Quindi, devi solo assicurarti di aprire il file come non binario per fare in modo che Vim scriva automaticamente un EOL.


5

Come ha detto Alexander , Vim non mostra EOL all'EOF, ecco perché è così confuso (specialmente con una nuova riga vuota / vuota che è un'altra cosa), quindi scrive effettivamente ogni volta sul salvataggio dei file.

Ecco un semplice test su come verificare se funziona:

$ printf foo > foo.txt
$ cat foo.txt
foo$ wc foo.txt
0 1 3 foo.txt
$ vim -cwq foo.txt
$ cat foo.txt
foo
$ wc foo.txt
1 1 4 foo.txt

Nota come si comporta il prompt della shell quando non c'è EOL (va mescolato con la riga successiva). Quando si salva di nuovo il file con Vim, lo aggiunge.

Usando wcpossiamo contare linee, parole e caratteri prima di salvare e dopo, così possiamo vedere che cambia effettivamente.

Perché questo è così importante? Per mantenere i nostri file conformi a POSIX .

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.