VIM отключить автоматический перевод строки в конце файла - PullRequest
227 голосов
/ 26 июня 2009

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

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

Ответы [ 12 ]

314 голосов
/ 20 апреля 2013

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

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

:set noeol
:wq

сделано.

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

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

:set binary
:set noeol
:wq

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

:set nofixendofline

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

22 голосов
/ 02 июля 2009

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

autocmd FileType php setlocal noeol binary fileformat=dos

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

Обновление:

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

set fileformats+=dos
17 голосов
/ 28 июня 2011

Есть другой способ приблизиться к этому, если вы используете 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.

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

#!/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)
11 голосов
/ 26 июня 2009

Я не пробовал эту опцию, но в справочной системе 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 значение не используется при записи файл. Когда бинарный включен раньше помнил присутствие для последней строки в файле, так что когда вы пишете файл Ситуация из исходного файла может быть сохраненным Но вы можете изменить это, если вы хочу.

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

9 голосов
/ 31 декабря 2010

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

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

8 голосов
/ 02 июля 2009

ОК, ваше пребывание в Windows усложняет ситуацию;)

Поскольку опция 'binary' сбрасывает опцию 'fileformat' (а запись с использованием набора 'binary' всегда записывает с окончанием строки 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 может быть получен несколько раз.

6 голосов
/ 26 апреля 2013

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

3 голосов
/ 28 июня 2009

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

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

2 голосов
/ 16 августа 2013

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

2 голосов
/ 30 мая 2013

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

set binary

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...