GNU emacs Lisp小結3

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).



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章