[Date Prev] [Date Index] [Date Next]
[Thread Prev] [Thread Index] [Thread Next]

[xyzzy:07763] mark-ring



幅田です。こんにちは。
いつも,どうでもいいお願いばかりしてきましたが,今回は,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

Index Home