4

インタラクティブ関数を定義し、同時にキーにバインドする単純なマクロを作成しました(以前の質問に関連していたものです)唯一のことは、強調表示せずに醜く見えることです。それはそのように呼ばれました:

(define-and-bind-command foo "C-x £" (message "Hello world"))

私は欲しいdefine-and-bind-commandfoo強調されています。まあ、define-and-bind-command強調表示するために、ラッパーを使用できますがdefmacro、それほどきれいではなく、についてはわかりませんfoo。の引数がrequireconst フェイスで強調表示されているため、それが可能であることはわかっています。

または、おそらく、ホイールを発明していますが、より高度な強調表示を備えた別の Lisp モードがありますか?

4

2 に答える 2

3

'define-and-bind-command' の強調表示は、'font-lock-add-keywords' を使用して非常に簡単に実現できます。

(defun my-elisp-mode-keywords()
  (font-lock-add-keywords nil
    '(
      ("\\<\\(define-and-bind-command\\)" . 'font-lock-keyword-face)
    )
  )
)

もちろん、「font-lock-keyword-face」を好みの任意のフェイスに変更したり、独自のフェイスを作成して使用したりできます。テキストのフォントロックされた部分にポイント (カーソル) を移動し、「describe-face」と入力してから return を入力すると、既に使用されているフェイスの名前を非常に簡単に見つけることができます。

Edit2:ああ、もちろん、elisp モードの場合は、その defun をいくつかのフックにフックする必要があります。

(add-hook 'emacs-lisp-mode-hook 'my-elisp-mode-keywords)

正規表現を使用して foo 部分を強調表示できます。 残念ながら、「define-and-bind-command」を含む正規表現を照合する方法がわからないため、その部分についてはまだお手伝いできませんが、後の単語のみを強調表示します。
編集:「define-and-bind-command」と foo 部分の両方を同じ面で強調表示したい場合を除き、それは非常に簡単なはずです。しかし、あなたは彼らに別の顔を持たせたいと思いますか?
Edit3:私のコードを修正し、stackoverflowは前にいくつかの中かっこを食べました...
Edit4:さて、私は2番目の部分だけを一致させるための解決策を持っています.私はそれを広範囲にテストしていませんが、うまくいくようです. 私は foo にスペース (および私が思うに改行) 以外の任意の文字を含めることを許可しました。そのイベントをさらに a-zA-z0-9 と "-" に制限できると思いますので、お好みに合わせて自由に変更してください。foo 部分のみのマッチングを担当するコードは次のとおりです。

("\\bdefine-and-bind-command\s\\([^\s]*\\)" 1 'font-lock-function-name-face t)

上記の関数の他の font-lock キーワードの後の行にそれを挿入すると、準備完了です。正規表現は、'define-and-bind-command' に一致します。このコマンドは、単語 ( \bの場合) の後にスペースが続く必要があり、スペースが存在するまで続くすべてを返します (フォントロック)。

お役に立てれば!

于 2012-05-20T09:41:48.660 に答える
2

font-lock-add-keywordsシンボル、新しいキーワードを適用するモードを取ることができます。だからあなたはすることができます

(font-lock-add-keywords 
 'emacs-lisp-mode
 '(("\\<\\(define-and-bind-command\\)" . 'font-lock-keyword-face)))

関数とフックを使用する場合と比較した場合の欠点は、これが派生モードでは機能しないことです。つまり、から派生したモードがある場合、emacs-lisp-modeこれらのキーワードは継承されません。

于 2012-05-21T18:00:34.657 に答える