sticky shift

problem

皆様は1文字だけ大文字を打つときはどのようにされていますか。
きっと「シフトを押しながら打つ」ことで大文字を入力しているんじゃないでしょうか。
これは至極一般的な方法ですが、僅かながら問題もあります。
シフトキーというのは左右に一個ずつあるので、右手で打つべきアルファベットの場合は シフトキーは左手で、左手で打つべきアルファベットの場合はシフトキーは右手で、とい うことになりますよね。
THE とか AND のように大文字だけなら Caps Lock すりゃいいですけど、IsFileOpen と か setNextDate みたいな java 等にありがちな大小字混合のメソッドを打つときはあち こちに指が飛ぶのでせわしないことこの上ないわけです。
そして何より、左手でシフトを押しているときに同じ左手の領域の文字を打とうとすると極端 に効率が落ちてしまいます。

sticky?

んで、何かいい方法はないかと候補に上ったのが sticky shift です。シフトを押しながらキー を打つのではなく、一度シフトを押して離した直後の文字だけが大文字になってくれれば いいのです。
ただし、これには多くの障害があります。シフトキーの押し・離しは文字端末では検出で きないために、汎用性がありません。又、私の使用している KINESIS のキーボードではハー ドウェアで sticky shift を実現できる機能もあるのですが、これも環境に左右されてい るのでイマイチです。

ならば。
sticky になるキーをシフトではないキーにすればいいのです。
幸いにして qwerty 配列では唯一、ホームポジションでありながらアルファベットでない文字があり ます。セミコロンです。
諸事情があって私はセミコロンの位置とバックスラッシュの位置を入れ換えてますが本質 は変りません。
セミコロンでこれを実現するのはとても簡単で、こんなかんじにします。

2002.06.15 かなり変更しました.
execute-kbd-macro の代わりに unread-command-events を利用するようにしました.
isearch でも利用できるようになっています.

2002.12.19 macro の中で eval しないようにというか macro 使わないように変更しました.
バイトコンパイルしようとするとエラー出てたみたいです. すんません.
(defvar sticky-key ";")
(defvar sticky-list
  '(("a" . "A")("b" . "B")("c" . "C")("d" . "D")("e" . "E")("f" . "F")("g" . "G")
    ("h" . "H")("i" . "I")("j" . "J")("k" . "K")("l" . "L")("m" . "M")("n" . "N")
    ("o" . "O")("p" . "P")("q" . "Q")("r" . "R")("s" . "S")("t" . "T")("u" . "U")
    ("v" . "V")("w" . "W")("x" . "X")("y" . "Y")("z" . "Z")
    ("1" . "!")("2" . "@")("3" . "#")("4" . "$")("5" . "%")("6" . "^")("7" . "&")
    ("8" . "*")("9" . "(")("0" . ")")
    ("`" . "~")("[" . "{")("]" . "}")("-" . "_")("=" . "+")("," . "<")("." . ">")
    ("/" . "?")(";" . ":")("'" . "\"")("\\" . "|")
    ))
(defvar sticky-map (make-sparse-keymap))
(define-key global-map sticky-key sticky-map)
(mapcar (lambda (pair)
          (define-key sticky-map (car pair)
            `(lambda()(interactive)
               (setq unread-command-events
                     (cons ,(string-to-char (cdr pair)) unread-command-events)))))
        sticky-list)
(define-key sticky-map sticky-key '(lambda ()(interactive)(insert sticky-key)))
あと, isearch でも使うためには
(define-key isearch-mode-map sticky-key sticky-map)
と書いてみてください.
と思いきや, こう書くとセミコロンが isearch できなくなっちゃいますね[2002.07.10].
skk-isearch ならともかく, 普通の isearch ではこれやらない方がよさそうかもです.
それに case-fold-search は t の方が多いですよね普段は.

こうすると、セミコロンを打った直後の文字は大文字になり、それ以降はまた普通の小文 字が入力されます。セミコロンを2連打するとセミコロンが挿入されますが、(キーボード の記号が ASCII 配列なら)コロンを打つときだけはシフト + セミコロンが必要です。

こうすることによる効力は先程の java っぽい単語だけでなく、emacs 上にて skk を利 用して日本語入力をしている場合にも大きな省力化を提供します。私はずっとこれでやっ ていますが、シフトを一度も押さずに skk を快適に利用できるのです。

skk でも利用できるようにするには, 追加で以下のを書いてみてください.
(eval-after-load "skk"
  '(progn
     (define-key skk-j-mode-map sticky-key sticky-map)
     (define-key skk-jisx0208-latin-mode-map sticky-key sticky-map)
     (define-key skk-abbrev-mode-map sticky-key sticky-map)))
(eval-after-load "skk-isearch"
  '(define-key skk-isearch-mode-map sticky-key sticky-map))
これがないと skk では利かないみたいです.

シフトキーは遠いので嫌いという私みたいなものぐさ人間にはうってつけでは ないでしょうか。指をホームから殆ど動かさずしかも大文字を打つときに反対の手の指を シフトキー上に拘束する必要もないというのは、キーボードワークの一連の流れを妨げず 無駄な動作を最小限に抑えるという合理的な実益があると思うのですが。







役に立たないので戻る