【问题标题】:Emacs: line numbers that respect line-wrappingEmacs:尊重换行的行号
【发布时间】:2013-07-05 02:38:31
【问题描述】:

模式:我使用 linum 表示行号,使用包 linum-relative 表示相对行号。如果重要的话,我也在使用视觉线模式。这些是灵活的。

目前,单行(即没有换行符的文本)仅被编号为一行,无论它被换行多少次。我想知道是否有办法更改编号以尊重这些包装。所以,例如,

263   This is all in
      a single line
      without newlines

可能变成:

263   This is all in
264   a single line
265   without newlines

并且,在相对模式下:

0     This is all in
      a single line
      without newlines

可能变成:

-1    This is all in
0     a single line
1     without newlines

我真的只想要相对模式的变化,但不介意它是否溢出到绝对模式。

对两者都有效的切换更改将是最有用的 - 这样,用户可以具体选择何时或使用哪种模式来关闭或打开它。

【问题讨论】:

  • 你能澄清一下目标吗?当像forward-line 这样的命令不尊重它们时,我不确定我是否看到了假行号的目的。另外,当您想使用goto-line 时,我认为 263a、b、c 等会更容易混淆
  • 像next-line 这样的交互式命令多年来一直尊重换行符;你的意思是goto-line?当您考虑相对行号的用例时,该请求开始有意义。想象一下,看着一条很长的缠​​绕线。当前视线编号为 0,下一条视线编号为 1,依此类推。可以使用C-u 15 down 访问相关第 15 行的有趣文本。这是我现在不使用鼠标或不反复按下向下箭头就无法做到的事情。
  • 虽然我可以理解您使用相对编号的用例,但如果目标是缓冲区导航,我认为有比 C-u # up/down 更好的解决方案。
  • 我正在使用邪恶的相对行号。有了 relative,我可以立即查看是否必须移动,例如,向下或向上移动 15,然后输入 15j 或 k(实际上,由于 colemak,15e 或 u,但我怀疑这很重要) .我正在尝试将 j/k 设置为 previous-line/next-line 以便它尊重换行。问题(为此我提出了这个问题)是相对行号没有,所以如果它是换行的文本,我必须注意行数。

标签: emacs


【解决方案1】:

如果目标是导航,我建议通过流行的ace-jump-mode 提供类似的解决方案。

如果目标只是持久的行号,您可以考虑使用longlines-mode 而不是visual-line-mode(但我个人会避免这种情况)。

ace-jump @ GitHub
https://github.com/winterTTr/ace-jump-mode

演示:
http://dl.dropboxusercontent.com/u/3254819/AceJumpModeDemo/AceJumpDemo.htm

有了它,您只需按两次键就可以跳转到任何一行。

除了行,你可以跳到任何单词的开头;还有个别字符级的跳跃精度。如果需要,可以将其配置为限制跳转到当前窗口/缓冲区,或跨当前帧中的所有窗口,甚至是多帧。

但是,它不会将换行识别为可跳转的位置。同样,如果longlines-mode 对您真的很重要,您可能会考虑作为解决此问题的方法,但据我了解,它被认为是 hack'ish 并且不推荐使用visual-line-mode。不过,对于 longlines-mode,这些行将按照您在第一个示例中的需要重新编号。

我假设目标是导航,因此,我认为您只需稍加练习就会发现,基于单词的跳跃甚至通过增量搜索进行跳跃是一种更好的解决方案。

更新

这是一个使用 emacs 缩小功能欺骗 ace-jump 在 N 行内扫描的简单解决方案;也许其他人可以改进它。您也可以对单词和行模式执行类似的操作。

(defun brian-ace-jump-to-char-within-N-lines (&optional n)
  (interactive "p")
  (let* ((N (or n 0))
     (query-char (read-char "Query Char:"))
     (start (save-excursion
          (forward-line (- N))
          (point)))
     (stop (save-excursion 
         (forward-line (1+ N))
         (point))))
    (unwind-protect
    (condition-case err 
        (progn
          (narrow-to-region start stop)
          (ace-jump-char-mode query-char))
      (error 
       (message (error-message-string err))))
      (widen))))

【讨论】:

  • 有没有办法在当前行或 N 行内快速跳转到字符? (为了减少匹配次数,因此希望减少按键次数)。
  • @spacingissue AFAIK,默认情况下它不在 ace-jump 中,但我用一个使用缩小和扩大的功能的解决方案更新了答案。
  • 太棒了,谢谢!我能看到的唯一问题是当前行应该是(or n 0),使得if 条件实际上是不必要的。
猜你喜欢
  • 1970-01-01
  • 2018-11-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-11-18
  • 2011-06-19
相关资源
最近更新 更多