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 в
.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.обычно вам не нужно устанавливать или сбросьте этот параметр. Когда "бинарный" - это выкл значение не используется при записи папка. Когда "двоичный" находится на нем используется для запоминания наличия для последней строки в файле, так что когда вы пишете файл ситуация из исходного файла может содержаться. Но вы можете изменить его, если вы хотеть.
вас также может заинтересовать ответ на предыдущий вопрос:"почему файлы должны заканчиваться новой строкой".
ОК, вы находитесь на 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,: w и: set nobinary файл будет записан без новой строки, если не было ни одного для начала.
эта последовательность команд может быть помещена в пользовательскую команду или отображение, конечно.
Я обнаружил, что этот плагин vimscript полезен для этой ситуации.
Plugin 'vim-scripts/PreserveNoEOL'и далее в github
Comments