我在PHP团队工作,我们都使用不同的编辑器,并且必须在Windows上工作。我使用vim,但是每当我编辑一个文件时,所有人都抱怨底部会有一个换行符。我找到了相关资料,发现这是vi和vim的已知行为...但我想知道是否有方法可以禁用此功能(最好是只针对特定的文件扩展名)。
如果有人知道如何做到这一点,那就太好了!
:set nofixeol
:set nofixendofline
vim -b file
然后进入vim编辑器。:set noeol
:wq
完成。
或者你可以用:e ++bin file
在vim中打开文件。
还有另一种选择:
:set binary
:set noeol
:wq
请查看更多详细信息:为什么我需要在二进制模式下使用vim才能使'noeol'起作用?
binary
会覆盖 expandtab
,这将导致源代码中出现制表符而非空格。 - Ciro Santilli OurBigBook.comset 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
这将确保您不会在 .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://dev59.com/CHI-5IYBdhLWcg3w0cOG#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.
通常情况下,您不需要设置或重置此选项。当“binary”处于关闭状态时,写入文件时不使用该值。当“binary”处于打开状态时,用于记住文件中最后一行的“\n”符号是否存在,以便在写入文件时可以保持与原始文件相同的情况。但是如果您想要更改它,也是可以的。
您可能对之前的一个问题的答案感兴趣:“为什么文件应该以换行符结尾”。
我已经在Vim维基上为类似(但不同)的问题添加了一条提示:
fixeol
选项,可以禁用自动保留文件末尾缺失EOL的功能。对于Vim 7.4.785及更高版本,此脚本变得不必要。谢谢,我不知道有这个新选项。 - Amirnoeol
和 nofixeol
才能达到理想的结果。 - selurvedu好的,你使用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>
如果这是您第一次处理autocommands,请务必阅读有关vim文档的全部内容。有一些注意事项,例如建议在您的.vimrc中删除所有autocmds,以防您的.vimrc可能被多次引用。
silent !your-script <afile>
。 - dash-tom-bang从 vim
v7.4 开始,您可以使用以下命令:
:set nofixendofline
这里有关于这个变更的一些信息:http://ftp.vim.org/vim/patches/7.4/7.4.785。
我已经采用了Blixtor的建议,使用Perl和Python进行后处理,可以在Vim中运行(如果编译时支持这种语言),也可以通过外部Perl脚本运行。它作为PreserveNoEOL插件在vim.org上提供。
let g:PreserveNoEOL = 1
放入我的 .vimrc
文件中!从插件描述中了解到这一点需要学习 vimscript! :D - DarthVanger:help PreserveNoEOL-usage
也会告诉你的。RTFM :-) - Ingo KarkatINSTALLATION
和CONFIGURATION
下寻找它。因为它在安装说明之上,所以甚至没有注意到描述中的USAGE
部分 :) - DarthVanger尝试在.vimrc中添加以下内容:
set binary
?>
闭合标签,就是出于这个原因。 - Sebastián Grignoli