emacsで複数行コメントアウトがしたかったので、lispでショートカットキーを作ってみました。
コードは若干冗長な気がする。。
こちらを参考に作成。
http://ganmacs.hatenablog.com/entry/2013/12/01/140306
ドラッグして領域を選択し、Ctrl-/
でコメントアウト。
領域の先頭行から末尾までをコメントアウトする仕様。
emacs.d/init.el
(defun lines-comment (begin end)
(interactive "r")
(save-excursion
(if (region-active-p)
(progn (goto-char begin)
(beginning-of-line)
(set-mark (point))
(goto-char end)
(end-of-line)
(comment-or-uncomment-region (region-beginning) (region-end))
)
(beginning-of-line)
(set-mark (point))
(end-of-line)
(comment-or-uncomment-region (region-beginning) (region-end)))))
(global-set-key (kbd "C-/") 'lines-comment)
追記
上記のコードだとファイルを開いてからC-@
などでリージョンを選択していない状態ではThe mark is not set now, so there is no region
というエラーになってしまっていた。(interactive "r")
のところでリージョン選択されていることが必要なようだった。
なので(interactive)
にしてリージョンの取得は(region-beginning)
と(region-end)
で行う。(interactive "r")
を使うと変数begin
とend
でリージョンを取得できてよいと思っていたけれど、よく理解できていなかった。
emacs.d/init.el
(defun lines-comment ()
(interactive)
(save-excursion
(if (region-active-p)
(progn
(setq original_begin (region-beginning))
(setq original_end (region-end))
(goto-char (region-beginning))
(beginning-of-line)
(set-mark (point))
(goto-char original_end)
(end-of-line)
(comment-or-uncomment-region (region-beginning) (region-end))
)
(beginning-of-line)
(set-mark (point))
(end-of-line)
(comment-or-uncomment-region (region-beginning) (region-end))
)
))
(global-set-key (kbd "C-/") 'lines-comment)