ラベル emacs の投稿を表示しています。 すべての投稿を表示
ラベル emacs の投稿を表示しています。 すべての投稿を表示

2010年5月28日金曜日

key chord

Emacsにはキーバインドが不足している。私は矢印キーなどを使う軟弱者なので、幸いC-[bfpn]は開いているが、でも足りない。例えば、replace-stringやreplace-regexpは割と使用頻度が高いが、さてこれをどこに割り当てたものか。あと、1ストロークで実行したいものもたくさんある。
そんな時はkey-chordというelispを使えばいいらしい。(http://www.emacswiki.org/cgi-bin/wiki/download/key-chord.el

;; key-chord
(require 'key-chord)
(key-chord-mode 1)
(setq key-chord-two-keys-delay 0.05)

;; key setting
(key-chord-define-global "gl" 'goto-line)
(key-chord-define-global "as" 'auto-save-buffers-toggle)
(key-chord-define-global "re" 'replace-string)
(key-chord-define-global "zx" 'undo)

key-chord-define-global は、第一引数で指定された文字全てが同時に(key-chord-two-keys-delay秒以内の誤差で)押されたら、関数がコールされるというもの。

例えば、指定行に行きたいときにはgoto-line(M-g g)を使うが、これがgとl同時押しでよいのだ。同じ要領で、reでreplace-stringも使えるようにした。これこそ、私にしてみればワンストロークでやりたかったことだった。
今回は頭文字をとってキーバインドを適当に決めたが、実際にはおしやすさが重要。中途半端に離れているととても打ちづらい。なので、実は現実的な割当数は思ったよりは少ないが、それでも大変な数のキーバインドを手にいれることが出来る。

key-chord.elにはcopyright 2003とか書いてあった。こういうelispを知る度に、一週間くらいずっと拡張ばっかりする時間が欲しいと思うのだが、結局そんな時間は取れた試しが無い。まだ数日しか使っていないが、手放せないelispになりそうだ。

なお、ターミナルではキルリングとクリップボードの共有(とりあえずMac)をやっておかないと、クリップボードから貼りつけると、いろんなキーがほぼ同時に押されたことになって大変なことになるので注意。

キルリングとクリップボードの共有(とりあえずMac)

emacsは独自のキルリングを使っているので、emacsで C-w などでコピーしたところで、例えばFirefoxにそれを貼り付けることはできない。
回避策として、ターミナルなら、それのコピー機能を使用することで、外部アプリケーションに張り付けられる。逆に、クリップボードの文字列も同様の方法でemacsに貼り付けることが出来る。
しかしこれには致命的な欠点があり:
  • 見えたままクリップボードに入るので、ウィンドウ分割していると上手くコピーできない
  • クリップボードからペーストすると、一文字ずつ打ったことになるので、重いしインデントが勝手につく
と、スマートとはいえない状態だ。GUIから起動すると、メニューからコピーなどができるようになっているが、Screenバンザイなのでそちらに行こうとは思えなかった。

そこで、以下のようなelispを、.emacsに書き加えた。(ソース:http://blog.lathi.net/articles/2007/11/07/sharing-the-mac-clipboard-with-emacs
; http://blog.lathi.net/articles/2007/11/07/sharing-the-mac-clipboard-with-emacs
(defun copy-from-osx ()
(shell-command-to-string "pbpaste"))

(defun paste-to-osx (text &optional push)
(let ((process-connection-type nil))
(let ((proc (start-process "pbcopy" "*Messages*" "pbcopy")))
(process-send-string proc text)
(process-send-eof proc))))

(setq interprogram-cut-function 'paste-to-osx)
(setq interprogram-paste-function 'copy-from-osx)
これでシェアされる。ただしMac限定。
仕組みは簡単で、macのコマンドpbcopyとpbpasteを利用しているだけだ。コマンドの名前があまりにも自明なのであえて説明はしない。
要するに、linux, windowsでも同様のコマンドがあれば、コマンド名の書換だけで使用できるようになる。現在度重なる不幸によって(笑)自分用のubuntu開発機を持っていないので、Linuxでの対応はまたその時にしたいと思うが、少し調べたら同様のコマンドはあるみたいだし、GTKを使えば数行のコードで実現出来るはずだ。

2009年2月27日金曜日

Emacs22の文字コード判別の頭が悪い

Emacs22から文字コードの判別にmule-ucsを使わなくなり起動が早くなったらしいが、そのせいで時々文字コードを間違えるようになったみたいだ。
写真は、二行目に「初音ミク」と書いてutf-8で保存されたものを開いた時のスクリーンショット。ステータス行を見ると、Shift-jisと誤認していることがわかる。こういう時は、C-x RET c utf-8-unix RET C-x C-v RETとタイプすればUTF-8で開き直せるが、あまりにも長すぎる。
以下のような行を入れておくことで、そのファイルの文字コードを指定できる。
# -*- coding:utf-8 -*-
(#はコメント。言語に合わせてセミコロンなどでも良)
これがファイル内にあれば、utf-8でファイルを読み込んでくれるようになるのだが、いちいち全部のファイルにこれを書くわけにはいかないし、何より読み込んでからでは遅い。

coding-category-listという変数の中に、文字コードの優先順位が書いてあり、先頭のほうが優先順位が高い。
coding-category-list
=> (coding-category-iso-8-2 coding-category-iso-7-tight coding-category-sjis coding-category-iso-7-else coding-category-iso-8-1 coding-category-utf-8 coding-category-utf-16-be coding-category-utf-16-le coding-category-iso-7 coding-category-iso-8-else coding-category-emacs-mule coding-category-raw-text ...)
確かに、coding-category-utf-8より前にcoding-category-sjisがある。
この優先順位を上げてやるといいらしい。以下の式を評価してから、問題のテキストファイルを開く。
(prefer-coding-system 'utf-8-unix)
=> (mule-utf-8 . mule-utf-8)
図のように、無事にutf-8と認識するようになったので、これを~/.emacs.my.elに追記しておく。
どうやら、coding-category-listを最初から順番に試していって、最初にファイル内全てを文字として表現できたものを問答無用で使うようになっているらしい。

# しかし、初音ミクで化けるとは・・・。