[xyzzy:07763] mark-ring
- Subject: [xyzzy:07763] mark-ring
- From: HABATA Katsuyuki <k_habata@xxxxxxxxxxxxxxxxxxxx>
- X-mailer: KaMail-0.0.2.5[01/11/08] on xyzzy-0.2.2.217 (windows-98)
- X-yzzy-version: 0.2.2.217
幅田です。こんにちは。
いつも,どうでもいいお願いばかりしてきましたが,今回は,Lisp
についての質問です。
xyzzy でも C-u C-SPC でマークの履歴を逆上っていければいいと
思い,Common Lisp the Language, 2nd Edition や xyzzy に付い
ている lisp や Emacs に付いている lisp を参考に,末尾のよう
なプログラム or コマンド(正しい用語が分からない)を作りまし
た(半年ぐらいかけて,コツコツと。すでにどこかで公開されてい
るのかもしれないけれど・・・)。
質問1
mark-ring を defvar-local しているからだと思うのですが,同じ
バッファで,モードを変えると,mark-ring が初期化されてしまい
ます。これを防ぐにはどうすればよいのでしょうか。
質問2
なぜ質問1をするかというと,私は,拡張子にモードを,モードに
書式(1行の折り返しや1タブの文字数など)を関連付けていて,
たまに,編集中に書式を変更することがあるからです。質問1とは
逆の発想で,モードを変えずに,拡張子に応じて,ここの意味での
「書式」を変更する賢いやり方があれば教えてください。
質問3
バッファの削除した範囲に複数のマーク履歴があった場合,該当個
所のマーク履歴がすべて同一になってしまいます。そこで時には,
何度 C-u C-SPC してもカーソルの位置が変わらない,なんてこと
になってしまいます。そのため,defun pop-mark の3〜4行目の
ような式を付け加えているのですが,そもそも,バッファの一部を
削除すれば,mark-ring の当該個所も消えてしまうようにするには
どうすればいいのでしょうか。(もちろん,そのほうが効率的であ
ればですが)
質問4
どうでもいいことなのですが…… *scratch* は kill-buffer して
も完全に消えなくなったので,mark-ring も nil になりません。
kill-all-local-variables すれば,local な部分は消えるのです
が,global な部分はどうすればよいのでしょうか。
*scratch* を完全に削除するしかないのでしょうか。
質問5(おまけ)
亀井さんは,mail# 20 で,「mark-ring はあまり使い道がなさそ
うなので実装していません。」と言われましたが,リージョンを設
定して何かをした後に,設定前のカーソル位置に戻りたいなんてこ
とはありませんか。そんな時にはどうしているのですか。
;;; mark を ring にする。
(defvar-local mark-ring nil)
(defvar *mark-ring-length* 10)
(defun push-mark ()
(when (and (mark t) (or (not (car mark-ring))
(not (eq (mark) (marker-point (car mark-ring))))))
(setq mark-ring (cons (set-marker (make-marker) (mark)) mark-ring))
(if (> (list-length mark-ring) *mark-ring-length*)
(rplacd (nthcdr (1- *mark-ring-length*) mark-ring) nil)))
(set-mark)
; グローバルなマークも設定。Emacs Lisp の意味が解読できなかったので以下で代用。
(global-mark-add))
(defun pop-mark ()
(when mark-ring
; 次の2行は“せっかちさん”用
(while (eq (mark) (marker-point (car mark-ring)))
(setq mark-ring (cdr mark-ring)))
(set-mark (marker-point (car mark-ring)))
(setq mark-ring (append (cdr mark-ring) (list (point-marker))))))
(defun set-mark-command (&optional arg)
(interactive "*p")
(cond ((null arg)
(push-mark)
(unless *executing-macro*
(message "Mark set"))
t)
(t
(goto-char (mark))
(pop-mark))))
--
HABATA Katsuyuki
mailto:k_habata@xxxxxxxxxxxxxxxxxxxx