VIM Disabilita Newline automatico alla fine del file

Quindi lavoro in un negozio PHP, e tutti usiamo editor diversi, e tutti noi dobbiamo lavorare su Windows. Io uso vim, e tutti nel negozio continuano a lamentarsi del fatto che ogni volta che modifico un file c’è una nuova riga in fondo. Ho cercato in giro e ho scoperto che si tratta di un comportamento documentato di vi & vim … ma mi stavo chiedendo se ci fosse un modo per disabilitare questa funzione. (Sarebbe meglio se potessi disabilitarlo per specifiche estensioni di file).

Se qualcuno lo sapesse, sarebbe fantastico!

anche se il file è stato già salvato con nuove righe alla fine:

vim -b file e una volta in vim:

 :set noeol :wq 

fatto.

in alternativa puoi aprire i file in vim con :e ++bin file

Ancora un’altra alternativa:

 :set binary :set noeol :wq 

E per vim 7.4+ puoi anche usare invece (preferibilmente sul tuo .vimrc):

 :set nofixendofline 

(grazie a 罗泽轩 per l’ultimo bit di notizie!)

Aggiungi il seguente comando al tuo .vimrc per triggersre l’opzione di fine riga:

 autocmd FileType php setlocal noeol binary fileformat=dos 

Tuttavia , PHP stesso ignorerà quell’ultimo fine linea – non dovrebbe essere un problema. Sono quasi sicuro che nel tuo caso ci sia qualcos’altro che sta aggiungendo l’ultimo carattere di nuova riga, o forse c’è un mixup con i tipi finali di windows / unix line ( \n o \r\n , ecc.).

Aggiornare:

Una soluzione alternativa potrebbe essere quella di aggiungere questa linea al tuo .vimrc:

 set fileformats+=dos 

C’è un altro modo per avvicinarsi a questo se si utilizza Git per il controllo del codice sorgente. Ispirato da una risposta qui , ho scritto il mio filtro da usare in un file gitattributes .

Per installare questo filtro, salvalo come noeol_filter da qualche parte nel tuo $PATH , noeol_filter eseguibile ed esegui i seguenti comandi:

 git config --global filter.noeol.clean noeol_filter git config --global filter.noeol.smudge cat 

Per iniziare a utilizzare il filtro solo per te, inserisci la seguente riga in $GIT_DIR/info/attributes :

 *.php filter=noeol 

Questo assicurerà di non commettere alcun newline in eof in un file .php , indipendentemente da cosa faccia Vim.

E ora, lo script stesso:

 #!/usr/bin/python # a filter that strips newline from last line of its stdin # if the last line is empty, leave it as-is, to make the operation idempotent # inspired by: https://stackoverflow.com/questions/1654021/how-can-i-delete-a-newline-if-it-is-the-last-character-in-a-file/1663283#1663283 import sys if __name__ == '__main__': try: pline = sys.stdin.next() except StopIteration: # no input, nothing to do sys.exit(0) # spit out all but the last line for line in sys.stdin: sys.stdout.write(pline) pline = line # strip newline from last line before spitting it out if len(pline) > 2 and pline.endswith("\r\n"): sys.stdout.write(pline[:-2]) elif len(pline) > 1 and pline.endswith("\n"): sys.stdout.write(pline[:-1]) else: sys.stdout.write(pline) 

Non ho provato questa opzione, ma le seguenti informazioni sono fornite nel sistema di aiuto di vim (ie help eol):

 '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  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  for the last line in the file, in which case it is reset. 

Normalmente non devi impostare o resettare questa opzione. Quando “binario” è distriggersto, il valore non viene utilizzato durante la scrittura del file. Quando è attivo ‘binary’ viene usato per ricordare la presenza di a per l’ultima riga del file, in modo che quando si scrive il file la situazione dal file originale possa essere mantenuta. Ma puoi cambiarlo se vuoi.

Potresti essere interessato anche alla risposta a una domanda precedente: ” Perché i file dovrebbero terminare con una nuova riga “.

Ho aggiunto un suggerimento sul wiki di Vim per un problema simile (anche se diverso):

http://vim.wikia.com/wiki/Do_not_auto-add_a_newline_at_EOF

OK, il tuo essere su Windows complica le cose;)

Dato che l’opzione ‘binaria’ resetta l’opzione ‘fileformat’ (e scrivendo con ‘binary’ set scrive sempre con terminazioni di riga unix), tiriamo fuori il grosso martello e lo facciamo esternamente!

Che ne dici di definire un autocomando (: help autocommand) per l’evento BufWritePost? Questo autocomando viene eseguito ogni volta che si scrive un intero buffer. In questo autocomando chiama un piccolo strumento esterno (php, perl o qualsiasi altro script) che rimuove l’ultima riga del file appena scritto.

Quindi questo sarebbe simile a questo e andrebbe nel tuo file .vimrc:

 autocmd! "Remove all autocmds (for current group), see below" autocmd BufWritePost *.php !your-script  

Assicurati di leggere l’intera documentazione di vim sugli autocomandi se questa è la prima volta che ti occupi di autocomando. Ci sono alcune avvertenze, ad es. Si consiglia di rimuovere tutte le autocmds nel tuo .vimrc nel caso in cui il tuo .vimrc venga prelevato più volte.

Ho implementato i suggerimenti di Blixtor con la post-elaborazione Perl e Python, sia in esecuzione all’interno di Vim (se è compilato con tale supporto linguistico), sia tramite uno script Perl esterno. È disponibile come plugin PreserveNoEOL su vim.org.

Forse potresti guardare perché si lamentano. Se un file php ha una nuova riga dopo il finale?>, Php lo stamperà come parte della pagina. Questo non è un problema a meno che non provi a inviare le intestazioni dopo che il file è stato incluso.

Tuttavia, il?> Alla fine di un file php è facoltativo. Senza fine?>, Nessun problema con una nuova riga alla fine del file.

Aggiungo in .vimrc

 set binary 

e aiuta, provalo

Penso di aver trovato una soluzione migliore rispetto alla risposta accettata. Le soluzioni alternative non funzionavano per me e non volevo dover lavorare in modalità binaria tutto il tempo. Fortunatamente, sembra che il lavoro sia terminato e non ho ancora riscontrato effetti collaterali sgradevoli: preservare l’end-of-line mancante alla fine dei file di testo . Ho appena aggiunto l’intera cosa al mio ~ / .vimrc.

Sarebbe ansible per te utilizzare un comando speciale per il salvataggio di questi file?

Se lo fai: set binary,: w e: set nobinary il file verrà scritto senza newline se non ce n’era nessuno con cui iniziare.

Questa sequenza di comandi potrebbe essere inserita in un comando definito dall’utente o in una mapping, ovviamente.

Ho trovato questo plugin VimScript è utile per questa situazione.

 Plugin 'vim-scripts/PreserveNoEOL' 

Oppure leggi di più su github