Lispも知らないEmacs初心者がマクロを作る以前の第一歩

programming-593312_640

 

Lispなんて知らないEmacs初心者が
マクロ機能を使って楽するための第一歩を提案

 

Emacsだけじゃないですけど、エディタを使っていて

 『キー操作が面倒だなぁ・・・』
 『同じ操作を何回も何回も繰り返してるぞ・・・』

なんて思った事はないでしょうか?

Emacsの場合、Lisp言語でマクロを組めば自分が思うような処理や思うようなキー操作が出来ますが、

 『Lisp言語なんて分からんがな(´・ω・`)』

という人も多いでしょう。
私もLisp言語は分からないです。

Lisp言語を知らない人やEmacsを使い始めて間もない方に向けて、

Emacsのカスタマイズはキーボードマクロから使ってみてはどうですか?

ということを提案させていただこうと思います。
難しいことは何も書いていませんので、Emacsを普通に使い込んでいる人であれば得られる情報はないかと思います(笑)

良かったら読んでやってください。

 

※この記事で書いているキー操作はEmacsを対象にしていますが、考え方自体はマクロ機能 or キー操作変更機能を持っているエディタに対しても有効だと思います。Emacs以外のユーザーでもほんのちょっとぐらいは参考にはなるかも知れません。

 



 

 

エディタに求める二つの機能

私はエディタを使う上で特に以下の二つを重要視しています。

キーボードマクロ機能
マクロ登録機能(キーボードマクロの再利用)

つまり、いかに『キー操作を少なく』できるかが非常に大切なのです。
プログラマの仕事は大量の文字を打ちますので、ほんのちょっとでもキー操作を少なくしたいし、なおかつ間違いを無くしたい
人間の手入力は間違い発生の元ですからね。
できるだけ自動化させてしまうのがラクする&間違いを減らすコツですね。

もちろん他にもエディタに求める機能はたくさんありますが、最低限上記の二つが無いとメインのエディタとしては使えません。
※まぁ単に個人の好みであって、決してエディタの優劣を決めるものではありませんので誤解しないでね。

マクロの何が便利なの?

※エディタによっては、マクロとして登録しなくても単にキーストロークのカスタマイズ設定で対応できる事があります。
※Emacsではキーストロークのカスタマイズってinit.elに書くため、マクロとしています。

例えばですが、ある行をコピーして二重化したい場合

普通の操作であれば

Aパターン

1.行頭にカーソルを移動する:C-a
2.行頭から行末まで選択する:C-S-e
3.コピーする:M-w
4.行末に移動する:C-e
5.改行する:C-j or Enterキー
6.ペーストする:C-y

というキー操作になるでしょうか。

もう少し簡単にしたとして、

Bパターン

1.行頭にカーソルを移動する:C-a
2.行選択する:C-S-n
3.コピーする:M-w
4.ペーストする:C-y

ですかね。

こういう操作を毎回やるのは面倒ですよね?
キー操作1回でできればラクですよね?
キーボードマクロの自動記録を使えば1回だけ操作を記録して、それを簡単なキー操作に割り当てておけば、その後は簡単なキー操作をすればばラクチンというワケです。

上記のA/Bパターンじゃなくて、こういう操作ならどうでしょうか?

Cパターン

1.二重化したい行のどこかにカーソルを置く
2.『Ctrl + Shift + Enter』

どの操作が一番ラクかは人によりますので断言できませんが、ごくごく普通に考えればCパターンがラクチンじゃないですかね?
※Cパターンのキーストロークそのものは今回の記事の主旨ではありません。あくまでも、「面倒な処理を簡単なキー操作に割り当てる」事に注目。

上記の行を二重化する操作って私は結構やるんですよ。
その度に前者の操作をするのが面倒で面倒で・・・・

私は、秀丸エディタには、

行二重化:Ctrl+Shift+Enter
行の削除:Ctrl+Enter

を割り当てています。

Emacsの場合、行の二重化という操作や機能は無く、行の削除はC-kがあります。
しかしC-kは行の削除ではなく、カーソル位置〜行末までの削除となります。
おまけにC-kはクリップボードの内容を書き換えるのであまり使いたくないんですよ。

で、自分の秀丸エディタの設定と同じようにしたいと思います。

Lispなんてワカラン!!!

がっ!!! しかしっ!!!
私はLispが分かりません。
マクロ機能大切って言うわりにはそのマクロを書けません(笑)
※秀丸エディタのマクロなら多少は書けるんですが・・・

Emacsのキーボードマクロは使えるので、
 キーボードマクロをinit.elに登録して、それにキーストロークを割り当ててしまえばいいじゃんっ!
と考えました。
(ま、誰でも思いつきますけどね)

手順

1.まずはキーボードマクロでキー操作を記録する

1. キーボードマクロ記録開始:C-x (
2. 記録したい操作をする
3. キーボードマクロ記録終了:C-x )

2.init.el を開く
3.記録したキー操作に名前を付ける

M-x name-last-kdb-macro -> Enterキー
hogehoge -> Enterキー (hogehogeの部分は好きな名前)


4.名前を付けたキー操作のS式を書き出す。

M-x insert-kdb-macro -> Enterキー
hogehoge -> Enterキー

こんな感じのS式が書き出されます。

(fset 'hogehoge
    [?\C-a ?\S-\C-e ?\M-w ?\C-e ?\C-j ?\C-a ?\S-\C-e ?\C-y ?\C-a])


5.書き出されたS式の下に以下を書く

(global-set-key (kbd "M-k") 'hogehoge)  ;; alt + k の場合

とか

(global-set-key (kbd "") 'hogehoge)  ;; Ctrl + Shift + Enter の場合

とか、お好きなキーを割り当ててください。
※ M-k とか <C-S-return> の部分に割り当てたいキーストロークを書く


6.init.el を保存
7.Emacs終了
8.Emacs起動

これで上記で設定したキーストロークが有効になっているはず。

私のinit.elには以下のように書いてあります。
キー操作が面倒な方はこれをコピペしてもいいです。
※使用については自己責任でお願いします。当方では責任取れません。

;; 行の二重化(Ctrl+Shift+Enter)
(fset 'copylinecopy
  [?\C-a ?\S-\C-e ?\M-w ?\C-e ?\C-j ?\C-a ?\S-\C-e ?\C-y ?\C-a])
(global-set-key (kbd "") 'copylinecopy)

;; 行の削除(Ctrl+Enter)
(fset 'dellinedel
  [?\C-a ?\S-\C-e backspace down ?\C-a])
(global-set-key (kbd "") 'dellinedel)

まとめ

EmcasのカスタマイズってLispを書かないといけないと考える人が多いと思います。

ただ、私としては仕事のプログラミングや文章作成が早くできればいいので、Lispを覚えるモチベーションはあまりないです。
Emacsやエディタを使いこなすことが目的ではなく、成果物を早く正確に仕上げる事が目的です。
Emacsやエディタは手段でしかありません。なので、Lispを覚える事に時間をかけるつもりはあまりありません。

とは言え、Emacsやエディタを使いこなす事が成果物制作の速度や正確性を上げるはずですので、Lispも覚えていきたいですね。
まずはキー操作をカスタマイズするところから入っていけば、Emacsが使いやすくなりLispとかを覚えるのが楽しくなってくると思います。

今回の内容は全く難しくありませんので、Emacsを使い始めて間がない方とか、キー操作の変更方法がよく分からない方は、まずはこの手順でカスタマイズをしていくことをオススメします。

 

 


1 個のコメント

  • コメントを残す

    メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

    ABOUTこの記事をかいた人

    Windows/Mac/Linuxを使う現役システムエンジニア&プログラマ。オープン系・組み込み系・制御系・Webシステム系と幅広い案件に携わる。C言語やC#やJava等数多くのコンパイラ言語を経験したが、少し飽きてきたので、最近はRubyやPython、WordPressなどのWeb系を修得中。初心者向けのプログラミング教室も運営中。オンライン・対面・出張等でプログラミングをレッスンします。