Meadow勉強中(9) キーボードマクロ

本気でエディタを使うなら欠かせないのがキーボードマクロ。キーボードの操作を記録して、自動でやらせる機能。Emacsにももちろんあった。

キーボードマクロ

キー 操作
C-x ( キーボードマクロ登録開始
C-x ) キーボードマクロ登録終了
C-x e 登録したキーボードマクロ実行
C-u (数値引数) C-x e 引数で指定した回数だけキーボードマクロ実行

なかなか簡単。キーもまあまあ覚えやすい。

登録開始をして、やりたい操作を教えてあげて(1回やってみせて)、登録終了する。あとは実行すれば同じキー入力が自動で行われる。

使い方

まずは簡単な例から。

2008.1.20
09:00-18:00
2008.1.21
09:00-18:00
2008.1.22
09:00-18:00

例えばこんな感じで、日付と勤務時間をメモっていたとする。で、このデータを

2008.1.20 09:00-18:00
2008.1.21 09:00-18:00
2008.1.22 09:00-18:00

こういうデータに変えたい。

1. 1行目にカーソルを移動して、キーマクロ登録開始。つまりC-x (。
2008.1.20
09:00-18:00
2008.1.21
09:00-18:00
2008.1.22
09:00-18:00

カーソルはファイルの先頭。この状態でキーマクロ登録開始。

2. C-eで行末にカーソル移動。

まだ見た目は変わらないけど、カーソルが1行目の末尾に移動した。

  1. C-dで改行文字を消す。
2008.1.2009:00-18:00
2008.1.21
09:00-18:00
2008.1.22
09:00-18:00

C-dはDeleteキーと同じでカーソル位置の文字を消す。この場合は1行目の改行文字が消えて、下の行が1行目の末尾に移動して来た。

3. スペースを挿入
2008.1.20 09:00-18:00
2008.1.21
09:00-18:00
2008.1.22
09:00-18:00

日付と時刻がくっついてしまっていたので、スペースを挿入。これで1行目は目的のデータになった。

4. C-aで行の頭にカーソル移動。

見た目は変わらず。カーソルが1行目の先頭に移動した。

5. C-nで次の行に移動。

↓キーでも良い。見た目は変わらず。カーソルが2行目の先頭に移動した。

6. ここでキーマクロ登録終了。つまりC-x )。

さてこれで、

  1. C-e (行末へ移動)
  2. C-d (削除)
  3. スペース
  4. C-a (行頭へ移動)
  5. C-n (下の行へ移動)

というキーボード操作が記録された。

7. C-x eでマクロ実行!

現在カーソルは2行目の頭にあるはず。ここでキーマクロ実行。

2008.1.20 09:00-18:00
2008.1.21 09:00-18:00
2008.1.22
09:00-18:00

一瞬で、たった今登録したキーと同じ操作が自動で入力され、2行目が編集された。カーソルは3行目の先頭に来ている。

8. もう一度、C-x eでキーマクロ実行!
2008.1.20 09:00-18:00
2008.1.21 09:00-18:00
2008.1.22 09:00-18:00

あっという間に終わり。ね?簡単でしょ?

もっと複雑な例

例えばテーブル定義を元にエンティティクラスを作りたいとき。

id
name
address

これを、Javaのエンティティとして

private String id;
public String getId(){
	return this.id;
}
public void setId(String id){
	this.id = id;
}
private String name;
public String getName(){
	return this.name;
}
public void setName(String name){
	this.name = name;
}
private String address;
public String getAddress(){
	return this.address;
}
public void setAddress(String address){
	this.address = address;
}

こうやることもできる。

  1. ファイルの先頭にカーソル移動。
  2. C-x (で記録開始。
  3. C-SPCで範囲選択開始。
  4. C-eで行末に移動。
  5. C-wで切り取り。
  6. そのまま"private String "と入力。
  7. C-yでヤンク(貼り付け)。
  8. ";"を入力して改行。画面は"private String id;"となる。
  9. つづけて"public String get"と入力。
  10. C-yでヤンク。画面は"public String getid"となる。
  11. M-bで単語の始まりまで戻る。"getid"の"g"のところにカーソルが移動する。
  12. C-fを3回。"get"の3文字分カーソルを右移動。"getid"の"i"の所にカーソルが移動する。
  13. M-cで、最初の文字だけを大文字にする。画面は"public String getId"となる。
  14. つづけて"(){"と入力し、改行。画面は"public String getId(){"となる。
  15. TABでインデントして、"return this."と入力。
  16. C-yでヤンク。
  17. ";"と入力して改行。"return this.id;"となる。
  18. "}"を入力。
  19. 同じ要領で、"public void setId(String id){"として改行。わかるよね。
  20. 次の行はTABでインデントして"this.id = id;"となるようにする。"id"の部分はヤンクを忘れずに。手で入力しちゃダメ。
  21. 次の行は"}"。
  22. C-aで行頭に戻り、C-nで次の行に移動。
  23. 記録終了。C-x )。

長かったけど、これで記録された。フィールド名を最初に切り取って、適宜ヤンク(貼り付け)しているのがわかると思う。固定の部分は自分で入力して、動的な部分はコピペをして、その全体のキー操作を記録しておく、というイメージ。カーソルの移動は、C-a、C-e、M-b、M-fなど、単語の文字数に依存しない方法を使うのがコツ。何文字の単語であっても同じキー操作になるようにする。

あとはC-x eを2回叩けばいいわけだけど、ここで数値引数も試してみる。C-u 2 C-x e。つまり、C-x eを2回やるよ、ということ。まあ2回だったらわざわざやる意味もないけど、これが10回とか100回になってくると大きい。

他にも使い方色々

キーボードマクロは、いくらでも使える。同じ事を3回やるなら、マクロでやった方が良い。

ところでちょっと思ったけど

これって動画で説明できたら簡単だったかも。デスクトップ上の操作を録画して文字とかを入れるのって簡単にできるのかな。

追記 : 動画の説明を追加

できたできた。

今回はWinkというツールを使った。指定したウィンドウ(や領域)をキャプチャしてFlashの動画にできる。文字とかも入れることができる。これなかなか良いね。