Notepad ++ Автоматическое обнаружение вкладок или пробелов Python - PullRequest
6 голосов
/ 03 апреля 2012

Я обычно пишу код с вкладками, но многие библиотеки Python используют пробелы. Есть ли способ для Notepad ++ автоматически определять, как форматируется файл, и автоматически переключаться на использование пробелов, когда файл уже отформатирован таким образом?

Кстати, я знаю, что уже ТАК вопрос о том, как изменить формат вкладок Notepad ++. Но было бы лучше, если бы он автоматически изменялся в зависимости от формата текущего файла.

Ответы [ 3 ]

6 голосов
/ 03 апреля 2012

Если вы установите плагин «Python Script» для Notepad ++, вы можете написать код для автоматического переключения между табуляцией и пробелами.

Вот как:

  1. ВМеню: Плагины -> Python Script -> Конфигурация и установите Инициализация в ATSTARTUP.При запуске Notepad ++ запускается сценарий startup.py.

  2. Найдите startup.py и отредактируйте его.На моем ПК его путь c:\Program Files\Notepad++\plugins\PythonScript\scripts\startup.py, добавьте следующий код в startup.py.

Функция buffer_active() вызывается каждый раз, когда вы переключаете вкладку, и guess_tab() проверяетиспользует ли текст отступ для вкладки или нет.Вы можете показать консоль Python для отладки кода.

def guess_tab(text):
    count = 0
    for line in text.split("\n"):
        indents = line[:len(line)-len(line.lstrip())]
        if "\t" in indents:
            count += 1
    if count > 5: 
        return True
    else:
        return False

def buffer_active(arg):
    editor.setBackSpaceUnIndents(True)
    use_tab = guess_tab(editor.getText())
    editor.setUseTabs(use_tab)
    sys.stderr.write( "setUseTabs %s\n" % use_tab )

notepad.clearCallbacks([NOTIFICATION.BUFFERACTIVATED])    
notepad.callback(buffer_active, [NOTIFICATION.BUFFERACTIVATED])

Это только пример, не стесняйтесь сделать guess_tab() лучше, возможно, используйте глобальный dict для кеширования результата и ускорения функции обратного вызова.

3 голосов
/ 17 ноября 2015

Вот улучшенная версия, основанная на ответе HYRY:

  • Работает на вкладке автозагрузки (при запуске notepad ++ для открытия файла)
  • Не требуется минимальное количество строк для запуска обнаружения отступов. Предположение об отступах основано на первой строке с отступом.
  • Сохраняет значения по умолчанию для отступа, когда отступ не может быть обнаружен
  • Очень эффективно, не замедляет Notepad ++ при открытии больших файлов (тестируется на файле размером 220 МБ, обнаружение отступов занимает всего <300 мс) </li>

Доступно для скачивания здесь: https://gist.github.com/vincepare/8a204172d959defb2122

import re
import time

def indent_guess_tab(text):
    for line in text.split("\n"):
        pattern = re.compile("^( {4,}|\t)")
        match = pattern.match(line)
        if (match):
            return True if ("\t" in match.group(1)) else False

def indent_auto_detect(arg):
    start = time.clock()

    # Get text sample
    maxLen = 500000
    len = editor.getTextLength()
    len = len if len < maxLen else maxLen
    sample = editor.getTextRange(0, len)

    # Indent set
    current_use_tab = editor.getUseTabs()
    use_tab = indent_guess_tab(sample)

    if (use_tab != None and use_tab != current_use_tab):
        console.write("Indent use tab switch (%s => %s)\n" % (current_use_tab, use_tab))
        editor.setUseTabs(use_tab)

    end = time.clock()
    console.write("Indentation detection took %s ms\n" % (round((end-start)*1000, 3)))

notepad.clearCallbacks([NOTIFICATION.BUFFERACTIVATED, NOTIFICATION.READY])    
notepad.callback(indent_auto_detect, [NOTIFICATION.BUFFERACTIVATED])
notepad.callback(indent_auto_detect, [NOTIFICATION.READY])
console.write("Automatic indentation detection started\n")
indent_auto_detect(None)
1 голос
/ 03 апреля 2012

Нет!

Вы всегда можете просто изменить их (на вкладки , конечно), чтобы удовлетворить ваши потребности с помощью Заменить все ( , \t) в расширенном режиме.

...