HOME xyzzy code 書き込む

複数のモードに対応したコメントアウト用マクロ


1. はじめに

コメントアウト用マクロを書いてみました。 本文をコメントアウトしたり、コメントを本文に戻したりできます。
モードごとに書式が設定できます。
ご参考までに。

2. 準備

  1. comment_l.txt の内容全てを siteinit.l にコピーしてください。
  2. siteinit.l にさらに以下の様なコードを追加します。 (in-package "editor") と (in-packate "user") の間に追加してください。
    (comment-out [key-out] [key-in] [n-columns]
        ([mode-name-1]  [start-string-1] [bol-char-1] [end-string-1])
        ([mode-name-2]  [start-string-2] [bol-char-2] [end-string-2])
         ........................................................
        ([mode-name-n]  [start-string-n] [bol-char-n] [end-string-n])
      )
    
    [key-out]
    コメントアウト用関数にバインドするキー。
    [key-in]
    コメントを本文に戻す関数にバインドするキー。
    [n-columns]
    区切り行に出力する [bol-char] (または [start-string] の最初の文字)の個数(目安)。
    [mode-name]
    モードの名前。lisp-mode, c-mode, c++-mode, LaTeX-mode, html-mode など。
    [start-string]
    コメントの最初につく文字列。";", "/*", "//" "%", "<!--" など。
    [bol-char]
    コメントが複数の行にわたるとき行の先頭につける文字(列) #\;, #\*, #\%, #\- など。 指定されていないときは [start-string] を使用。
    [end-string]
    コメントの最後につく文字列。"*/", "-->" など。 なければ 省略。
    例)
    (comment-out #\M-o #\M-p 40
         (lisp-mode ";")
         (c-mode "/*" #\* "*/")
         (c++-mode "//")
         (perl-mode "#")
         (LaTeX-mode "%")
         (html-mode "<!--" #\- "-->")
       )
    
  3. [重要]siteinit.l をコンパイルし、ダンプファイルを再作成します。

    3. 使い方

    コメントアウト用キー(上の場合は Alt-o) を入力すると、
    範囲を選択していない場合は、カーソルのある位置から行末までがコメントアウトされます。
    範囲を選択してある場合、設定範囲の前後に区切り行が入り、選択範囲がコメントアウトされます。
    また、本文に戻すキー(上の場合は Alt-p) を入力すると、
    範囲を選択していない場合は、カーソルのある行のコメントが本文になります。
    範囲を選択してある場合、設定範囲が本文になります。
    例)
    モード 一行 複数行
    変換前 something |comment
    (| はカーソルの位置)
    This is comment 1.
    This is comment 2.
    This is comment 3.
    lisp-mode something ; comment ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
    ; This is comment 1.
    ; This is comment 2.
    ; This is comment 3.
    ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
    c-mode something /* comment*/ /*****************************************
    * This is comment 1.
    * This is comment 2.
    * This is comment 3.
    *****************************************/
    c++-mode something // comment //////////////////////////////////////////
    // This is comment 1.
    // This is comment 2.
    // This is comment 3.
    //////////////////////////////////////////
    perl-mode something # comment #########################################
    # This is comment 1.
    # This is comment 2.
    # This is comment 3.
    #########################################
    LaTeX-mode something % comment %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    % This is comment 1.
    % This is comment 2.
    % This is comment 3.
    %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    html-mode something <!-- comment--> <!------------------------------------------
    - This is comment 1.
    - This is comment 2.
    - This is comment 3.
    ------------------------------------------->

    4. 補足

    マクロ comment-out はモードごとにコメントアウトする関数を定義し、それを モードのキーマップに登録します。 例えば、lisp-mode の場合 lisp-mode-comment-out, lisp-mode-comment-in という関数が定義され、 それが *lisp-mode-map* の設定されたキーにバインドされます。

    関数をモードごとに分けないで、1つの関数で全てのモードをカバーすることも 可能だと思いますが、複雑になりそうですし、実行時の処理が多くなりそうなので モードごとの関数を定義するマクロを書いてみました。