将 Emacs 缓冲区固定到窗口(对于 cscope)

问题描述 投票:0回答:3

我的日常工作是使用 Emacs。完全如此。我也变得非常依赖 CScope 来帮助我在代码中查找内容。

通常,我有 2 个窗口拆分 (C-x 3): 替代文本http://bitthicket.com/files/emacs-2split.JPG

我使用右侧窗口作为代码缓冲区,使用左侧窗口作为 CScope 搜索缓冲区。当您执行 CScope 搜索并选择结果时,它会自动更新右侧窗口以显示结果引用的缓冲区。这一切都很好,只是它让我失去了我正在研究的其他缓冲区的位置。有时这没什么大不了的,因为 [C-s u] 让我回到原来的位置。

不过,更好的是有 3 个分割窗口,如下所示(左侧窗口中的 [C-x 2]): 替代文本http://bitthicket.com/files/emacs-3split.jpg

让左下窗口包含 CScope 搜索缓冲区,左上窗口成为 CScope 更新的唯一缓冲区。这样,我可以看到我的 CScope 搜索并在代码中导航,而不会丢失我关注的缓冲区。

有人知道我该怎么做吗?

emacs cscope
3个回答
35
投票

将其放入您的 .emacs 文件中:

;; Toggle window dedication

(defun toggle-window-dedicated ()

"Toggle whether the current active window is dedicated or not"

(interactive)

(message 

 (if (let (window (get-buffer-window (current-buffer)))

       (set-window-dedicated-p window 

        (not (window-dedicated-p window))))

    "Window '%s' is dedicated"

    "Window '%s' is normal")

 (current-buffer)))

然后将其绑定到某个键 - 我使用暂停键:

(global-set-key [pause] 'toggle-window-dedicated)

然后用它来“专用”您想要锁定的窗口。那么 cscope 只能在其他窗口中打开其结果窗口中的文件。很有魅力。我专门将它用于此目的 - 将一个源文件始终显示在屏幕上,同时在第二个缓冲区/窗口中使用 cscope,并在第三个缓冲区/窗口中查看 cscope 结果。


0
投票

好吧,我决定不做一个名誉妓女,自己去寻找答案。我查看了 Emacs wiki 上显示的 cscope.el,以及 RHEL 上 cscope RPM 包附带的 xcscope.el。

似乎都没有提供一种方法来完成我想要的事情。方法可能是通过添加像

*browse-buffer*
之类的包变量来编辑 ELisp,如果用户第一次执行
[C-c C-s g]
或其他操作时尚未初始化该变量,则只需初始化该变量,并且始终将结果代码显示在
*browse-buffer*
。然后用户可以将
*browse-buffer*
放在任何他想要的地方。


0
投票

这有点旧,但我想出了一种适合我的方法,使用一些自定义代码行。

它使用挂钩到 GUD 用于显示源代码的函数中的建议,即

gud-display-line
加上一个 var 来保存最后使用的缓冲区。这样,GUD 就能够为源代码回收相同的缓冲区。 如果没有,它会抢占一个缓冲区,但通常在我的情况下,我已经用我正在调试的程序的源代码打开了缓冲区。

;; Change gud behaviour when acquiring buffers to display source code
;; Define a variable to keep track of the last source code window
(defvar last-source-window nil)

;; Advice to run before displaying source code in GUD buffer
(defadvice gud-display-line (before reuse-source-window activate)
  "Reuse the same window for displaying source code in GUD."
  (let ((source-buffer (ad-get-arg 1)))
    (if (bufferp source-buffer)
        (setq last-source-window (get-buffer-window source-buffer)))))

;; Advice to run before creating a new source code window
(defadvice gud-display-line (after reuse-source-window activate)
  "Reuse the same window for displaying source code in GUD."
  (when last-source-window
    (with-selected-window last-source-window
      (switch-to-buffer (ad-get-arg 1)))))

;; Hook to add the advice
(add-hook 'gud-mode-hook
          (lambda ()
            (ad-activate 'gud-display-line 'before)
            (ad-activate 'gud-display-line 'after)))
© www.soinside.com 2019 - 2024. All rights reserved.