私はテキストエディタを作っていますが、Pygmentsを使ってシンタックスハイライトを助けています。キーワードを入力すると、for
と表示され、黄色く変化します。さて、どちらかを入力すると、fore
、for
の文字は、バックスペースがある場合は黄色のまたは、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するなら、それはあまりにも遅すぎるでしょう。次のようにタグ付けする前に
重複しているわけではありません。すべてのタグを削除するよう求めているわけではなく、1つまたは2つだけです。元のタグから変更された場合に基づいています。 –
Hum。言葉をハイライトすると言いますが、バックスペースを押すと、元に戻ってから短縮された言葉が強調表示されますか? –
はい、正確には強調表示した後は元に戻っていないので、 'for'がハイライト表示されたときに' e'をタイプして 'fore'を作ると、' for'の 'fore'が強調表示されます。あるいは、もし私がバックスペースをしていれば、 'fo'や' f'が強調表示されます。本当に変わっちゃった –