所以我在PHP店工作,大家都用不同的编辑器,我们都必须在Windows上运行。 我使用vim,每个人都在店里不停抱怨,每当我编辑一个文件有在底部的新行。 我搜索了一圈,发现这是第六和vim的一个记录的行为......但我想知道,如果有一些方法来禁用该功能。 (它wouldbe最好的,如果我可以禁用它特定文件扩展名)。
如果任何人都知道这一点,那将是伟大的!
所以我在PHP店工作,大家都用不同的编辑器,我们都必须在Windows上运行。 我使用vim,每个人都在店里不停抱怨,每当我编辑一个文件有在底部的新行。 我搜索了一圈,发现这是第六和vim的一个记录的行为......但我想知道,如果有一些方法来禁用该功能。 (它wouldbe最好的,如果我可以禁用它特定文件扩展名)。
如果任何人都知道这一点,那将是伟大的!
即使文件已被保存在结尾的新行:
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帮助系统(即帮助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.
通常情况下,你不必设置或重置该选项。 如果“binary”关闭,写入文件时不使用的值。 当“二进制”是它是用来记住的该文件的最后一行的存在,所以,当你写的文件从原始文件的情况下可以保持。 但你可以改变它,如果你想。
你可能有兴趣在回答前一个问题还有:“ 为什么要文件用新行结束 ”。
我已经添加了对Vim的维基尖端的相似(虽然不同)的问题:
http://vim.wikia.com/wiki/Do_not_auto-add_a_newline_at_EOF
OK,你是在Windows上复杂的事情;)
作为“二进制”选项会将“fileformat”选项(与写作“二元”设置总是Unix行结尾写道),让我们拿出的大铁锤,做它外部!
如何定义自动命令:为BufWritePost里事件(帮助自动命令)? 该自动命令你写的每一个整体缓冲时间后执行。 在此自动调用剥去只是书面文件的最后换行符一个小的外部工具(PHP,Perl或任何脚本)。
因此,这将是这个样子,并会进入你的.vimrc文件:
autocmd! "Remove all autocmds (for current group), see below"
autocmd BufWritePost *.php !your-script <afile>
请务必阅读有关自动命令整个Vim文档,如果这是你第一次处理自动命令。 还有一些注意事项,比如它的建议,以消除你的.vimrc所有自动命令的情况下,你的.vimrc可能会采购的多次。
我已经实现Blixtor与Perl和Python后处理的建议,无论是在Vim内运行(如果是这样的语言支持编译),或通过外部的Perl脚本。 它可作为PreserveNoEOL插件上vim.org。
也许你可以看看他们为什么都在抱怨。 如果一个PHP文件有结束后换行?>,PHP将其输出作为页面的一部分。 除非你试图包含在文件后发送头这不是一个问题。
但是,?>在PHP文件的末尾是可选的。 没有结局?>,用在文件的最后一个换行符没有问题。
我加入的.vimrc
set binary
它可以帮助,试试吧
我想我找到了比接受的答案一个更好的解决方案。 替代方案并没有为我工作,我不希望在二进制模式下工作,所有的时间。 还好,这似乎把工作做好,我还没有遇到过任何讨厌的副作用尚未: 保留缺少结束行的文本文件结束 。 我只是说整个事情对我的〜/ .vimrc。
有没有可能让你使用一个特殊的命令来保存这些文件?
如果你这样做:设置二进制,:w和:设置nobinary该文件将不换行如果没有,则开始与写入。
命令序列可以被放入一个用户定义的命令或映射,当然。
我发现这个插件Vimscript中对这种情况有帮助。
Plugin 'vim-scripts/PreserveNoEOL'
或更多在github上