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

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

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

Ответ 1

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

vim -b file  и один раз в vim:

:set noeol
:wq

сделано.

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

Еще одна альтернатива:

:set binary
:set noeol
:wq

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

:set nofixendofline

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

Ответ 2

Добавьте следующую команду в свой .vimrc, чтобы включить параметр конца строки:

autocmd FileType php setlocal noeol binary fileformat=dos

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

Update:

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

set fileformats+=dos

Ответ 3

Существует другой способ приблизиться к этому, если вы используете 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 в файле .php, независимо от того, что делает Vim.

И теперь сам script:

#!/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: /questions/9237/how-can-i-delete-a-newline-if-it-is-the-last-character-in-a-file/63542#63542

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)

Ответ 4

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

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

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

Ответ 6

ОК, вы на Windows усложняют вещи;)

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

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

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

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

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

Ответ 7

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

Ответ 8

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

Однако,? > в конце php файла является необязательным. Нет окончания? > , Никаких проблем с новой строкой в ​​конце файла.

Ответ 9

Я добавляю в .vimrc

set binary

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

Ответ 10

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

Ответ 11

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

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

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

Ответ 12

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

Plugin 'vim-scripts/PreserveNoEOL'

Или читайте больше на github