web-dev-qa-db-ja.com

Emacsコメント/コメント解除現在の行

これについてはすでにEmacsの質問があり、それがクローズされたことを知っていますが、非常に関連性があり、重要だと思います。

基本的に、私は現在の行をコメント/コメント解除したいです。これはマクロでかなり簡単だと思っていましたが、実際は簡単ではないことがわかりました。

現在の行がコメント化されている場合は、コメントを外します。コメントされていない場合は、コメントしてください。また、カーソル位置だけでなく、行全体をコメント化します。

私はこのようなマクロを試しました:

C-a

'comment-dwim

しかし、これは行にコメントするためにのみ機能し、すでにコメントされている場合はコメントを解除するためではありません。

どれほど簡単かはわかりませんが、何か方法があれば本当に気に入っています。

また、このアイデアが大好きな理由は、Geanyを使用したとき、 C-e そしてそれは完璧だった。

43
David Gomes

この関数を試して、お気に入りのキーにバインドします。

(defun toggle-comment-on-line ()
  "comment or uncomment current line"
  (interactive)
  (comment-or-uncomment-region (line-beginning-position) (line-end-position)))
40
Trey Jackson

Treyの機能は完全に機能しますが、それほど柔軟ではありません。

代わりにこれを試してください:

(defun comment-or-uncomment-region-or-line ()
    "Comments or uncomments the region or the current line if there's no active region."
    (interactive)
    (let (beg end)
        (if (region-active-p)
            (setq beg (region-beginning) end (region-end))
            (setq beg (line-beginning-position) end (line-end-position)))
        (comment-or-uncomment-region beg end)))

現在の行またはリージョンがアクティブな場合はリージョンをコメント化/コメント解除します。


必要に応じて、次のように、現在の行をコメント解除した後、次の行にジャンプするように関数を変更できます。

(defun comment-or-uncomment-region-or-line ()
    "Comments or uncomments the region or the current line if there's no active region."
    (interactive)
    (let (beg end)
        (if (region-active-p)
            (setq beg (region-beginning) end (region-end))
            (setq beg (line-beginning-position) end (line-end-position)))
        (comment-or-uncomment-region beg end)
        (next-line)))

変更されているのは、関数の最後に追加されたnext-lineコマンドだけであることに注意してください。

95
Gerstmann

私はTreyの回答を取り、それを改良して、リージョンがアクティブなときにも機能するようにしましたが、そのリージョンで機能します。

(defun comment-or-uncomment-line-or-region ()
  "Comments or uncomments the current line or region."
  (interactive)
  (if (region-active-p)
      (comment-or-uncomment-region (region-beginning) (region-end))
    (comment-or-uncomment-region (line-beginning-position) (line-end-position))
    )
  )

(define-key c-mode-base-map (kbd "C-/") 'comment-or-uncomment-line-or-region)
11
Arne

びっくりcomment-regionルーチンは言及されていません。 (私はそれが何かを逃したことを示すかもしれないと認めますが)。私が気になっているほとんどの主要なプログラミングモードでうまく機能します。

(global-set-key "\C-c\C-c" 'comment-region)

「コメント領域」のドキュメントから

ドキュメンテーション:リージョンの各行をコメント化またはコメント解除します。 C-uプレフィックス引数のみを使用して、リージョンの各行のコメントを外します。数値接頭辞arg ARGは、ARGコメント文字を使用することを意味します。 ARGが負の場合は、代わりにその数のコメント文字を削除します。改行でコメントが終了しない構文でも、コメントは各行で終了します。空白行はコメントを取得しません。

3
Michael Wilson

この答え はここに当てはまります。コマンドcomment-region-linesを定義して、現在の行、またはアクティブな場合は領域をコメント化またはコメント解除します。

これはcomment-or-uncomment-regionに似ていますが、コメント解除するかコメントにするかを決定できますnestコメントを作成できます。既にコメント化されている場合は、自動的にコメントを解除します。

数値のプレフィックスargを指定すると、その数のコメント開始文字が使用されます(例:;;;;;;、... in LISP)。プレーンなC-uプレフィックス引数を使用すると、コメントが解除されます。 C-x C-;にバインドします。

1
Drew

キーボードマクロの仕組みを誤解していると思います。 @Treyが提供するのはEmacs-LISPコマンドです。 Emacs-LISPを理解していなければ、自分でこれを達成できたはずです。

最初に、必要なことを行うキーのシーケンスを見つけてから、そのシーケンスをマクロとして記録します。

あなたはこれを提案しました: C-a M-; (M-;はcomment-dwim)。それはあなたが考えていた事をしますか?そうでない場合、キーボードマクロとして再生しても、魔法のように動作しません。

1
event_jr