3

ジレンマ: 可読性か保守性か?

次の関数を見てみましょう。それが何をするかは問題ではありません。重要な部分は、文字列を 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-lockregex-let-form"(let\\*?[ \t]*"?次の理由から、実行可能なジョブです。

  1. http://www.emacswiki.org/emacs/PrettyLambdaのように識別子をフォントロックすることも可能です: rainbow-mode .

  2. また、定数をフォントロックすることもできます。私の知る限り、C++ モードでは既に完了していますが、emacs-lisp モードではまだ完了していません。

後は、この 2 つを接続するだけです。残念ながら、私はそれを行うのに十分なfont-lock内臓を知りませんが、他の誰かが行うのでしょうか? または、これを行うパッケージが既にありますか?

4

4 に答える 4

1

hl-defined.el(本日更新, 2013-10-20) は、定数 Emacs-Lisp シンボル、つまり、現在の値がシンボル自体である変数を強調表示できます。あなたdefconstが評価された場合、これはあなたが要求していることを行います。

于 2013-10-20T18:10:23.963 に答える