VIM отключить автоматическую новую строку в конце файла

поэтому я работаю в PHP-магазине, и все мы используем разные редакторы, и все мы должны работать с windows. Я использую vim, и все в магазине продолжают жаловаться, что всякий раз, когда я редактирую файл, внизу есть новая строка. Я искал вокруг и обнаружил, что это документированное поведение vi & vim... но мне было интересно, есть ли способ отключить эту функцию. (Было бы лучше, если бы я мог отключить его для определенных расширений файлов).

Если кто-нибудь знает об этом, это будет будь великим!

12 ответов


даже если файл уже был сохранен с новой строки в конце:

vim -b file и однажды в vim:

:set noeol
:wq

сделано.

в качестве альтернативы вы можете открывать файлы в vim с помощью :e ++bin file

еще один вариант:

:set binary
:set noeol
:wq

и для vim 7.4+ вы также можете использовать вместо этого (желательно на вашем .vimrc):

:set nofixendofline

(спасибо 罗泽轩 за эту последнюю новость!)


добавьте следующую команду .vimrc для поворота опции конца строки:

autocmd FileType php setlocal noeol binary fileformat=dos

, PHP сам проигнорирует этот последний конец строки-это не должно быть проблемой. Я почти уверен, что в вашем случае есть что-то еще, что добавляет последний символ новой строки, или, возможно, есть путаница с типами окончания строки windows/unix (\n или \r\n и т. д.).

обновление:

альтернативное решение может быть просто добавить эту строку в ваш .vimrc:

set fileformats+=dos

есть другой способ подойти к этому, если вы используете Git для управления версиями. Вдохновленный ответ здесь, Я написал свой собственный фильтр для использования в gitattributes.

для того чтобы установить этот фильтр, сохраните его как noeol_filter где-то в $PATH, сделайте его исполняемым и выполните следующие команды:

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

чтобы начать использовать фильтр только для себя, поместите следующую строку в свой $GIT_DIR/info/attributes:

*.php filter=noeol

это убедитесь, что вы не фиксируете новую строку в eof в неважно, что ВИМ делает.

и теперь сам скрипт:

#!/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)

Я не пробовал эту опцию, но в справочной системе vim (т. е. 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 <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.  

обычно вам не нужно устанавливать или сбросьте этот параметр. Когда "двоичный" off значение не используется при записи папка. Когда "binary" находится на нем раньше помню наличии для последней строки файла, так что когда вы пишете в файл ситуация из исходного файла может содержаться. Но вы можете изменить его, если вы хотеть.

вас также может заинтересовать ответ на предыдущий вопрос:"почему файлы должны заканчиваться новой строкой".


Я добавил подсказку на вики Vim для аналогичной (хотя и другой) проблемы:

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


OK, вы находитесь на Windows, усложняет вещи;)

поскольку опция "binary" сбрасывает опцию "fileformat" (и запись с помощью "binary" set всегда записывает с окончаниями строк unix), давайте вытащим большой молоток и сделаем это извне!

Как насчет определения автокоманды (: help autocommand) для события BufWritePost? Эта автокоманда выполняется после каждого написания целого буфера. В этой автокоманде вызовите небольшой внешний инструмент (php, perl или любой другой скрипт) это удаляет последнюю новую строку только что написанного файла.

таким образом, это будет выглядеть примерно так и войдет в ваш .файл vimrc:

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

обязательно прочитайте всю документацию vim об автокомандах, если вы впервые имеете дело с автокомандами. Есть некоторые предостережения ,например, рекомендуется удалить все autocmds в вашем.vimrc в случае вашего .vimrc может получить источник несколько раз.


я реализовал предложения Blixtor с пост-обработкой Perl и Python, либо внутри Vim (если он скомпилирован с такой поддержкой языка), либо через внешний скрипт Perl. Он доступен как плагин PreserveNoEOL on vim.org.


может быть, вы могли бы посмотреть, почему они жалуются. Если файл php имеет новую строку после окончания ?> , php выведет его как часть страницы. Это не проблема, если вы не пытаетесь отправить заголовки после включения файла.

, в ?> в конце файла php является необязательным. Без конца ?> нет проблем с новой строки в конце файла.

добавить в .vimrc

set binary

и это помогает, попробуй


Я думаю, что нашел лучшее решение, чем принятый ответ. Альтернативные решения не работают для меня, и я не хочу работать в двоичном режиме. К счастью, это, похоже, делает работу, и я еще не сталкивался с неприятными побочными эффектами:сохранить отсутствующий конец строки в конце текстовых файлов. Я просто добавил Все это в свой~/.vimrc.


можно ли использовать специальную команду для сохранения этих файлов?

Если вы сделаете: set binary,: w и: set nobinary, файл будет записан без новой строки, если ее не было.

эта последовательность команд может быть помещена в пользовательскую команду или отображение, конечно.


Я нашел, что этот плагин vimscript полезен для этой ситуации.

Plugin 'vim-scripts/PreserveNoEOL'

и далее в github