Ho difficoltà a comprendere un comportamento strano: vi sembra aggiungere una nuova riga (ASCII: LF, in quanto si tratta di un sistema Unix ( AIX )) alla fine del file, quando NON l'ho digitato specificamente.
Modifico il file come tale in vi (facendo attenzione a non inserire una nuova riga alla fine):
# vi foo ## Which I will finish on the char "9" and not input a last newline, then `:wq`
123456789
123456789
123456789
123456789
~
~
## When I save, the cursor is just above the last "9", and no newline was added.
Mi aspetto che vi salvi "così com'è", in modo da avere 39 byte: 10 caratteri ASCII su ciascuna delle prime tre righe (numeri da 1 a 9, seguiti da una nuova riga (LF sul mio sistema)) e solo 9 sull'ultima linea (caratteri da 1 a 9, nessuna nuova riga / LF terminante).
Ma appare quando lo salvo è 40 byte (anziché 39) e od mostra un LF terminante :
# wc foo
4 4 40 foo ## I expected 39 here! as I didn't add the last newline
# od -a toto
0000000 1 2 3 4 5 6 7 8 9 lf 1 2 3 4 5 6
0000020 7 8 9 lf 1 2 3 4 5 6 7 8 9 lf 1 2
0000040 3 4 5 6 7 8 9 lf
0000050
## An "lf" terminates the file?? Did vi add it silently?
Se creo il file con un printf che fa esattamente quello che ho fatto all'interno di vi, funziona come previsto:
# ## I create a file with NO newline at the end:
# printf "123456789\n123456789\n123456789\n123456789" > foo2
# wc foo2 ## This one is as expected: 39 bytes, exactly as I was trying to do above with vi.
3 4 39 foo ## As expected, as I didn't add the last newline
## Note that for wc, there are only three lines!
## (So wc -l doesn't count lines; it counts the [newline] chars... Which is rather odd.)
# root@SPU0WMY1:~ ## od -a foo2
0000000 1 2 3 4 5 6 7 8 9 lf 1 2 3 4 5 6
0000020 7 8 9 lf 1 2 3 4 5 6 7 8 9 lf 1 2
0000040 3 4 5 6 7 8 9
0000047 ## As expected, no added LF.
Entrambi i file (foo (40 caratteri) e foo2 (39 caratteri) appaiono esattamente gli stessi se li riapro con vi ...
E se apro foo2 (39 caratteri, nessuna nuova riga che termina) in vi e faccio solo :wq
senza modificarlo , dice che scrive 40 caratteri e appare l'alimentatore!
Non riesco ad accedere a un vi più recente (lo faccio su AIX, vi (non Vim ) versione 3.10 penso? (Nessuna "versione" o altri mezzi per conoscerlo)).
# strings /usr/bin/vi | grep -i 'version.*[0-9]'
@(#) Version 3.10
È normale per vi (e forse non nella versione più recente? O Vim?) Aggiungere silenziosamente una nuova riga alla fine di un file? (Ho pensato che ~ indicava che la riga precedente NON si concludeva con una nuova riga.)
-
Modifica: alcuni aggiornamenti aggiuntivi e un po 'di riepilogo, con un grande ringraziamento alle risposte di seguito:
vi aggiunge silenziosamente una nuova riga finale nel momento in cui scrive un file a cui mancava (a meno che il file non sia vuoto).
lo fa solo al momento della scrittura! (vale a dire, fino a quando: w, è possibile utilizzare: e per verificare che il file sia ancora come lo si è aperto ... (ovvero: mostra ancora "nome file" [L'ultima riga non è completa] N linea, carattere M). Quando salvi, una nuova riga viene aggiunta silenziosamente, senza un avviso specifico (indica quanti byte salva, ma nella maggior parte dei casi non è sufficiente sapere che è stata aggiunta una nuova riga) (grazie a @jiliagre per avermi parlato del aprendo il messaggio vi, mi ha aiutato a trovare un modo per sapere quando si verifica davvero il cambiamento)
Questa (correzione silenziosa) è un comportamento POSIX ! (vedi la risposta @ barefoot-io per i riferimenti)
vi
versione o almeno un indizio sulla sua origine eseguendo il :ve
comando.
ex
pagina di manuale in cui il :ver
comando è normalmente documentato.