4

有谁知道如何在页边空白处打印代码的行号?我可以显示行号,不能在打印输出中显示。谢谢!

4

3 回答 3

4

You can add the line numbers with temporary overlays and convert the buffer to HTML using the htmlize package, after which you can save the HTML and print using lpr or a browser.

(defun htmlize-with-line-numbers ()
  (interactive)
  (goto-char (point-min))
  (let ((n 1))
    (while (not (eobp))
      (htmlize-make-tmp-overlay (point) (point) `(before-string ,(format "%4d " n)))
      (setq n (1+ n))
      (forward-line 1)))
  (switch-to-buffer (htmlize-buffer)))

This will require a recent version of htmlize.

于 2012-11-28T10:20:16.673 回答
3

当然,一种简单但不可靠的方法是将行号直接临时插入缓冲区

C-<
C-M-% ^ RET \,(1+ \#) SPC RET

然后打印它

M-x print-buffer

然后再次撤消行号:

C-/
C-u C-SPC

结果不是很漂亮,但可以使用。主要存在三个问题:

  • 您正在对缓冲区进行更改。特别是,这意味着缓冲区不能是只读的。
  • 行号是左对齐的,这意味着您会根据行号中的位数获得不同的缩进。
  • 您的主要模式将跳过行号,您将失去语法突出显示。如果您在黑白打印机上打印,这不是问题。

您可以通过使用更复杂的替换字符串来修复第二点:

\,(format "%4d " (1+ \#))

但是你必须知道最大行号是多少,这样你才能在%和之间给出正确的位数d。您当然可以快速跳转到缓冲区的末尾以检查最大行号。但更重要的是,每次要打印行号时都输入所有内容变得很痛苦。

于 2012-11-28T13:13:43.540 回答
2

对于这么旧的帖子的解决方案,我们深表歉意。我使用ps-print-buffer了而不是print-buffer,因为结果看起来更好看。无论如何,由于某种原因,手册中没有记录它,但是如果您查看 的源代码ps-print.el,您会发现ps-line-number可以设置为非零的变量,以便包括行号。

M-x set-variable RET ps-line-number RET t

那应该暂时设置它,以便您可以打印。您可能希望将其永久设置在您的init.el.

您还可以使用M-x pr-interface命令进行打印,该命令会显示各种打印选项的缓冲区。

于 2017-03-30T21:57:46.340 回答