0

行折り返しを有効にしてEmacs 24.2を使用しています。

「Error: ...some message...」などのメッセージを含むさまざまなシミュレーションのログ ファイルを読み取ると、インクリメンタル検索を実行します: Cs error RET, Cs, Cs...

検索の強調表示された結果 (エラーという単語) が画面の下部に表示され、追加の折り返されたすべての行が表示されないのは非常に面倒です。

ここに画像の説明を入力

次のように、テキスト行全体がバッファーに表示されるように変更を加えたいと思います。

ここに画像の説明を入力

検索結果の再センタリングに関するこの質問を見つけました。検索機能にも同じdefadviceステートメントを使用できるようですが、行を中央に移動するのではなく、ラップされた部分の数だけ画面を下にスクロールするだけです。

これを行う方法?

4

3 に答える 3

1

参照する質問に対してソリューションを使用できますが、recenter-top-bottomこの非常にテストされていない機能によって変更されます。

(defun scroll-if-truncated()
  (scroll-up
   (/ (- (save-excursion
           (end-of-line) (point))
         (save-excursion
           (beginning-of-line) (point)))
      (window-body-width))))
于 2013-10-25T13:54:42.317 に答える
0

@juanleonのアドバイスに従ってコードで少し遊んだ後、私はこれで終わりました:

;; Execute after each update in isearch-mode
(setq isearch-update-post-hook 'show-whole-line)


(defun show-whole-line ()
  "Scroll such that the whole line (which contains the point) will be visible."

  ;; If it is the top part which is truncated
  (if (not (pos-visible-in-window-p (line-beginning-position)))
      (let
      ((amount 
        ;; the required number of lines to scroll
        (ceiling (/
              (- (window-start) 
             (line-beginning-position))
              (float (window-body-width))))))
    ;; don't scroll at all if the search result will be scrolled out
    (if (< amount (/ 
               (- (window-end)
              (point) )
               (float (window-body-width))))
        (scroll-down amount)))

    ;; Else
    (if (not (pos-visible-in-window-p (line-end-position)))
    (let
        ((amount 
          (min 
           ;; the required number of lines to scroll
           (ceiling (/ 
             (- 
              (line-end-position) 
              (window-end (selected-window) t)) 
             (float (window-body-width))) )
           ;; however not to scroll out the first line
           (/ (- (line-beginning-position) (window-start)) (window-body-width)))))
      (scroll-up amount)))))

いくつかの説明:

  • の設定defadviceisearch-forwardは不十分です。検索文字列に文字を追加しても、この関数は再度呼び出されません。isearch.el.gz パッケージを簡単に確認した後、isearch-update機能するようにアドバイスすることにしました。これにより、 and などに別のアドバイスを追加する必要もなくなりますisearch-repeat-forward。後で、 に事前定義されたフックがあることに気付きました。したがって、 hereisearch-updateは必要ありません。defadvice
  • show-whole-line関数は、現在の行の先頭が表示されているかどうかをチェックします。そうでない場合は、下にスクロールして行の先頭を表示します。ただし、このスクロールによって検索一致自体が非表示になる場合を除きます。
  • 行の先頭が表示されている場合は、行show-whole-lineの末尾も表示されているかどうかを確認します。そうでない場合は、上にスクロールして行の末尾を表示します。ただし、このスクロールによって行の先頭が非表示になる場合を除きます。私は、行の先頭を見ることができる方が好きです。

この関数とフックは非常にうまく機能しますが、厄介なことが 1 つあります。最初に Cs を押したとき (検索文字列を入力する前) に関数が呼び出されます。これは、ポイントがウィンドウの外に開始または終了する行にある場合、 Cs を呼び出すだけで何らかの方法でスクロールすることを意味します。

まったく重要ではありませんが、上記の副作用を取り除く方法の提案をいただければ幸いです。

于 2013-10-25T22:43:39.180 に答える
0

scroll-conservatively変数とscroll-margin、特に後者を使用して、必要な動作を取得できるはずです。

于 2013-11-28T02:31:46.550 に答える