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



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



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

646   12  

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 в .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)

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

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

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

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

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

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

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

Как насчет определения autocommand (: 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 ВКЛ vim.org.

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

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

добавить в .vimrc

set binary

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

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

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

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

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

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

Plugin 'vim-scripts/PreserveNoEOL'

и далее в github

Comments

    Ничего не найдено.