multiple-cursors 20170713.1847(in MELPA)
Multiple cursors for Emacs.

概要

Emacsは分身の術が使える忍者だった!
ということで、 multiple-cursors.el
カーソルを分身させるという恐しい拡張です。

以前から注目していたのですが、当時はパソコンの性能が貧弱で動作が遅かったし、
あまりに多機能すぎてどこから手をつければいいのかがわからなくて
使いこなせないでいました。

しかし、今回やっとツボを発見したので紹介しておきます。

multiple-cursors.elは、カーソルを複数同時に
動かすという離れ業をやってのけます!

これにより、同じような行を一度に処理できます。

たとえば、特定の単語を含む行に対して同じ編集処理をしたい場合、
従来の方法ですと、 正規表現置換 などの難解な方法を使わざるを得ませんでした。

正規表現置換は高度な処理なので、
visual-regexp.el でかなり軽減できるものの、
なかなか初級者には手が出ません。

しかし、このmultiple-cursors.elを使えば、
正規表現置換以上のことが直観的にできるようになります。

multiple-cursors状態でC-SPCやC-yやC-wなどのコピペもできるので、
もはや矩形編集コマンドなんていらなくなるんじゃないか!?
というほどの破壊力を秘めています。

このパッケージにはたくさんのコマンドが定義されていますが、
今は M-x mc/mark-all-dwim だけ使っていれば、
ほぼすべてのケースをまかなうことができるようになります。

インストール

パッケージシステムを初めて使う人は
以下の設定を ~/.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/")))

初めてmultiple-cursorsを使う方は
以下のコマンドを実行します。

M-x package-install multiple-cursors

アップグレードする方は、
以下のコマンドでアップグレードしてください。
そのためにはpackage-utilsパッケージが必要です。

M-x package-install package-utils (初めてアップグレードする場合のみ)
M-x package-utils-upgrade-by-name multiple-cursors

mc/mark-all-dwimの挙動

このコマンドの挙動は次のようになっています。

  • 1行のregionが指定してある場合はそのregionの内容が対象になる
  • regionが指定されていない場合はそのsymbolが対象になる
  • 複数行のregionを指定してC-uを押せばその間の行が対象になる

ありがたいことに、こんな感じで空気読んでくれます。

設定 141110074452.multiple-cursors.el(以下のコードと同一)

mc/mark-all-dwimはautoloadされているので無設定で使えますが、
さらに進んだ設定は、既存のコマンドと同じキーに割り当ててしまうことです。

C-x r tは矩形を同じ文字列に置き換える M-x string-rectangle ですが、
同じ桁の場合は単に同じ文字列を挿入するだけです。

その場合だけmc/edit-linesを起動させるようにしても、
同じ操作性で文字列を挿入できます。

よって、C-x r tに組み込むのは合点がいきます。

さらに、C-M-SPC (M-x mark-sexp) も拡張しましょう。

C-u C-M-SPCは本来、4つのS式をマークしますが、
C-M-SPCを4回叩くのと同じだし、めったに使いません。

そこでC-u C-M-SPCをM-x mc/mark-all-dwimにしてしまいましょう。

このようにしてしまえばデフォルト設定に自然と溶け込ませられます。

特に記憶に負担をかけることもなく、
この「イカれた」拡張を使いこなせるでしょう。

(require 'multiple-cursors)
(defun mc/edit-lines-or-string-rectangle (s e)
  "C-x r tで同じ桁の場合にmc/edit-lines (C-u M-x mc/mark-all-dwim)"
  (interactive "r")
  (if (eq (save-excursion (goto-char s) (current-column))
          (save-excursion (goto-char e) (current-column)))
      (call-interactively 'mc/edit-lines)
    (call-interactively 'string-rectangle)))
(global-set-key (kbd "C-x r t") 'mc/edit-lines-or-string-rectangle)

(defun mc/mark-all-dwim-or-mark-sexp (arg)
  "C-u C-M-SPCでmc/mark-all-dwim, C-u C-u C-M-SPCでC-u M-x mc/mark-all-dwim"
  (interactive "p")
  (cl-case arg
    (16 (mc/mark-all-dwim t))
    (4 (mc/mark-all-dwim nil))
    (1 (mark-sexp 1))))
(global-set-key (kbd "C-M-SPC") 'mc/mark-all-dwim-or-mark-sexp)

実行方法

$ wget http://rubikitch.com/f/141110074452.multiple-cursors.el
$ emacs -Q -f package-initialize -l 141110074452.multiple-cursors.el

20141110075238.png
Fig1: C-u C-M-SPCで分身!

20141110075302.png
Fig2: 分身して書き換え!!

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


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