逆引きxyzzy lisp(バッファ) - circleratio/xyzzy GitHub Wiki
(create-new-buffer "*test*")
create-new-buffer は、既に同名のバッファがある場合、<2>, <3>, ... の添え字が付いた新しいバッファを作成する。
(get-buffer-create "*test*")
get-buffer-create は、既に同名のバッファがある場合、そのバッファを返す。
(switch-to-buffer "*test*")
switch-to-buffer は、既に同名のバッファがある場合、そのバッファを返す。 指定したバッファを操作中のウィンドウに表示する点が get-buffer-create との相違点。
(set-buffer (get-buffer-create "lisp.txt")))
(buffer-name (selected-buffer))
(buffer-size)
(delete-buffer "*test*")
delete-buffer は削除するかどうかの確認をしない。
(kill-buffer "*test*")
kill-bufferは、バッファが変更されていると、削除するかどうかを対話的に確認する。 マクロで使うなら確認を行わない delete-buffer を使ったほうがよいことが多い。
(kill-selected-buffer)
現在選択しているバッファを削除する。
(kill-all-buffers)
すべてのバッファを削除する。 マクロで使うことは基本的にないと思われる。
(set-buffer-fileio-encoding *encoding-sjis*)
(set-buffer-eol-code 1)
0がlf, 1がcrlf, 2がcr, 3がcrlf.
(buffer-list)
=> (#<buffer: *Completion*> #<buffer: *Minibuf0*> #<buffer: *Buffer List*> #<buffer: *scratch*>)
emacs では current-buffer だけど,xyzzy では selected-buffer なので注意.
(selected-buffer)
=> #<buffer: *scratch*>
行番号の表示を有効にし,改行とEOFの表示を無効にする例.
(let ((buf (selected-buffer)))
(set-local-window-flags buf
(+ *window-flag-line-number*)
t)
(set-local-window-flags buf
(+ *window-flag-newline*
*window-flag-eof*)
nil))
(toggle-read-only t)
(make-local-variable 'need-not-save)
(setq need-not-save t)
(insert "ab" "cd" "ef")
=> abcdef
(insert "ab" 4)
=> abababab
(insert "ab" "cd" 2)
=> abcdabcd
(insert "ab" 2 "cd" 2)
=> 不正なデータ型です: 2: (or string character)
(insert #¥a #¥b "c" "d")
=> abcd
(insert #¥a 5)
=> aaaaa
(find-file "/tmp/test.txt")
(buffer-substring (point-min) (point-max))
(buffer-substring from to)
(replace-regexp "^¥n" "" t)
(delete-region (point-min) (point-max))
erase-buffer でもバッファの内容をクリアできるが,作業途中でバッファの内容をクリアする際にはこちらのやりかたのほうがよい. erase-buffer だと「知らない間にファイルの日付が変わっています」と文句を言われるようになるため.
現在のカーソル位置以降のテキストに対して置換が行われる.
(replace-string "nil" "x" :noerror)
(replace-buffer "[a-z]¥¥{2¥¥}" "XXXX" :regexp t)
(forward-char)
(backward-char)
beginning-of-buffer の場合、カーソルが元あった位置にマークが設定される。
(goto-char (point-min))
(beginning-of-buffer)
end-of-buffer の場合、カーソルが元あった位置にマークが設定される。
(goto-char (point-max))
(end-of-buffer)
(goto-char 10)
(goto-bol)
(goto-eol)
(goto-column 5)
引数を省略した場合は1行ずつ移動する.
(previous-line)
=> t
(next-line 2)
=> t
(goto-line 5)
テキストの検索には scan-buffer を使う。 Emacs Lisp では search-forward や search-backward などいくつかの関数があるが、xyzzy Lisp では scan-buffer に統一されているので注意すること。
(scan-buffer "[a-z]+" :regexp t)
=> t
(match-string 0)
=> "scan"
(match-beginning 0)
=> 21
(match-end 0)
=> 25
(point)
検索方向 | 正規表現 | 関数 |
---|---|---|
前方 | あり | looking-at |
前方 | なし | looking-for |
後方 | あり | 自前で用意すること |
後方 | なし | looking-back |
(defun check-parenthesis-at-bol ()
(interactive)
(if (looking-at "^(")
(message "OK")
(message "NG")))
(defun check-empty-parenthesis ()
(interactive)
(if (looking-for "()")
(message "OK")
(message "NG")))
(defun check-empty-parenthesis-backward ()
(interactive)
(if (looking-back "()")
(message "OK")
(message "NG")))
looking-at の後方版。
(defun looking-at-backward (regexp &optional case-fold)
(save-excursion
(save-restriction
(narrow-to-region (point-min) (point))
(goto-char (point-min))
(scan-buffer (format nil "¥¥(?:‾A¥¥)¥¥'" regexp)
:regexp t :case-fold case-fold))))
(defun end-line-of-file-p ()
(interactive)
(if (next-line)
(progn
(previous-line)
nil)
t))
取り出すには yank を行う.
12345678901234567890 …バッファ先頭にこの文字列があるとする
(kill-region 5 10)
=> t
123451234567890 …kill-region 後はこのようになる.
(yank)
=> 67890
=> t
文字列の並びを逆にする例.
(defun reverse-string (str)
(coerce (reverse (coerce str 'list)) 'string))
(defun reverse-string-region ()
(interactive)
(save-restriction
(narrow-to-region (mark) (point))
(let ((str (buffer-substring (point-min) (point-max))))
(delete-region (point-min) (point-max))
(insert (reverse-string str)))))
リージョンの書き換え関数を作るマクロ. 下記でfuncは文字列の引数をひとつ取り,これを書き換える関数.
(defmacro make-region-replace-function (func)
(let ((str (gensym)))
`(defun ,(intern (concat (symbol-name func) "-region")) ()
(interactive)
(save-restriction
(narrow-to-region (mark) (point))
(let ((,str (buffer-substring (point-min) (point-max))))
(delete-region (point-min) (point-max))
(insert (,func ,str)))))))
=> make-region-replace-function
(defun rs (str)
(coerce (reverse (coerce str 'list)) 'string))
=> rs
(make-region-replace-function rs)
=> rs-region
(defun runcmd (cmd)
(interactive "sCommand: ")
(switch-to-buffer "*command*")
(setq need-not-save t)
(let (proc)
(setq proc (make-process cmd))
(while (eql :run (process-status proc))
(do-events))))
(runcmd "cmd /c dir c:")
カレントバッファにフィルタをかける例.
関数filter-bufferが本体で,引数は以下の2つ. *func: フィルタの評価関数.引数をひとつ取り,これに入力元から一行ずつが与えられる.評価結果が non-nil の場合,その行はフィルタされずに残る. *bufunc: カレントバッファの書き換えでなく,新しくバッファを作りたい場合に切り替えを行う関数.nil ならカレントバッファを書き換える.
(defun filter-buffer (func buffunc)
"Filter buffer with an evaluation function(func). func must take an argument(a line in a buffer) and return if the line should be left or deleted. If buffunc is non-nil, result is set in a new buffer created by buffunc, otherwise it overwrite the current buffer."
(let ((s (make-buffer-stream (selected-buffer)))
(stack nil) line)
(while (setq line (read-line s nil))
(if (funcall func line)
(push line stack)))
(if buffunc (funcall buffunc))
(delete-region (point-min) (point-max))
(insert (format nil "‾{‾A‾%‾}" (reverse stack)))))
;
; utility functions
;
(defun make-tmpbuf (bufname)
(set-buffer (switch-to-buffer bufname))
(setq need-not-save t))
;
; sample functions
;
(defun grep-buffer (regexp)
"Filter buffer with a regular expression. This command edits current buffer directly."
(interactive "sRegular Expression: ")
(filter-buffer (lambda (l)
(string-match regexp l))
(lambda () (make-tmpbuf "*grep*"))))
(defun copy-buffer ()
(interactive)
(filter-buffer (lambda (l) t)
(lambda () (make-tmpbuf "*copy*"))))
(defun end-line-of-file-p ()
(interactive)
(if (next-line)
(progn
(previous-line)
nil)
t))
(defun foreach-line-buffer (func)
(interactive)
(if (eq (buffer-size) 0)
(message "nil")
(save-excursion
(loop
(let ((bol) (eol))
(beginning-of-line)
(setq bol (point))
(goto-eol)
(setq eol (point))
(narrow-to-region bol eol)
(funcall func bol eol)
(widen))
(next-line)
(if (end-line-of-file-p)
(return)))
(message "t"))))