6.2 what-line

what-line命令告诉您光标所在位置的行号。该函数演示了save-restrictionsave-excursion命令的用法。以下是该函数的原始文本:

(defun what-line ()
  "打印光标所在位置(在缓冲区中)的当前行号。"
  (interactive)
  (save-restriction
    (widen)
    (save-excursion
      (beginning-of-line)
      (message "第%d行"
               (1+ (count-lines 1 (point)))))))

(在GNU Emacs的现代版本中,what-line函数已经扩展,不仅告诉您在扩展缓冲区中的行号,还告诉您在狭窄缓冲区中的行号。现代版本比这里展示的版本更复杂。如果您感到有冒险精神,可以在弄清楚此版本的工作原理后查看它。您可能需要使用C-h fdescribe-function)。新版本使用条件判断确定缓冲区是否已经被狭窄。

此外,what-line的现代版本使用line-number-at-pos,它除了简单的表达式(例如(goto-char (point-min)))外,还使用(forward-line 0)将光标移动到当前行的开头,而不是beginning-of-line。)

这里展示的what-line函数具有文档行并且是交互式的,正如您所期望的那样。接下来的两行使用了save-restrictionwiden函数。

save-restriction特殊形式记录当前缓冲区中任何有效的缩小范围(如果有的话),并在save-restriction的主体代码被评估后恢复该缩小范围。

save-restriction特殊形式后跟widen。此函数撤消了在调用what-line时当前缓冲区可能存在的任何缩小。 (save-restriction记住的是存在的缩小。)这种扩展使得行计数命令能够从缓冲区的开头计数。否则,它们将受限于在可访问区域内计数。任何原始缩小都在save-restriction特殊形式完成函数后立即恢复。

widen的调用后跟save-excursion,该函数保存光标(即点)的位置,并在save-excursion的主体代码使用beginning-of-line函数移动点后恢复它。

(请注意,(widen)表达式位于save-restrictionsave-excursion特殊形式之间。当您按顺序编写两个save- …表达式时,将save-excursion写在最外层。)

what-line函数的最后两行是用于计算缓冲区中行数然后在回显区打印该数字的函数。

(message "第%d行"
         (1+ (count-lines 1 (point)))))))

message函数在Emacs屏幕底部打印一行消息。第一个参数位于引号中,被打印为一个字符串。但是,它可能包含‘%d’表达式,以打印后续参数。‘%d’将参数打印为十进制数,因此消息将显示类似于‘第243行’的内容。

替换‘%d’的位置打印的数字由函数的最后一行计算:

(1+ (count-lines 1 (point)))

这是从缓冲区的第一个位置(由1指示)到(point)的行数,然后将其加一。 (1+函数将其参数加一。)我们加一是因为第2行之前只有一行,而count-lines只计算当前行之前的行。

count-lines完成其工作并且消息已经在回显区打印后,save-excursion将点还原到其原始位置;save-restriction恢复原始的缩小(如果有的话)。