emacs相当于vim的shift-h和shift-l

时间:2009-10-05 12:24:45

标签: vim emacs navigation cursor-position

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

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

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

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

6 个答案:

答案 0 :(得分:29)

使用:

  • 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+hkAlt+rThe key sequence C-h k means tell me what the next key sequence does.它告诉我命令名称,并且您可以将数字参数传递给命令以选择要转到的行。如果你没有通过它,你可以将点移动到你看到的窗口中间。

您可以通过typing a number while holding down Meta将数字参数传递给命令。减号本身就是-1。现在,要移动到屏幕顶部,我们要传递第0行,并在屏幕底部显示第-1行。这给了我们上面的关键序列。

如果您想将move-to-window-line绑定到其他键look at Joe's answer to this question

答案 1 :(得分: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)

答案 2 :(得分:7)

在Emacs 23.2中,M-r完全符合您的要求。

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

无需其他配置或自定义功能。

答案 3 :(得分:2)

要添加Joe和Dave的答案,你可以获得中间:

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

(我将bp添加到我的所有功能的前面,以区别于内置插件或其他人...随意删除它。)

答案 4 :(得分:1)

我发现move-to-window-line不尊重window-buffer-height。因此,当缓冲区大小小于窗口时,它实际上不提供Vim具有的行为。由于我不使用终端中的Emacs,也不关心最小化它的帧,我选择重复使用它的前缀键,因为'z'让我想起Vim的ztzm,和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)

答案 5 :(得分:0)

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

编辑:

糟糕,糟糕,将当前行放在窗口的中心/顶部/底部。虽然仍然有用:)