repeatable-motion 20170620.1148(in MELPA)
Make repeatable versions of motions

概要

昨日のeasy-repeat.el(レビュー) とちょっと似た新入りパッケージを紹介します。

前後の対になるコマンドはしばしば繰り返し実行されます。

たとえばforward-word・previous-wordだったり、
next-error・previous-errorだったり、
enlarge-window・shrink-windowだったり…

そういうのを繰り返しキー(C-:)と逆繰り返しキー(C-M-:)で
実行できたらよくないですか?

org-modeでもC-c C-nを繰り返して次々と見出しに移動して、
C-c C-pで戻ったりとかもします。

この場合、 C-c C-n C-c C-n C-c C-n C-c C-p は
本設定によりC-c C-n C-: C-: C-M-:と操作できるようになります。

ただ、現時点では開発当初なので

  • Emacs標準のC-x z (repeat) を使うようにする
  • 対になるコマンドを登録するのではなくて類推させる

ようにすればかなり使い勝手がよくなるでしょう。

インストール

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

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

M-x package-install repeatable-motion

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

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

設定 150505050057.repeatable-motion.1.el(以下のコードと同一)

(require 'repeatable-motion)
(defun repeatable-motion-remap-key (keymap next-cmd prev-cmd)
  "対になるコマンドを定義し、キーに割り当てられたコマンドをrepeatable-motion版に置き換える"
  (repeatable-motion-define-pair next-cmd prev-cmd)
  (dolist (command (list next-cmd prev-cmd))
    (define-key keymap (vector 'remap command)
      (intern (format "repeatable-motion-%s" command)))))

;;; 繰り返しキー
(global-set-key (kbd "C-:") 'repeatable-motion-forward)
;;; 逆繰り返しキー
(global-set-key (kbd "C-M-:") 'repeatable-motion-backward)

(with-eval-after-load "org"
  ;; C-c C-n / C-c C-p
  (repeatable-motion-remap-key org-mode-map 'org-next-visible-heading 'org-previous-visible-heading)
  (repeatable-motion-remap-key org-mode-map 'outline-next-visible-heading 'outline-previous-visible-heading)
  ;; C-c C-f / C-c C-b
  (repeatable-motion-remap-key org-mode-map 'org-forward-heading-same-level 'org-backward-heading-same-level))
;;; C-x { / C-x }
(repeatable-motion-remap-key global-map 'enlarge-window-horizontally 'shrink-window-horizontally)
;;; C-x ^
(repeatable-motion-remap-key global-map 'enlarge-window 'shrink-window)
;;; C-x → / C-x ←
(repeatable-motion-remap-key global-map 'next-buffer 'previous-buffer)
;;; M-g M-n / M-g M-p
(repeatable-motion-remap-key global-map 'next-error 'previous-error)
;;; M-{ / M-}
(repeatable-motion-remap-key global-map 'forward-paragraph 'backward-paragraph)
;;; C-x [ / C-x ]
(repeatable-motion-remap-key global-map 'forward-page 'backward-page)
;;; M-f / M-b
(repeatable-motion-remap-key global-map 'forward-word 'backward-word)

実行方法

$ wget http://rubikitch.com/f/150505050057.repeatable-motion.1.el
$ emacs -Q -f package-initialize -l 150505050057.repeatable-motion.1.el

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


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