如何使用显示下一个缓冲区的新窗口自定义Emacs split-window-X?

如何使用显示下一个缓冲区的新窗口自定义Emacs split-window-X?,emacs,split,window,buffer,Emacs,Split,Window,Buffer,在Emacs 21.x中,我不知道是通过特定的分割窗口定制,还是由于Emacs的不同默认行为,除了分割窗口外,还调用下面的分割窗口,它将非聚焦窗口中的缓冲区切换到下一个缓冲区 目前(Emacs 24.x),下面的拆分窗口和兄弟拆分窗口以及右边的拆分窗口似乎不允许这样的定制。这是真的吗 如果是这样,如何调整Emacs以实现这种行为?重新定义“拆分窗口”或“下方拆分窗口”和“右侧拆分窗口”,以便在非聚焦窗口上有一个切换到下一个窗口的额外步骤。这可以通过以下建议来实现: (defun split-wi

在Emacs 21.x中,我不知道是通过特定的分割窗口定制,还是由于Emacs的不同默认行为,除了分割窗口外,还调用下面的分割窗口,它将非聚焦窗口中的缓冲区切换到下一个缓冲区

目前(Emacs 24.x),下面的拆分窗口和兄弟拆分窗口以及右边的拆分窗口似乎不允许这样的定制。这是真的吗

如果是这样,如何调整Emacs以实现这种行为?重新定义“拆分窗口”或“下方拆分窗口”和“右侧拆分窗口”,以便在非聚焦窗口上有一个切换到下一个窗口的额外步骤。这可以通过以下建议来实现:

(defun split-window-and-next-buffer (new-window)
  (let ((old-window (selected-window)))
    (select-window new-window)
    (next-buffer)
    (select-window old-window)
    new-window))

(defadvice split-window-right (after split-window-right-and-next-buffer
                     activate protect compile)
  (split-window-and-next-buffer ad-return-value))

(defadvice split-window-below (after split-window-bellow-and-next-buffer
                      activate protect compile)
  (split-window-and-next-buffer ad-return-value))

由于上述建议中已有的法律列表所示的更正已经生效,我得到了预期的行为,但无法自定义旧行为。

针对这个问题,原始海报可能希望尝试更改张贴代码中下方
一词的拼写


此函数将三行代码(在末尾)添加到当前版本的Emacs Trunk
拆分窗口下方
,并使用
defalias
将函数重命名为
lawlist拆分窗口下方
。将一个右括号移到函数的末尾,以允许使用函数中更高层定义的两个
let
绑定。如果用户想在
新窗口中对焦(退出该功能后),只需删除最后一行代码
(选择窗口旧窗口)

(下面的defun lawlist拆分窗口(&可选大小)
将所选窗口拆分为两个窗口,一个在另一个上。
所选窗口位于上方。新拆分的窗口位于上方
并显示“下一个缓冲区”。返回新窗口。
如果省略了可选参数大小或为零,则两个窗口都将获得
相同高度,或接近高度。如果尺寸为正,则上部
\(选定)窗口获取大小行。如果大小为负,则
较低(新)窗口获取大小为的行。
如果变量“split window keep point”为非nil,则
窗口获得与选定窗口相同的点值。
否则,将选择窗口开始,以最小化
重新显示的数量;这在慢速终端上很方便。”
(交互式“P”)
(let((旧窗口(选定窗口))
(旧点(窗口点))
(大小(和大小(前缀数值大小)))
按窗口高度移动(新窗口底部移动)
(当(和尺寸(<尺寸0)(<(-size)窗口最小高度))
“拆分窗口”在这里不表示错误。
(错误“新窗口的大小太小”))
(设置新窗口(拆分窗口大小为零))
(除非拆分窗口保持点
(带当前缓冲区(窗口缓冲区)
在下面的垂直运动中使用“保存偏移”
(Bug#10971)。注意:当选定窗口的缓冲区具有
;标题行,最多两行缓冲区可能不显示
;在生成的配置中。
(省去远足
(转到字符(窗口开始))
(setq移动(垂直运动(窗高)))
(设置窗口开始新窗口(点))
(当(>(点)(窗口点新窗口))
(设置窗口点新窗口(点)))
(当(=移动(窗高))
(setq由窗高t移动)
(垂直运动-1))
(setq底部(点)))
(并按窗高移动

(对于几天前构建的当前版本的Emacs Trunk,
split window Down
将窗口垂直拆分,两个窗口中显示相同的缓冲区--
将所选窗口拆分为两个窗口,一个在另一个上。所选窗口在上。新拆分的窗口在下,并显示相同的缓冲区。返回e新建窗口。
.BTW--您在下面的
中有几次拼写错误。@lawlist,谢谢您的回答并指出错误。我已经更新了问题,现在我的简单的基于建议的解决方案已经起作用了。
(defun lawlist-split-window-below (&optional size)
  "Split the selected window into two windows, one above the other.
The selected window is above.  The newly split-off window is
below, and displays the 'next-buffer'.  Return the new window.

If optional argument SIZE is omitted or nil, both windows get the
same height, or close to it.  If SIZE is positive, the upper
\(selected) window gets SIZE lines.  If SIZE is negative, the
lower (new) window gets -SIZE lines.

If the variable `split-window-keep-point' is non-nil, both
windows get the same value of point as the selected window.
Otherwise, the window starts are chosen so as to minimize the
amount of redisplay; this is convenient on slow terminals."
  (interactive "P")
  (let ((old-window (selected-window))
    (old-point (window-point))
    (size (and size (prefix-numeric-value size)))
        moved-by-window-height moved new-window bottom)
    (when (and size (< size 0) (< (- size) window-min-height))
      ;; `split-window' would not signal an error here.
      (error "Size of new window too small"))
    (setq new-window (split-window nil size))
    (unless split-window-keep-point
      (with-current-buffer (window-buffer)
    ;; Use `save-excursion' around vertical movements below
    ;; (Bug#10971).  Note: When the selected window's buffer has a
    ;; header line, up to two lines of the buffer may not show up
    ;; in the resulting configuration.
    (save-excursion
      (goto-char (window-start))
      (setq moved (vertical-motion (window-height)))
      (set-window-start new-window (point))
      (when (> (point) (window-point new-window))
        (set-window-point new-window (point)))
      (when (= moved (window-height))
        (setq moved-by-window-height t)
        (vertical-motion -1))
      (setq bottom (point)))
    (and moved-by-window-height
         (<= bottom (point))
         (set-window-point old-window (1- bottom)))
    (and moved-by-window-height
         (<= (window-start new-window) old-point)
         (set-window-point new-window old-point)
         (select-window new-window)))
    ;; Always copy quit-restore parameter in interactive use.
    (let ((quit-restore (window-parameter old-window 'quit-restore)))
      (when quit-restore
    (set-window-parameter new-window 'quit-restore quit-restore)))
    new-window)
  (select-window new-window)
  (next-buffer)
  (select-window old-window)))

(defalias 'split-window-below 'lawlist-split-window-below)