« プログラミングを始めるには(21) | Main | プログラミングを始めるには(23) »

August 19, 2014

プログラミングを始めるには(22)

Emacs上で手っ取り早くプログラミングに慣れるためには、まず簡單で人畜無害な編集コマンドを書いてみると良い。既に書いたようにEmacsの編集機能はすべてEmacs上のコマンドとして實裝されている。なので、それを書いてみるのが一番感覺的に分かりやすいということだ。

(1) カーソルをバッファの先頭に移動する。
(2) カーソルを5行下に移動する。
(3) カーソルがある行をkillする。
(4) カーソルをバッファの終端に移動する。
(5) カーソルのある位置にkillした行をyankする。

こんな手順をコマンドにしたらどうなるだろうか...。プログラムを書いたことがない人が、これを書くためにGNU Emacs Lisp Manualを讀んでも、すぐには出來ないと思う。私の經驗では、最初にあれこれ考えた擧句、キーボードマクロをコマンドに置き換えてみたらどうかと考えた。

まず「C-x (」でキーボードマクロの記錄を開始し、上記の手順通り操作する。操作が終わったら「C-x )」で記錄を完了する。

(name-last-kbd-macro 'edit-command)
[escape 60 14 14 14 14 14 11 11 escape 62 25]

(symbol-function 'edit-command)
[escape 60 14 14 14 14 14 11 11 escape 62 25]

キーボードマクロの記錄が終わったら、name-last-kbd-macroコマンドでそれに名前を付ける(ここではedit-commandという名前を付けた)。そうするとedit-commandは文字コードの羅列によって定義されているように見える。しかし、M-x edit-commandで起動すると、記錄したとおりに實行される。

;; Keyboard Macro Editor.  Press C-c C-c to finish; press C-x k RET to cancel.
;; Original keys: ESC < 5*C-n 2*C-k ESC > C-y

Command: edit-command
Key: none

Macro:

ESC
<			;; self-insert-command
5*C-n			;; next-line
2*C-k			;; kill-line
ESC
>			;; self-insert-command
C-y			;; yank

文字コードの羅列ではどういうコマンドなのか分からないので、edit-named-kbd-macroでさらに中身を見てみると上記のように表示される。最初にタイプした「ESC <」は「ESC」と「<」が分離されて「<」は文字として入力されたように表示されているが、これはKeyboard Macro Editorの仕樣かもしれない。

;; Keyboard Macro Editor.  Press C-c C-c to finish; press C-x k RET to cancel.
;; Original keys: ESC < 5*C-n 2*C-k ESC > C-y

Command: edit-command
Key: none

Macro:

ESC <			;; beginning-of-buffer
C-n			;; next-line
C-n			;; next-line
C-n			;; next-line
C-n			;; next-line
C-n			;; next-line
C-k			;; kill-line
C-k			;; kill-line
ESC >			;; end-of-buffer
C-y			;; yank

ホントはこういう表示になることを期待していたのだが...。まあこれでどんなコマンドをどういう順番で實行したかが判明した。あとはこの手順を關數化すればそれで良いことになる。elispのマニュアルを少しでも讀んだことがあれば、關數はdefunで定義するということくらいは分かるはずだ。

(defun edit-new-command ()
  "こんな關數を書いてはいけません!"
  (beginning-of-buffer)
  (next-line)
  (next-line)
  (next-line)
  (next-line)
  (next-line)
  (kill-line)
  (kill-line)
  (end-of-buffer)
  (yank))

こんな見たことないような變な關數が出來上がる。さてこの關數をeval-defunし、さっきみたいにM-x edit-new-commandと起動してみよう。そしてアレ?!ということなる。起動出來ない。じゃあ、M-x eval-expression(edit-new-command)と關數を實行してみよう。すると實行は出來たものの、豫想と違う結果になる。

(defun edit-new-command ()
  "こんな關數を書いてはいけません!"
  (beginning-of-buffer)
  (next-line)
  (next-line)
  (next-line)
  (next-line)
  (next-line)
  (let ((kill-whole-line t))
    (kill-line))
  (end-of-buffer)
  (yank))

一應、こう修正すると想定通りの動作となるが、動く動かないに關わらず、こんな關數を書いてはいけないし、Emacs上の編集プログラムとしてこんな例は探しても出てこないはず。その理由は次囘確認する。

|

« プログラミングを始めるには(21) | Main | プログラミングを始めるには(23) »

Comments

Post a comment



(Not displayed with comment.)


Comments are moderated, and will not appear on this weblog until the author has approved them.



TrackBack

TrackBack URL for this entry:
http://app.cocolog-nifty.com/t/trackback/74224/60178027

Listed below are links to weblogs that reference プログラミングを始めるには(22):

« プログラミングを始めるには(21) | Main | プログラミングを始めるには(23) »