【问题标题】:Emacs windmove move a buffer without switchingEmacs windmove 移动缓冲区而不切换
【发布时间】:2014-08-11 18:07:04
【问题描述】:

我的 Emacs Windmove 设置良好且工作正常,但我仍然对它有一点小烦恼。似乎没有办法在不切换两个缓冲区的位置的情况下将一个缓冲区滑到另一个缓冲区上。如何将一个缓冲区滑到另一个缓冲区上,只替换那个缓冲区。

这是我想做的:

   ___________               ___________           ___________
   |    |  B  |             |    |  B  |          |    |  C  |<-----
   | A  |_____|   --->      | A  |_____|   --->   | A  |_____|     |
   |    |  D  |             |    |  C  |          |    |  D  |     |
   |____|_____|             |____|_____|          |____|_____|     |
          Buffer C opens up,  ------^     With a key combo, maybe__|
          covering buffer D               I can slide up buffer C 
                                          to get back buffer D

编辑:我忘了提到我有一些使用 windmove 来实际切换两个缓冲区的 elisp。我想做的用例是有时会在某个窗口中打开一个缓冲区,覆盖我想查看的另一个缓冲区。我想在不干扰其他缓冲区的情况下滑动新打开的缓冲区,并将被覆盖的缓冲区取回。我希望这是有道理的。

【问题讨论】:

  • 您可以将焦点放在窗口 B 中,然后调用 M-x switch-to-buffer RET,然后使用向下箭头键选择 C ​​缓冲区或输入缓冲区名称(如果您知道),然后按 RET .然后,对另一个窗口重复该过程。
  • 这行得通,但肯定不如使用组合键高效。
  • 我想我理解这个问题,但我对它的措辞方式感到非常困惑:windmove 不包含用于更改窗口配置的 any 功能框架。它所做的只是提供一个简单的界面来更改当前选定的窗口(在那个未修改的窗口配置中)。我不明白你为什么提到它。
  • 嘿,谢谢。我编辑了我的帖子,希望它更清晰。

标签: emacs


【解决方案1】:
(defun slide-buffer (dir)
  "Move current buffer into window at direction DIR.
DIR is handled as by `windmove-other-window-loc'."
  (require 'windmove)
  (let ((buffer (current-buffer))
        (target (windmove-find-other-window dir)))
    (if (null target)
        (user-error "There is no window %s from here" dir)
      (switch-to-prev-buffer)
      (select-window target)
      (switch-to-buffer buffer nil t))))

(defun slide-buffer-up () (interactive) (slide-buffer 'up))
(defun slide-buffer-down () (interactive) (slide-buffer 'down))
(defun slide-buffer-left () (interactive) (slide-buffer 'left))
(defun slide-buffer-right () (interactive) (slide-buffer 'right))

绑定到C-S-&lt;arrow&gt;:

(define-key global-map (kbd "C-S-<up>")    #'slide-buffer-up)
(define-key global-map (kbd "C-S-<down>")  #'slide-buffer-down)
(define-key global-map (kbd "C-S-<left>")  #'slide-buffer-left)
(define-key global-map (kbd "C-S-<right>") #'slide-buffer-right)

【讨论】:

  • 太棒了!但是我得到“符号的函数定义是无效的:windmove-find-other-window。”该功能是否已被弃用?
  • 哦,也许你需要先(require 'windmove)
【解决方案2】:

在您的评论中,您说您想要一个“组合键来完成它”,意思是 (1) 切换到显示缓冲区 B 的窗口,然后 (2) 切换该窗口中显示的缓冲区以缓冲C

你现在是怎么做到的?你用钥匙,不是吗?所以你已经有了一个“组合键”。如果你的意思是你想要一个更短的组合键,那么编写一个命令,将绑定到你现在使用的键的命令链接在一起。

#1 有几种方法,#2 就是C-x b C

#1 的一种方法是在Icicles 中使用C-0 C-o。它允许您使用完成按名称选择窗口。有问题的命令是icicle-choose-window-by-name

将两者放在一起,通过 Icicles 您可以使用此代码。然后点击F3 做你想做的事。

 (defun foo ()
   (interactive)
    (call-interactively #'icicle-choose-window-by-name)
    (call-interactively #'switch-to-buffer))

 (global-set-key [f3] 'foo)

如果您不想使用冰柱,还有其他方法可以选择窗口。 This is the place to start,在查找有关选择(在其中导航)窗口的信息时。

【讨论】:

  • 我修改了我的帖子,希望让它更清楚。当它覆盖我想看到的另一个缓冲区时,我希望能够在缓冲区周围滑动,而不干扰其他缓冲区。
  • 听起来还是和我之前理解的一样。我想我已经提供了答案。
  • 这是一个很好的答案,但我希望能够使用向上滑动、向下滑动、向左滑动和向右滑动的组合键来滑动缓冲区。
  • 那么你应该在你的问题中提到左、右、上和下。说 Emacs,你想要的是选择左边,右边等的窗口,然后 switch-to-buffer' there. You should make clear also whether you want to end up in that buffer (which is what switch-to-buffer' 做)或者你想留在同一个缓冲区中,只是改变哪个缓冲区显示在目标窗口中(左、右等)。你的问题提出的不好。
  • 显然没有,因为我得到了我正在寻找的答案和一些有趣的冰柱信息!
猜你喜欢
  • 1970-01-01
  • 2011-10-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多