what-line
The what-line
command tells you the number of the line in which
the cursor is located. The function illustrates the use of the
save-restriction
and save-excursion
commands. Here is the
original text of the function:
(defun what-line () "Print the current line number (in the buffer) of point." (interactive) (save-restriction (widen) (save-excursion (beginning-of-line) (message "Line %d" (1+ (count-lines 1 (point)))))))
(In modern versions of GNU Emacs, the what-line
function has
been expanded to tell you your line number in a narrowed buffer as
well as your line number in a widened buffer. The modern version is
more complex than the version shown here. If you feel adventurous,
you might want to look at it after figuring out how this version
works. You will probably need to use C-h f
(describe-function
). The newer version uses a conditional to
determine whether the buffer has been narrowed.
Also, the modern version of what-line
uses
line-number-at-pos
, which among other simple expressions, such
as (goto-char (point-min))
, moves point to the beginning of the
current line with (forward-line 0)
rather than
beginning-of-line
.)
The what-line
function as shown here has a documentation line
and is interactive, as you would expect. The next two lines use the
functions save-restriction
and widen
.
The save-restriction
special form notes whatever narrowing is in
effect, if any, in the current buffer and restores that narrowing after
the code in the body of the save-restriction
has been evaluated.
The save-restriction
special form is followed by widen
.
This function undoes any narrowing the current buffer may have had
when what-line
was called. (The narrowing that was there is
the narrowing that save-restriction
remembers.) This widening
makes it possible for the line counting commands to count from the
beginning of the buffer. Otherwise, they would have been limited to
counting within the accessible region. Any original narrowing is
restored just before the completion of the function by the
save-restriction
special form.
The call to widen
is followed by save-excursion
, which
saves the location of the cursor (i.e., of point), and
restores it after the code in the body of the save-excursion
uses the beginning-of-line
function to move point.
(Note that the (widen)
expression comes between the
save-restriction
and save-excursion
special forms. When
you write the two save- …
expressions in sequence, write
save-excursion
outermost.)
The last two lines of the what-line
function are functions to
count the number of lines in the buffer and then print the number in the
echo area.
(message "Line %d" (1+ (count-lines 1 (point)))))))
The message
function prints a one-line message at the bottom of
the Emacs screen. The first argument is inside of quotation marks and
is printed as a string of characters. However, it may contain a
‘%d’ expression to print a following argument. ‘%d’ prints
the argument as a decimal, so the message will say something such as
‘Line 243’.
The number that is printed in place of the ‘%d’ is computed by the last line of the function:
(1+ (count-lines 1 (point)))
What this does is count the lines from the first position of the
buffer, indicated by the 1
, up to (point)
, and then add
one to that number. (The 1+
function adds one to its
argument.) We add one to it because line 2 has only one line before
it, and count-lines
counts only the lines before the
current line.
After count-lines
has done its job, and the message has been
printed in the echo area, the save-excursion
restores point to
its original position; and save-restriction
restores
the original narrowing, if any.