26

有谁知道如果像这样的Vim 相对行号对于 emacs 存在?我使用 vimpulse,伙计,这将非常方便!我知道一些口齿不清,所以如果它没有,我可以尝试制作自己的,如果我有一个正确的方向。

更新:由于正确的响应,我想出了这个,它将显示当前行的 1 和上一行的 -1,用于结合 vimpulse yanks 和 deletes。

非常感谢所有帮助过的人!我知道这不是 Vim 所做的,但是 vim 中从零开始的相对行号有什么用?愚蠢的vim。

(defvar my-linum-current-line-number 0)

(setq linum-format 'my-linum-relative-line-numbers)

(defun my-linum-relative-line-numbers (line-number)
  (let ((test2 (1+ (- line-number my-linum-current-line-number))))
    (propertize
     (number-to-string (cond ((<= test2 0) (1- test2))
                             ((> test2 0) test2)))
     'face 'linum)))

(defadvice linum-update (around my-linum-update)
  (let ((my-linum-current-line-number (line-number-at-pos)))
    ad-do-it))
(ad-activate 'linum-update)
4

6 回答 6

30

在 Emacs 26.1 中,有一个内置的行号模式(display-line-numbers-mode)。启用它并设置(setq display-line-numbers 'relative)为使用相对行号。

于 2019-01-27T21:04:54.943 回答
13

(2012-03-16:行号现在右对齐,并显示在正确的面上。)

这里的问题是,在linum-format调用自定义函数时,点已经被移动(通过linum-update-window)到有问题的行,所以我们不能再用它来确定两条线之间的区别;它只会为每一行打印一个零。

有一个linum-before-numbering-hook, 但这是点被移动到缓冲区的开头之后运行的,所以这对我们的目的没有用。

下面的代码通过使用通知linum-update存储当前行号解决了这个问题,以便自定义linum-format函数可以使用它。

为了使数字右对齐,我最初使用了硬编码格式字符串,%3d因为单个窗口显示超过 100 行代码的可能性不大。但是,如果您是 的粉丝follow-mode(或者只是在同一个缓冲区上有多个窗口),那么这种情况就极有可能发生;所以代码现在动态计算所需的列数。使用linum-before-numbering-hook使得这比默认dynamiclinum 格式采用的方法更有效。

请注意,如果您注释掉add-hook,则使用更快的非动态方法。

(defvar my-linum-format-string "%3d")

(add-hook 'linum-before-numbering-hook 'my-linum-get-format-string)

(defun my-linum-get-format-string ()
  (let* ((width (1+ (length (number-to-string
                             (count-lines (point-min) (point-max))))))
         (format (concat "%" (number-to-string width) "d")))
    (setq my-linum-format-string format)))

(defvar my-linum-current-line-number 0)

(setq linum-format 'my-linum-relative-line-numbers)

(defun my-linum-relative-line-numbers (line-number)
  (let ((offset (- line-number my-linum-current-line-number)))
    (propertize (format my-linum-format-string offset) 'face 'linum)))

(defadvice linum-update (around my-linum-update)
  (let ((my-linum-current-line-number (line-number-at-pos)))
    ad-do-it))
(ad-activate 'linum-update)
于 2011-08-03T14:28:43.950 回答
10

我刚刚遇到了 Scott Jaderholm 的代码,并记得看到过这个问题,所以我决定在他的 .emacs 中发布相关行的链接。

更新:如果您正在使用MELPA(而且您应该使用!),只需M-x package-install RET linum-relative.

于 2011-10-24T21:12:44.677 回答
5

在相关说明中,如果您只想移动到特定行,则ace-jump-mode提供了一个命令ace-jump-line-mode,可让您跳转到屏幕上可见的特定行。但是,它使用字母而不是数字来表示行:

王牌跳跃模式截图

于 2014-01-30T15:28:33.170 回答
4

看看M-x linum-modelinum-format变量。

linum-format 是在 `linum.el' 中定义的变量。
它的价值是动态的

文档:

用于显示行号的格式。
可以是像 "%7d" 这样的格式字符串,根据需要调整宽度的 `dynamic',或者使用行号作为参数调用的函数,并且应该评估为要在该行上显示的字符串。
另见`linum-before-numbering-hook'。

于 2011-07-29T15:51:26.860 回答
0

emacs 28,这对我有用

(global-display-line-numbers-mode 1)
(setq display-line-numbers-type 'relative)

可能会有所帮助

早些时候我使用的是“linum-relative”包,它与“diff-hl”冲突:行号在版本控制的差异区域中不可见,本机行号工作正常!

于 2021-11-18T07:51:54.873 回答