如何阻止VIM在文件末尾添加换行符?
所以我在一家PHP商店工作,我们都使用不同的编辑器,我们都必须在Windows上工作。我使用vim,商店里的每个人都在抱怨,每当我编辑一个文件时,底部都有一个换行符。我四处搜索,发现这是一个记录在案的vi&vim行为。。。但我想知道是否有办法禁用此功能。(如果我可以针对特定的文件扩展名禁用它,那将是最好的)如何阻止VIM在文件末尾添加换行符?,vim,settings,newline,Vim,Settings,Newline,所以我在一家PHP商店工作,我们都使用不同的编辑器,我们都必须在Windows上工作。我使用vim,商店里的每个人都在抱怨,每当我编辑一个文件时,底部都有一个换行符。我四处搜索,发现这是一个记录在案的vi&vim行为。。。但我想知道是否有办法禁用此功能。(如果我可以针对特定的文件扩展名禁用它,那将是最好的) 如果有人知道这件事,那就太好了 我没有尝试此选项,但vim帮助系统(即帮助下线)中提供了以下信息: “endofline”“eol”布尔值(默认打开) 本地到缓冲区 {不在Vi} 写入文件时
如果有人知道这件事,那就太好了 我没有尝试此选项,但vim帮助系统(即帮助下线)中提供了以下信息:
“endofline”“eol”布尔值(默认打开)
本地到缓冲区
{不在Vi}
写入文件时,此选项处于禁用状态,而“二进制”选项
启用时,将为文件中的最后一行写入“否”。这
选项在开始编辑新文件时自动设置,除非
文件中的最后一行没有
在这种情况下,它被重置。
通常情况下,您不必设置或
重置此选项。当“二进制”是
关闭写入时不使用该值
档案。当“二进制”打开时,它是
用来记住一个
对于文件中的最后一行,
所以当你写文件的时候
情况可以从原始文件中删除
保留。但如果你愿意,你可以改变它
我想
你可能也对前面问题的答案感兴趣:“。也许你可以看看他们为什么抱怨。如果一个php文件在结束?>后有一个换行符,php将把它作为页面的一部分输出。这不是问题,除非在包含文件后尝试发送头
但是,php文件末尾的?>是可选的。无结尾?>,文件结尾的换行符没有问题。是否可以使用特殊命令保存这些文件 如果执行:set binary、:w和:set nobinary,则在没有换行符的情况下写入文件
当然,可以将此命令序列放入用户定义的命令或映射中。将以下命令添加到.vimrc中,以转到行结束选项:
autocmd FileType php setlocal noeol binary fileformat=dos
然而,PHP本身将忽略这一行的最后一段——这不应该是一个问题。我几乎可以肯定的是,在您的情况下,有其他东西正在添加最后一个换行符,或者可能与windows/unix的行尾类型混淆(\n
或\r\n
等)
更新:
另一种解决方案可能是将这一行添加到.vimrc中:
set fileformats+=dos
好吧,你使用Windows会使事情变得复杂;) 由于“binary”选项重置了“fileformat”选项(并且使用“binary”集合写入时总是使用unix行结尾),让我们拿出大锤,从外部执行此操作 为BufWritePost事件定义一个自动命令(:help autocommand)怎么样?每次写入整个缓冲区后,都会执行此自动命令。在这个自动命令中,调用一个小型的外部工具(php、perl或任何脚本),它去掉了刚刚编写的文件的最后一行换行符 这看起来像这样,并且会进入你的.vimrc文件:
autocmd! "Remove all autocmds (for current group), see below"
autocmd BufWritePost *.php !your-script <afile>
autocmd!“删除所有AutoCMD(对于当前组),请参阅下文”
autocmd BufWritePost*.php!你的剧本
如果这是您第一次处理自动命令,请务必阅读有关自动命令的整个vim文档。有一些注意事项,例如,建议删除.vimrc中的所有AutoCMD,以防.vimrc可能多次获得源代码。我在Vim wiki上为类似(尽管不同)问题添加了提示:
如果您使用Git进行源代码管理,还有另一种方法可以实现这一点。受此启发,我编写了自己的过滤器,用于文件中 要安装此筛选器,请将其另存为
noeol\u filter
中的$PATH
中的某个位置,使其可执行,然后运行以下命令:
git config --global filter.noeol.clean noeol_filter
git config --global filter.noeol.smudge cat
要开始仅为自己使用筛选器,请在$GIT_DIR/info/attributes
中添加以下行:
*.php filter=noeol
这将确保您不会在.php
文件的eof中提交任何新行,无论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
7.4+,您可以使用(最好是在.vimrc上)(感谢罗泽轩 最后一条消息!):
现在,关于较旧版本的vim
即使文件已在结尾处以新行保存:
vim-b文件
一旦进入vim:
:set noeol
:wq
完成了
或者,您可以使用:e++bin file
还有另一种选择:
:set binary
:set noeol
:wq
请参阅中的更多详细信息,我已经使用Perl和Python后处理实现了Blixtor的建议,这些建议可以在Vim内部运行(如果它是使用这种语言支持编译的),也可以通过外部Perl脚本实现。它可以在vim.org上访问。尝试添加到.vimrc
set binary
我想我找到了一个比公认答案更好的解决办法。替代解决方案对我不起作用,我不想一直在二进制模式下工作。
幸运的是,这似乎完成了工作,我还没有遇到任何令人讨厌的副作用:。我刚刚将整个内容添加到我的~/.vimrc中。我发现这个vimscript插件对这种情况很有帮助
Plugin 'vim-scripts/PreserveNoEOL'
或者从您可以使用的
vim
v7.4开始阅读更多内容
:set nofixendofline
这里有一些关于这种变化的信息:。我还遇到了eol设置。。。但它并没有完成这项任务。它更多的是一个变量,用于确定是否已将文件放在文件末尾。此外,它对文本文件没有影响,但只对二进制文件有影响。vim帮助还说“当‘二进制’关闭时,在写入文件时不使用该值。”关于eol+1,VonC对该问题的回答突出显示了“换行符”和eol
Plugin 'vim-scripts/PreserveNoEOL'
:set nofixendofline