- crux 20170801.1334(in MELPA)
- A Collection of Ridiculously Useful eXtensions
概要
crux パッケージは以下の要素に分かれています。
Emacsはregionに作用するコマンドと
バッファ全体や現在行に作用するコマンドが別個に分かれていたりします。
それらが別なキーに割り当てられていると、つい統合したくなりますよね。
regionがある場合はregionを、
そうでない場合はバッファ全体や現在行に作用させれば、
うまく空気を読んでくれるコマンドに大変身します。
キーバインドの資源も節約できますしね。
以下で紹介するコマンドはregionの有無によって挙動を変更します。
インストール
パッケージシステムを初めて使う人は
以下の設定を ~/.emacs.d/init.el の
先頭に加えてください。
(package-initialize) (setq package-archives '(("gnu" . "http://elpa.gnu.org/packages/") ("melpa" . "http://melpa.org/packages/") ("org" . "http://orgmode.org/elpa/")))
初めてcruxを使う方は
以下のコマンドを実行します。
M-x package-install crux
アップグレードする方は、
以下のコマンドでアップグレードしてください。
そのためにはpackage-utilsパッケージが必要です。
M-x package-install package-utils (初めてアップグレードする場合のみ) M-x package-utils-upgrade-by-name crux
M-x crux-duplicate-current-line-or-region
M-x crux-duplicate-current-line-or-region は、
regionがない場合は現在行をコピーし、
regionがある場合はregionで指定された行をコピーします。
数引数で指定された分だけ繰り返します。
regionがない場合
foo ★bar baz
↓
foo bar ★bar baz
region([]で囲まれた部分)がある場合
[foo ]★bar baz
↓
foo bar foo ★bar baz
M-x crux-duplicate-and-comment-current-line-or-region
M-x crux-duplicate-and-comment-current-line-or-region は、
M-x crux-duplicate-current-line-or-regionと似ていますが
その後にコメントアウトします。
regionがない場合
foo ★bar baz
↓
foo # bar ★bar baz
region([]で囲まれた部分)がある場合
[foo ]★bar baz
↓
# foo # bar ★foo bar baz
M-x crux-cleanup-buffer-or-region
M-x crux-cleanup-buffer-or-region は、以下の順でregionまたはバッファ全体をきれいにします。
- M-x untabify でタブ→スペースに変換する
- 自動インデント無効モードにおいては M-x indent-region でインデントする
- M-x whitespace-cleanup でホワイトスペースに関する問題を解決します。
M-x whitespace-cleanupについては whitespace-style 変数に依存しています。
バッファの先頭や末尾の空行をなくしたり、タブ→スペース変換、スペース→タブ変換などを行います。
regionを受け取るコマンドを拡張するアドバイスマクロ
Emacsにはregion指定が必須なコマンドがあります。
それらをregionなしでも動作するように拡張するアドバイスを定義するマクロがcruxで定義されています。
- crux-with-region-or-buffer
- regionなしの場合はバッファ全体
- crux-with-region-or-line
- regionなしの場合は現在行
- crux-with-region-or-point-to-eol
- regionなしの場合は現在位置から行末
どうなっているかは、コードを見た方がはやいです。
(defmacro crux-with-region-or-buffer (func) "When called with no active region, call FUNC on current buffer. Use to make commands like `indent-region' work on both the region and the entire buffer (in the absense of a region)." `(defadvice ,func (before with-region-or-buffer activate compile) (interactive (if mark-active (list (region-beginning) (region-end)) (list (point-min) (point-max)))))) (defmacro crux-with-region-or-line (func) "When called with no active region, call FUNC on current line." `(defadvice ,func (before with-region-or-line activate compile) (interactive (if mark-active (list (region-beginning) (region-end)) (list (line-beginning-position) (line-beginning-position 2)))))) (defmacro crux-with-region-or-point-to-eol (func) "When called with no active region, call FUNC from the point to the end of line." `(defadvice ,func (before with-region-or-point-to-eol activate compile) (interactive (if mark-active (list (region-beginning) (region-end)) (list (point) (line-end-position))))))
たとえばM-x indent-regionをバッファ全体に作用させたいならば
(crux-with-region-or-buffer indent-region)
とします。
regionを指定しない場合はバッファ全体をインデントし、
regionを指定した場合にregionをインデントするように挙動が変わります。
設定ファイルに入れておくと便利になります。
本サイト内の関連パッケージ
- openwith - Open files with external programs
- dired-open - Open files from dired using using custom actions
- dired-launch - Use dired as a launcher
本日もお読みいただき、ありがとうございました。参考になれば嬉しいです。