Sublime Text 3 - обеспечить _only_ одну конечную новую строку в конце файла

Я использую Sublime Text 3 и хочу, чтобы я получил только одну новую строку в конце файла при сохранении. В настоящий момент 90% времени мои пробелы отлично работают, используя:

"ensure_newline_at_eof_on_save": true

и

"trim_trailing_white_space_on_save": true

... однако, каждый раз файл сохраняет две новые строки в конце файла.

Это происходит, когда перед окончанием новой строки перед пробелом есть пробел, при этом настройки конфигурации добавляют новую строку, а затем удаляют пробелы. Изменение порядка этих настроек в config не разрешает это.

Мне не удалось найти другие причины этого, так что это может быть единственной причиной, хотя в идеале я бы хотел проверить, есть ли еще одна новая строка для сохранения.

Окружающая среда, в которой я работаю, не выполняет свои тесты, если у файла нет только одной новой строки в конце, так что это немного боль. Мой вопрос заключается в том, есть ли плагин/способ быть более строгим в сохранении, обеспечивая одну и только одну завершающую новую строку.

Ответ 1

EDIT:

Я расширил плагин, который я опубликовал ниже, много, и теперь он доступен для установки с помощью Package Control.

  • Single Trailing Newline - это пакет 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

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