【问题标题】:Relative Line Numbers In EmacsEmacs 中的相对行号
【发布时间】:2011-10-16 00:20:39
【问题描述】:

有谁知道如果 emacs 存在类似 Vim Relative Line Numbers 的东西怎么办?我使用 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)

【问题讨论】:

  • 正如史蒂夫所说,他在 Emacs 中使用 vimpulse。 emacswiki.org/emacs/Vimpulse
  • @phils - 啊,谢谢,错过了这篇文章。
  • Steve,我冒昧地更新了您的版本并修复了错误,以便为 linum-format 函数输出使用正确的面。
  • BTW:关于这样一个“相对行号”功能,当缓冲区显示在多个窗口中时它应该如何表现:“其他窗口”应该显示相对于它们各自点的行号,还是当前选定窗口中的点(如果是,如果缓冲区的窗口都不是选定的窗口,会发生什么情况)?

标签: emacs line-numbers vimpulse


【解决方案1】:

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

【讨论】:

  • 对我来说(setq display-line-numbers-type 'relative) 在全球范围内启用了它。 (Emacs 26.3)
  • @lok​​i display-line-numbers-type 完美运行
  • 还应添加(global-display-line-numbers-mode) 以自动启用所有缓冲区的编号。
【解决方案2】:

(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)

【讨论】:

  • 两个问题。如何在没有 - 前缀的情况下获得负行号?以及如何避免行号在它们所代表的行上获得相同的面部设置?例如,注释掉的行的行号与 cmets 本身应用相同的颜色。
  • 要去掉减号,只需调用abs即可获取数字的绝对值。即:(number-to-string (abs (- line-number my-linum-current-line-number)))
  • 对于问题二,我的代码缺少一个技巧:当linum-format 是一个函数时,返回值不会自动使用linum 面进行属性化。我已经更新了上面的代码来解决这个问题。如果您想进一步修改脸部,您可以M-x customize-group RET linum RET。
  • 谢谢,效果很好:)...我只有最后一个问题,你如何右对齐或左填充行号?例如,行号在这里看起来是左对齐的:cl.ly/2J1i1T2B0Q0N13181g24
  • juanjux:尝试运行emacs -Q,看看加载此代码后是否仍有问题。在我写它的时候,这实际上比默认的 linum更有效(但我认为这在过渡期间已经解决了)。无论如何,如果您在使用未修改的 linum 时没有遇到此代码的问题,我会感到惊讶?如果您还没有这样做,请尝试对代码进行字节编译。您还可以研究 nlinum 包,它是由 Emacs 维护者编写的,可以更有效地替代 linum。
【解决方案3】:

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

更新:如果您使用的是MELPA(而且您应该这样做!),只需 M-x package-install RET linum-relative。

【讨论】:

  • 提供此功能的最完整和最新的库实际上似乎是linum-relative,Melpa为此提供了一个快照ELPA包。
  • @sanityinc linum-relative 不能使用 package.el 或 el-get 从 melpa 安装。你是如何让它工作的?
  • @Sam 从 Melpa 安装 linum-relative 对我来说效果很好。 “不安装”是什么意思?您收到错误消息,或者您没有在您的软件包列表中看到它?
  • 在 emacs24 + windows 上的重绘问题与 phils 的代码相同。
  • PS:但在 linux GUI 和控制台上完美运行,问题似乎仅限于 Windows Emacs。
【解决方案4】:

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

【讨论】:

    【解决方案5】:

    查看 M-x linum-mode 和 linum-format 变量。

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

    文档:

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

    【讨论】:

    • 啊,我以前没有看到,我可以给它一个函数来创建在线显示的字符串...好电话,我可能会在这个周末尝试自己制作。
    【解决方案6】:

    emacs 28,这对我有用

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

    可能会有所帮助

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-12-17
      • 1970-01-01
      • 2011-06-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-04-07
      相关资源
      最近更新 更多