Emacs windmove移动缓冲区而不切换

时间:2014-08-11 18:07:05

标签: emacs

我让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。我想要做的用例是有时缓冲区将在某个窗口中打开,覆盖我想要看到的另一个缓冲区。我想在不打扰其他缓冲区的情况下滑动新打开的缓冲区,并获取被覆盖的缓冲区。我希望这是有道理的。

2 个答案:

答案 0 :(得分: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-<arrow>

(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)

答案 1 :(得分:0)

在你的评论中,你说你想要一个&#34; 组合键&#34;,这意味着(1)切换到显示缓冲区B的窗口然后(2)将该窗口中显示的缓冲区切换为缓冲区C

你现在怎么做?你用钥匙,不是吗?所以你已经有一个&#34; 组合键来做&#34;。如果你的意思是想要一个更短的组合键,那么编写一个命令,将命令绑定到你现在使用的键上。

有几种方法可以做#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,在查找有关选择(导航)窗口的信息时。