让Emacs将光标移出屏幕


23

这个问题最初是在/programming/15895313/let-emacs-move-the-cursor-off-screen上提出的,但是我得到的所有答案或多或少都说“这无法完成”。 ,但我不接受emacs。

像大多数GUI文本编辑器一样,是否可以让Emacs将光标移出屏幕?当我在任何GUI编辑器上使用Emacs时,这是困扰我的最大事情之一。当我向下滚动时,光标在缓冲区顶部被“向前推”。

我以前曾认为这是完全不可能的,因为这是硬连接到Emacs的体系结构中的,但是后来我看到了多个游标,它确实对辅助游标执行了此操作(假设您阻止了滚动功能作用于辅助游标)游标)。是否可以使用多光标将主光标放在某个隐藏缓冲区中,而有效光标是我实际编辑的对象?还是其他一些聪明的把戏?还是我的谷歌搜索使我失败了,而实际上没有任何魔术已经可以实现吗?

我使用的是终端emacs,因此它应该在那里工作。


请记住,所有的多光标程序包所做的都是添加假游标,这些游标不受实际游标的限制。希望您根据上一个问题的建议得到答案。
wasamasa 2014年

我认为这个问题是特定于使用滚动条的,对吗?
nispio 2014年

1
那么,您正在使用哪些滚动命令,而这些滚动命令不会使光标随身携带?以我的经验,在使用PgUp / PgDn或箭头键时,光标会在所有编辑器中跟随您。
nispio 2014年

4
@nispio可能使用鼠标滚轮滚动?
ffevotte 2014年

2
除非光标移出屏幕,否则Page Up和Page Down(Cv和Mv)不会在emacs中移动光标。滚动与移动(光标)不同。
asmeurer 2014年

Answers:


11

GNU ELPA上有一个名为的新软件包,可以scroll-restore尝试解决此问题。有几种不同的行为可供选择,但是我为自己配置的方式(见下文)使光标在滚动命令期间变为不可见,然后在我再次开始键入时跳回到其原始位置。

到目前为止,我已经遇到了一些错误,但是该程序包似乎在大多数情况下都按宣传的方式工作。您可以通过以下方式安装进行测试

M-x package-install RET scroll-restore RET

安装软件包后,您可以通过以下方式启用次要模式:

M-x scroll-restore-mode

就我个人而言,我将其绑定到Scroll Lock密钥上,因为它似乎非常合适!这是我要添加到我的init文件中的内容:

(require 'scroll-restore)
(scroll-restore-mode 1)
;; Allow scroll-restore to modify the cursor face
(setq scroll-restore-handle-cursor t)
;; Make the cursor invisible while POINT is off-screen
(setq scroll-restore-cursor-type nil)
;; Jump back to the original cursor position after scrolling
(setq scroll-restore-jump-back t)
;; Toggle scroll-restore-mode with the Scroll Lock key
(global-set-key (kbd "<Scroll_Lock>") 'scroll-restore-mode)

1
如果您已将密钥绑定到它,我想您有时想禁用它。这种模式会影响正常编辑吗?
T. Verron

1
@ T.Verron现在看来似乎很容易出错,其故障模式之一是将光标“困”在某个区域中而不让其离开。我发现再次释放光标的唯一方法是禁用该模式。一旦解决了所有错误,我就不会一直使用它。
nispio 2014年

2
这应该如何工作?我似乎无法做任何事情。
asmeurer 2014年

5

我一直使用的方法是将标记设置为我想跳回的位置,然后在完成缓冲区的读取后,使用弹出标记C-u C-SPC。即使我忘了在游荡之前设定标记,我也会发现弹出标记通常会使我非常接近我的出生地。这部分是由于某些命令(isearch例如)在没有意识到的情况下设置了标记。因此,在编辑过程中,您无意间留下了一些痕迹。

从文档中:

set-mark-command is an interactive compiled Lisp function in `simple.el'.

It is bound to C-@, C-SPC.

(set-mark-command ARG)

....

With prefix argument (e.g., C-u C-SPC), jump to the mark, and set the mark
from position popped off the local mark ring (this does not affect the global
mark ring).  Use C-x C-@ to jump to a mark popped off the global mark ring
(see `pop-global-mark').

我几乎从不理会设置书签或寄存器,但是我几乎总是可以使用C-u C-SPC或快速找到自己的出路pop-global-mark


坦率地说,我认为人们希望光标能够在屏幕外移动的主要原因是因为他们习惯于没有正确光标位置历史记录的编辑器。您也可以这样做,scroll-upscroll-down自动设置标记,C-u C-SPC以确保将您带回原籍。
Radon Rosborough

0

以下代码足以让我在滚动鼠标滚轮后跳回去:

(advice-add 'mwheel-scroll :before (lambda (arg) (if (not (eq last-command 'mwheel-scroll)) (setq point-before-mwheel-scroll (window-point)))))
(defun jump-back () (goto-char point-before-mwheel-scroll))
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.