VIM禁用自动换行在末端的文件VIM禁用自动换行在末端的文件(VIM Disable Automat

2019-05-13 22:52发布

所以我在PHP店工作,大家都用不同的编辑器,我们都必须在Windows上运行。 我使用vim,每个人都在店里不停抱怨,每当我编辑一个文件有在底部的新行。 我搜索了一圈,发现这是第六和vim的一个记录的行为......但我想知道,如果有一些方法来禁用该功能。 (它wouldbe最好的,如果我可以禁用它特定文件扩展名)。

如果任何人都知道这一点,那将是伟大的!

Answer 1:

即使文件已被保存在结尾的新行:

vim -b file ,一旦在vim:

:set noeol
:wq

完成。

或者你可以用VIM打开文件的:e ++bin file

另一种替代方案:

:set binary
:set noeol
:wq

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

:set nofixendofline

(感谢罗泽轩的消息,说最后一点!)



Answer 2:

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

autocmd FileType php setlocal noeol binary fileformat=dos

然而 ,PHP本身会忽略这最后结束行-它不应该是一个问题。 我几乎可以肯定,你的情况有别的一些东西,加上最后一个换行符,或者可能存在与Windows / Unix行结束类型(一查询股价\n\r\n等)。

更新:

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

set fileformats+=dos


Answer 3:

还有一种方式,如果你正在使用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: 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)


Answer 4:

我没试过这个选项,但下面的信息在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”关闭,写入文件时不使用的值。 当“二进制”是它是用来记住的该文件的最后一行的存在,所以,当你写的文件从原始文件的情况下可以保持。 但你可以改变它,如果你想。

你可能有兴趣在回答前一个问题还有:“ 为什么要文件用新行结束 ”。



Answer 5:

我已经添加了对Vim的维基尖端的相似(虽然不同)的问题:

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



Answer 6:

OK,你是在Windows上复杂的事情;)

作为“二进制”选项会将“fileformat”选项(与写作“二元”设置总是Unix行结尾写道),让我们拿出的大铁锤,做它外部!

如何定义自动命令:为BufWritePost里事件(帮助自动命令)? 该自动命令你写的每一个整体缓冲时间后执行。 在此自动调用剥去只是书面文件的最后换行符一个小的外部工具(PHP,Perl或任何脚本)。

因此,这将是这个样子,并会进入你的.vimrc文件:

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

请务必阅读有关自动命令整个Vim文档,如果这是你第一次处理自动命令。 还有一些注意事项,比如它的建议,以消除你的.vimrc所有自动命令的情况下,你的.vimrc可能会采购的多次。



Answer 7:

我已经实现Blixtor与Perl和Python后处理的建议,无论是在Vim内运行(如果是这样的语言支持编译),或通过外部的Perl脚本。 它可作为PreserveNoEOL插件上vim.org。



Answer 8:

也许你可以看看他们为什么都在抱怨。 如果一个PHP文件有结束后换行?>,PHP将其输出作为页面的一部分。 除非你试图包含在文件后发送头这不是一个问题。

但是,?>在PHP文件的末尾是可选的。 没有结局?>,用在文件的最后一个换行符没有问题。



Answer 9:

我加入的.vimrc

set binary

它可以帮助,试试吧



Answer 10:

我想我找到了比接受的答案一个更好的解决方案。 替代方案并没有为我工作,我不希望在二进制模式下工作,所有的时间。 还好,这似乎把工作做好,我还没有遇到过任何讨厌的副作用尚未: 保留缺少结束行的文本文件结束 。 我只是说整个事情对我的〜/ .vimrc。



Answer 11:

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

如果你这样做:设置二进制,:w和:设置nobinary该文件将不换行如果没有,则开始与写入。

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



Answer 12:

我发现这个插件Vimscript中对这种情况有帮助。

Plugin 'vim-scripts/PreserveNoEOL'

或更多在github上



文章来源: VIM Disable Automatic Newline At End Of File