key-combo v0.7をリリース:直前に空白があった場合は空白を二重に入れないように

key-combo v0.7をリリースしました。

  1. カーソル位置の直前に空白があった場合は空白を二重に入れないように

変更詳細

詳細を説明します。key-comboに空白を開ける系のコマンド" = "などを登録すると便利です。しかし、v0.6まではカーソル位置の直前に空白があっても空白を挿入してしまうため、いらっとすることがありました。
例えば

(key-combo-define-global (kbd "=") " = ")

と設定した場合、
hoge 」の直後で「=」を入力すると「hoge = 」となってしまいました。hogeの後ろの空白を削除するお仕事にも疲れたので、先行する空白がある場合は空白を入れないようにしました。
これからは、上記と同じ設定で「hoge 」の直後で「=」を入力しても「hoge = 」となってくれます。

インストール方法

ソースがgithubにおいてあるので

(auto-install-from-url "https://github.com/uk-ar/key-combo/raw/177bf94345c532e3dc4c29388a4f160b5241e818/key-combo.el")

を評価するか、
marmaladeから
M-x package-install key-combo
でインストール可能です。

key-combo v0.6をリリース:sequential-command的な使い方もサポート!

key-combo v0.6をリリースしました。
sequential-command的な使い方をするために、以下の機能を加えました。

  1. クリーンアップ用の関数を省略可能に
  2. コマンド実行前の位置を記録し、key-combo-returnで戻れるように
  3. Metaキーを含むキーも登録可能に
  4. 元のコマンドがself-insert-commandの時のみundoの履歴に結果を残すように

変更詳細

詳細を説明します。今回はkey-comboのクリーンアップ関数を省略出来れば、sequential-commandの代わりになるんじゃないかと思いついたのがきっかけです。それに対応して、使い勝手がよくなるようにいろいろ変更しました。sequential-commandを知らない方はid:rubikitchさんの同じコマンドを連続実行することで挙動を変える(行頭→先頭など) sequential-command.el をリリース - http://rubikitch.com/に移転しましたを参考にしてください(丸投げ)
それではサンプルと解説です。
キーは従来通りkey-combo-define-globalにて定義して下さい。一つのキーに対して、実行用の関数とnilを「.」でつないだ形式で指定します。更に. nilは省略可能なので、(実行用の関数)で指定が可能です。
例えば

(key-combo-define-global (kbd "C-a")
'((back-to-indentation) (beginning-of-line) (beginning-of-buffer) (key-combo-return)))

と設定すれば、「C-a」を入力するたびに「インデントを飛ばした行の先頭」「行の先頭」「バッファの先頭」「コマンド開始時の位置」に移動します。sequential-commandに比べると括弧が多くなってしまうのが、あまりイケてませんが…。以下のようにラムダ式も関数として受け付けます。
例えば

(key-combo-define-global (kbd "C-e")
'((lambda () (end-of-line)) (lambda () (goto-char (point-max))) (lambda () (key-combo-return))))

と設定すれば、「C-e」を入力するたびに「行の末尾」「バッファの末尾」「コマンド開始時の位置」に移動します。
なお、上記2つの設定はデフォルト設定に含まれているので

(key-combo-load-default)

により設定が可能です。

インストール方法

ソースがgithubにおいてあるので

(auto-install-from-url "https://github.com/uk-ar/key-combo/raw/cc2cbc60ff9bee69e251e31170aa0d551c883c35/key-combo.el")

を評価するか、
marmaladeから
M-x package-install key-combo
でインストール可能です。

制限事項

sequential-commandの代用として使った場合、以下の制限があります。

  1. 関数名を指定できないためdescribe-bindingsした時わかりにくい。
  2. キーを登録する際、括弧が多い

key-combo v0.5をリリース:smartchrと同じく、キーに対して関数が割り当てられるように

key-combo v0.5をリリースしました
主な変更点は以下の通りです

  1. キーに関数を登録可能にした

変更詳細

詳細を説明します。
1.v0.4まではkey-comboのキーに登録できるのは挿入する文字列だけでした。カーソル位置の指定ぐらいはできるものの、それ以上複雑なことは出来ませんでした。smartchrには関数を登録できるため、smartchrを使い倒しているひとは移行ができなかったと思います。
ですがっっ、今日からは違います。key-comboにも関数を登録する機能がつきました。これで心おきなくkey-comboに移行出来ます。やったね♪(まだ足りない機能がある場合はお教え下さい)
それではサンプルと解説です。
キーは従来通りkey-combo-define-globalにて定義して下さい。一つのキーに対して、実行用の関数とクリーンアップ用の関数を「.」でつないだ形式で指定します
例えば

(key-combo-define-global (kbd "=") '(self-insert-command . delete-backward-char))

と設定すれば、「=」を入力すると「=」を挿入します。
さらに、ラムダ式も関数として受け付けます。
例えば

(key-combo-define-global (kbd "==") '((lambda() (insert " = ")) .
                                                                  (lambda() (delete-backward-char 3))))

と設定すれば、「==」を入力すると「 = 」を挿入します。
もちろん、従来通り関数を指定する代わりに挿入する文字列を指定することもできます。例えば、

(key-combo-define-global (kbd "===") " == ")

とすれば、「===」を入力すると「 == 」を挿入します。

また、同じキーが複数回続く設定はリストとすることでまとめて定義することができます。例えば、上記3つの上の設定をまとめて

(key-combo-define-global
 (kbd "=")
 '((self-insert-command . delete-backward-char)
   ((lambda() (insert " = ")) . (lambda() (delete-backward-char 3)))
   " == " ))

とすることができます。

インストール方法

ソースがgithubにおいてあるので

(auto-install-from-url "https://github.com/uk-ar/key-combo/raw/c757f5115800ca2638ec24542146cfef63cf3e2a/key-combo.el")

を評価するか、
marmaladeから
M-x package-install key-combo
でインストール可能です。

その他

今回は内部の実装を大幅に変更しました。
これで当初の目的だったsmartchrの代替という大きな山は越えた感じですね。
次はキーマップの割り当てをバッファローカルにしたりしてうまく整理したいとこですね。
あとはsequential-command的な機能の導入もしていこうと思ってます。

key-combo v0.4に更新:有効と無効を手軽に切り替え可能に

主な変更点は以下の通りです

  1. 有効と無効を手軽に切り替え可能に

変更詳細

詳細を説明します。
1.v0.3まではkey-combo用のキーマップをグローバルマップに割り当てていたために、key-comboを無効にするのは大変でした。今回のv0.4からはkey-combo-modeにキーマップを割り当てるため、M-x key-combo-modeで簡単に有効、無効を切り替えが可能です。
キーは従来通りkey-combo-define-globalにて定義して下さい。
例えば

(key-combo-define-global (kbd "=") '(" = " " == " " === " ))
(key-combo-define-global (kbd "=>") " => ")

などとします。

インストール方法

ソースがgithubにおいてあるので

(auto-install-from-url "https://github.com/uk-ar/key-combo/raw/fea60e001a4e027701b554380e568a9727c41432/key-combo.el")

を評価するか、
marmaladeから
M-x package-install key-combo
でインストール可能です。

key-combo v0.3をリリース

主な変更点は以下の通りです

  1. 同じキーが複数回続く定義がなければ、クリーンアップせずに連続して挿入します。
  2. tomykairaさんによるバグ修正
  3. リファクタリング
  4. el-expectationによるテストを追加

変更詳細

詳細を説明します。
1. わかりにくい日本語ですみません。
v0.2まではある単一のキーを定義した場合、連続してそのキーを入力しても同じ文字列の削除と挿入を繰り返すだけでした。
例えば

(key-combo-define-global (kbd ">") '(">"))

とした場合。一度「>」を入力すると「>」が挿入されバッファには「>」が表示されます。しかし、もう一度「>」を入力しても「>」が消去された後に「>」が挿入されるため、バッファの文字列は「>」のままになってしまいます。
組み合わせの為だけでも先頭のキーを定義する必要があるので、

(key-combo-define-global (kbd ">") '(">"))
(key-combo-define-global (kbd ">=") " >= ")

とした場合に不便でした。

そのため、同じキーが複数回続く定義がない場合には連続して挿入するように変更しました。
例えば、

(key-combo-define-global (kbd ">") '(">"))
(key-combo-define-global (kbd ">=") " >= ")

とする設定では一度「>」を入力すると「>」となりもう一度「>」を入力すると「>>」となります。

2. 年末12/27あたりにひどい変更を入れてしまったため、まともに動かなくなっていました。tomykairaさんにより修正してもらったので、12/27から1/8ぐらいに使ってだめだった人はすみませんがもう一度試してみてください。

3. 4. グローバルな変数を大量に使っていたりでわけがわからなくなっていたので、テストを書いてリファクタリングしました。少しは読みやすくなったと思います。

インストール方法

ソースがgithubにおいてあるので

(auto-install-from-url "https://raw.github.com/uk-ar/key-combo/bb4e004a78e1db36e2b81a4a7a6c460a4bebb4f4/key-combo.el")

を評価するか、
marmaladeから
M-x package-install key-combo
でインストール可能です。

key-comboを使って読みやすいコードを書く (Emacs Advent Calendar 8日目)

新しい情報
key-combo v0.3をリリース - むしゃくしゃしてやった
も合わせてご覧下さい。

Emacs Advent Calendar jp: 2011の8日目の記事です。
昨日7日目はふぁいてんさんでした。http://www.phyten.net/summary/emacs-advent.html
6日目のid:kiwanamiさんの分も本日アップされたようです。
Emacs で IPC や RPC (Emacs Advent Calendar jp: 2011) - 技術日記@kiwanami

この記事では、任意のキーの組み合わせで任意の文字列を挿入するkey-combo.elというのを書いたので、その紹介をします。
GitHub - uk-ar/key-combo: emacs plugin:enhanced smartchr

きっかけ

みなさん、smartchr.elはご存知でしょうか?id:IMAKADOさんが作ったEmacs Lispで、キー入力に対して様々な文字列を割り当てることができます。id:IMAKADOさんによる説明を引用します。

さて、皆さんはプログラム中に = を書くとき、両端にスペースを入れているでしょうか? 私は、入れています。入れないより入れた方が、プログラムがずっと読みやすくなるからです。 ですが、前後にスペースを入れない時と比べて、2回タイプ数が増えてしまうという問題があります。

そういった問題を解決する smartchr.el というemacs拡張をリリースしました。

smartchr.elに出会ったときCtrlやMetaなどの修飾キーを押さずに一般的なキーに動作を割り当てる発想が斬新で私もいろいろ設定して使っていました。
特に

  • 「=」を入力すると「 = 」
  • 「==」を入力すると「 == 」

を挿入する設定をしてしばらく使っていました。ところが、使ってるうちに不満が出てきたのです。

何が問題?

私はよくrubyを使ってますが、上の設定をした上でハッシュの記号「=>」を打つ場合、そのまま「=>」を入力すると「 = >」となって間にスペースが入ってしまいます。もちろん回避策はいくつかあって、「===」や「>>」を入力すると「 => 」を挿入する設定や「===」で「=」を挿入する設定を試してみました。
が、やはり長年のくせで「=>」を入力してしまい、やるせない想いをかみしめてまいりました。

これは何?

前置きが長くなりましたが、そんなやるせない夜とはもうおさらばです。そうkey-comboならね。
具体的には

  • 「=」を入力すると「 = 」
  • 「==」を入力すると「 == 」
  • 「=>」を入力すると「 => 」
  • 「>=」を入力すると「 >= 」

を挿入するよう設定できます。

インストール方法

ソースがgithubにおいてあるので

(auto-install-from-url "https://raw.github.com/uk-ar/key-combo/master/key-combo.el")

とするか、
今話題のmarmaladeから
M-x package-install key-combo
でもインストール可能です。
load-path の通ったディレクトリに配置して、

(require 'key-combo)

すると使えるようになります。

設定方法

「=」を入力すると「 = 」、「==」を入力すると「 == 」を挿入するコマンドを定義してみます。定義には key-combo-define-global を使用します。この関数は global-set-key に対応しますが(第一引数が単一キーの時は)第二引数には挿入する文字列のリストをとることができます。具体的には

(key-combo-define-global (kbd "=") '(" = " " == "))

となります。
続いて、「=>」を入力すると「 => 」を挿入するコマンドを定義してみます。

(key-combo-define-global (kbd "=>") " => ")

となります。
さらに、「>=」を入力すると「 >= 」を挿入するコマンドを定義します。

(key-combo-define-global (kbd ">") '(">"))
(key-combo-define-global (kbd ">=") " >= ")

となります。一行目の(kbd ">")に関しては冗長な感じがしますが今のところ必要です。コンビネーションのキーを登録する場合は前もって一文字目をプレフィックスの様に登録しているからです。("=>"の場合は前もって"="が登録されていた)
なお、ここでの設定例は自分で設定しなくとも

(key-combo-load-default)

とすれば、設定されます。

細かい使い方

smartchr.elより工夫した点として、一回目の入力はundoで本来の動作にキャンセルできます。例えば、「=」を入力すると「 = 」が挿入されますが、そこでundoすると「=」を挿入した状態に戻ります。Wordとかの英単語の先頭を大文字に自動訂正する機能の動作がキャンセルできるとこからパクりました。これで、イラッとしてもすぐに元に戻せます。

smartchr.elと同様に引数の文字列中の `!!' によりカーソルの位置の指定もできるので、以下のような定義も可能です。

(key-combo-define-global (kbd "{") '("{`!!'}"))
(key-combo-define-global (kbd "{}") "{}")

こうすれば、「{」を入力すると「{」「}」がカーソルの前後に挿入されますが、直後に癖で「}」を打ってしまっても余分な「}」が挿入されません。

問題点

疲れてきたので箇条書きです。

  • それでもおせっかいに感じるときがあるので一括で機能をオンオフしたい(マイナーモード?)
  • 何が実行されるかがdescribe-bindingしてもわかりづらい。
  • smartchr.elでの関数を登録する機能が未実装
  • ターミナルでemacsを起動した時、screen経由でコピペしたり、ブラウザからコピペしたりすると不要な文字がついてしまい悲しい。
  • 文の途中を編集するときには希望しない結果になることが多いかも(文末だけ有効にする機能をつける?)
  • 作ったあとに気付いたけど、コード整形だけならリージョンやバッファを指定して一括処理した方が便利かも。

他にも問題点があればgithubのissueトラッカまでお願いします。
ソースもばんばんforkして改造してpull requestをしてみてください。
(デフォルトで便利そうな設定を取り込んできたいです)

あとがき

key-combo.elについて紹介しました。
イデアの元となったsmartchr.elの開発者のid:IMAKADOさんに感謝します。
コードの大半はsmartchr.elとkey-chord.elを盛大にパクって参考にしています。

明日はid:buzztaikiさんです。
お楽しみに。

Macできれいにソフトの動画キャプチャをとって再生する

というかデモを作るときの設定メモ

キャプチャ

QuickTimePlayer

編集

iMovie
取り込み時
ファイル→読み込み→ムービー
!!ビデオを最適化をOFFに!!

出力

h264

再生

QuickTimePlayer
フルスクリーンに切り替え
拡大、縮小