chapter4 与缓冲区有关的函数
4.1 查找更多的信息
C-h f 函数名   ;查询函数
C-h v 变量名   ;查询变量
find-tags 函数 ;跳到响应函数
M-. 函数名     ;同上
上面函数需要定义一个标记表(tags table),这是一个名为"TAGS"的文件。
可以使用M-x visit-tages-table来指定
C-h p 命令让你用主题关键字搜索Emacs Lisp标准库。

4.2 简化的beginning-of-buffer函数定义
beginning-of-buffer => M-<
end-of-buffer => M->

(defun simple-beginning-of-buffer ()
"Move point to the beginning of the buffer;
leave mark at previous position."
(interactive)
(push-mark)
(goto-char (point-min)))
你可以使用C-h f fun来查询具体函数。
C-x C-x可以回到原来位置。
end-of-buffer 只需要把point-min换成point-max.

4.3 mark-whole-buffer函数
快捷键:C-x h

(defun mark-whole-buffer ()
"Put point at beginning and mark at end of buffer."
(interactive)
(push-mark (point))
(push-mark (point-max))
(goto-char (point-min)))

4.4 append-to-buffer函数的定义
(defun append-to-buffer (buffer start end)
"Append to specified buffer the next of the region.
It is insert into that buffer before its point.
When calling from a program, give three arguments:
a buffer or the name of one, and two character numbers
specifying the portion of the current buffer to be copied."
(interactive "BAppend to buffer:\nr")
(let ((oldbuf (current-buffer)))        
(save-excursion
(set-buffer (get-buffer-create buffer))
(insert-buffer-substring oldbuf start end))))

4.5回顾
1.descibe-function, describe-variable
C-h f, C-h v
2.find-tag
M-.
3.save-excursion
保存当前的位点,标记,缓冲区,执行参数,最后返回原状态。
4.push-mark
在指定位置设置一个标记,并在标记环中记录原来标记的值。
5.goto-char
将位点设置为由参量指定的位置。
6.insert-buffer-substring
将一个来自缓冲区的文本域拷贝到当前缓冲区。
7.mark-whole-buffer
C-x h
8.set-buffer
将Emacs的注意力转移到另一个缓冲区,但是不改变显示的窗口。
9.get-buffer-create, get-buffer
寻找一个已指定名字的缓冲区,或当指定名字的缓冲区不存在时就创建它。


chapter5 更复杂的函数
5.1 copy-to-buffer函数的定义
(defun copy-to-buffer (buffer, start, end)
"...."
(interactive "BCopy to buffer:\nr")
(let ((oldbuf (current-buffer)))
 (save-excursion
   (set-buffer (get-buffer-create buffer))
   (erase-buffer)
   (save-excursion
     (insert-buffer-substring oldbuf start end)))))

5.2 insert-buffer函数的定义
(defun insert-buffer (buffer)
"Insert after point the contents of BUFFER.
Puts mark after the inserted text.
BUFFER may be a buffer or a buffer name."
 (interactive "*bInsert buffer:")
 (or (bufferp buffer))
   (setq buffer (get-buffer buffer))
 (let (start end newmark)
   (save-excursion
     (save-excursion
       (set-buffer buffer)
       (setq start (point-min) end (point-max)))
     (insert-buffer-substring buffer start end)
     (setq newmark (point)))
   (push-mark newmark)))

5.2.1 insert-buffer函数中的交互表达式
1.只读缓冲区
“*”用于缓冲区是一个只读缓冲区。
2.交互表达式中的“b”
传送给insert-buffer函数的参量应是一个存在的缓冲区或者这个缓冲区的名字。
大写的“B”可以允许参量传送不存在的缓存区。

5.2.2 insert-buffer 函数体
or表达式的目地是为了确保buffer参量真正与一个缓冲区绑定在一起,而不是绑定缓冲区的名字。

5.2.3 用if表达式(而不是or表达式)编写的insert-buffer函数
(if (not (bufferp buffer))                ;if-part
   (setq buffer (get-buffer buffer)))    ;then-part

5.2.4 函数体中的or表达式
一个or函数可以有很多参量。它逐一对每一个参量并返回第一个其值不是nil的参量的值。
一旦遇到其值不是nil的参量之后,or表达式就不再对后续的参量的求值。

5.2.5 insert-buffer 函数中的let表达式

5.3 biginning-of-buffer函数的完整定义
C-u 7 M-<  将光标移动到从缓冲区开始的这个缓冲区的70%处,如果大于10,则移到末尾。

(defun beginning-of-buffer (&optional arg)
 "Move point to the beginning of the buffer;
 leave mark at previous position.
 With arg N, put point N/10 of the way
 from the true beginning.
 Don't use this in Lisp programs!
 \(goto-char (point-min)) is faster
 and does not set the mark."
 (interactive "P")
 (push-mark)
 (goto-char
   (if arg
     (if  (> (buffer-size) 10000)
        ;;Avoid overflow for large buffer sizes!
        (* (prefix-numeric-value arg) (/ (buffer-size) 10))
        (/ (+ 10 (* (buffer-size) (prefix-numeric-value arg))) 10))
     (point-min)))
 (if arg (forward-line 1)))

5.4 回顾
1.or
逐一对每一个参量求值,直到返回第一个非空值。
2.and
逐一对每一个参量求值,直到有一个参量的值是nil
3.&optional
在函数定义中用于指出一个参量是可选参量。
4.prefix-numeric-value
将一个由(interactive "P")产生的未加工的前缀参量转换成一个数值。
5.forward-line
将光标移到下一行的行首,如果参数大于1,则移动多行。
6.erase-buffer
删除当前缓冲区的全部内容
7.bufferp
如果其参量是一个缓冲区则返回“真”,否则返回“假”。

chapter 6 变窄和曾宽
6.1 save-restriction特殊表
跟踪变窄开启的部分。
(save-restriction
body....)

(save-excursion
(save-restriction
body...))
如果需要同时使用,顺序不能错。

6.2 what-line函数
这个函数告诉你光标所在的行数。
(defun what-line ()
 "Print the current line number (in the buffer) of point."
 (interactive)
 (save-restriction
   (widen)
   (save-recursion
     (beginning-of-line)
     (message "Line %d" (1+(count-lines 1 (point)))))))


增补:
C-x n n
   Narrow down to between point and mark (narrow-to-region).
C-x n w
   Widen to make the entire buffer accessible again (widen).
C-x n p
   Narrow down to the current page (narrow-to-page).
C-x n d
   Narrow down to the current defun (narrow-to-defun).