19

この質問は、別のEmacs :TODO indicator at left side に関連しています。私は最近、FixmeModeと呼ばれる非常に気に入っているマイナー モードに出会いました。TODOマークの自動強調表示とそれらの間の移動をサポートしています。ただし、ファイル全体を汚染するよりも、コメントでのみ「TODO」文字列を認識する方が理にかなっていると思います。出来ますか?

4

3 に答える 3

25

ライブラリfic-mode.elを確認してください。C++ と Emacs-Lisp で検証されています。

この質問に答えるために特別に書かれました。

インストールは、標準パッケージと同様です。

(require 'fic-mode)
(add-hook 'c++-mode-hook 'turn-on-fic-mode) 

Wei Huは、複数のモードに簡単に追加する方法を求めましたが、次のようになります。

(defun add-something-to-mode-hooks (mode-list something)
  "helper function to add a callback to multiple hooks"
  (dolist (mode mode-list)
    (add-hook (intern (concat (symbol-name mode) "-mode-hook")) something)))

(add-something-to-mode-hooks '(c++ tcl emacs-lisp) 'turn-on-fic-mode)
于 2010-10-10T11:10:12.283 に答える
3

可能ですが、かなりトリッキーです。Fixme モードはfont-lock強調表示を行うために使用されるため、キーワードを入力するたびに強調表示されます。Font-lock は非常に低いレベルでフックされ、基本的にはバッファーの内容が変更されるたびに実行されます。ただし、高度に最適化されているため、最新のコンピューターで瞬時に表示されます。

左フリンジの TODO インジケータは静的です。関数を実行すると、現在のすべての TODO が強調表示されます。バッファーを変更 (TODO を追加または削除) しても、フリンジ インジケーターは変更されません。これは、関数が再度実行されたときにのみ変更されます。

あなたのアプローチは、最初にコメントにいるときを判断し、次にキーワードを探して、構文テーブルに入る必要があります。難しいのは、これをインタラクティブに (つまり、入力しながら) 行うことです。これを行うために構造にフックできるはずですがfont-lock、コメント構文テーブルを検索してからキーワードを検索するために提供する関数は、バッファーが変更されるたびに実行されるため、非常に効率的です (ただし、変更されたリージョンでのみ実行されると思います)。シンタックス キーワード パスがシンタックス パスの前に発生し (キーワード パスの前に発生)、コメント自体が設定される前にコメント内に TODO を設定する必要があるためでfont-lock-syntactic-keywordsはなく、これらすべてを詰め込む必要があります。font-lock-keywords

申し訳ありませんが、完全な作業コードの回答ではありません.....

于 2010-03-03T13:29:56.453 に答える
2

たぶんこれが役に立ちます: c-in-literalcc-mode には fn がありcsharp-in-literal、csharp モードにも同様のものがあります。戻り値はc、C スタイルのコメントのc++場合、C++ スタイルのコメントの場合です。左側の Emacs :TODO インジケーターのコードにそれを追加して、 必要なものを取得できます。

(defun annotate-todo ()
   "put fringe marker on TODO: lines in the curent buffer"
  (interactive)
  (let (lit)
  (save-excursion
    (goto-char (point-min))
    (while (re-search-forward "TODO:" nil t)
      (progn
        (setq lit (c-in-literal)) ;; or csharp-in-literal
        (if (or (eq lit 'c) (eq lit 'c++))
            (let ((overlay (make-overlay (- (point) 5) (point))))
              (overlay-put overlay 'before-string
                           (propertize "A"
                                       'display
                                       '(left-fringe   ;; right
                                         horizontal-bar
                                         better-fringes-important-bitmap))))))))))
于 2010-03-03T13:33:50.990 に答える