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

Re: cannot go back to previous position



>>>>> In [emacs-w3m : No.03406] 藤井宏憲さん wrote:

> w3m-view-previous-page の挙動が私には奇妙に感じられます。
> 例えば、Webページ a, b, cがあったとし、

>   a → b → c → b

> とハイパーリンクをたどったとします。
> ここで w3m-view-previous-page を実行すると、
> Webページ a に戻ります。私としては c へ戻りたいのです。

藤井さんに指摘をいただいてから、何と一年以上も経ってしまいました
が、どうやら感覚的にわかりやすい w3m-hist.el ができたようです。
とりあえず幹にだけ CVS commit しました。

従来の w3m-hist.el のやり方では、history データベースに複数の同
じ URL の素子を持たないようにしていたのですが、それを許すように
しました。従来の動作の方が好きな人は、以下の設定で変更できます。

(setq w3m-history-reuse-history-elements t)

さて、emacs-w3m には w3m-history というコマンド (キーは `s' また
は `o') があって、history データベースの木構造を web ベースで提
供します。ここに複数の同じ URL が現れた場合に、それらをちゃんと
区別して扱うのが最大の難関でした。現在は非常に adhoc なやり方で
逃げていますが、まあ emacs-w3m だけで閉じているので、このままで
も良いかな、と。

参考までに、w3m-history という変数の doc-string の和訳を付けます。

w3m-history
===========
これは、訪れたことがあるすべてのリンクの複雑な木構造のリストを含む、バッ
ファローカル変数です。例えばそれは次のようなものです。

[枝-1.0.0.0]:                 +--> U1.0.0.0.0 --> U1.0.0.0.1
                              |
    [枝-1.0]:         +--> U1.0.0 --> U1.0.1 --> U1.0.2
                      |
        [幹]: U0 --> U1 --> U2 --> U3 --> U4 --> U5 --> U6
                             |
    [枝-2.0]:                +--> U2.0.0 --> U2.0.1
                             |
    [枝-2.1]:                +--> U2.1.0 --> U2.1.1 --> U2.1.2
                                                |
[枝-2.1.1.0]:                                   +--> U2.1.1.0.0

この場合、履歴子 U1.0.0.0.0 は、履歴子 U1.0.0 から生えた最初の枝の最初
のリンクであることを表します。

幹または枝は、いくつかの履歴子を含む単純なリストです。幹または枝にある
履歴子は、昇順に並んで (最新の履歴子がリストの最後になって) いなければ
なりません。それぞれの履歴子は、以下のレコードで構成されるリンクを表し
ます。
	(URL PROPERTIES BRANCH BRANCH ...)

ここで URL はリンクのアドレスの文字列です。PROPERTIES は、URL を修飾す
る何らかの種類のデータを含んでいる、以下のような plist です。

	(KEYWORD VALUE KEYWORD VALUE ...)

残りの BRANCH (複数可) は、その履歴子の枝です。それらの枝もまた、昇順
に並んで (最新のものが右端になって) いなければなりません。さらにそれぞ
れの BRANCH も、木構造の複雑なリストになります。それゆえ、履歴構造体は
際限無く成長します。そのための十分なメモリを持っていますか? :-p

Lisp の資源を節約するため、`w3m-history' 変数にある URL 文字列と
PROPERTIES は、すべての emacs-w3m バッファで共有されます。それは、二つ
の `w3m-history' 変数にあるそれぞれの素子を、`equal' ではなく `eq' で
照合できることを意味します。もし、いくつかの修飾子 (properties) をバッ
ファローカルにする必要があるならば、代わりに `w3m-history-flat' 変数を
使って下さい。

Emacs-w3m の履歴管理機構には、特別な規則があります。たぶんご想像の通り、
U2.0.0 で「戻る」操作を行なうと U2 に行き、もう一度「戻る」と U1 に行
きます。さて、では U1 で「進む」操作を行なったら、次はどこに行けば良い
のでしょうか? 規則は、訪れたことがある最新のリンクを選択することです。
したがって、その操作では U1.0.0 に行きます。

もう一つの規則は、U1.0.1 から U4 へダイレクトに移動する場合に、変数
`w3m-history-reuse-history-elements' の値が `nil' だったら、U1.0.1 か
ら新しい U4 の枝を生やすことです。一方それが `non-nil' だった場合は、
新しい枝を生やすのではなくて、すでに存在している U4 のリンクへのジャン
プが実行されます。

加えて、`w3m-history' 変数は、その car 項に以下のようなポインタのリス
トを持っています。

	(PREV CURRENT NEXT)

ここで PREV というリストは以前の履歴子を指し示し、CURRENT というリスト
は現在のものを、NET というリストは次のものを指し示します。それぞれのリ
ストは奇数個の整数を持ちます。例えば、(0) は U0 を、(2 0 1) は U2.0.1
を指し示すというように。最終的に `w3m-history' 変数の値は以下のように
構成されます。

(((1) (2) (2 1 0))
 ("http://www.U0.org/" (:title "U0" :foo "bar"))
 ("http://www.U1.org/" (:title "U1" :foo "bar")
  (("http://www.U100.org/" (:title "U100" :foo "bar")
    (("http://www.U10000.org/" (:title "U10000" :foo "bar"))
     ("http://www.U10001.org/" (:title "U10001" :foo "bar"))))
   ("http://www.U101.org/" (:title "U101" :foo "bar"))
   ("http://www.U102.org/" (:title "U102" :foo "bar"))))
 ("http://www.U2.org/" (:title "U2" :foo "bar")
  (("http://www.U200.org/" (:title "U200" :foo "bar"))
   ("http://www.U201.org/" (:title "U201" :foo "bar")))
  (("http://www.U210.org/" (:title "U210" :foo "bar"))
   ("http://www.U211.org/" (:title "U211" :foo "bar")
    (("http://www.U21100.org/" (:title "U21100" :foo "bar"))))
   ("http://www.U212.org/" (:title "U212" :foo "bar"))))
 ("http://www.U3.org/" (:title "U3" :foo "bar"))
 ("http://www.U4.org/" (:title "U4" :foo "bar"))
 ("http://www.U5.org/" (:title "U5" :foo "bar"))
 ("http://www.U6.org/" (:title "U6" :foo "bar")))