首页 文章

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

提问于
浏览
200

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

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

12 回答

  • 1

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

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

  • 17

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

    vim -b file 和vim一次:

    :set noeol
    :wq
    

    完成 .

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

    另一种选择:

    :set binary
    :set noeol
    :wq
    

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

    :set nofixendofline
    

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

  • 11

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

    autocmd FileType php setlocal noeol binary fileformat=dos
    

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

    Update:

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

    set fileformats+=dos
    
  • 3

    如果您使用Git进行源代码管理,还有另一种方法可以解决这个问题 . 受an answer here的启发,我编写了自己的过滤器,用于gitattributes文件 .

    要安装此过滤器,请将其保存为 $PATH 中的 noeol_filter ,使其可执行,然后运行以下命令:

    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)
    
  • 8

    我没有尝试过这个选项,但是在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'关闭时,在写入文件时不使用该值 . 当'binary'打开时,它用于记住文件中最后一行的a的存在,这样当您编写文件时,可以保留原始文件中的情境 . 但是如果你愿意,你可以改变它 .

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

  • 2

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

  • 278

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

  • 2

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

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

  • 0

    我加入.vimrc

    set binary
    

    它有帮助,试试吧

  • 22

    我想我已经为我工作了,但我还没有遇到任何令人讨厌的副作用:preserve missing end-of-line at end of text files . 我刚刚将整个内容添加到〜/ .vimrc中 .

  • 10

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

    如果你这样做:设置二进制,:w和:set nobinary如果没有可以开始的话,文件将被写成没有换行符 .

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

  • 6

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

    Plugin 'vim-scripts/PreserveNoEOL'
    

    或者阅读更多信息,请致电github

相关问题