因此,我在一家PHP商店工作,我们都使用不同的编辑器,我们都必须在Windows上工作。我使用vim,商店中的每个人都在抱怨,每当我编辑文件时,底部都会有一个换行符。我四处搜索,发现这是vi和vim的记录行为...但是我想知道是否有某种方法可以禁用此功能。(最好是可以针对特定的文件扩展名禁用它)。
如果有人知道这一点,那就太好了!
?>
出于这个原因,PHP官方建议的做法是省略最后一个结束标记。
因此,我在一家PHP商店工作,我们都使用不同的编辑器,我们都必须在Windows上工作。我使用vim,商店中的每个人都在抱怨,每当我编辑文件时,底部都会有一个换行符。我四处搜索,发现这是vi和vim的记录行为...但是我想知道是否有某种方法可以禁用此功能。(最好是可以针对特定的文件扩展名禁用它)。
如果有人知道这一点,那就太好了!
?>
出于这个原因,PHP官方建议的做法是省略最后一个结束标记。
Answers:
对于vim
7.4+,您可以使用(最好在您的.vimrc上使用)(感谢罗泽轩提供的最新消息!):
:set nofixendofline
现在关于的旧版本vim
。
即使文件已经用结尾的新行保存:
vim -b file
并在vim中:
:set noeol
:wq
完成。
或者,您可以使用以下命令在vim中打开文件 :e ++bin file
另一个选择:
:set binary
:set noeol
:wq
set binary
并set noeol
在.vimrc
binary
覆盖expandtab
,这将导致您在源代码中获取文字标签。
set nofixendofline
解决Vim 7.4+中的问题
将以下命令添加到您的.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: /programming/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”打开时,它用于记住文件最后一行的a的存在,因此当您写入文件时,可以保留原始文件中的情况。但是您可以根据需要进行更改。
您可能也对上一个问题的答案感兴趣:“ 文件为什么要以换行符结尾 ”。
OK,您在Windows上使事情变得复杂了;)
当'binary'选项重置'fileformat'选项时(并且使用'binary'设置进行写操作时总是使用unix行尾进行写操作),让我们拿起大锤子从外部进行操作!
如何为BufWritePost事件定义自动命令(:help自动命令)?每次您写入整个缓冲区后,都会执行此自动命令。在此自动命令调用中,将使用一个小的外部工具(php,perl或任何脚本)剥离刚刚写入的文件的最后一个换行符。
因此,这看起来像这样,并将进入您的.vimrc文件:
autocmd! "Remove all autocmds (for current group), see below"
autocmd BufWritePost *.php !your-script <afile>
如果您是第一次处理自动命令,请确保阅读有关自动命令的整个vim文档。有一些警告,例如,建议删除.vimrc中的所有autocmd,以防您的.vimrc可能多次获得。
silent
。例如silent !your-script <afile>
。
我已经在Perl和Python后处理中实现了Blixtor的建议,这些后处理既可以在Vim中运行(如果使用这种语言支持进行编译),也可以通过外部Perl脚本运行。它可以作为vim.org上的PreserveNoEOL插件使用。
let g:PreserveNoEOL = 1
放入.vimrc
文件中!必须学习vimscript从插件描述中找出答案!:D
:help PreserveNoEOL-usage
也会告诉你的。RTFM :-)
INSTALLATION
和下寻找这个CONFIGURATION
。甚至没有注意到USAGE
描述中的部分,因为它位于安装之上:)
也许您可以看看他们为什么抱怨。如果php文件末尾有一个换行符?>,则php将其输出为页面的一部分。除非您在包含文件后尝试发送头,否则这不是问题。
但是,php文件末尾的?>是可选的。没有结尾?>,文件末尾的换行符没有问题。
我认为我找到了比可接受答案更好的解决方案。替代解决方案不适用于我,我也不想一直都在二进制模式下工作。幸运的是,这似乎可以完成工作,而且我还没有遇到任何讨厌的副作用:在文本文件末尾保留丢失的行尾。我只是将整个内容添加到我的〜/ .vimrc中。