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またはバッファ全体をきれいにします。

  1. M-x untabify でタブ→スペースに変換する
  2. 自動インデント無効モードにおいては M-x indent-region でインデントする
  3. 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をインデントするように挙動が変わります。
設定ファイルに入れておくと便利になります。

本サイト内の関連パッケージ


本日もお読みいただき、ありがとうございました。参考になれば嬉しいです。