2009年12月19日土曜日

Emacsと別アプリとの切り貼り連携をホームポジションで

これはEmacsAdventCalendar 2009の12月19日分として公開したものです。
12月18日分はtomoyaさんによるこちら、20日分はkitokitokiさんによるこちらです。
また19日分のおまけネタとしてこちらも作りました。

Emacsは昔からあるアプリケーションなので、ウィンドウという言葉が通常のアプリケーションと違う意味で遣われていたり、基本編集のキー配置が他のアプリケーションと違っていたりします。そしてコピーしたり切り取ったりした文字列は原則としてEmacsの中だけで使われていて、他のアプリケーションと共有することはできません(あ、Unix, Linux on X Window Systemでの話です。他のOSだと?)。
いや、それはあまりにも使いにくいのでメニューのEdit → Copy|Paste(そしてそのショートカットのファンクションキー的なもの)を使えば、他のアプリケーションとの連動ができます。






しかしこれでもまだ使いにくい! Emacs野郎はFunctionキーなんか使いませんよ。マウスでクリックして、その場にコンテキストメニューが出てくるならともかく、メニューバーまでポインタを動かしてメニューを出してCopyを選ぶなんてまどろっこしい。
ということでもっと使いやすいキーにバインドしてしまいましょう(C-wやC-yを置き換えるのはやめておきます)
でも覚えやすいキーなんて残っているのかしらん?

それがあるのです。なぜか Control-Shift-w, Control-Shift-y が未束縛です(※ 少なくともDebianでは)。そこで:

(define-key global-map (kbd "C-S-w") 'clipboard-kill-ring-save)
(define-key global-map (kbd "C-S-y") 'x-clipboard-yank)

と定義すれば、C-wやC-yはこれまで通りで、シフトを押しながらC-w, C-yならデスクトップ環境のクリップボードへの貼り付け・コピーができるようになります。-nw 付きで起動した場合は使えないという制約はありますが、ちょいと便利です。



※ この記事は以下のWaveでも読み書きできます。
https://wave.google.com/wave/?#restored:wave:googlewave.com!w%252BSauQrHe4A

私Emacsユーザだけど彼氏のSKKが…

これはEmacsAdventCalendar 2009に関連したおまけのエントリーです。


最近出た新しいポメラはキークリック音がしてかわいいんだとかtwitterで見ました。。。えー、それくらいEmacsでもできるわい。簡単にできるわい。んー、検証してみよう。。。
というわけでキーを押すたびに音がするピコピコEmacsを実現してみました。
要は、ーイベントが起きるたびにhookしてやって(コードに則して言えばadviceしてやって)、サウンド再生コマンドを外部プロセスとして起動してやればいいじゃんという方針。子プロセスの終了まで同期されるとキー入力に追い付かないことになってまずいですが、ちょっと調べるとcall-process-shell-commandの第3引数が0ならプロセスの終了を待たないということだったのでこの方針で問題なさそうです。また、本当はself-insert-commandをadviceできればいいんでしょうが、subrではできないようなので、SKKユーザとしてはとりあえずSKKを使った日本語入力中にピコピコ鳴ればいいだろうと妥協して、こういうことになりました:

(defadvice skk-insert (before magictape activate)
  ;; (message "%d" last-command-event)
  (let* ((e last-command-event)
         (l
          '((9 . "bin080518100400001.mp3")    ;; TAB
            (97 . "bin070620135222001.mp3")   ;; A
            (105 . "bin070620135304001.mp3")  ;; I
            (117 . "bin070620135348001.mp3")  ;; U
            (101 . "bin070620135442001.mp3")  ;; E
            (111 . "bin070620135129001.mp3"))) ;; O
         (a (cond
             ((cdr-safe (assq e l)))
             ((and (numberp e) (< 64 e) (< e 91) "bin080518100400001.mp3")) ;; 変換開始
             (t nil))))
    (if a 

        (call-process-shell-command "mpg123" () 0 () "-o" "pulse"  ;; Linuxでpulseaudio使用
                                    (expand-file-name a "~/Desktop")))))

長いコードになっているのはa、i、u、e、o 、TAB(での補完)、変換開始(=大文字)のそれぞれに別の音をつけたためです。サウンドファイルの場所や使用するプログラム名などいろいろなものが決め打ちですが、さて、どういう音を鳴らすのがいいか? 著作権フリーなものをいろいろぐぐって、http://koukaongen.com/からダウンロードして、納得しているものがこれです(12月18日現在):



結局、
バリバリバリバリうるさい非実用tips(いわゆるネタ)になっちゃったのでした〜^^