关于设置:vim禁用文件末尾的自动换行

VIM Disable Automatic Newline At End Of File

所以我在一家PHP商店工作,我们都使用不同的编辑器,我们都必须在Windows上工作。我使用vim,商店里的每个人都抱怨每当我编辑一个文件时,底部都有一个新行。我四处搜索,发现这是一个记录在案的vi&vim行为…但是我想知道是否有什么方法可以禁用这个功能。(最好是我可以为特定的文件扩展名禁用它)。

如果有人知道,那就太好了!


即使文件已在末尾用新行保存:

vim -b file一旦进入VIM:

1
2
:set noeol
:wq

完成。

或者,您可以使用:e ++bin file在vim中打开文件。

还有另一种选择:

1
2
3
:set binary
:set noeol
:wq

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

1
:set nofixendofline

(多亏了罗泽轩最后一点消息!)


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

1
autocmd FileType php setlocal noeol binary fileformat=dos

然而,PHP本身会忽略最后一行——这不应该是一个问题。我几乎可以肯定,在您的例子中,还有其他一些添加了最后一个换行符,或者可能与Windows/Unix行尾类型(

等)混淆了。

更新:

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

1
set fileformats+=dos


如果您使用git进行源代码管理,那么还有另一种方法来处理这个问题。受这里答案的启发,我编写了自己的过滤器,用于Gittributes文件中。

要安装此筛选器,请将其另存为noeol_filter,使其可执行,并运行以下命令:

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

要只为自己使用过滤器,请在您的$GIT_DIR/info/attributes中放置以下行:

1
*.php filter=noeol

这将确保您不会在.php文件的EOF提交任何新行,无论VIM做什么。

现在,脚本本身:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
#!/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("

"):

        sys.stdout.write(pline[:-2])
    elif len(pline) > 1 and pline.endswith("
"):

        sys.stdout.write(pline[:-1])
    else:
        sys.stdout.write(pline)


我没有尝试过此选项,但VIM帮助系统(即帮助EOL)中提供了以下信息:

1
2
3
4
5
6
7
8
9
'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.

Normally you don't have to set or
reset this option. When 'binary' is
off the value is not used when writing
the file. When 'binary' is on it is
used to remember the presence of a
for the last line in the file,
so that when you write the file the
situation from the original file can
be kept. But you can change it if you
want to.

您可能对前面一个问题的答案也感兴趣:"为什么文件以换行符结尾"。


我在vim wiki上添加了一个关于类似(尽管不同)问题的提示:

http://vim.wiki a.com/wiki/do_not_auto-add_a_newline_at_eof


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

由于"binary"选项重置了"fileformat"选项(并且使用"binary"设置写入时总是使用unix行尾写入),所以让我们拿出大锤子从外部执行它!

为bufWritePost事件定义自动命令(:help autocommand)如何?每次写入整个缓冲区后都会执行此自动命令。在这个自动命令中,调用一个小型的外部工具(php、perl或其他脚本),它去掉刚刚写入文件的最后一行。

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

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

如果这是您第一次处理自动命令,请务必阅读有关自动命令的完整VIM文档。有一些警告,例如,建议删除.vimrc中的所有autocmd,以防.vimrc可能多次获得源代码。


我已经用Perl和Python后处理实现了Blixtor的建议,要么在Vim内部运行(如果它是用这种语言支持编译的),要么通过外部Perl脚本。它在vim.org上作为preservenoeol插件提供。


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

然而,?>在PHP文件的末尾是可选的。没有结局?>,文件末尾的换行符没有问题。


我想我找到了比公认答案更好的解决方案。其他的解决方案对我不起作用,我也不想一直在二进制模式下工作。幸运的是,这似乎完成了任务,我还没有遇到任何令人讨厌的副作用:保留文本文件末尾缺少的行尾。我刚刚把这一切都加在了我的~/.vimrc上。


我加进去。

1
set binary

有帮助,试试看


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

如果执行以下操作:set binary、:w和:set nobinary,则如果没有要开始的文件,则该文件将不带换行符写入。

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


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

1
Plugin 'vim-scripts/PreserveNoEOL'

或在Github阅读更多内容