Ctrl+中指か薬指を使うキー操作が多いEmacsで指の負担を軽くする方法

http://d.hatena.ne.jp/kotorikotoriko/20081103/1225687600

Emacsを使っていると、Ctrlを押しながらうんぬんというのがとても多い。だから指が疲れてしまうという話をよく聞く。俺は10年以上使っているのだが、幸い今のところ指が疲れるということはない。というか、逆に左手小指が異常に鍛えられている気すらする。これはさておき、俺は俺なりに指の負担を軽減する方策を取っている。

skk + スティッキーシフト

SKKを使っているとどうしてもShiftを押しまくることになる。これはスティッキーシフトでShiftを押さないようにしている。CamelCaseな変数名を使うJavaプログラマにもおすすめかも。
SKK + スティッキーシフト = 最強 - http://rubikitch.com/に移転しました

view-modeを活用する

あとは、極力view-modeを活用すること。いくらEmacsでも常に編集しているわけではない。バッファの内容を閲覧している方が多い。閲覧といえばview-modeというマイナーモードがある。編集をしないのでアルファベット・数字キーは機能に割り当てられる。だからわざわざCtrlを押さなくてもカーソル移動などができる。いわばページャーのようなものだ。viのようにhjklでカーソル移動、スペースでスクロールができるようにしてみた。view-mode以外にも閲覧が主体のモードがあるので他のモードでも再利用できるようにしてある。

(setq view-read-only t)
(defvar pager-keybind
      `( ;; vi-like
        ("h" . backward-word)
        ("l" . forward-word)
        ("j" . next-window-line)
        ("k" . previous-window-line)
        (";" . gene-word)
        ("b" . scroll-down)
        (" " . scroll-up)
        ;; w3m-like
        ("m" . gene-word)
        ("i" . win-delete-current-window-and-squeeze)
        ("w" . forward-word)
        ("e" . backward-word)
        ("(" . point-undo)
        (")" . point-redo)
        ("J" . ,(lambda () (interactive) (scroll-up 1)))
        ("K" . ,(lambda () (interactive) (scroll-down 1)))
        ;; bm-easy
        ("." . bm-toggle)
        ("[" . bm-previous)
        ("]" . bm-next)
        ;; langhelp-like
        ("c" . scroll-other-window-down)
        ("v" . scroll-other-window)
        ))
(defun define-many-keys (keymap key-table &optional includes)
  (let (key cmd)
    (dolist (key-cmd key-table)
      (setq key (car key-cmd)
            cmd (cdr key-cmd))
      (if (or (not includes) (member key includes))
        (define-key keymap key cmd))))
  keymap)

(defun view-mode-hook0 ()
  (define-many-keys view-mode-map pager-keybind)
  (hl-line-mode 1)
  (define-key view-mode-map " " 'scroll-up))
(add-hook 'view-mode-hook 'view-mode-hook0)

;; 書き込み不能なファイルはview-modeで開くように
(defadvice find-file
  (around find-file-switch-to-view-file (file &optional wild) activate)
  (if (and (not (file-writable-p file))
           (not (file-directory-p file)))
      (view-file file)
    ad-do-it))
;; 書き込み不能な場合はview-modeを抜けないように
(defvar view-mode-force-exit nil)
(defmacro do-not-exit-view-mode-unless-writable-advice (f)
  `(defadvice ,f (around do-not-exit-view-mode-unless-writable activate)
     (if (and (buffer-file-name)
              (not view-mode-force-exit)
              (not (file-writable-p (buffer-file-name))))
         (message "File is unwritable, so stay in view-mode.")
       ad-do-it)))

(do-not-exit-view-mode-unless-writable-advice view-mode-exit)
(do-not-exit-view-mode-unless-writable-advice view-mode-disable)

key-chord.elで同時押し!

つい最近やっていることは、key-chord.elでワンタッチでview-modeをトグルすること。key-chord.elは2つのキーを同時押しすることで機能を実行するもの。ある意味Emacsの操作性に革命を起こしている。
当然「同時押し」というても、コンマ何秒かの誤差があるのは当然だ。俺の場合0.04秒以内に2つのキーが押されると同時押しとみなすように設定している。試行錯誤の結果これが丁度よいことがわかった。「jk」を同時押しすることでview-modeを実行する。ホームポジションにあるので事実上ワンタッチだ。こりゃ便利。

M-x install-elisp http://www.emacswiki.org/cgi-bin/wiki/download/key-chord.el

(require 'key-chord)
(setq key-chord-two-keys-delay 0.04)
(key-chord-mode 1)
(key-chord-define-global "jk" 'view-mode)

で、編集時と閲覧時にちょくちょくview-modeを切り換えているので操作が楽になった。もちろん指の負担も楽に。いつのまにかviちっくな操作になってしまったけど、vimに乗り換える気はさらさらない。10年以上鍛えぬいた.emacsを手放すことなんてできない。key-chord.elはEmacsは指が疲れるという悪いイメージを払拭する救世主となるであろう。

anything.elで複数の機能をまとめる

anything.elは複数の機能をまとめられるので、これまで個別にキーが割り当ててあったのを統一できる。押しやすい位置に再配置することも思いのまま。

http://www.emacswiki.org/emacs/Anything
http://d.hatena.ne.jp/rubikitch/archive?word=%2a%5banything%5d

俺もanything-mapにカーソルキーやDelete, Home, End, PageUp, PageDownに機能を割り当てている。anythingを閲覧目的に使うことがあるからだ。

(define-key anything-map [end] 'anything-scroll-other-window)
(define-key anything-map [home] 'anything-scroll-other-window-down)
(define-key anything-map [next] 'anything-next-page)
(define-key anything-map [prior] 'anything-previous-page)
(define-key anything-map [delete] 'anything-execute-persistent-action)

追記

id:ytoさんより親指Ctrlを紹介してもらった。
http://chalow.net/clsearch.cgi?key=%BF%C6%BB%D8%A5%B3%A5%F3%A5%C8%A5%ED%A1%BC%A5%EB&mode=1

俺はCtrlをAの左に配置していて15年も使っている。初代機はPC-98だったのであのころからAの左がCtrlだった。今更親指Ctrlは無理だがAltも結構使うので親指Altにしている。つまり、無変換キーをAltに割り当て。乗り変えはすぐできた。親指を無理に曲げなくてすむから楽になった。

[2008/11/05]追記 SandSとupcase-word

Emacsで手(主に小指)の負担を減らす方法 - yaotti's diary

SandSという方法を知った。なるほど

  □ Spaceを押しながら文字入力→Shift+文字
  □ Space単体→Space扱い

ならばSpaceの有効活用になるわけか。key-chord.elをいじれば実現できるかなと考えていたけど、Spaceを押しながら連続した文字入力ができないことに気付いて頓挫。うーん。sands.elとかsands-mode.elとかxmodmapの設定とかを検索しても見当たらん。

まぁ似非SandSということでSpace+英字のkey chordを定義すれば小指の負担も減らせるな。たとえば Space + f でfind-file。C-x C-fより楽なのかもしれない。ただ、この場合 key-chord-two-keys-delayが0.04じゃ短すぎる。かといって長くするとfを押したときに文字が出るまで遅延がでるなぁ。spaceを押してからdelayをかけるようにしてみればいいんじゃないかな。

(key-chord-define-global " f" 'find-file)


似非SandSならば key-chord-define の亜種を用意して、key-chord-input-method のadviceをかければできそうだ。

やってみた→親指を有効活用space-chord.el〜スペースを押しながら〜 - http://rubikitch.com/に移転しました

clmemo@aka: 大文字連続入力 |Emacs|

ああupcase-wordがあったな。そういや俺の場合はC-Spaceでマークを付けてからC-x C-u(upcase-region)してるな。

(defun upcase-backward-word (arg)
  "Convert previous word (or arg words) to upper case."
  (interactive "p")
  (upcase-word (- arg)))

これを複数回実行したら前の単語〜というふうに大文字にする範囲を広げられたらおもしろいだろうね。

やってみた→カーソル前の単語を次々に大文字(小文字・capitalize)にする - http://rubikitch.com/に移転しました

[2008/11/05]追記 ブクマコメに返信

たくさんのブックマーク・コメントありがとう!

vi使え系→無理(きっぱり)!たとえviの操作性に慣れたとしてもEmacs Lispの知識・資産を移行できないから。40歳の空手家がボクシング始めるようなものかと(ぁ

・ 2008年11月05日 ama-ch ama-ch 左利きの僕は「Ctrlで指が疲れる」とは無縁です。

矯正されたものの俺も小さいころ左利きだった。もしかしたら左手が疲れない原因のひとつはそれかもしれない。逆にマウス操作がきつそう…

・ 2008年11月05日 mojin mojin ゲスト端末をつかわざるを得ないときとかに苦労するので、 キーマップはあまり変えていない。CtrlをAの隣にはしているが。

んー、Emacsだったら常用する設定をひとつのファイルにまとめておいて(cat *.elなどで)trampやinstall-elispでひっぱってきてevalすればよいような…

・ 2008年11月05日 tor_ozaki tor_ozaki emacs これからはemacsenも指を労わる時代

そうだろうね。key-chord.elなどが出てきたのも時代の流れだろうか。

・ 2008年11月05日 ttpooh ttpooh Software もはや左手小指・薬指が進化したので問題なし。 でも参考に。

俺も同じタイプかも。でも長時間作業をする以上指は労わりたい。

・ 2008年11月04日 itouhiro itouhiro 同時押しって、SKK同梱のNICOLA-SKKで検出できるのだ が……。SKK+親指シフトはShift押す代わりに、F+J 同時押しで漢字の位置を指定するように なってる。でも機能割り振れる点で key-chord.el に新規性があるのか。

まあkey-chord.elはそう難しくはない。特定のキーが来たら一定時間待って、時間内にもうひとつのキーが押されたら同時押しとみなすだけ。よくあるアイデアじゃないかな。

もこ→キー操作の話。0.04秒は一瞬なのでずれていると同時押しとはみなされないが、同時押ししやすいキーならば問題ない時間。っつーかはじめましてちゃうってw

・ 2008年11月06日 di digdigdig 最初にEmacsなどというどこの馬の骨とも判らぬエディタを 使ってしまい、熟練とともに当然世界最強のエディタであるVim(=涅槃)の操作感に落ち着い たが、Emacsから抜け出せない哀れな例。という訳でこれから使う人はVim

なんという煽りブクマコメ…
俺はLispが大好きなんじゃー!!!ってのはさておき、徒然なるままに書きつづっていく場合は俺的にはモードを気にしないEmacsの操作性が好きだ。校正など閲覧主体の作業の場合はvi風味になってはいる。適材適所かと。十人十色な要求を呑み込めるEmacsの太っ腹が好きだ。