VIM отключить автоматическую новую строку в конце файла
Поэтому я работаю в магазине PHP, и мы все используем разные редакторы, и мы все должны работать над окнами. Я использую vim, и все в магазине продолжают жаловаться, что всякий раз, когда я редактирую файл, внизу появляется новая строка. Я искал вокруг и обнаружил, что это документированное поведение vi & vim... но мне было интересно, есть ли способ отключить эту функцию. (Было бы лучше, если бы я мог отключить его для определенных расширений файлов).
Если кто-нибудь знает об этом, это было бы здорово!
14 ответов
Даже если файл уже был сохранен с новыми строками в конце:
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://stackru.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 для аналогичной (хотя и другой) проблемы:
ОК, ты находишься на 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 может быть получен несколько раз.
Я реализовал предложения Blixtor с помощью постобработки Perl и Python, либо выполняемой внутри Vim (если она скомпилирована с такой поддержкой языка), либо с помощью внешнего сценария Perl. Он доступен как плагин PreserveNoEOL на vim.org.
Начиная с vim
v7.4 вы можете использовать
:set nofixendofline
Некоторая информация об этом изменении есть здесь: http://ftp.vim.org/vim/patches/7.4/7.4.785.
Может быть, вы могли бы посмотреть, почему они жалуются. Если у файла php есть новая строка после окончания?>, Php выведет его как часть страницы. Это не проблема, если вы не попытаетесь отправить заголовки после включения файла.
Тем не менее,?> В конце php-файла не является обязательным. Нет конца?>, Нет проблем с переводом строки в конец файла.
Я думаю, что нашел лучшее решение, чем принятый ответ. Альтернативные решения не работали для меня, и я не хотел постоянно работать в двоичном режиме. К счастью, это, кажется, делает работу, и я еще не столкнулся с какими-либо неприятными побочными эффектами: сохраняйте отсутствующий конец строки в конце текстовых файлов. Я просто добавил все это в мой ~/.vimrc.
Можно ли использовать специальную команду для сохранения этих файлов?
Если вы сделаете:set binary,:w и:set nobinary, файл будет записан без перевода строки, если не было никого, с чего начинать.
Эта последовательность команд может быть помещена в определенную пользователем команду или отображение, конечно.
Я нашел этот плагин vimscript полезным для этой ситуации.
Plugin 'vim-scripts/PreserveNoEOL'
Или читайте больше на github
в неовиме вы можете использовать
vim.opt.fixendofline = false
в файле конфигурации Lua