21

我想知道emacs是否内置了这些光标移动命令,或者我是否必须编写它们或在某处找到一个片段。我发现它们非常漂亮,并经常在 vim 中使用它们。到目前为止,我还没有在 emacs 的文档中找到它们。

在 vim 中,它们看起来像这样: shift-h -> 将光标移动到屏幕顶部 shift-m -> 将光标移动到屏幕中间 shift-l -> 将光标移动到屏幕底部

只是为了澄清,我不想将光标移动到文档的顶部/底部,只是移动到文档当前可见部分的顶部/底部,即当前显示在屏幕上的部分。

到目前为止,我找到了其中一个。alt-r 似乎相当于 vim 的 shift-m。它将光标移动到中间行的第一列。

4

6 回答 6

30

采用:

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

严格来说,这些应该写为M-0 M-r屏幕顶部和屏幕M-- M-r底部。whereM表示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 对这个问题的回答

于 2009-10-05T12:44:35.317 回答
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.

您可以使用 a 来调用它0以转到页面顶部,并使用 a 来调用它以转到页面-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)
于 2009-10-05T13:33:47.540 回答
7

在 Emacs 23.2 中,Mr 完全按照您的意愿行事。

该命令的第一次调用将点移动到当前可见窗口的中心,接下来的连续调用将移动到顶部和底部。

无需额外配置或自定义功能。

于 2010-05-21T19:11:17.170 回答
2

要添加到 Joe 和 Dave 的答案中,您可以使用以下方法:

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

(我添加bp到我所有函数的前面,以将它们与内置函数或其他人的......随意删除。)

于 2009-10-05T13:57:55.407 回答
1

我发现move-to-window-line不尊重window-buffer-height。因此,当缓冲区大小小于窗口时,它实际上并没有提供 Vim 的行为。因为我不使用终端的 Emacs,也不关心最小化它的框架,所以我选择重用它的前缀键,因为 'z' 让我想起了 Vim 的zt, zm, 和zb(也因为我要将以下内容与 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)
于 2012-05-12T23:49:02.163 回答
0

如果您使用的是 Emacs 23,它只是C-l. 第一次会到中心,第二次会到顶部,第三次会到底部。

编辑:

哎呀,我的错,将当前行放在窗口的中心/顶部/底部。不过还是有用的:)

于 2009-10-05T13:34:04.257 回答