Sublime Text 3 - 在文件末尾确保_only_一个尾随换行符

时间:2016-06-13 16:22:26

标签: newline sublimetext3 sublimetext eof sublime-text-plugin

我使用Sublime Text 3并希望确保在保存文件末尾只有 一个新行。目前,90%的时间我的空白完美运行,使用:

"ensure_newline_at_eof_on_save": true

"trim_trailing_white_space_on_save": true

...但是,每隔一段时间文件就会在文件末尾用两个新行保存。

如果在保存之前最终换行符上有空格,配置设置添加换行符,然后删除空格,则会出现这种情况。在配置中更改这些设置的顺序并不能解决此问题。

我还没有找到其他原因,所以它可能是唯一的原因,但理想情况下我想检查是否有超过一个新行保存。

我工作的环境未通过测试,除非文件末尾只有一个新行,所以这有点痛苦。我的问题是,是否有一个插件/方式更加严格保存,确保只有一个尾随新行。

1 个答案:

答案 0 :(得分:13)

编辑:

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

  • Single Trailing Newline是一个Sublime Text包,可确保文件末尾只有一个尾随换行符。它的工作原理是删除文件末尾的所有空格和换行符(如果有的话),然后插入一个换行符。

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

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

原始答案:

这是一个可以执行此操作的插件。

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

#
# 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

def is_newline_or_whitespace(char):

    if char == '\n' or char == '\t' or char == ' ':
        return True
    else:
        return False

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_on_save')
        return None

class OneTrailingNewLineAtEndOfFileOnSaveCommand(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
        char = self.view.substr(pos)

        while pos >= 0 and is_newline_or_whitespace(char):
            pos -= 1
            char = self.view.substr(pos)

        # 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")