ジレンマ: 可読性か保守性か?
次の関数を見てみましょう。それが何をするかは問題ではありません。重要な部分は、文字列を 2 倍使用していること"(let\\*?[ \t]*"
です。
(defun setq-expression-or-sexp ()
"Return the smallest list that contains point.
If inside VARLIST part of `let' form,
return the corresponding `setq' expression."
(interactive)
(ignore-errors
(save-excursion
(up-list)
(let ((sexp (preceding-sexp)))
(backward-list 1)
(cond
((looking-back "(let\\*?[ \t]*")
(cons 'setq
(if (= (length sexp) 1)
(car sexp)
(cl-mapcan
(lambda (x) (unless (listp x) (list x nil)))
sexp))))
((progn
(up-list)
(backward-list 1)
(looking-back "(let\\*?[ \t]*"))
(cons 'setq sexp))
(t
sexp))))))
2 つ (またはそれ以上) の場所で文字列を更新する必要があるのは頭痛の種defconst
なので、次のようにする必要があります。
(defconst regex-let-form "(let\\*?[ \t]*")
コードはより保守しやすくなりましたが、実際のコードが一目でわかりにくいため、読みにくくもなりましたregex-let-form
。
(defun setq-expression-or-sexp ()
"Return the smallest list that contains point.
If inside VARLIST part of `let' form,
return the corresponding `setq' expression."
(interactive)
(ignore-errors
(save-excursion
(up-list)
(let ((sexp (preceding-sexp)))
(backward-list 1)
(cond
((looking-back regex-let-form)
(cons 'setq
(if (= (length sexp) 1)
(car sexp)
(cl-mapcan
(lambda (x) (unless (listp x) (list x nil)))
sexp))))
((progn
(up-list)
(backward-list 1)
(looking-back regex-let-form))
(cons 'setq sexp))
(t
sexp))))))
アイデア:なぜ両方ではないのですか?
とにかく定数なので、そうであるかのように見せてみませfont-lock
んregex-let-form
か"(let\\*?[ \t]*"
?次の理由から、実行可能なジョブです。
http://www.emacswiki.org/emacs/PrettyLambdaのように識別子をフォントロックすることも可能です: rainbow-mode .
また、定数をフォントロックすることもできます。私の知る限り、C++ モードでは既に完了していますが、emacs-lisp モードではまだ完了していません。
後は、この 2 つを接続するだけです。残念ながら、私はそれを行うのに十分なfont-lock
内臓を知りませんが、他の誰かが行うのでしょうか? または、これを行うパッケージが既にありますか?