如何在窗口中显示整行?

时间:2013-10-25 12:59:09

标签: emacs elisp emacs24

我正在使用Emacs 24.2并激活换行。

当我读取包含以下消息的各种模拟的日志文件时:“错误:......某些消息......”,我执行增量搜索:C-s错误RET,C-s,C-s ......

我觉得非常恼人的是,搜索的突出显示结果(单词Error)会显示在屏幕的底部,并且无法看到所有其他包裹的行:

enter image description here

我想添加修改,以确保整个文本行将显示在缓冲区中,如下所示:

enter image description here

我发现this question有关重新定位搜索结果的问题。似乎我可以对搜索功能使用相同的defadvice语句,但是不需要重新对齐我需要的行,只需将屏幕向下滚动包装部分的数量。

怎么做?

3 个答案:

答案 0 :(得分: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))))

答案 1 :(得分: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)))))

几个解释:

  • defadvice设置isearch-forward是不够的 - 当您向搜索字符串添加字符时,不会再次调用此函数。在快速回顾一下isearch.el.gz包之后,我决定向isearch-update函数提出建议。这也消除了为isearch-repeat-forward等添加单独建议的需要。后来我注意到isearch-update中有一个预定义的挂钩,因此此处不需要defadvice
  • show-whole-line函数检查当前行的开头是否可见。如果没有,它会向下滚动以显示该行的开头,除非此滚动将导致隐藏搜索匹配本身。
  • 如果该行的开头可见,show-whole-line会检查该行的结尾是否也可见。如果没有,它会向上滚动以显示该行的结尾,除非此滚动将导致隐藏行的开头。我希望能够看到该行的开头。

这个函数和一个钩子工作得很好,但有一个烦人的事情:当你最初按C-s时(在你输入任何搜索字符串之前)调用该函数。这意味着如果该点位于窗口开始或结束的行上,则简单地调用C-s将导致以某种方式滚动。

虽然不重要,但我很乐意听取有关如何消除上述副作用的建议。

答案 2 :(得分:0)

您应该能够使用变量scroll-conservativelyscroll-margin获得所需的行为,特别是后者。