【问题标题】:Emacs -- test for same buffer in other windows with different widthEmacs -- 在不同宽度的其他窗口中测试相同的缓冲区
【发布时间】:2014-06-16 02:37:58
【问题描述】:

我正在寻求一些帮助,以测试多个窗口(在任何框架上)中是否存在相同的缓冲区以及这些窗口的 window-width 是否(包含特定的缓冲区)是不同的。


  • 示例一

第 1 帧

窗口 A -- minor-mode-xyz -- (= (window-width) 55) -- (equal (buffer-name) "*TEST*")

窗口 B -- 对这个例子没有什么重要的

窗口 C -- minor-mode-xyz -- (= (window-width) 55) -- (equal (buffer-name) "*TEST*")

第 2 帧

窗口 A -- minor-mode-xyz -- (= (window-width) 100) -- (equal (buffer-name) "*TEST*")

窗口 B -- 对这个例子没有什么重要的

窗口 C -- minor-mode-xyz -- (= (window-width) 55) -- (equal (buffer-name) "*TEST*")

结果:(message "The test yielded a positive result -- do something now.")


  • 示例二

第 1 帧

窗口 A -- minor-mode-xyz -- (= (window-width) 100) -- (equal (buffer-name) "*TEST*")

窗口 B -- 对这个例子没有什么重要的

窗口 C -- minor-mode-xyz -- (= (window-width) 100) -- (equal (buffer-name) "*TEST*")

第 2 帧

窗口 A -- minor-mode-xyz -- (= (window-width) 100) -- (equal (buffer-name) "*TEST*")

窗口 B -- 对这个例子没有什么重要的

窗口 C -- minor-mode-xyz -- (= (window-width) 100) -- (equal (buffer-name) "*TEST*")

结果:(message "Everything is PERFECT -- do not do anything !!!")


  • 示例三

第 1 帧

窗口 A -- minor-mode-xyz -- (= (window-width) 100) -- (equal (buffer-name) "*TEST*")

窗口 B -- 对这个例子没有什么重要的

Window C -- 对这个例子没有什么重要的

第 2 帧

窗口 A -- 对这个例子没有什么重要的

窗口 B -- 对这个例子没有什么重要的

Window C -- 对这个例子没有什么重要的

结果:(message "Everything is PERFECT -- do not do anything !!!")


这是一个示例,其中两个窗口中的window-width 完全相同,并且次要模式运行良好。


(来源:lawlist.com


这是一个示例,其中窗口中的window-width 相等,并且次要模式在任何没有焦点的窗口中都变得混乱 - 例如,水平/垂直黄线未正确绘制。当出现这种情况时,最好的处理方法可能是进行测试,当它返回阳性时,禁用所有窗口中的黄色水平/垂直线。


(来源:lawlist.com


以下只是一个草拟的概念想法,但还不能处理所需的测试:

(defun test-function (&optional all-frames)
"If the same buffer displays on any frame -- with different `window-width`,
then do something."
  (let* (
      (wins (window-list (selected-frame) 'no-minibuf))
      (bufs (delete-dups (mapcar #'window-buffer wins))))
    (dolist (buf bufs)
      (with-current-buffer buf
        (dolist (win
            (get-buffer-window-list (current-buffer) 'no-minibuf all-frames))
          (select-window win)
          (when test-mode
            (message "hello-world.")))))))

【问题讨论】:

  • 澄清问题:您是要测试是否存在 特定 缓冲区(例如,当前缓冲区),还是要测试 any 缓冲区是否存在跨窗口重复?
  • @Dan -- 最可能的情况是current-buffer -- 例如,杀死一个 unrelated 缓冲区可能会显示一个新的 current-buffer 已经显示在其他地方; split-window-horizontally 自然会显示current-buffer;并且切换到缓冲区也可能是在其他地方显示的缓冲区。但是,当使用display-buffer 时,可能会出现不是current-buffer 的情况(因为不一定要选择新的目标窗口)。所以,包罗万象的测试,应该涵盖所有场景 - 即,minor-mode-xyzany 缓冲区。

标签: emacs elisp


【解决方案1】:

这是一个返回共享相同缓冲区但宽度不同的窗口对列表的函数:

(defun window-pairs ()
  (let (wmap ret)
    ;; get a list of all windows
    (dolist (frame (frame-list))
      (dolist (window (window-list frame))
        (let* ((buffer (window-buffer window))
               (assoc (assoc buffer wmap)))
          ;; if the window shares the window with some previously
          ;; visited windows, also compare their widths
          (if assoc
              (let ((other-windows (cdr assoc)))
                (dolist (other-window other-windows)
                  (unless (= (window-width window) (window-width other-window))
                    (push (cons window other-window) ret)))
                (push (cons buffer (cons window other-windows)) wmap))
            (push (cons buffer (list window)) wmap)))))
    ret))

它找到共享同一个缓冲区的所有窗口,每次找到一个新窗口,其缓冲区之前已经看到过,它会遍历以前的窗口,将它们的宽度与当前窗口的宽度进行比较。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-02-26
    • 1970-01-01
    • 1970-01-01
    • 2016-07-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多