2012年5月31日木曜日

Emacs:キーボードマクロを勉強する。

Emacsはつまみ食いなので,当然のスキルが身についておりません。

書類書きに必要なスキルを身につけます。

今回は,キーボードマクロ
Wordとかでもありますが,便利です。

色々なサイトで紹介されていますが,分かりやすいのが
ここの記事
http://blog.fenrir-inc.com/jp/2012/01/emacs-kbd-macro.html

要するに,
マクロ記録をF3,マクロ終了をF4
実行が,C-x,e(Emacsの決まりごとです,eはCtrlを外してです)

一括処理は,リージョン選択後(C-SPC,その後ex.C-e)
C-x,C-k,r

です。簡単です。

マクロを作るときの工夫が一番頭をつかいます。

……………………………………………………
H240530追記

キーボードマクロの具体例
結構これが思いつきませんので,まとめます。

http://www.ysr.net.it-chiba.ac.jp/data/emacs/emacs214.html

ファイルの全行の先頭に ``>>''を入れたい場合、入れたい最初の行の先頭にカーソルを持って いき、以下のような手順で行なえば良い。
C-x ((キーボードマクロ定義開始)
>>(>>の入力)
C-a(カーソルを行頭へ)
C-n(カーソルを次の行へ)
C-x )(キーボードマクロ定義終了)


これは,なんとなく思いつきます。C-s(検索)を使うのがポイントです。


http://www.bookshelf.jp/texi/emacs-man/21-3/jp/emacs_16.html

たとえば、

C-x ( M-f foo C-x )

のように打鍵すると、 1単語分ポイントを前進させ文字列`foo'をバッファに挿入する、 キーボードマクロを定義できます。

なるほどです。ただ,日本語で使う場合には,M-fは効きにくいので一工夫必要なときもあるかもしれません。



http://startup.dino.co.jp/2008/05/23/emacs_other2/


北海道  札幌
青森県  青森
岩手県  盛岡
神奈川県 横浜
宮城県  仙台
秋田県  秋田
山形県  山形
和歌山県 和歌山
福島県  福島
埼玉県 さいたま
茨城県  水戸

という課題について,
PHPの連想配列にして格納してください。(都道府県名がキー、県庁所在位置が要素でいれてください。)」

" M-f " C-f = > M-f M-b " M-f " , C-a
要するに「"北海道" => "札幌",」という具合に変換するものです。
スペースがあれば,M-f,M-bは日本語でも効きます。
続きのものは難しいかもしれません。


http://www.sipec-square.net/~mi-home/goodies/emacsen/chapter3.html

行頭にある一文字を削除するというコマンドを作ることを考えます。まず、Emacsで行頭にある一文字を削除する方法を考えてみてください。幸いEmacsには、行頭に移動する(C-a)というコマンドがあるのでこれを活用します。すると、行頭にある一文字を消すコマンドは、
C-a C-d C-n
になります。最後にC-nしているのは、このコマンドを機械的に打ち込み続ければ、全テキストについて処理が行われるようにするためです。

C-nがあると,C-x,e連打でいけますということです。
ちなみに,回数についての指定も書いていますので,メモ

C-u 100 C-x,e 100回繰り返し


http://dev.ariel-networks.com/articles/emacs/part3/
このサイトは,マクロ保存の方法を具体的に書いてありとても参考になります。使うか分かりませんがw,複雑なマクロ登録についても説明してあります。
いまいる行に書いてあるファイル名を開いて,そのファイルの文字コードをshift-jisに変更する.
変更した後,元のバッファに戻って一行したに移動する.

さて,前準備としてファイル名の一覧を作っておきましょう.*scratch*バッファに以下のようなファイル名一覧を書いておきます. 
================  
~/tmp/foo.txt  
~/tmp/bar.txt  
~/tmp/baz.txt 
 ================ 

次に"~/foo.txt"の先頭にカーソルを移動させておきます.

そうしたらマクロ登録の開始です.以下のマクロを登録します. 
================ 
 C-x r SPC a C-SPC C-e M-w C-x C-f C-y RET C-x RET f shift_jis RET C-x r j a C-n C-a  
================ 
これだけだと何のことだかさっぱりわからないですね.それぞれの意味を説明して,マクロの紹介を終わります. 
- "C-x r SPC a" :: 今のバッファと位置を"a"という名前のレジスタに保存  
- "C-SPC C-e M-w" :: 今の行にあるファイル名をコピー 
- "C-x C-f C-y RET" :: コピーしたファイル名のファイルを開く
 - "C-x RET f shift_jis RET" :: ファイルの文字コードをshift_jisに変更 
 - "C-x r j a" :: "a"という名前のレジスタに保存したバッファと位置に移動.つまりファイル名一覧に戻る.  
- "C-n C-a" :: ファイル名一覧の次の行の先頭に移動 
以下にレジスタ操作コマンドを表にしておきます. 
| C-x r SPC | 今のバッファと位置を保存 | 
 | C-x r j | 保存したバッファと位置に移動 | 
 | C-x r s | 選択範囲の文字列を保存 |  
| C-x r n | 数値0を保存 |  
| C-u 3 C-x r n | 数値3を保存 | 
 | C-x r + | 保存した数値を1増やす | 
 | C-x r i | 保存した文字列や数値を挿入. | 
 | | 挿入した文字列の反対側へ移動するには C-x C-x | 

レジスタを使っています。これで,日本語がつながっている場合でもいけそうです。このサイトは,とても参考になります。



http://d.hatena.ne.jp/kobapan/20090506/1241603455
このサイトは,.emacs(init.el)への記載方法も書いてあります。具体例があると分かりやすいです。ちなみに,ここで「F1」と書いてありますがキーバインド変更しています(引用部分,前の方に書いてあります)。

今回 .emacs に追加するマクロ定義は以下のようなものです

(fset 'insert-a-href
   "<a href=\"\">\C-e</a>")
  


文字列を a リンクタグに置換するマクロです。

このマクロを記録するために、

a リンクにしたい文字の先頭にカーソルを置く


F1 を押す キーボードマクロの記録開始

<a href=\"\"> を入力

C-e で行末へ 

</a>を入力
F2 を押す キーボードマクロの記録終了
M-x name-last-kbd-macro RET insert-a-href RET
.emacs を開いて、定義を書き込みたい場所にカーソルを移動
M-x insert-kbd-macro RET insert-a-href RET

ということをやっています
あとはemacs を再起動してマクロを使うだけ

.emacsは,挿入されたのがまずかったら修正すればいいことになりますね。すばらしい。
……………………………………………………
H240531追記

http://yang02.org/log/?p=103
連番挿入の仕方です。
これは,登録してもいいかもしれません。


レジスタ、キーボードマクロを使って行に連番を挿入する方法。
1ずつ増える連番なら
C-u 1 C-x r n g
C-x ( C-x r g g C-e RET C-u 1 C-x r + g C-x )
C-u 繰り返したい回数 C-x e

マクロ中C-eの前に,C-f【全角スペース】 を入れると都合よいでしょうか。

……………………………………………………
H240531追記
連番を最初に打つ場合には簡単なのがありました。
有名な方のブログです。
http://d.hatena.ne.jp/rubikitch/20090722/kmacro



連番の初期値1を設定する。C-x C-k C-cを押すと「Macro counter value」と聞いてくるので、1を入力する。
その後は C-x C-k C-i で現在の値を挿入できる。なので、 C-x C-k C-i . SPC RET マクロ定義。あとはを連打することでどんどん連番を挿入できる。


ということで,init.elに登録


;;;H240531 連番マクロ C-x C-k C-c の後1を入れてから
(fset 'renban
   "\C-x\C-k\C-i\.\ \C-a\C-n")

ちょっと中途半端ですが,
M-x renban
で,

1.全角スペース
C-x,eで,次の行最初に行って,2.全角スペース
ができます。

もう少し工夫するといいかもしれませんね。
……………………………………………………