2012-04-03 52 views
6

我通常使用选项卡编写代码,但许多python库使用空格。 Notepad ++有没有什么办法可以自动检测文件格式化的方式,并在文件已经格式化时自动切换到使用空格?记事本++自动检测Python选项卡或空格

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

+0

边注:Visual Studio的Python工具会自动恢复正常间距是制表符或空格 – 2012-04-03 02:05:30

+1

没有,但Vim可以:-) – 2012-04-03 02:06:54

回答

6

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

方法如下:

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

  2. 找到startup.py并编辑它。在我的PC上,它的路径是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()更好的自己,也许使用全局字典缓存结果和加速回调函数。

+0

似乎没有工作。这可能是PythonScript的一个问题。切换标签页时,我没有看到控制台中印有任何内容。我不应该看到setUseTabs吗? – speedplane 2012-04-12 05:13:04

+0

我刚试过,它完美的工作! speedplane:将“if count> 5”更改为“if count> 0”..也许您已经试过它在文件的少于6行的前面带有制表符的行吗? @HYRY:你为什么不把它张贴在这里? https://sourceforge.net/projects/npppythonscript/forums/forum/1199074 ...这是一个非常方便的脚本! – ufo 2012-06-02 13:49:12

+0

明白了!我不得不从插件管理器重新安装Python脚本插件。 – speedplane 2012-06-18 11:35:45

1

不!

你可以随时改变他们(以标签当然),以满足您的需求,在扩展模式全部替换(    \t)。

+2

或者**特xtFX> TextFX编辑>引导空格到制表符或制表符到空格**,但我有时质疑Notepad ++插件的功效。 – BoltClock 2012-04-03 02:06:28

+0

@BoltClock:啊,谢谢。我通常不敢触摸TextFX菜单:) – Ryan 2012-04-03 02:07:40

2

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

  • 工程的启动选项卡上(当您启动记事本++打开文件)
  • 并不需要行最少量的触发缩进检测。缩进猜测基于第一个遇到的缩进行。
  • 保持压痕默认时压痕不能检测
  • 非常有效的,打开大文件时(在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) 
+0

这是另一个也检测空间数量(并且更短):https://gist.github.com/patstew/8dc8a4c0b816e2f33204e3e15cd5497e – patstew 2017-03-08 13:04:12