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

Bou*_*ley 238 vim settings newline

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

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

gcb*_*gcb 336

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

vim 并且一旦进入vim:

:set nofixendofline
Run Code Online (Sandbox Code Playgroud)

完成.

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

另一种选择:

:set noeol
:wq
Run Code Online (Sandbox Code Playgroud)

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

:set binary
:set noeol
:wq
Run Code Online (Sandbox Code Playgroud)

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

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

too*_*php 23

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

autocmd FileType php setlocal noeol binary fileformat=dos
Run Code Online (Sandbox Code Playgroud)

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

更新:

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

set fileformats+=dos
Run Code Online (Sandbox Code Playgroud)


Ami*_*mir 17

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

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

git config --global filter.noeol.clean noeol_filter
git config --global filter.noeol.smudge cat
Run Code Online (Sandbox Code Playgroud)

要仅为自己开始使用过滤器,请在以下行中添加以下行$GIT_DIR/info/attributes:

*.php filter=noeol
Run Code Online (Sandbox Code Playgroud)

.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: 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)
Run Code Online (Sandbox Code Playgroud)


Tim*_*gan 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.  
Run Code Online (Sandbox Code Playgroud)

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

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

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

Jo *_*iss 9

我在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页面.)谢谢,我不知道这个新选项. (5认同)
  • 我必须同时设置 `noeol` 和 `nofixeol` 才能达到理想的效果。 (2认同)

Bli*_*tor 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>
Run Code Online (Sandbox Code Playgroud)

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

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

Ing*_*kat 6

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


Vic*_*ema 6

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

:set nofixendofline
Run Code Online (Sandbox Code Playgroud)

这里有一些有关该更改的信息:http://ftp.vim.org/vim/patches/7.4/7.4.785