Sublime Text 3 - 确保文件结尾只有一个换行符

23

我正在使用Sublime Text 3,并希望确保在保存文件时仅获得一个换行符。目前,我的空格90%的时间都可以完美地工作,使用:

"ensure_newline_at_eof_on_save": true

"trim_trailing_white_space_on_save": true

... 然而,有时候文件保存时会在文件末尾出现两个换行符。

这似乎是由于在保存之前最后一个换行符上存在空格,配置设置添加了一个换行符,然后删除了空格。更改配置中这些设置的顺序无法解决此问题。

我还没有找到其他原因,因此这可能是唯一的原因,虽然我想最好检查是否在保存时有多个换行符。

我所使用的环境除非文件的末尾恰好有一个换行符,否则会导致测试失败,这让人很烦恼。我的问题是,是否有插件/方法可以更严格地在保存时确保只有一个尾随的换行符。


在什么情况下,文件会以两个换行符保存,即“every once in a while”?除非我们能够重现这个问题,否则我们无法帮助您。 - MattDMo
感谢@MattDMo的指点,我已经更新了问题。这是我能看到导致问题的唯一情况。感谢建议。 - SRack
1个回答

21

编辑:

我已经扩展了下面发布的插件,现在可以使用Package Control进行安装。

  • 单行尾随换行符是Sublime Text插件,确保文件末尾恰好有一个换行符。它通过删除文件末尾的所有空格和换行符(如果有的话),然后插入一个单独的换行符来实现。

  • 该插件可以设置为每次保存文件时自动运行。默认情况下禁用此功能,但通过更改设置,可以启用所有文件或特定语法文件的功能。

  • 提供命令面板条目以更改包的设置;添加/删除将触发插件的语法,并允许或防止插件在所有语法中运行。

原始答案:

这里有一个可以实现的插件。

将以下代码保存在一个带有.py扩展名的文件中,例如EnsureExactlyOneTrailingNewLineAtEndOfFileOnSave.py,并将该文件复制到您的软件包目录中。当您保存文件时,它将删除文件末尾的所有尾随换行符和空格,然后添加一个单独的尾随换行符。

#
# A Sublime Text plugin to ensure that exactly one trailing
# newline is at the end of all files when files are saved.
#
# License: MIT License
#

import sublime, sublime_plugin

class OneTrailingNewLineAtEndOfFileOnSaveListener(sublime_plugin.EventListener):

    def on_pre_save(self, view):
        # A sublime_plugin.TextCommand class is needed for an edit object.
        view.run_command("one_trailing_new_line_at_end_of_file")
        return None

class OneTrailingNewLineAtEndOfFileCommand(sublime_plugin.TextCommand):

    def run(self, edit):
        # Ignore empty files.
        if self.view.size() == 0:
            return

        # Work backwards from the end of the file looking for the last
        # significant char (one that is neither whitespace nor a newline).

        pos = self.view.size() - 1
        whitespace = ("\n", "\t", " ")

        while pos >= 0 and self.view.substr(pos) in whitespace:
            pos -= 1

        # Delete from the last significant char to the end of
        # the file and then add a single trailing newline.

        del_region = sublime.Region(pos + 1, self.view.size())
        self.view.erase(edit, del_region)
        self.view.insert(edit, self.view.size(), "\n")

那太完美了!非常感谢@mattst的付出,如果我可以的话,我会给你一百万个赞 :) - SRack
2
@SRack 没问题,这是我自己想要已经有一段时间了。请查看我的编辑答案,扩展插件可以设置仅与特定语法一起使用,并具有其他功能。 - mattst
2
@SRack插件已经进一步扩展(请看我已经再次编辑过的帖子),现在可以在Package Control上获取。建议您卸载手动安装,然后使用Package Control进行安装,这样您将自动获得更新。 - mattst
谢谢你!只是在自己的设置中找到首选项有点奇怪,最初的想法是将其添加到常规设置页面,所以不得不将片段添加到自定义用户设置中让我有些困惑!但现在像魔法一样运作!只需添加 {"enable_for_all_syntaxes": true} - JayRizzo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接