如何在GNU Emacs中逐行滚动?


87

简而言之,我试图像在vim和大多数其他编辑器中一样在emacs中滚动。当我为例子,从底部/顶部两行,我按向下/向上(Ctrl- ,pn它会只有一条线向上或向下,而不是半个屏幕。


5
我相信这将永远不会解决。这是上个90年代的缺陷,2010
Steve Kuo

12
@Steve Kuo:退出重击-这是按设计工作的,但是可以通过简单的设置进行更改(或“固定”)。
泰迪

17
@Teddy,这是什么“简单设置”?
史蒂夫郭

1
@Teddy是的,这是什么?
踏板车

@Rook:实际上,我建议z.在vim中更频繁地使用以获得Emacs的感觉;-)可能不寻常,但是它实际上比逐行滚动IMHO更有用。
U. Windl

Answers:


51

请参阅EmacsWIki上的一些建议:

(setq滚动步骤1
      保守地滚动10000)

3
看到了,实际上-您的答案和jrockway的答案都可以,但是不建议在Wiki上同时使用。不幸的是,其原因尚不清楚。这就是为什么我发布问题,希望有人找到一种无缺陷的方法。
Rook

1
我不明白为什么不建议这样做。我一直在使用类似的配置,并且运行良好。为了进一步向您保证,请参见以下滚动步骤文档(注意最后一句话):*当点移出时尝试滚动窗口的行数。如果那不能使点回到框架上,则将点居中。如果该值为零,则点在移出框架后始终居中。如果你想滚动永远是在一个时间线,你应该设置`滚动保守”到一个较大的值,而不是将其设置为1
AN0

是的,环顾四周一点,我看不出要备份Wiki上的注意事项的更多内容。例如,通过Google搜索在多个.emacs文件中滚动步似乎很常见。也许Wiki作者是指emacs的旧版本?
ars

从来没有任何问题scroll-conservatively。对此的警告有些奇怪-如果它引起问题,那么很容易从init.el中删除该行!
DBR

1
@ars groups.google.com/group/gnu.emacs.help/browse_thread/thread/...使用Emacs <23.1和大文件的话,它可能有时会跳到光标移到中间,这似乎不是最大的问题
dbr

51

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

  • 默认情况下,它将当前行放置在屏幕中间。

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


14
不要误解,但是与逐行滚动有什么关系?(即问题)
Rook

9
提供一种替代的工作流程(使用作者的观点)是很自然的,这是合理的。但是,您应该在其开头加上这种效果的免责声明,并解释为什么这种方法“越好”(如果有可能)。
dmckee ---前主持人小猫

2
@dmckee-我用过vim ...嗯,很久了。很好。但是,由于我正在使用lisp进行操作,因此我开始迫使自己至少再次与emacs保持联系,而这种“替代”的移动方式目前对我来说太过分了。阅读该教程,就知道了……但是,太奇怪了,恕我直言。不自然。
Rook 2009年

1
@Idigas:好的。那很公平,您不需要接受starblue的建议。但是我认为,这种回答如果是预先的并且包含令人信服的解释,则可能会有所帮助。
dmckee ---前主持人小猫,

1
是的,这只需几次击键即可完成。(我之所以用Google搜索“如何逐行滚动”,是因为这似乎是搜索“如何使代码转到我想要的位置”的有用方法。)谢谢!
Ennael 2015年

42

我参加聚会有点晚了,但是如果您不介意安装软件包,那么可以平滑滚动githubMELPA中也提供)可能是您想要的-这肯定对我有用

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

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

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


7
读这篇文章时,我哭泣了。可以肯定的是,这就是问题的答案。
埃里克·布朗

3
是的,作为尝试Emacs的Vim用户,这正是我想要的。
juanjux 2014年

我同时使用了该解决方案和滚动步骤解决方案,当我从底部移至第六行并向下按时,它会滚动一行,而从顶部移至第六行,这种组合非常吸引人。
Emad Elsaid

令人遗憾的是,当您使用“出现模式”或“搜索”在文件中四处滚动时,平滑滚动现在经常会失败:两者都可以使该点脱离屏幕,并且您必须单击CL才能显示结果。
Erik Knowles

27

我的解决方案不是更改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)

然后,它将询问您要绑定的命令,并且应给它起早些时候发明的名称,例如向下一行。

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

此处用于宏定义说明

这里介绍如何控制滚动


22

.emacs自2000年以来,我一直在文件中使用它们。

(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/...
scorpiodawg

13

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

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

2
这不是我一直在寻找的东西。我不想让屏幕滚动(因为它想启用滚动锁定),但不想让屏幕“移动”……哦,……记事本是怎么做的:)
Rook

12

简单地做到这一点:

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

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

QED。不知道上述所有人群都在吸烟!


或者,正如我刚刚发布的,您可以使用上滚动线和下滚动线。
Rajesh J Advani

5

我的.emacs文件中包含以下内容,以实现良好的ctrl向上,ctrl向下滚动行为。我也将其用于鼠标滚轮。

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

我已经尝试过了,但这不是我一直在寻找的行为。它使您可以转到屏幕的最后一行,但是单击鼠标左键仍会“使屏幕向上倾斜几行” ...不知道如何更好地解释它。
Rook 2012年

我喜欢映射鼠标滚轮的想法。但是,内置的View-scroll-line-forward和View-scroll-line-backward(或更新的向上滚动和向下滚动)功能不是在定义自己的功能吗?
Rajesh J Advani

2

要使“ 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对我
有用

2

由于使用可能会很烦人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))))

1

M-x customize-variable scroll-conservatively

设置为1。

不过,您实际上并不想要这样做。


5
看到了,实际上-您的答案和ars的答案都可以,但是不建议在Wiki上同时使用。不幸的是,其原因尚不清楚。这就是为什么我发布问题,希望有人找到了一种无缺陷的方法。
Rook

3
如果您可以为我们说明一些新手,为什么这不是一个好主意,将非常方便。
丹尼尔(Daniel)

我可以认为这不是一个好主意的唯一原因是滚动速度变慢:您总是必须一次滚动一行,而不是默认的半屏幕滚动。(我猜是吗?)
ShreevatsaR 2011年


0

如果在.xsession中启动emacs,就我而言,保守地将滚动设置为100+无效,也不会滚动步骤1。但是,如果u在X之后启动emacs,则可以。


0

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

Ch v鼠标滚轮滚动量(单击定制,将值更改为“特定行数” 1,ApplyAndSave。)

或在.emacs中添加以下行:'(mouse-wheel-scroll-amount'(1((shift)。1)((meta))((control)。text-scale)))

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

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.