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

[xyzzy:08990] Re: 複数行の検索・置換とスクロール時の選択状態維持など



こんばんは。赤羽伸之といいます。

あまり役にたたないメールになりましたが、送信します。

μさん writes:

> 2.カーソルのある位置や選択状態が、画面をスクロールして
>   も維持されるようなモードを追加できませんでしょうか?
> 
> スクリプトを書けばなんとかなりますか?

これは、ワープロソフトのように、
PageUpキーやPageDownキーで表示領域を移動しても、
カーソルの位置は変化しない、という
現象のことですよね??

これを少し変形して、
PageUpキーやPageDownキーを押して表示を移動しても、
あるコマンドを実行すれば、
元いた場所に戻れる(ジャンプできる)、
ということであれば、
スクリプトを書けば
できるかも??と思いました。

1. バッファーローカル変数(たとえば my-position)を用意する。
     初期値はnilにしておく。
2. カーソル位置を変数my-positionに代入する関数を用意する。
     たとえば
     (defun set-my-position ()
            (if (not my-position) ;;;my-positionがnilならば
              (setq my-position (point)))) ;;;現在位置を代入
     こんな感じで。
3. カーソル位置をmy-positionに設定するコマンドを用意する。
     つまり、元の位置(最初の位置)に戻るための関数というわけです。
     たとえば
     (defun goto-my-position ()
            (interacrive)
            (if my-position ;;;my-positionがnilでなければ
                (progn (goto-char my-position)  ;;その位置に移動する
                       (setq my-position nil))));;my-positionをクリアする
     こんな感じで。
4. C-vやM-v など、画面が移動する関数では、必ず
     2.の関数(set-my-position)を呼び出すようにする。
     (マウスでスクロールバーをドラッグした時も含む)
5. 3で定義した関数(goto-my-position)を呼びだすと
     元いた位置にジャンプする(戻れる)。
6. 文字の入力の時は、元いた位置(my-positionの値)は
     変化しないといけない。よって、(setq my-position nil)を
     入力時には呼び出さないといけない。
     C-nやC-bなどの時も同様。

同様にすれば、選択状態を復元することも可能ではないか、と
思います。

問題は、4や6で、どうやって関数を呼び出せばいいのか、
(hookをかければいいのか) だと思います。

それ以前に、そもそもこのアルゴリズムでいいのか??という
不安もありますが。

すみません、実際に試していなくて、
想像で書きました。

Index Home