tips

tips

指定した関数にジャンプ

M-x imenu をする。カーソルをジャンプしたい関数名の下においてするとデフォルトで関数名が表示される。 戻る時は、C-u C-SPC

コードを試す方法

M-x open-junk-file をする。ファイル名を聞いてくるので拡張子はel。コードを入力後、M-; M-; をする。評価したいときはさらに、M-x lispxmp (C-c C-d)

if文のサンプル

文字列の先頭の文字の確認

(setq aa "#abcdef ghijk")		; => "#abcdef ghijk"
(if (/= ?# (string-to-char aa))		; => nil
    (setq bb "先頭は#ではない")				; => 
  (setq bb "先頭は#"))				; => "先頭は#"

行毎の処理

ポイントのある位置のバッファの行数を数える

(setq aa (count-lines (point-min) (point)))

1行分のデータを得る

最後にaaに代入した値が呼び出した側に返される

(defun tt-one-line ()
  "1行のデータを得る"
  (let (aa start end)
      (end-of-line)
      (setq end (point))
      (beginning-of-line)
      (setq start (point))
      (setq aa (buffer-substring start end))))

2つ以上連続する空白を削除

繰り返し処理のサンプルでもある

;;; 2つ以上続く空白をひとつにする
;;;
(defun cc-kuhaku2 ()
  "2つ以上連続する空白を1つにする"
  (interactive)
  (let ((cnt 0))
    (goto-char (point-min))
    (while (re-search-forward " +" nil t)
	  (progn
	    (replace-match " ")
	    (forward-char 1)
	    (setq cnt (1+ cnt))))
    (message "連続する空白%d回処理しました。" cnt)
    (sit-for 3)
    (goto-char (point-min))))

関数における変数の有効範囲

関数oya, kodomo, magoの3つを定義

let内で定義した同じ変数名は別物として扱われる

oya, kodomo, magoに各々let内で変数aaを定義しているが、別物として取り扱われる

(defun ttt-test-oya ()
  "letの入れ子の確認"
  (interactive)
  (let (aa)
    (setq aa "oya-aa")
    (ttt-test-kodomo)
    (insert "test-oya   ==> " aa "\n")))

(defun ttt-test-kodomo ()
  (let (aa)
    (setq aa "kodomo-aa")
    (ttt-test-mago)
    (insert "test-kodomo==> " aa "\n")))

(defun ttt-test-mago ()
  (let (aa)
    (setq aa "mago-aa")
    (insert "test-mago  ==> " aa "\n")))

結果は以下の通り

test-mago  ==> mago-aa
test-kodomo==> kodomo-aa
test-oya   ==> oya-aa

呼び出された側の関数からは呼び出した側の変数は参照できる

vv-oyaで変数oya-aa, kodomo-aa, mago-aaを定義する。その中で呼び出す関数vv-kodomo, vv-magoからは参照できている

(defun ttt-test-vv-oya ()
  "変数参照可能の確認"
  (interactive)
  (let (oya-aa kodomo-aa mago-aa)
    (setq oya-aa "oya   が代入")
    (ttt-test-vv-kodomo)
    (ttt-test-vv-mago)
    (insert oya-aa "\n")
    (insert kodomo-aa "\n")
    (insert mago-aa "\n")))

(defun ttt-test-vv-kodomo ()
  (let (bb)
    (setq kodomo-aa "kodomoが代入")))

(defun ttt-test-vv-mago ()
  (let (bb)
    (setq mago-aa "mago  が代入")))

結果は以下の通り

oya   が代入
kodomoが代入
mago  が代入

もちろんこんな方法もある:関数の本来の働き?

上記と同じことをする

(defun ttt-test-2-oya ()
  "関数の変数への代入方法2"
  (interactive)
  (let (oya-bb kodomo-bb mago-bb)
    (setq oya-bb "test-oya    bb")
    (setq kodomo-bb (ttt-test-2-kodomo))
    (setq mago-bb (ttt-test-2-mago))
    (insert oya-bb "\n")
    (insert kodomo-bb "\n")
    (insert mago-bb "\n")))

(defun ttt-test-2-kodomo ()
  (let (aa)
    (setq aa "test-kodomo bb")))

(defun ttt-test-2-mago ()
  (let (aa)
(setq aa "test-mago   bb")))

結果は以下のとおり

test-oya    bb
test-kodomo bb
test-mago   bb

バッファの最後まで繰り返す例

行頭から3桁の数字が並んでいる行数を数える。正規表現を使い、見つかる毎にカウンタをアップして、最後にカウンタを表示

;;; -*- Emacs-Lisp -*-
;;;   (setq debug-on-error t)
(defun kurikaesi-sample ()
  "バッファの最後までの繰り返しサンプル01"
  (interactive)
  (let (aa bb pmax (datacnt 0))
    (goto-char (point-min))
    (while (if (re-search-forward "^[0-9][0-9][0-9]" nil t)
	       (setq datacnt (1+ datacnt))))
    (goto-char (point-min))
    (message "data数=%d" datacnt)
    (sit-for 3)))