0

主な目標: スマートな「コメント解除」機能をあらゆるモードに適したものにすること。

(defun uncomment-mode-specific ()
  (interactive)
  (if (region-active-p)
      (comment-region (region-beginning) (region-end) -1)  ; so far so good
    (if (= ";" (line-beginning-position))                   ; here is the problem
         (message "successful")
       (message "unsuccessful"))
))

ステートメントではif、行の最初の文字の値を確認したいと思います。それequalsが変数( emacs lispcomment-startでは " " を返す) である場合は、その文字に移動して削除します。アイデア?;beginning-of-line

編集:以下のコメントで要求された詳細な説明が続きます。私は機能をしたい:

1)リージョンが選択されている場合は、コメントを削除します(ここでは、パトリックが指摘したように、コメント解除リージョンまたはコメント dwim が機能します)。

そうしないと:

2) ポイントの行の最初の文字がコメント文字である場合は、コメント文字を削除します。

そうしないと:

\%3) コメントの現在の行を検索し ( or 、モード依存を除く\;)、コメントまで上に移動し、コメント記号で始まる行を削除します。

これがどのように異なる動作をしたいのかわかりませんでした。次に、モードに応じてcomment-start、コメント文字を識別するために使用して、コメントを単純に削除するために 1 つのキーにバインドできます。

4

1 に答える 1

3

あなたがやろうとしていることは、comment-dwimコマンドですでに部分的に行われているので、これを別の回答として投稿しています。ドキュメントから(を使用して見つけることができますC-h f comment-dwim

comment-dwim は `newcomment.el' に含まれるインタラクティブなコンパイル済み Lisp 関数です。

にバインドされていM-;ます。

(コメント-dwim ARG )

必要なコメント コマンドを呼び出します (Do What I Mean)。
リージョンがアクティブでtransient-mark-modeオンの場合は、 を呼び出します comment-region(コメントのみで構成されている場合を除きます。この場合は を呼び出しますuncomment-region)。
それ以外の場合、現在の行が空の場合、comment-insert-comment-function 定義されている場合は呼び出し、そうでない場合はコメントを挿入してインデントします。プレフィックスARGが指定されている場合は、 を呼び出しますcomment-kill。それ以外の場合は、 を呼び出しますcomment-indent。リージョンのコメント方法を変更するように
構成できます。comment-style

したがって、それを使用するには、(set-mark-command) でリージョンを選択しC-SPC、キャレットを別のポイントに移動して を実行するだけcomment-dwimです。

于 2012-10-15T11:48:29.397 に答える