简而言之,我试图像在 vim 和大多数其他编辑器中一样在 emacs 中滚动;例如,当我从底部/顶部开始两行时,我按下/向上(Ctrl-p,n,↑,↓)它只会向上或向下移动一行,而不是屏幕的一半。
z.
以获得 Emacs 的感觉;-) 这可能不寻常,但它实际上比逐行滚动恕我直言更有用。
查看 Emacs Wiki 上的一些建议:
Emacs Wiki:平滑滚动
(setq scroll-step 1
scroll-conservatively 10000)
如果要准确定位屏幕,可以使用 Ctrl-L。
默认情况下,它将当前行定位在屏幕中间。
ESC 0 Ctrl-L 将当前行置于顶部。
我参加聚会有点晚了,但如果您不介意安装软件包,那么 smooth-scrolling(github,也可在 MELPA 中使用)可能就是您要找的因为 - 它当然对我有用。
安装后,您可以在 init.el 中弹出以下内容:
(require 'smooth-scrolling)
(smooth-scrolling-mode 1)
(setq smooth-scroll-margin 5)
最后一行是可选的;它开始在屏幕边缘附近而不是在屏幕边缘滚动,因此您总是可以在该点周围获得一些上下文。调整口味。
我的解决方案不是更改 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 了解如何控制滚动
自 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-forward
和 View-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
实际上会向下 滚动一行,因为缓冲区 正在向上移动一行。
我重新绑定箭头键以执行滚动操作。
(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)))
简单的这样做:
(global-set-key [M-up] (lambda () (interactive) (scroll-up 1)))
(global-set-key [M-down] (lambda () (interactive) (scroll-down 1)))
然后元光标向上移动,元光标向下移动。
QED。不知道以上所有的人都在抽烟!
我的 .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)
如果您正在寻找一种快速创建类似滚动效果的方法,请依次输入 C-n
和 C-l
,将光标向下移动然后居中。
要让“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)
由于使用 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))))
M-x customize-variable scroll-conservatively
将其设置为 1。
不过,您并不想这样做。
如果您不介意使用鼠标并且有滚轮,则可以通过以下任一方式自定义变量 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 列出了很多可能性
如果您在 .xsession 中启动 emacs,在我的情况下,将滚动保守设置为 100+ 将不起作用,滚动步骤 1 也不起作用。但是如果您在 X 之后启动 emacs,它会起作用。
在使用了可用配置(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-margin
和 scroll-conservatively
的值并不重要,因为 maximum-scroll-margin
会限制它们。他们只需要平等(也许?)。
滚动发生逐行,甚至在文件的末尾(对我来说是最坏的情况)。唯一缺少的功能是顶部和底部的边距丢失了。
这是一种妥协,对我来说,平滑滚动是值得的。
不定期副业成功案例分享
scroll-conservatively
从来没有任何问题。对此的警告有点奇怪 - 如果它引起问题,很容易从 init.el 中删除该行!