在Emacs中将光标移动到文件开头

25

如何在Emacs中移动到文件的开头(即在窗口化文本编辑器中按下 Ctrl+Home 后的效果)?

快速按页上键并不能将光标移动到开头(当然也不是用 Ctrl+Home )。

在这里 描述了期望结果的快捷方式:

M-<: 移动到缓冲区的顶部(beginning-of-buffer)。使用数字参数 n 时,移动到距离顶部 n/10 的位置。

M-> : 移动到缓冲区的末尾 (end-of-buffer)。

但是,Meta + <会产生“未进行M-x tags-search或M-x tags-query-replace”消息。

我正在输入快捷方式 Alt + Shift + ,,因为要获取 "<",我必须键入 "Shift + ,"

我做错了什么吗?

谢谢。

编辑: 事实证明,只有在通过屏幕运行emacs时,键盘快捷键才会因某种原因被错误解释。 例如,C-Home 给出以下错误消息:

M-[ 1; 5h (从 M-[ 1; 5H 转换而来) 未定义

有什么解决方法吗?


1
我在引语中提到了相关的快捷键,就我所知它是标准的(例如,这个 Emacs速查表中相同的)。但是在我的帖子中,它对我不起作用,我将解释原因。 - npit
3
请使用C-h k后跟M-<来检查键序列是否绑定到beginning-of-buffer。你输入是正确的。 - Rorschach
1
你是在终端中使用Emacs,还是使用GUI版本的Emacs?如果有区别的话,你也可以提及你目前使用的操作系统和Emacs版本。M-x emacs-version - lawlist
好的,我可能感觉像个白痴,因为按照@jenesaisquoi的指示,我发现它确实映射到了标准快捷键,但是Ctrl+Home现在可以工作了 - 不知道为什么以前不能用。我不知道如何成功地输入M-<Alt+Shift+,。当我尝试时,它会变成M-,。我只在终端中使用emacs。 - npit
在这种情况下,请考虑删除您的问题,因为它不太可能对其他人有帮助。谢谢。 - Drew
1
我正在恢复并更新这个问题。 - npit
3个回答

25

这适用于较新的Emacs

Esc followed by < #beginning of file
Esc followed by > #end of file

与ssh和Tmux结合使用效果很好


4

我无法复现你所经历的与 C-HOME 的完全相同行为。对于我来说,它被翻译为 M-[ 1 ;,没有 5H(但实际上是插入了...)。

但是,鉴于这一点,以下是我如何设置绑定的方法。

我会进入 *scratch* 缓冲区并键入

(read-key-sequence "please type C-home ") C-j

这将提示您输入一个键序列,所以按下 C-HOME,Emacs 应该在 read-key-sequence 行之后插入以下内容:

    "^[[1;"
    5H
这向我显示了键序列的实际字符串,以及神秘的 5H

使用该字符串,我会在我的 .emacs 中这样设置绑定:

(global-set-key "^[[1;" 'beginning-of-buffer)

这将适当地定义按键绑定,但是(对我来说)它现在会在缓冲区顶部插入5H。我相信5H是屏幕的产物...


更新添加:

5H很烦人,但据我所知,Emacs认为我们要输入它。 因此,我编写了两种替代方法,以产生相同的行为。

第一种使用keyboard-quit在到达缓冲区开头后中断键序列。 这可以防止插入5H。 但是它的缺点是执行了一个keyboard-quit - 每次都会闪烁/响铃提醒你。 有点烦人。

(global-set-key "^[[1;" 'my-bob)
(defun my-bob () "转到缓冲区开头,然后退出" (interactive) (beginning-of-buffer) (keyboard-quit))

为了避免keyboard-quit,我编写了另一个版本,它运行了一个小代码片段,如果存在则删除5H。 它需要更多步骤,但是完成了任务。

(global-set-key "^[[1;" 'my-bob)
(defun my-bob () "转到缓冲区开头,然后删除绑定插入的任何5H" (interactive) (beginning-of-buffer) (run-with-idle-timer 0.1 nil 'delete-inserted-chars "5H"))
(defun delete-inserted-chars (chars) (save-excursion (backward-char (length chars)) (if (looking-at (regexp-quote chars)) (delete-char (length chars)))))

delete-inserted-chars可以重用于屏幕中其他插入字符的绑定。


只需使用 (global-set-key (kbd "\033[1;5H") 'beginning-of-buffer)。 - egor7

-1

你可以做的一件事是转到第一行:

C-u 1 M-g M-g

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