VIM在文件结束时禁用自动换行

所以我在一家PHP商店工作,我们都使用不同的编辑器,我们都必须在Windows上工作。 我使用vim,商店里的每个人都不停地抱怨,每当我编辑一个文件,底部都有一个换行符。 我search了四处,发现这是一个logging的vi&vim的行为…但我想知道是否有某种方法来禁用此function。 (这将是最好的,如果我可以禁用它的特定文件扩展名)。

如果有人知道这件事,那就太棒了!

即使该文件已在最后以新行保存:

vim -b file ,一旦在vim中:

 :set noeol :wq 

完成。

或者你也可以在vim中打开文件:e ++bin file

还有另一种select:

 :set binary :set noeol :wq 

而对于vim 7.4+,你也可以使用(最好在.vimrc上):

 :set nofixendofline 

(感谢罗泽轩的最新消息!)

将下面的命令添加到.vimrc中以结束行结束选项:

 autocmd FileType php setlocal noeol binary fileformat=dos 

但是 ,PHP本身将忽略最后一个行尾 – 这不应该是一个问题。 我几乎可以肯定的是,在你的情况下,还有其他的东西是添加最后一个换行符,或者可能是与windows / unix行末尾types混合( \n\r\n等)。

更新:

另一种解决scheme可能是将此行添加到.vimrc中:

 set fileformats+=dos 

如果您使用Git进行源代码pipe理,还有另一种方法可以解决这个问题。 受到这里的答案的启发,我写了自己的filter在gitattributes文件中使用。

要安装此filter,请将其保存为$PATH某处的noeol_filter ,使其可执行,然后运行以下命令:

 git config --global filter.noeol.clean noeol_filter git config --global filter.noeol.smudge cat 

要开始仅为自己使用filter,请将以下行放入$GIT_DIR/info/attributes

 *.php filter=noeol 

这将确保你不会在.php文件的eof中提交任何换行符,不pipeVim如何。

而现在,剧本本身:

 #!/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帮助系统(ie 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. 

通常,您不必设置或重置此选项。 当“二进制”closures时,写入文件时不使用该值。 当“二进制”打开时,它用于记住文件中最后一行的a的存在,以便在写入文件时可以保留原始文件的情况。 但是如果你愿意,你可以改变它。

您也可能对上一个问题的答案感兴趣:“ 为什么文件应该以换行符结束 ”。

我在Vim wiki上添加了一个类似(虽然不同)问题的提示:

http://vim.wikia.com/wiki/Do_not_auto-add_a_newline_at_EOF

好吧,你在Windows上使事情复杂化;)

由于“二进制”选项重置“文件格式”选项(用“二进制”设置写入总是写入unix行结尾),让我们拿出大锤子,并在外部做!

如何为BufWritePost事件定义自动命令(:help autocommand)? 这个自动命令在你每次写完一个缓冲区之后执行。 在这个自动命令中,调用一个小的外部工具(php,perl或其他脚本),去掉刚刚写入的文件的最后一个换行符。

所以这看起来像这样,会进入你的.vimrc文件:

 autocmd! "Remove all autocmds (for current group), see below" autocmd BufWritePost *.php !your-script <afile> 

如果这是您第一次处理自动命令,请务必阅读有关自动命令的整个vim文档。 有一些注意事项,例如,build议您删除.vimrc中的所有autocmds,以防万一您的.vimrc可能来源多次。

我已经使用Perl和Python后处理实现了Blixtor的build议,既可以在Vim中运行(如果编译时使用了这种语言支持),也可以通过外部Perl脚本运行。 它可以作为vim.org上的PreserveNoEOL插件使用。

也许你可以看看他们为什么抱怨。 如果一个php文件在结束后有一个换行符,> php将会把它作为页面的一部分输出。 这不是一个问题,除非您在包含文件后尝试发送标题。

但是,PHP文件末尾的?>是可选的。 没有结束?>,没有问题在文件的末尾换行。

我认为我find了比接受的答案更好的解决scheme。 替代解决scheme不适合我,我不想一直在二进制模式下工作。 幸运的是,这似乎完成了工作,我还没有遇到任何令人讨厌的副作用: 在文本文件末尾保留缺less的行尾 。 我只是把整个东西加到我的〜/ .vimrc中。

你有可能使用一个特殊的命令来保存这些文件吗?

如果你这样做:设置二进制,:W和:设置nobinary文件将被写入没有换行,如果没有开始。

当然,这个命令序列可以放入用户定义的命令或映射中。

我添加.vimrc

 set binary 

这有助于尝试

我发现这个vimscript插件对这种情况很有帮助。

 Plugin 'vim-scripts/PreserveNoEOL' 

或者阅读更多的github