1

たくさんの単語を強調しようとしているので、pygments拡張機能を作成しました。基本的には機能しますが、それでも満足のいくものではありません。

うまくいくはずの簡単なアイデアは次のとおりです。単語を適切に強調表示し、これらの単語と一致しない他のすべてのテキストをテキストで強調表示します。しかし、これはハングアップします:

from pygments.lexer import RegexLexer
from pygments.token import *

class HotKeyPoetry(RegexLexer):
    name = 'HotKeyPoetry'
    aliases = ['HotKeyPoetry']
    filenames = ['*.hkp']

    tokens = {
        'root': [

            (r'\bAlt\b', Generic.Traceback),
            (r'\bShft\b', Name.Variable),
            (r'\bSpc\b', Operator),
            (r'\bCtrl\b', Keyword.Type),
            (r'\bRet\b', Name.Label),
            (r'\bBkSpc\b', Generic.Inserted),
            (r'\bTab\b', Keyword.Type),
            (r'\bCpsLk\b', String.Char),
            (r'\bNmLk\b', Generic.Output),
            (r'\bScrlLk\b', String.Double),
            (r'\bPgUp\b', Name.Attribute),
            (r'\bPgDwn\b', Name.Builtin),
            (r'\bHome\b', Number.Oct),
            (r'\bEnd\b', Name.Constant),
            (r'\bDel\b', Name.Decorator),
            (r'\bIns\b', Number.Integer.Long),
            (r'\bWin\b', Name.Builtin.Pseudo),
            (r'\bF1?[1-9]\b', Name.Function),

            (r'(?!\b(Alt|Shft|Spc|Ctrl|Ret|BkSpc|Tab|CpsLk|NmLk|ScrlLk|PgUp|PgDwn|Home|End|Del|Ins|Win|F5)\b)', Text),

        ]
    }

仕事に別のレクサーを使用したほうがいいのではないでしょうか。

編集1

それで

r"(.+?)(?:$|\b(?=(Alt|Shft|Spc|Ctrl|Ret|BkSpc|Tab|CpsLk|NmLk|ScrlLk|PgUp|P‌​gDwn|‌​Home|End|Del|Ins|Win|F[12]?[1-9])\b))"

私が探していた排他的な正規表現です。

今、私は#コメント文字を作成しようとしています-それ以降のすべて(行内)がコメントになるように:私は試しました:

r"(.+?)(?:$|#.*$|\b(?=(Alt|Shft|Spc|Ctrl|Ret|BkSpc|Tab|CpsLk|NmLk|ScrlLk|PgUp|P‌​gDwn|‌​Home|End|Del|Ins|Win|F[12]?[1-9])\b))"

r"([^#]+?)(?:$|\b(?=(Alt|Shft|Spc|Ctrl|Ret|BkSpc|Tab|CpsLk|NmLk|ScrlLk|PgUp|PgD‌​wn|‌​Home|End|Del|Ins|Win|F[12]?[1-9])\b))"

に続く

 (r'#.*$', Comment),

また、2番目の状態を追加しようとしました:

'comment': [ 
      (r'#.*$', Comment),
],

-しかし、何も機能しません。

編集2

完全に機能するpygments拡張Pythonパッケージはこちらです。あなたは得ることができます

python setup.py build
python setup.py install --user

pygmentsに登録します。次に、次のコマンドでテストできます。

pygmentize -f html -O full -o test.html test.hkp

または言語を指定します。

pygmentize -f html -O full -l HotKeyPoetry -o test.html test.hkp

これがサンプルtest.hkpです:

Ctrl-Alt-{Home/End} ⇒ {beginning/end}-of-visual-line
Ctrl-Alt-{b/↓/↑} ⇒ {set/goto next/goto previous} bookmark # I have it in okular and emacs
Alt-{o/O} ⇒ switch-to-buffer{/-other-window}
Ctrl-{o/O} ⇒ find-file{/-other-window}
Ctrl-x o ⇒ ergo-undo-close-buffer # it uses ergoemacs' recently-closed-buffers
Ctrl-Alt-O ⇒ find-alternate-file

(コメントはホットキーにはあまり役立ちませんが、PyMOLには必要です)。

4

2 に答える 2

4

1)あなたはどのように機能するかを誤解してい(?!ます:それはテキストと一致しません。(元のコードブロック内の)最後のREは、リストした単語が後に続かない位置で一致します。ただし、テキストの0文字に一致するため、色を付けることはできず、先に進むことはありません。

あなたが本当に意味したのはこれです:\b(?!(?:Alt|Shft|etc)\b)\w+\b。( sの\w+間の任意の単語に一致しますが、最初の単語の後にキーワードのいずれかが続く場合は一致しません)\b\b

2)一致するコメントについて: pygmentsのドキュメントに基づいて、式は機能する(r'#.*$', Comment)はずです。または、例で使用されているスタイルで:

(r'#.*\n', Comment),

3)必要な状態は1つだけなので、コメントルールをルート状態に追加します。複数の状態は、さまざまな場所でさまざまな構文を使用している場合、たとえばhtmlとPHPを混在させている場合、またはPython文字列内のSQLを強調表示する場合に使用します。

4)ルールは入力のすべてと一致する必要があります。ルールは機能するまで順番に試行されるため、キーワードと一致しないルールを作成する代わりに、このワイルドカードを最後のルールとして配置できます。

(r'(?s).', Text),

他のルールが一致するものに到達するまで、一度に1文字ずつ進みます。繰り返すには:キーワード以外に一致する長いルールを削除し、代わりに上記を使用します。

于 2012-08-16T21:05:28.760 に答える
3

はい、最終的な正規表現は実際にはどの文字とも一致していません。私はこのコードを試しました:

import re

regexes = {
  "text": re.compile(r"(.+?)(?:$|\b(?=(Alt|Shft|Spc|Ctrl|Ret|BkSpc|Tab|CpsLk|NmLk|ScrlLk|PgUp|PgDwn|Home|End|Del|Ins|Win|F1?[1-9])\b))"),
  "kwd": re.compile(r"(Alt|Shft|Spc|Ctrl|Ret|BkSpc|Tab|CpsLk|NmLk|ScrlLk|PgUp|PgDwn|Home|End|Del|Ins|Win|F1?[1-9])\b")
}

def tokenise(state):
  while state["src"]:
    state["tok"] = "text" if state["tok"] == "kwd" else "kwd"
    #print "mode: {0:20} {1!r}".format(state["tok"].capitalize(), state["src"])

    m = regexes[state["tok"]].match(state["src"])
    if m:
      match = m.group(0)
      state["src"] = state["src"][m.end():]
      #print "  TOKEN({0}, {1!r})".format(state["tok"], match)
      yield "TOKEN({0}, {1!r})".format(state["tok"], match)


state = {
  "src": "A thing that, Tab, is AltCps or 'Win'. F8 is good, as is: F13.",
  "tok": "text"
}
print repr(state["src"])
print "\n".join(list(tokenise(state)))
print

state = {
  "src": "Alt thing that, Tab, is AltCps or 'Win'. F8 is good, as is: F13.",
  "tok": "text"
}
print repr(state["src"])
print "\n".join(list(tokenise(state)))
print

state = {
  "src": "Alt thing that, Tab, is AltCps or 'Win'. F8 is good, as is: F11",
  "tok": "text"
}
print repr(state["src"])
print "\n".join(list(tokenise(state)))
print

そして、それは私がテストしたケースでうまくいきます、テキスト正規表現はあなたのコードでよく見えます:)

于 2012-08-16T21:54:53.337 に答える