VIM在文件末尾禁用自动换行

时间:2009-06-26 18:52:34

标签: vim settings newline

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

如果有人知道这一点,那就太棒了!

13 个答案:

答案 0 :(得分:310)

即使文件最后已用新行保存:

vim -b file  一次进入vim:

:set noeol
:wq

进行。

或者您可以使用:e ++bin file

在vim中打开文件

另一种选择:

:set binary
:set noeol
:wq

对于vim 7.4+,你也可以使用(最好是你的.vimrc):

:set nofixendofline

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

答案 1 :(得分:22)

将以下命令添加到.vimrc以转换行尾选项:

autocmd FileType php setlocal noeol binary fileformat=dos

然而,PHP本身将忽略最后一行 - 它应该不是问题。我几乎可以肯定,在你的情况下,还有其他东西正在添加最后一个换行符,或者可能有一个混合使用windows / unix行结束类型(\n\r\n等)。< / p>

<强>更新

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

set fileformats+=dos

答案 2 :(得分:17)

如果您使用Git进行源代码管理,还有另一种方法可以解决这个问题。受an answer here的启发,我编写了自己的过滤器,用于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文件中提交任何换行符,无论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)

答案 3 :(得分:11)

我没有尝试过这个选项,但是在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.  
  

通常您不必设置或   重置此选项。当'二进制'是   写入时不使用off值   文件。当“二进制”打开时,它就是   曾经记得a的存在    对于文件中的最后一行,   这样当你写文件时   来自原始文件的情况可以   被保存。但是你可以改变它   想要。

您可能也对上一个问题的答案感兴趣:“Why should files end with a newline”。

答案 4 :(得分:9)

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

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

答案 5 :(得分:8)

好的,你在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>

如果这是您第一次处理自动命令,请务必阅读有关自动命令的整个vim文档。有一些警告,例如如果您的.vimrc可能多次获取,建议删除.vimrc中的所有autocmds。

答案 6 :(得分:6)

我已经用Perl和Python后处理实现了Blixtor的建议,要么在Vim中运行(如果它是用这种语言支持编译的话),要么通过外部Perl脚本。它可以在vim.org上以PreserveNoEOL plugin的形式获得。

答案 7 :(得分:3)

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

但是,?&gt;在php文件的末尾是可选的。没有结束?&gt;,文件末尾的换行没问题。

答案 8 :(得分:2)

我添加.vimrc

set binary

它有帮助,试试吧

答案 9 :(得分:2)

我认为我找到了比接受的答案更好的解决方案。替代解决方案对我不起作用,我不想一直以二进制模式工作。 幸运的是,这似乎完成了工作,我还没有遇到任何令人讨厌的副作用:preserve missing end-of-line at end of text files。我刚刚把整件事添加到我的〜/ .vimrc。

答案 10 :(得分:1)

您是否可以使用特殊命令保存这些文件?

如果你这样做:设置二进制,:w和:set nobinary,如果没有新行,文件将被写成没有换行符。

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

答案 11 :(得分:1)

vim v7.4开始,您可以使用

:set nofixendofline

此处提供有关此更改的一些信息:http://ftp.vim.org/vim/patches/7.4/7.4.785

答案 12 :(得分:0)

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

Plugin 'vim-scripts/PreserveNoEOL'

或在github

了解详情