Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/vim/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何阻止VIM在文件末尾添加换行符?_Vim_Settings_Newline - Fatal编程技术网

如何阻止VIM在文件末尾添加换行符?

如何阻止VIM在文件末尾添加换行符?,vim,settings,newline,Vim,Settings,Newline,所以我在一家PHP商店工作,我们都使用不同的编辑器,我们都必须在Windows上工作。我使用vim,商店里的每个人都在抱怨,每当我编辑一个文件时,底部都有一个换行符。我四处搜索,发现这是一个记录在案的vi&vim行为。。。但我想知道是否有办法禁用此功能。(如果我可以针对特定的文件扩展名禁用它,那将是最好的) 如果有人知道这件事,那就太好了 我没有尝试此选项,但vim帮助系统(即帮助下线)中提供了以下信息: “endofline”“eol”布尔值(默认打开) 本地到缓冲区 {不在Vi} 写入文件时

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


如果有人知道这件事,那就太好了

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

“endofline”“eol”布尔值(默认打开)
本地到缓冲区
{不在Vi}
写入文件时,此选项处于禁用状态,而“二进制”选项
启用时,将为文件中的最后一行写入“否”。这
选项在开始编辑新文件时自动设置,除非
文件中的最后一行没有
在这种情况下,它被重置。
通常情况下,您不必设置或 重置此选项。当“二进制”是 关闭写入时不使用该值 档案。当“二进制”打开时,它是 用来记住一个 对于文件中的最后一行, 所以当你写文件的时候 情况可以从原始文件中删除 保留。但如果你愿意,你可以改变它 我想


你可能也对前面问题的答案感兴趣:“。

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


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

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

如果执行:set binary、:w和:set nobinary,则在没有换行符的情况下写入文件


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

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

autocmd FileType php setlocal noeol binary fileformat=dos
然而,PHP本身将忽略这一行的最后一段——这不应该是一个问题。我几乎可以肯定的是,在您的情况下,有其他东西正在添加最后一个换行符,或者可能与windows/unix的行尾类型混淆(
\n
\r\n
等)

更新:

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

set fileformats+=dos

好吧,你使用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>
autocmd!“删除所有AutoCMD(对于当前组),请参阅下文”
autocmd BufWritePost*.php!你的剧本

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

我在Vim wiki上为类似(尽管不同)问题添加了提示:


如果您使用Git进行源代码管理,还有另一种方法可以实现这一点。受此启发,我编写了自己的过滤器,用于文件中

要安装此筛选器,请将其另存为
noeol\u 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
文件的eof中提交任何新行,无论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)

对于
vim
7.4+,您可以使用(最好是在.vimrc上)(感谢罗泽轩 最后一条消息!):

现在,关于较旧版本的
vim

即使文件已在结尾处以新行保存:

vim-b文件
一旦进入vim:

:set noeol
:wq
完成了

或者,您可以使用
:e++bin file

还有另一种选择:

:set binary
:set noeol
:wq

请参阅

中的更多详细信息,我已经使用Perl和Python后处理实现了Blixtor的建议,这些建议可以在Vim内部运行(如果它是使用这种语言支持编译的),也可以通过外部Perl脚本实现。它可以在vim.org上访问。

尝试添加到.vimrc

set binary

我想我找到了一个比公认答案更好的解决办法。替代解决方案对我不起作用,我不想一直在二进制模式下工作。
幸运的是,这似乎完成了工作,我还没有遇到任何令人讨厌的副作用:。我刚刚将整个内容添加到我的~/.vimrc中。

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

Plugin 'vim-scripts/PreserveNoEOL'

或者从您可以使用的
vim
v7.4开始阅读更多内容

:set nofixendofline

这里有一些关于这种变化的信息:。

我还遇到了eol设置。。。但它并没有完成这项任务。它更多的是一个变量,用于确定是否已将文件放在文件末尾。此外,它对文本文件没有影响,但只对二进制文件有影响。vim帮助还说“当‘二进制’关闭时,在写入文件时不使用该值。”关于eol+1,VonC对该问题的回答突出显示了“换行符”和eol
Plugin 'vim-scripts/PreserveNoEOL'
:set nofixendofline