ChatGPT解决这个技术问题 Extra ChatGPT

如何在 GNU Emacs 中逐行滚动?

简而言之,我试图像在 vim 和大多数其他编辑器中一样在 emacs 中滚动;例如,当我从底部/顶部开始两行时,我按下/向上(Ctrl-p,n,↑,↓)它只会向上或向下移动一行,而不是屏幕的一半。

我坚信这永远不会得到解决。这是上个 90 年代的缺陷,到 2010 年仍然存在缺陷。
@Steve Kuo:退出抨击 - 这按设计工作,但可以通过简单的设置进行更改(或“修复”)。
@Teddy,这个“简单设置”是什么?
@Teddy 是的,那是什么?
@Rook:实际上我建议在 vim 中更频繁地使用 z. 以获得 Emacs 的感觉;-) 这可能不寻常,但它实际上比逐行滚动恕我直言更有用。

P
Philippe Fanaro

查看 Emacs Wiki 上的一些建议:

Emacs Wiki:平滑滚动

(setq scroll-step            1
      scroll-conservatively  10000)

看到它,实际上 - 两个答案,你的和 jrockway 的,但在 Wiki 上都没有推荐。不幸的是,其原因并没有得到清楚的解释。这就是为什么我发布这个问题,希望有人找到一种没有缺陷的方法。
我不明白为什么不推荐这样做。我一直在使用类似的配置,并且运行良好。为了进一步向您保证,请参阅此滚动步骤文档(注意最后一句):*当点移出时尝试滚动窗口的行数。如果这无法将点带回帧上,则将点居中。如果为零,则点在移出框架后始终居中。如果您希望每次滚动总是一行,您应该将 `scroll-conservatively' 设置为一个较大的值,而不是将其设置为 1。
是的,环顾四周,我没有看到更多支持 wiki 上的警告说明。例如,通过谷歌搜索,滚动步骤在多个 .emacs 文件中似乎很常见。也许wiki作者指的是旧版本的emacs?
scroll-conservatively 从来没有任何问题。对此的警告有点奇怪 - 如果它引起问题,很容易从 init.el 中删除该行!
@ars groups.google.com/group/gnu.emacs.help/browse_thread/thread/… 使用 emacs < 23.1和大文件,有时可能会将光标跳到中间,这似乎不是最大的问题
s
starblue

如果要准确定位屏幕,可以使用 Ctrl-L。

默认情况下,它将当前行定位在屏幕中间。

ESC 0 Ctrl-L 将当前行置于顶部。


不要误会,但这与逐行滚动有什么关系? (即问题)
提供一个(在作者看来)使用手头的工具更自然的替代工作流程是合理的。但是您应该在前面加上免责声明,并解释为什么这种方法“更好”(如果可能的话)。
@dmckee - 我用过 vim ......嗯,很长时间了。很好用。然而,由于我正在使用 lisp 做一些事情,我开始强迫自己至少再次掌握 emacs,而这种“另类”的移动方式目前对我来说太过分了。阅读教程,知道它......但是,这太奇怪了,恕我直言。不自然。
@Idigas:当然。这很公平,你不需要听星蓝的建议。但我认为,如果它是预先的并且包含令人信服的解释,那么这种答案可能会有所帮助。
是的,这只需几次击键即可完成。 (我用谷歌搜索“如何逐行滚动”只是因为这似乎是搜索“如何使代码转到我想要的地方”的有用方法。)谢谢!
H
Hans Maree

我参加聚会有点晚了,但如果您不介意安装软件包,那么 smooth-scrollinggithub,也可在 MELPA 中使用)可能就是您要找的因为 - 它当然对我有用。

安装后,您可以在 init.el 中弹出以下内容:

(require 'smooth-scrolling)
(smooth-scrolling-mode 1)
(setq smooth-scroll-margin 5)

最后一行是可选的;它开始在屏幕边缘附近而不是在屏幕边缘滚动,因此您总是可以在该点周围获得一些上下文。调整口味。


当我读到这篇文章时,我哭了起来。很确定这是问题的答案。
是的,作为一个尝试 Emacs 的 Vim 用户,这正是我想要的。
我同时使用了这个解决方案和滚动步骤解决方案,当我从底部移动到第 6 行并按下它会滚动一行时,这种组合很有趣,从顶部开始也是如此。
可悲的是,当您使用发生模式或搜索在文件中跳转时,平滑滚动现在经常失败:两者都可以将点移出屏幕,您必须点击 CL 才能显示结果。
H
Hulk1991

我的解决方案不是更改 Emac 的默认滚动,而是从宏创建键序列命令。这样,您就可以方便地一次滚动一行。不理想,但超级容易。碰巧 M-(↓) 和 M-(↑) 可用,所以这就是我使用的。

我就是这样做的。首先,您需要为向上和向下的一行滚动录制一个宏。

开始宏

C-x ( 

向下滚动一个

C-u 1 C-v

停止宏

C-x )

对于向上滚动一个,使用

C-u 1 M-v

接下来,您需要命名宏。

M-x name-last-kbd-macro

在出现如下提示时给它一个名称:

down-one-line

然后只需使用以下命令将键序列绑定到该命令名称:

M-x global-set-key

并在提示时,使用类似的东西:

M-(down arrow)

然后它会问你要绑定哪个命令,你应该给它你之前发明的名字,例如,down-one-line。

这是我得到这些信息的地方。您还可以在下面和其他地方找到有关将宏添加到 .emacs 文件的说明。

Here 为宏定义解释

Here 了解如何控制滚动


R
Rajesh J Advani

自 2000 年以来,我一直在我的 .emacs 文件中使用这些。

(global-set-key (quote [M-down]) (quote View-scroll-line-forward))
(global-set-key (quote [M-up]) (quote View-scroll-line-backward)) 

这样,我可以保持 Emacs 的默认行为以及一次滚动一行,这取决于我在做什么。

这至少工作到 GNU Emacs 22。我最近升级到 Emacs 24,发现 View-scroll-line-forwardView-scroll-line-backward 不再可用。经过一番打猎,我发现向上滚动和向下滚动行的工作。因此,如果您使用的是 Emacs 24,则可以使用它。

(global-set-key (quote [M-down]) (quote scroll-up-line))
(global-set-key (quote [M-up]) (quote scroll-down-line)) 

我主要跳过了 Emacs 23,所以如果这是您正在使用的版本,您可以尝试以上两种方法。

注意:scroll-up-line 实际上会向下 滚动一行,因为缓冲区 正在向上移动一行。


谢谢,这行得通...但我遇到了我在这里问过的另一个问题:stackoverflow.com/questions/19256551/…
D
Derek Slager

我重新绑定箭头键以执行滚动操作。

(global-set-key [up] (lambda () (interactive) (scroll-down 1)))
(global-set-key [down] (lambda () (interactive) (scroll-up 1)))

(global-set-key [left] (lambda () (interactive) (scroll-right tab-width t)))
(global-set-key [right] (lambda () (interactive) (scroll-left tab-width t)))

这不正是我想要的。我不想让屏幕滚动(因为它希望启用滚动锁定),但是让屏幕“移动”......哦,......记事本是如何做到的:)
k
kleopatra

简单的这样做:

(global-set-key [M-up] (lambda () (interactive) (scroll-up 1)))
(global-set-key [M-down] (lambda () (interactive) (scroll-down 1)))

然后元光标向上移动,元光标向下移动。

QED。不知道以上所有的人都在抽烟!


或者,正如我刚刚发布的,您可以使用向上滚动和向下滚动。
A
Alex B

我的 .emacs 文件中有以下内容,以启用良好的 ctrl-up、ctrl-down 滚动行为。我也将它用于鼠标滚轮。

(defun scroll-down-in-place (n)
  (interactive "p")
  (previous-line n)
  (scroll-down n))

(defun scroll-up-in-place (n)
  (interactive "p")
  (next-line n)
  (scroll-up n))

(global-set-key [mouse-4] 'scroll-down-in-place)
(global-set-key [mouse-5] 'scroll-up-in-place)
(global-set-key [C-up] 'scroll-down-in-place)
(global-set-key [C-down] 'scroll-up-in-place)

我刚刚尝试过,但这不是我想要的行为。它使您可以下到屏幕上的最后一行,但是单击下它仍然会“将屏幕向上拉几行”……不知道如何更好地解释它。
我喜欢映射鼠标滚轮的想法。但是内置的 View-scroll-line-forward 和 View-scroll-line-backward (或较新的向上滚动和向下滚动)不会起作用,而不是定义自己的函数吗?
M
Michael David Watson

如果您正在寻找一种快速创建类似滚动效果的方法,请依次输入 C-nC-l,将光标向下移动然后居中。


j
jjpikoov

要让“vim”滚动把它放到你的 .emacs 文件中:

(defun next-line-and-recenter () (interactive) (next-line) (recenter))
(defun previous-line-and-recenter () (interactive) (previous-line) (recenter))
(global-set-key (kbd "C-n") 'next-line-and-recenter)
(global-set-key (kbd "C-p") 'previous-line-and-recenter)

@Matt 它对我有用
r
romwel

由于使用 M-up 和 M-down 会很烦人,因为它会干扰 org-mode,从而使这些命令过载。为了避免这个问题,我个人使用那些结合了 M-page-up M-page-down" 的命令。这里我定义了向上和向下滚动到 1 行。

;;;scroll by `number-of-lines' without the cursor attached to the screen
(global-set-key [M-prior] (lambda () (interactive) (let ((number-of-lines 1))
                                                  (scroll-down number-of-lines)
                                                  (forward-line (- number-of-lines)))))
(global-set-key [M-next] (lambda () (interactive) (let ((number-of-lines 1))
                                                  (scroll-up number-of-lines)
                                                  (forward-line number-of-lines))))

;;;scroll by `number-of-lines' with the cursor attached to the screen
(global-set-key [S-M-prior] (lambda () (interactive) (let ((number-of-lines 1))
                                                  (scroll-down number-of-lines))))
(global-set-key [S-M-next] (lambda () (interactive) (let ((number-of-lines 1))
                                                  (scroll-up number-of-lines))))

j
jrockway

M-x customize-variable scroll-conservatively

将其设置为 1。

不过,您并不想这样做。


看到它,实际上 - 两个答案,你的和 ars 的,但在 Wiki 上都没有推荐。不幸的是,其原因并没有得到清楚的解释。这就是为什么我发布这个问题,希望有人找到一种没有缺陷的方法。
如果您能为我们这些菜鸟说明为什么这不是一个好主意,那将会很方便。
我认为这不是一个好主意的唯一原因是滚动变得很慢:您总是必须一次滚动一行,而不是默认的半屏滚动。 (我猜?)
P
Philip

如果您不介意使用鼠标并且有滚轮,则可以通过以下任一方式自定义变量 mouse-wheel-scroll-amount:

Ch v mouse-wheel-scroll-amount(单击自定义,将值更改为“特定行数”1,ApplyAndSave。)

或添加到 .emacs 行: '(mouse-wheel-scroll-amount '(1 ((shift) . 1) ((meta)) ((control) . text-scale)))

https://www.emacswiki.org/emacs/Scrolling 列出了很多可能性


s
seb

如果您在 .xsession 中启动 emacs,在我的情况下,将滚动保守设置为 100+ 将不起作用,滚动步骤 1 也不起作用。但是如果您在 X 之后启动 emacs,它会起作用。


t
tcpaiva

在使用了可用配置(emacs 26.3)之后,我得到了以下一组值:

(setq scroll-step 1
      scroll-preserve-screen-position t
      scroll-margin 10
      scroll-conservatively 10
      maximum-scroll-margin 0.0
      scroll-up-aggressively 0.0
      scroll-down-aggressively 0.0)

我相信 scroll-marginscroll-conservatively 的值并不重要,因为 maximum-scroll-margin 会限制它们。他们只需要平等(也许?)。

滚动发生逐行,甚至在文件的末尾(对我来说是最坏的情况)。唯一缺少的功能是顶部和底部的边距丢失了。

这是一种妥协,对我来说,平滑滚动是值得的。