有没有人知道如果对于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)
答案 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
,可让您跳转到屏幕上可见的特定行。它使用字母而不是数字作为行,但是:
答案 3 :(得分:4)
查看 M-x linum-mode
和linum-format
变量。
linum-format是`linum.el'中定义的变量 它的价值是动态的
文档:
用于显示行号的格式 格式字符串如“%7d”,“动态”以适应宽度 根据需要,或使用行号作为其调用的函数 参数,并应评估为该行上显示的字符串 另见`linum-before-numbering-hook'。
答案 4 :(得分:3)
在Emacs 26.1中,有一个内置的行号模式(display-line-numbers-mode)
。启用它,并将(setq display-line-numbers 'relative)
设置为使用相对行号。