2017-06-11 8 views
0

私はテキストエディタを作っていますが、Pygmentsを使ってシンタックスハイライトを助けています。キーワードを入力すると、forと表示され、黄色く変化します。さて、どちらかを入力すると、foreforの文字は、バックスペースがある場合は黄色のまたはfoまたはfは黄色です。tkinterのタグ付き単語を変更すると、色が元に戻ります。

なぜそれが黒に戻って色を変えないのですか?これを行う効率的な方法はありますか?私のコードは、ちょうど必要な場合は次のようになります。バグはありませんので、ハイライト機能を追加するだけですが、それ自体はおそらく不要です。

import sys #imports 
from pygments import highlight 
from pygments.lexers import PythonLexer #python syntax highlighter 
from pygments import lex 
major_version = sys.version_info.major 
if major_version == 2: #check python version for importing tkinter 
    from Tkinter import * 
    import tkFileDialog 
elif major_version == 3: 
    from tkinter import * 
    import tkinter.filedialog as tkFileDialog 
else: 
    raise RuntimeError('Unexpected python major version: %d' % major_version) 

def highlight(t, previousContent): 
    content = t.get("1.0", END) 
    lines = content.split("\n") 

    if(content != previousContent): 
     t.mark_set("range_start", "1.0") 
     data = t.get("1.0", "end-1c") 

     for token, content in lex(data, PythonLexer()): 
      t.mark_set("range_end", "range_start + %dc" % len(content)) 
      t.tag_add(str(token), "range_start", "range_end") 

      t.mark_set("range_start", "range_end") 

def highlightLine(t, previousContent): 
    content = t.get("1.0", END) 
    lines = content.split("\n") 
    currentCursorPosition = t.index(INSERT) 
    currentCursorPositionSplit = currentCursorPosition.split(".") 
    currentLine = currentCursorPositionSplit[0] 
    currentColumn = currentCursorPositionSplit[1] 

    if(content != previousContent): 
     t.mark_set("range_start", str(currentLine) + ".0") 
     data = t.get(str(currentLine) + ".0", str(currentLine) + "." + str(currentColumn)) 

     for token, content in lex(data, PythonLexer()): 
      t.mark_set("range_end", "range_start + %dc" % len(content)) 
      t.tag_add(str(token), "range_start", "range_end") 

      t.mark_set("range_start", "range_end") 

def initHighlight(t): 
    t.tag_configure("Token.Keyword", foreground="#CC7A00") 
    t.tag_configure("Token.Keyword.Constant", foreground="#CC7A00") 
    t.tag_configure("Token.Keyword.Declaration", foreground="#CC7A00") 
    t.tag_configure("Token.Keyword.Namespace", foreground="#CC7A00") 
    t.tag_configure("Token.Keyword.Pseudo", foreground="#CC7A00") 
    t.tag_configure("Token.Keyword.Reserved", foreground="#CC7A00") 
    t.tag_configure("Token.Keyword.Type", foreground="#CC7A00") 

    t.tag_configure("Token.Name.Class", foreground="#003D99") 
    t.tag_configure("Token.Name.Exception", foreground="#003D99") 
    t.tag_configure("Token.Name.Function", foreground="#003D99") 

    t.tag_configure("Token.Operator.Word", foreground="#CC7A00") 

    t.tag_configure("Token.Comment", foreground="#B80000") 

    t.tag_configure("Token.Literal.String", foreground="#248F24") 

この質問ではないが、言葉がISNをタグ付けされたものならば、私はチェックしない方法を求めていたテキストからすべてのタグを削除する方法を求めているが、必要に応じて

私はそれ以上を含みますその言葉のタグを取り除いてください。。私はすべてのタグを削除してすべてをretagするなら、それはあまりにも遅すぎるでしょう。次のようにタグ付けする前に

+0

重複しているわけではありません。すべてのタグを削除するよう求めているわけではなく、1つまたは2つだけです。元のタグから変更された場合に基づいています。 –

+0

Hum。言葉をハイライトすると言いますが、バックスペースを押すと、元に戻ってから短縮された言葉が強調表示されますか? –

+0

はい、正確には強調表示した後は元に戻っていないので、 'for'がハイライト表示されたときに' e'をタイプして 'fore'を作ると、' for'の 'fore'が強調表示されます。あるいは、もし私がバックスペースをしていれば、 'fo'や' f'が強調表示されます。本当に変わっちゃった –

答えて

0

は、同じ機能では、私はそれがすべてのタグをチェックし

for tag in t.tag_names(): 
    t.tag_remove(tag, str(currentLine) + ".0", str(currentLine) + "." + str(currentColumn)) 

を追加し、その後、その後、現在の行にタグを削除し、それは彼らが戻って追加されます、フル機能が行きます:

def highlightLine(t, previousContent): 
    content = t.get("1.0", END) 
    lines = content.split("\n") 
    currentCursorPosition = t.index(INSERT) 
    currentCursorPositionSplit = currentCursorPosition.split(".") 
    currentLine = currentCursorPositionSplit[0] 
    currentColumn = currentCursorPositionSplit[1] 

    if(content != previousContent): 
     t.mark_set("range_start", str(currentLine) + ".0") 
     data = t.get(str(currentLine) + ".0", str(currentLine) + "." + str(currentColumn)) 

     for tag in t.tag_names(): 
      t.tag_remove(tag, str(currentLine) + ".0", str(currentLine) + "." + str(currentColumn)) 

     for token, content in lex(data, PythonLexer()): 
      t.mark_set("range_end", "range_start + %dc" % len(content)) 
      t.tag_add(str(token), "range_start", "range_end") 

      t.mark_set("range_start", "range_end") 

完璧に動作します。

+0

ニース。私はあなたがラインで働くことができてうれしいです。 –

関連する問題