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
使得这比默认的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)
Run Code Online (Sandbox Code Playgroud)
我只是碰到斯科特Jaderholm的代码来了这一点,并记得看到了这个问题,所以我决定发布一个链接到他的.emacs相关线路.
更新:如果你正在使用MELPA(你应该是!),只是M-x package-install RET linum-relative.
小智 7
在Emacs 26.1中,有一个内置的行号模式(display-line-numbers-mode)
。启用它并设置(setq display-line-numbers 'relative)
为使用相对行号。