Notepad ++自动检测Python选项卡或空格

Notepad++ Automatic Detection of Python Tabs or Spaces

我通常使用制表符编写代码,但许多python库使用空格。 Notepad ++是否有任何方法可以自动检测文件的格式,并在文件已经格式化时自动切换到使用空格?

顺便说一句,我知道如何改变Notepad ++的标签格式已经有了一个问题。 但如果它根据当前文件的格式自动更改会更好。


如果为Notepad ++安装"Python Script"插件,则可以编写代码以自动在选项卡和空格之间切换。

这是如何做:

  • 在菜单中:插件 - > Python脚本 - >配置,并将初始化设置为ATSTARTUP。当Notepad ++启动时,startup.py脚本将运行。

  • 找到startup.py并进行编辑。在我的PC上,它的路径是c:\Program Files
    otepad++\plugins\PythonScript\scripts\startup.py
    ,将以下代码添加到startup.py

  • 每次切换选项卡时都会调用函数buffer_active()guess_tab()会检查文本是否使用制表符缩进。您可以显示Python控制台以调试代码。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    def guess_tab(text):
        count = 0
        for line in text.split("
    "
    ):
            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
    "
    % use_tab )

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

    这只是一个例子,随意使guess_tab()更好,也许使用全局dict来缓存结果并加速回调函数。


    这是基于HYRY答案的改进版本:

    • 在启动选项卡上工作(当您启动notepad ++以打开文件时)
    • 不需要最少量的行来触发缩进检测。缩进猜测是基于第一个遇到的缩进行。
    • 当无法检测到缩进时,保留缩进默认值
    • 非常高效,打开大文件时不会减慢Notepad ++的速度(在220 MB文件上测试,缩进检测只需<300 ms)

    可从此处下载:https://gist.github.com/vincepare/8a204172d959defb2122

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    import re
    import time

    def indent_guess_tab(text):
        for line in text.split("
    "
    ):
            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)
    "
    % (current_use_tab, use_tab))
            editor.setUseTabs(use_tab)

        end = time.clock()
        console.write("Indentation detection took %s ms
    "
    % (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
    "
    )
    indent_auto_detect(None)


    不!

    您可以随时更改它们(当然是标签)以在扩展模式下全部替换(    \t)来更改它们。