■ emacs 全般で利用できる設定


【お知らせ】


<2018/08/10 追記>
mc/cycle-forward と mc/cycle-backward にキーを設定しました。

<2018/08/08 追記>
カーソルの位置を維持するために mc/cursor-specific-vars 変数から temporary-goal-column を削除する設定を追加しました。
以下で追加された設定を解除しているものですが、この対応による影響は分かりません。

<2017/05/02 追記>
以前のバージョンより機能が縮小されましたが、正常に動作するように見直しました。

【本題】


multiple-cursors を違和感なく使うための設定です。以下のページを参考としています。

上記の設定に以下の改善をしてみました。
  • リージョンを選択せずに multiple-cursors を使った場合に、cua-mode と同じような動きとなるキー設定とした。また、縦移動時にカーソル位置が維持されないのを改善した。
  • 操作性をシンプルにするために previous でマーカーを上位に設定する機能は、全面的に不採用とした。

C-t で起動します。後は、リージョンを設定してもしなくとも、C-n、C-p、C-s を使えば、だいたいのことはできるようになっています。
入力した正規表現にマッチするリージョン内の部分をマークする機能も C-M-r に設定しています。利用してみてください。

(require 'multiple-cursors)
(require 'smartrep)

(declare-function smartrep-define-key "smartrep")

;; 入力した文字列にマッチするリージョン内の部分をマークする
(global-set-key (kbd "C-M-c") 'mc/mark-all-in-region)

;; 入力した正規表現にマッチするリージョン内の部分をマークする
(global-set-key (kbd "C-M-r") 'mc/mark-all-in-region-regexp)

(global-unset-key (kbd "C-t"))

(smartrep-define-key global-map "C-t"
  '(("C-t" . 'mc/mark-next-like-this)
    ("C-n" . 'mc/mark-next-like-this)
    ("C-p" . 'mc/unmark-next-like-this)
    ("C-u" . 'mc/unmark-next-like-this)
    ("C-s" . 'mc/skip-to-next-like-this)
    ("C-*" . 'mc/mark-all-like-this)
    ("C-d" . 'mc/mark-all-like-this-dwim)
    ("C-i" . 'mc/insert-numbers)
    ("C-v" . 'mc/cycle-forward)
    ("M-v" . 'mc/cycle-backward)
    ("C-l" . 'recenter-top-bottom)
    ;; IM の切替えコマンドを指定する
    ("C-o" . 'toggle-input-method)))

;; IM の切替えコマンドを追加する
(add-to-list 'mc--default-cmds-to-run-once 'toggle-input-method)

;; カーソルの位置を維持するために mc/cursor-specific-vars 変数から
;; temporary-goal-column を削除する
(delq 'temporary-goal-column mc/cursor-specific-vars)

(defun mc/last-command-check ()
  (memq last-command '(mc/mark-next-like-this
                       mc/unmark-next-like-this
                       mc/skip-to-next-like-this)))

;; 縦移動時にカーソル位置が維持されないのを対策する
(advice-add 'mc/mark-next-like-this
            :around (lambda (orig-fun &rest args)
                      (if (mc/last-command-check)
                          (let ((last-command 'next-line))
                            (apply orig-fun args))
                        (apply orig-fun args))))

;; smartrepによるコマンド実行中はキー入力をエコーしない
;; http://shakenbu.org/yanagi/d/?date=20140105
(advice-add 'smartrep-map-internal
            :around (lambda (orig-fun &rest args)
                      (let ((echo-keystrokes 0))
                        (apply orig-fun args))))

以下のページの内容を追加設定するとさらに便利になります。
http://qiita.com/ShingoFukuyama/items/3ad7e24cb2d8f55b4cc5


<変更履歴>
  • 2014/05/21 このページを作成した。
  • 2014/05/30 実装方法を見直した。(機能は同じ)
  • 2014/07/31 NTEmacs で IM の切換えを行う場合、切替えが正しく機能しない場合があることの対策を行った。
  • 2017/05/02 以前のバージョンより機能が縮小されたが、正常に動作するように見直した。
  • 2018/08/08 カーソルの位置を維持するために mc/cursor-specific-vars 変数から temporary-goal-column を削除する設定を追加した。