以编程方式检测缓冲区中的任何行是否正在包装?

时间:2017-04-07 15:30:43

标签: emacs elisp

我知道可能很酷/可能很愚蠢的emacs脚本会动态调整文本大小以填充可用空间。

我似乎无法弄明白的一件事是如何查询当前缓冲区以查看当前是否有任何行被包装。我该怎么做?

2 个答案:

答案 0 :(得分:3)

您可以使用以下函数检查当前缓冲区中是否包含任何行:

(defun wrapped-lines-p ()
  (save-excursion
    (goto-char (point-min))
    (let ((long-line-regexp 
           (format "^.\\{%d\\}.+$" (window-body-width))))
      (search-forward-regexp long-line-regexp nil t))))

如评论中所述,这并未考虑缓冲区的字体大小。由于缓冲区可以混合使用不同大小的字体,因此需要测试窗口文本像素大小。试试这个:

(defun wrapped-lines-p ()
  (let ((window-width-pixels (window-body-width nil t)))
    (> (car (window-text-pixel-size nil nil nil (1+ window-width-pixels)))
       window-width-pixels)))

答案 1 :(得分:1)

请注意"当前正在包装任何行"是窗口的属性,而不是缓冲区

给定window,您可以将其从顶部可见线扫描到底部,并将线长度与window-width进行比较:

(defun window-long-lines-p ()
  "Return t is any visible line in the current window is longer than window width."
  (save-excursion
    (move-to-window-line -1)
    (let ((end (point)) here
          found-long-line)
      (move-to-window-line 0)
      (while (and (not found-long-line)
                  (< (setq here (point)) end))
        (when (< (window-width)
                 (- (progn (forward-line 1)
                           (point))
                    here))
          (setq found-long-line t)
          (message "long line: %d" (1- (line-number-at-pos)))))
      found-long-line)))