Emacs中的相对行号

时间:2011-07-29 14:16:23

标签: emacs line-numbers vimpulse

有没有人知道如果对于emacs存在这样的Vim Relative Line Numbers之类的内容?我使用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)

5 个答案:

答案 0 :(得分: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的使用使其比默认dynamic linum格式采用的方法更有效。

请注意,如果您注释掉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)

答案 1 :(得分:9)

我刚刚遇到Scott Jaderholm的代码,并记得看到这个问题,所以我决定发布一个the relevant lines in his .emacs的链接。

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

答案 2 :(得分:5)

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

ace-jump-mode screenshot

答案 3 :(得分:4)

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

  

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

     

文档:

     

用于显示行号的格式   格式字符串如“%7d”,“动态”以适应宽度   根据需要,或使用行号作为其调用的函数   参数,并应评估为该行上显示的字符串   另见`linum-before-numbering-hook'。

答案 4 :(得分:3)

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