VIM Desactivar Nueva Línea Automática Al Final Del Archivo


Así que trabajo en una tienda PHP, y todos usamos diferentes editores, y todos tenemos que trabajar en Windows. Uso vim, y todo el mundo en la tienda sigue quejándose de que cada vez que edito un archivo hay una nueva línea en la parte inferior. He buscado y encontrado que este es un comportamiento documentado de vi & vim... pero me preguntaba si había alguna manera de desactivar esta función. (Sería mejor si pudiera desactivarlo para extensiones de archivo específicas).

Si alguien sabe de esto, eso sería ¡Órale!

Author: Nemanja Boric, 2009-06-26

12 answers

Incluso si el archivo ya estaba guardado con nuevas líneas al final:

vim -b file y una vez en vim:

:set noeol
:wq

Hecho.

Alternativamente, puede abrir archivos en vim con :e ++bin file

Otra alternativa:

:set binary
:set noeol
:wq

Y para vim 7.4+ también se puede utilizar en su lugar (preferiblemente en su .vimrc):

:set nofixendofline

(gracias a 罗泽轩 por esa última noticia!)

 266
Author: gcb,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-09-19 00:15:19

Agregue el siguiente comando a su .vimrc a su vez de la opción de fin de línea:

autocmd FileType php setlocal noeol binary fileformat=dos

Sin embargo , PHP mismo ignorará ese último final de línea-no debería ser un problema. Estoy casi seguro de que en su caso hay algo más que está agregando el último carácter de nueva línea, o posiblemente hay una confusión con los tipos de terminación de línea de windows/unix (\n o \r\n, etc).

Actualización:

Una solución alternativa podría ser simplemente agregar esta línea a su .vimrc:

set fileformats+=dos
 22
Author: too much php,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-07-02 23:34:58

Hay otra forma de abordar esto si está utilizando Git para el control de código fuente. Inspirado por una respuesta aquí, escribí mi propio filtro para usar en un archivo gitattributes.

Para instalar este filtro, guárdelo como noeol_filter en algún lugar de su $PATH, hacerlo ejecutable, y ejecute los siguientes comandos:

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

Para comenzar a usar el filtro solo para usted, ponga la siguiente línea en su $GIT_DIR/info/attributes:

*.php filter=noeol

Esto asegurará que no cometas ninguna nueva línea en eof en un archivo .php, no importa lo que haga Vim.

Y ahora, el guion en sí:

#!/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)
 16
Author: Amir,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-23 12:02:38

No he probado esta opción, pero la siguiente información se da en el sistema de ayuda vim (es decir, ayuda 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 <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.  

Normalmente no tiene que configurar o restablezca esta opción. Cuando 'binario' es off el valor no se usa al escribir archivo. Cuando 'binario' está encendido es se utiliza para recordar la presencia de un para la última línea del archivo, para que cuando se escribe el archivo de la situación del archivo original puede quédate. Pero puedes cambiarlo si querer a.

También puede interesarle la respuesta a una pregunta anterior: " Por qué los archivos deben terminar con una nueva línea".

 11
Author: Tim Henigan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-23 12:26:20

He añadido un consejo en el wiki de Vim para un problema similar (aunque diferente):

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

 9
Author: Jo Liss,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-12-31 02:48:44

OK, estar en Windows complica las cosas ;)

A medida que la opción' binary 'restablece la opción' fileformat '(y escribir con el conjunto' binary ' siempre escribe con finales de línea unix), vamos a sacar el gran martillo y hacerlo externamente!

¿Qué tal definir un autocommand (:help autocommand) para el evento BufWritePost? Este comando automático se ejecuta después de cada vez que escribes un buffer completo. En este autocommand llamar a una pequeña herramienta externa (php, perl o cualquier script) fuera de la última nueva línea del archivo recién escrito.

Así que esto se vería algo como esto y entraría en su.archivo vimrc:

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

Asegúrese de leer toda la documentación de vim sobre autocomandos si es la primera vez que trata con autocomandos. Hay algunas advertencias, por ejemplo, se recomienda eliminar todos los autocmds en su .vimrc en caso de su.vimrc puede obtener fuentes varias veces.

 8
Author: Blixtor,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-07-02 07:22:29

He implementado las sugerencias de Blixtor con el post-procesamiento de Perl y Python, ya sea ejecutándose dentro de Vim (si está compilado con dicho soporte de lenguaje), o a través de un script Perl externo. Está disponible como el Preservvenoeol plugin en vim.org.

 6
Author: Ingo Karkat,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-04-26 12:14:34

Tal vez podrías ver por qué se están quejando. Si un archivo php tiene una nueva línea después de la finalización ?> , php lo mostrará como parte de la página. Esto no es un problema a menos que intente enviar encabezados después de que se incluya el archivo.

Sin embargo, el ?> al final de un archivo php es opcional. No termina ?> , no hay problema con una nueva línea al final del archivo.

 3
Author: Ken,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-06-28 17:04:03

Añado.vimrc

set binary

Y ayuda, pruébalo

 2
Author: IvanM,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-05-30 05:43:58

Creo que he encontrado una solución mejor que la respuesta aceptada. Las soluciones alternativas no funcionaban para mí y no quería tener que trabajar en modo binario todo el tiempo. Afortunadamente, esto parece hacer el trabajo y todavía no he encontrado ningún efecto secundario desagradable: preservar el final de línea faltante al final de los archivos de texto. Acabo de añadir todo a mi ~/.vimrc.

 2
Author: Jay Paroline,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-08-16 05:47:01

¿Sería posible utilizar un comando especial para guardar estos archivos?

Si lo hace :set binary, :w y :set nobinary, el archivo se escribirá sin nueva línea si no había ninguna para comenzar.

Esta secuencia de comandos se podría poner en un comando definido por el usuario o una asignación, por supuesto.

 1
Author: Blixtor,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-07-01 09:19:51

Me pareció que este plugin vimscript es útil para esta situación.

Plugin 'vim-scripts/PreserveNoEOL'

O leer más en github

 0
Author: Alan Dong,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-07-12 00:57:55