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

时间:2012-04-03 02:01:23

标签: python tabs notepad++

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

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

3 个答案:

答案 0 :(得分:6)

如果您为Notepad ++安装“Python Script”插件,您可以编写代码以自动在制表符和空格之间切换。

以下是:

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

  2. 查找startup.py并进行修改。在我的电脑上,其路径为c:\Program Files\Notepad++\plugins\PythonScript\scripts\startup.py,将以下代码添加到startup.py

  3. 每次切换选项卡时都会调用函数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()更好,也许使用全局字典来缓存结果并加速回调函数。

答案 1 :(得分:3)

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

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

可从此处下载: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)

答案 2 :(得分:1)

都能跟得上!

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