当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《VIM在文件末尾禁用自动换行》经验,为你挑选了7个好方法。

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

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



1> gcb..:

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

vim 并且一旦进入vim:

:set nofixendofline

完成.

或者你可以用vim打开文件 vim

另一种选择:

:set noeol
:wq

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

:set binary
:set noeol
:wq

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


**注意**:`binary`覆盖`expandtab`,它将引导你在源代码中获得文字标签.
现在你可以添加`set nofixendofline`来解决Vim 7.4+中的问题
您还可以在.vimrc中添加`set binary`和`set noeol`
@CiroSantilli谢谢!我一直在寻找二元的副作用,并想知道为什么它不是默认的!因为我爱我的标签,我想我会考虑增加的好处:)

2> too much php..:

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

autocmd FileType php setlocal noeol binary fileformat=dos

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

更新:

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

set fileformats+=dos



3> Amir..:

如果您使用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

.php无论Vim做什么,这都将确保您不在文件中的eof中提交任何换行符.

现在,剧本本身:

#!/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: /sf/ask/17360801/#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)



4> Tim Henigan..:

我没有尝试过这个选项,但是在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  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  for the last line in the file, in
which case it is reset.  

通常,您不必设置或重置此选项.当'binary'关闭时,在写入文件时不使用该值.当'binary'打开时,它用于记住文件中最后一行的a的存在,这样当您编写文件时,可以保留原始文件中的情境.但是如果你愿意,你可以改变它.

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


vim帮助还说"当'二进制'关闭时,在写入文件时不使用该值." 关于eol

5> Jo Liss..:

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

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


"Vim 7.4.785添加了`fixeol`选项,可以禁用该选项以自动保留文件末尾的任何丢失的EOL.这个脚本对于Vim 7.4.785及更高版本来说是不必要的."(来源:相同的wiki页面.)谢谢,我不知道这个新选项.

6> Blixtor..:

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

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


这很棒!好极了!但是我有一个问题......有没有办法让它成为所以我不需要在每次保存后输入两次.我必须在弹出的cmd窗口中按Enter键,然后再次,因为vim告诉我脚本返回成功...任何方式让它们全部消失?
要避免提示,只需在命令前加上`silent`.例如`沉默!你的脚本`.

7> Ingo Karkat..:

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

推荐阅读
可爱的天使keven_464
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有