Emacs中的相对行号

Ste*_*eve 21 emacs vimpulse line-numbers

有没有人知道如果对于emacs存在类似这样的Vim相对行号的话?我使用vimpulse和man,这将是非常方便的!我知道一些口齿不清,所以如果没有,我可以尝试自己做,如果我在正确的方向得到一个点.

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

非常感谢所有帮助过的人!我知道这不完全是Vim所做的,但是vim中从0开始的相对行号有什么用呢?愚蠢的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)
Run Code Online (Sandbox Code Playgroud)

phi*_*ils 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)
Run Code Online (Sandbox Code Playgroud)


san*_*inc 9

我只是碰到斯科特Jaderholm的代码来了这一点,并记得看到了这个问题,所以我决定发布一个链接到他的.emacs相关线路.

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


小智 7

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

  • 对我来说 `(setq display-line-numbers-type 'relative)` 全局启用了它。(Emacs 26.3) (3认同)
  • 还应该添加 `(global-display-line-numbers-mode)` 以自动为所有缓冲区启用数字。 (2认同)

Wil*_*hes 5

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

ace-jump-mode截图