如何在 GNU Emacs 中逐行滚动?

Posted

技术标签:

【中文标题】如何在 GNU Emacs 中逐行滚动?【英文标题】:How to scroll line by line in GNU Emacs? 【发布时间】:2009-07-15 01:23:48 【问题描述】:

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

【问题讨论】:

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

查看 Emacs Wiki 上的一些建议:

Emacs Wiki: Smooth Scrolling
(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 【参考方案2】:

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

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

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

【讨论】:

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

我参加聚会有点晚了,但如果你不介意安装一个包,那么 smooth-scrolling(github,也可以在 MELPA 中找到)可能就是你想要的'正在寻找 - 它确实对我有用。

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

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

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

【讨论】:

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

我的解决方案不是更改 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 了解如何控制滚动

【讨论】:

【参考方案5】:

自 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 实际上是向下滚动一行,因为缓冲区被向上移动了一行。

【讨论】:

谢谢,这行得通……但我遇到了另一个我在这里问过的问题:***.com/questions/19256551/…【参考方案6】:

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

(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)))

【讨论】:

这不是我想要的。我不想让屏幕滚动(因为它希望启用滚动锁定),但是让屏幕“移动”......哦,......记事本是如何做到的:)【参考方案7】:

Simple 这样做:

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

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

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

【讨论】:

或者,正如我刚刚发布的,您可以使用向上滚动和向下滚动。【参考方案8】:

我的 .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 (或更新的向上滚动和向下滚动)不会起作用,而不是定义自己的函数吗?跨度> 【参考方案9】:

要让“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 对我有用【参考方案10】:

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

【讨论】:

【参考方案11】:

因为使用 M-upM-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))))

【讨论】:

【参考方案12】:

M-x customize-variable scroll-conservatively

将其设置为 1。

不过,你并不是真的想这样做。

【讨论】:

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

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

C-h 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

【讨论】:

【参考方案14】:

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

【讨论】:

【参考方案15】:

在使用了可用配置(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 会限制它们。他们只需要平等(也许?)。

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

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

【讨论】:

以上是关于如何在 GNU Emacs 中逐行滚动?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Julia 中逐行读取文件?

我应该如何在 Python 中逐行读取文件?

如何禁用 .onDelete- 或如何在列表中逐行使用 .deleteDisabled?

如何使用python在字符串html中逐行添加“\ n”?

如何在 Python 中逐行计算数据框的小计?

如何在文本文件中逐行替换特定行?