owdriver 20141011.738(in MELPA)
Quickly perform various actions on other windows

概要

<2015-02-21 Sat> win-switch.elも仲間に入れてください。

これは便利!

通常のEmacsでは3分割以上ウィンドウを分割していると、
一気に操作性が悪くなっていました。

というのは、 scroll-other-window などのother-window系コマンドは
すぐ隣のウィンドウを操作するものでしかないからです。

3分割されているとき、隣の隣のウィンドウを直接操作するコマンドはありません。

この問題は owdriver.el (Other Window Driver) が解決してくれます。

そのうち紹介しますが、連続するプレフィクスキーを
省略できる smartrep.el のうまい活用例です。

2分割であってもわざわざ C-x o (other-window) で操作するウィンドウを
選択する必要がないので、導入する価値は十分にあります。

プレフィクスキー( owdriver-prefix-key )をうまく設定しておけば、
other-window系コマンドは用済み になってしまいます。

それくらいやばい破壊力を持っています!!

switch-windowも併用するとなおよし

インストール

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

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

M-x package-install owdriver

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

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

設定 140911110001.owdriver.el(以下のコードと同一)

(require 'owdriver)
(global-unset-key (kbd "M-o"))
(setq owdriver-prefix-key "M-o")
(owdriver-config-default)
;;; これを入れておくことでM-o M-oで対象ウィンドウを選択できる
(owdriver-add-keymap owdriver-prefix-key 'owdriver-next-window)
(owdriver-mode 1)

実行方法

$ wget http://rubikitch.com/f/140911110001.owdriver.el
$ emacs -Q -f package-initialize -l 140911110001.owdriver.el

M-oをsmartrepのプレフィクスキーにしておけば、
M-oを押した後は隣のウィンドウをあたかも
選択したかのように操作できます。

たとえばM-oの後にC-vやM-vでスクロールできるし、
C-f/C-b/C-n/C-pでカーソル移動などもできます。

3分割以上のときにM-oをたて続けに押せば、
対象ウィンドウを切り替えられます。

他ウィンドウの操作を終わるにはC-gかC-qです。

操作しているウィンドウを選択して終了するにはC-RETです。

コマンドを追加する

現時点での owdriver-config-default の定義はこうなっています。

(defun owdriver-config-default ()
  "Do the recommended configuration."
  ;; Own command
  (owdriver-add-keymap "C-o"        'owdriver-next-window)
  (owdriver-add-keymap "C-S-o"      'owdriver-previous-window)
  (owdriver-add-keymap "<C-return>" 'owdriver-focus-window)
  (owdriver-add-keymap "C-q"        'owdriver-quit)
  ;; Basic command
  (owdriver-define-command scroll-up               t)
  (owdriver-define-command scroll-up-command       t)
  (owdriver-define-command scroll-down             t)
  (owdriver-define-command scroll-down-command     t)
  (owdriver-define-command scroll-left             t (scroll-left 10 t))
  (owdriver-define-command scroll-right            t (scroll-right 10 t))
  (owdriver-define-command next-line               t)
  (owdriver-define-command previous-line           t)
  (owdriver-define-command forward-char            t)
  (owdriver-define-command forward-word            t)
  (owdriver-define-command backward-char           t)
  (owdriver-define-command backward-word           t)
  (owdriver-define-command move-beginning-of-line  t)
  (owdriver-define-command move-end-of-line        t)
  (owdriver-define-command beginning-of-buffer     t)
  (owdriver-define-command end-of-buffer           t)
  (owdriver-define-command isearch-forward         t (isearch-forward))
  (owdriver-define-command isearch-backward        t (isearch-backward))
  (owdriver-define-command set-mark-command        t)
  (owdriver-define-command kill-ring-save          t (call-interactively 'kill-ring-save) (deactivate-mark))
  ;; Third party command
  (owdriver-define-command pophint:do t (pophint:do :not-switch-window t))
  (owdriver-define-command inertias-up t)
  (owdriver-define-command inertias-down t)
  )

owdriver-add-keymap でowdriverコマンドを追加します。

owdriver-define-command でowdriver用コマンドを定義します。

owdriver-define-command は、 owdriver-add-keymap の機能を含んでいます。

たとえば、

(owdriver-define-command scroll-up-command       t)

は、scroll-up-command (C-v) のowdriver版
(owdriver-do-scroll-up-command) を定義しています。

第2引数にtを指定していることでキーマップに追加し、
M-o C-vと操作できるようになります。

ときたまowdriver版コマンドは、
元のコマンドを実行するだけではすまされないこともあります。

そのときのために、第3引数以降に任意のフォームを記述できるようになっています。

(owdriver-define-command kill-ring-save          t
  (call-interactively 'kill-ring-save) (deactivate-mark))

は、owdriver版では

(progn
  (call-interactively 'kill-ring-save) (deactivate-mark))

を実行するように定義されます。

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


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