Emacs windmove在不切换的情况下移动缓冲区

Emacs windmove在不切换的情况下移动缓冲区,emacs,Emacs,我的Emacs Windmove设置很好,并且工作正常,但我仍然有一个小麻烦。如果不切换两个缓冲区的位置,似乎无法将一个缓冲区滑动到另一个缓冲区上。如何将一个缓冲区滑动到另一个缓冲区上,仅替换该缓冲区 以下是我想做的: ___________ ___________ ___________ | | B | | | B | | | C |<----- |

我的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
\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu___________
|| B | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | ||
|| D | | | C | | | D ||
|____|_____|             |____|_____|          |____|_____|     |
缓冲区C打开,------^可能有一个组合键__|
覆盖缓冲区D我可以向上滑动缓冲区C
取回缓冲区D

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

在你的评论中,你说你想要一个“组合键”,意思是(1)切换到显示buffer
B
的窗口,然后(2)将该窗口中显示的buffer切换到buffer
C

你现在是怎么做到的?你用钥匙,不是吗?所以你已经有了一个“组合键来做这件事”。如果您的意思是希望使用较短的键组合,请编写一个命令,将绑定到您现在使用的键的命令链接在一起

有几种方法可以做到#1,而#2只是
C-xbc

一种方法是在中使用
C-0c-o
。它允许您使用完成方式按名称选择窗口。该命令是
冰柱按名称选择窗口

将两者结合起来,使用冰柱可以使用此代码。然后点击
F3
执行您想要的操作

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

 (global-set-key [f3] 'foo)
如果您不想使用冰柱,还有其他选择窗口的方法,查找有关选择(在窗口中导航)的信息时

将其绑定到
C-S-

(定义键全局映射(kbd“C-S-”)#'slide-buffer-up)
(定义键全局映射(kbd“C-S-”)#“滑动缓冲区”下拉)
(定义键全局映射(kbd“C-S-”)#“滑动缓冲区-左侧”)
(定义键全局映射(kbd“C-S-”)#“滑动缓冲区-右侧”)

您可以将焦点放在窗口B中,然后调用
M-x开关切换到buffer RET
,然后使用向下箭头键选择C缓冲区或键入缓冲区名称(如果您知道),然后按
RET
。然后,对另一个窗口重复该过程。这是可行的,但它肯定不如使用组合键来实现效率高。我想我理解这个问题,但我对它的措辞感到非常困惑:
windmove
不包括任何用于更改框架中窗口配置的功能。它所做的只是提供一个简单的界面来更改当前选择的窗口(在未修改的窗口配置中)。我不明白你为什么提到它。嘿,谢谢。我编辑了我的文章,希望它更清晰。我修改了我的文章,希望它更清晰。当一个缓冲区覆盖了我想看到的另一个缓冲区时,我希望能够在它周围滑动,而不会干扰其他缓冲区。这听起来仍然像我以前理解的那样。我想我已经提供了一个答案。这是一个很好的答案,但我希望能够使用向上滑动、向下滑动、向左滑动和向右滑动的组合键来滑动我的缓冲区。然后你应该在问题中提到向左、向右、向上和向下。说到Emacs,您需要选择左边、右边等的窗口,然后在那里切换到buffer。您还应该弄清楚您是想在该缓冲区中结束(这就是切换到缓冲区所做的),还是想留在同一个缓冲区中,只更改目标窗口中显示的缓冲区(左、右等)。你的问题很糟糕。显然不是,因为我得到了我想要的答案和一些有趣的冰柱信息!令人惊叹的!然而,我得到了“Symbol的函数定义无效:windmove查找其他窗口”。该函数是否已被弃用?哦,也许您需要
(要求“windmove”)
(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))
(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)