Emacs中与Vim的shift-h和shift-l相对应的功能是什么?

21
我想知道emacs是否内置了这些光标移动命令,或者我需要编写它们或在其他地方找到片段。我发现它们在vim中非常好用且经常使用。到目前为止,我还没有在emacs的文档中找到它们。
在vim中,它们看起来像这样: shift-h -> 将光标移到屏幕顶部 shift-m -> 将光标移到屏幕中间 shift-l -> 将光标移到屏幕底部
只是为了澄清,我不是想将光标移动到文档的顶部/底部,而是将光标移动到当前可见部分的顶部/底部,即当前正在屏幕上显示的部分。
到目前为止,我只找到其中一个。 alt-r似乎相当于vim的shift-m。它将光标移动到中间行的第一列。
6个回答

30

使用:

  • Alt+0 Alt+r - 窗口顶部
  • Alt+- Alt+r - 窗口底部

严格来说,应该将其写成M-0 M-r表示屏幕顶部和M-- M-r表示屏幕底部。其中M表示Meta键,通常映射为Alt.

我通过以下方式找到了这些按键组合:

M-r运行move-to-window-line命令。我用C-h k M-r(即Ctrl+h, k, Alt+r)找到了它。 按键序列C-h k的意思是告诉我接下来的按键序列做什么。 它告诉了我命令名称,并且还可以向该命令传递数字参数以选择要前往的行。 如果您不传递任何内容,则会将光标移动到窗口中间,就像您所看到的那样。

您可以通过按住Meta键并键入数字将数字参数传递给命令。一个独立的减号被视为-1。 现在,要移动到屏幕顶部,我们要传递第0行,对于屏幕底部则需要传递-1行。 这就给我们了上面的按键序列。

如果您想将move-to-window-line绑定到其他键,请查看Joe的回答


2
使用:- M-= M-r - 窗口中间 - huntar
smartparens将M-r绑定到sp-splice-sexp-killing-around,因此您可能会发现将Emacs默认设置(move-to-window-line-top-bottom)更改为M-R很有帮助。 - Micah Elliott

9
您想要使用的函数是move-to-window-line,其定义如下:
move-to-window-line is an interactive built-in function in `C source
code'.

It is bound to M-r.
(move-to-window-line arg)

Position point relative to window.
With no argument, position point at center of window.
An argument specifies vertical position within the window;
zero means top of window, negative means relative to bottom of window.

您可以使用0来回到页面顶部,使用-1来回到页面底部。这些可以绑定到匿名函数或命名函数的按键上。以下是两种不同方式的示例。 匿名函数
(global-set-key [(f4)] (function
                        (lambda ()
                          "Go to top of page."
                          (interactive)
                          (move-to-window-line 0))))

(global-set-key [(f4)] (function
                        (lambda ()
                          "Go to bottom of page."
                          (interactive)
                          (move-to-window-line -1))))

命名函数

(defun my-top-of-page ()
  "Go to top of page."
  (interactive)
  (move-to-window-line 0))

(defun my-bottom-of-page ()
  "Go to bottom of page."
  (interactive)
  (move-to-window-line -1))

(global-set-key [(f4)] 'my-top-of-page)
(global-set-key [(shift f4)] 'my-bottom-of-page)

7
在Emacs 23.2中,M-r命令可以满足你的需求。
第一次使用此命令会将光标移动到当前可见窗口的中心位置,连续使用会分别移动到顶部和底部。
无需额外配置或自定义函数。

2

除了Joe和Dave的回答,你还可以使用以下方法来获取中间值:

(defun bp-goto-center()
  "move cursor to middle line"
  (interactive)
  (move-to-window-line (/ (window-height) 2)))

我在所有自己编写的函数前面添加bp以区分它们和内置函数或其他人的函数... 如果需要的话,可以自由删除这个前缀。


2
我会点赞这个回答,但是你的代码块没有格式化(是的,我很挑剔!) - mgalgs
我需要执行以下操作才能使中间部分起作用:(move-to-window-line (/ (window-buffer-height (get-buffer-window)) 2)) - Ian Tegebo

1
我发现move-to-window-line不尊重window-buffer-height。因此,它实际上没有提供Vim在缓冲区大小小于窗口时的行为。由于我不使用终端中的Emacs,也不关心最小化其框架,我选择重用其前缀键,因为“z”让我想起了Vim的ztzmzb(也因为我将与Emacs的C-l结合使用以实现相同的整体效果)。
(define-prefix-command 'ctl-z-map)
(defun move-to-window-line-top ()
  (interactive)
  (move-to-window-line 0))
(defun move-to-window-line-middle ()
  (interactive)
  (let* ((wb-height (window-buffer-height (get-buffer-window)))
        (actual-height (if (> wb-height (window-height))
                           (window-height)
                         wb-height)))
    (move-to-window-line (/ actual-height 2))))
(defun move-to-window-line-bottom ()
  (interactive)
  (move-to-window-line -1)
  (beginning-of-line))
(define-key ctl-z-map (kbd "h") 'move-to-window-line-top)
(define-key ctl-z-map (kbd "m") 'move-to-window-line-middle)
(define-key ctl-z-map (kbd "l") 'move-to-window-line-bottom)
(global-set-key (kbd "C-z") 'ctl-z-map)

0
如果您正在使用Emacs 23,那么只需按下C-l即可。第一次它会跳转到中心位置,第二次它会跳转到顶部,第三次它会跳转到底部。
编辑:
哎呀,我的错,这会将当前行放在窗口的中心/顶部/底部。尽管如此,仍然很有用 :)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接