Elisp 入門筆記(1)
由於用慣了Windows,在使用Linux作業系統後遇到的第一個棘手的問題就是沒有很順手的編輯器。陰差陽錯的開始用起了Emacs。
其實也沒有比較編輯器的優劣,只是預設安裝開啟文字的編輯器是Emacs而已。但是隨著使用Emacs的逐漸深入,發現越來越喜歡這個
編輯器了。
Emacs編輯器的神奇之處莫過於內嵌外掛的強大,現在以一種好奇和求知慾的心態來逐漸瞭解一下內嵌外掛的開發語言Elisp。
Emacs Lisp,一種直譯式的指令碼語言,為LISP的方言之一,GNU Emacs與XEmacs文字編輯器都使用這個程式語言來擴充套件它們的功能。
它的直譯器是以C語言來實作的。
note:
Emacs Lisp Reference is the official Emacs Lisp documentation. It is built into the Emacs Info pages and is the go-to for most Elisp programmers. It is shipped with Emacs and can be accessed by the menu bar, with ‘M-x menu-bar-read-lispref’, or from the
top page of InfoMode.
Emacs Lisp Intro is a book for non-programmers available from the Free Softwar eFoundation and is shipped with Emacs. Its command is ‘M-x menu-bar-read-lispinfo’.
熱身運動:
Emacs的外掛實現的功能雖然數不勝數,但是萬變不離其宗。當實現一個功能不管是用快捷鍵還是用(M-x),最本質的其實是Elisp函式
的呼叫。so,Emacs外掛其實就是用Elisp語言來寫函式。知易行難,要是真正寫起外掛來,工作量也是讓人不要不要的。
初探Elisp:
啟動Emacs,在下面會發現 *scratch* 的字樣,這表示你當前的緩衝區(buffer)的名字。緩衝區也叫做工作區,在Emacs中開啟一個檔案,
實際只是在Emacs中構造該檔案的一個副本,放到緩衝區中,狀態行下面的那行,叫做輔助輸入區(minibuffer),該minibuffer用於顯示計算
為了實驗本教程中的lisp命令,我們要讓Emacs工作在lisp-interaction-mode工作模式下,這個模式可以讓我們在緩衝區中和Emacs進行互
動,並且直接執行Lisp命令,得到結果。進入lisp-interaction-mode的方法: 把游標移動到輔助輸入區,鍵入M-x lisp-interaction-mode 然
後回車。
(message "hello elisp")
注意返回值和作用是不同的。比如前面 message 函式它的作用是在 Minibuffer 裡顯示一個字串,但是它的返回值是 "hello world" 字串。
一、變數、表示式、函式
(setq my-name "Tom")
給變數my-name賦值,然後C-x C-e 檢視執行結果。
(insert my-name)
C-x C-e
在游標處插入my-name
defun命令用來定義一個函式,語法是(defun 函式名 (引數列表) (函式體))
(defun SayHello (name)
(insert my-name name))
C-x C-e
(SayHello "Tom" )
C-x C-e
函式的呼叫方式,相當於SysHello("Tom")
二、progn,let和互動式函式
執行switch-to-buffer-other-window命令,將在在一個新的視窗中開啟一個buffer,並將該buffer命名叫做 test, 並且把游標移到新的buffer的視窗中。
(switch-to-buffer-other-window "*test*")
要回到原來的buffer中,可以使用滑鼠點選原來的buffer或者使用組合鍵 C-x o (M-x other-window)
如果要執行一系列的指令,可以使用流程函式progn,把函式命令連線起來.
(progn
(switch-to-buffer-other-window"*test*")
(erase-buffer)
(SayHello "Tom" ))
let函式用來做區域性變數的定義,然後寫入要執行的指令這個功能和progn類似
(let ((local-name "you"))
(switch-to-buffer-other-window "*test*")
(erase-buffer)
(SayHello local-name)
(other-window 1)) ;;切換視窗
read-from-minibuffer函式提供和使用者互動的功能,這個函式可以幫助Elisp程式從使用者處得到輸入
(read-from-minibuffer "Enter your name: ")
format函式可以用做格式化的輸出 其中%s表示該s的地方將被之後提供的一個字串替換,類似於C語言的prinf。
(defun greeting (from-name)
(let ((your-name (read-from-minibuffer "Enter your name: ")))
(switch-to-buffer-other-window "*test*")
(erase-buffer)
(insert (format "Hello %s!\n\nI am %s." your-name from-name))
(other-window 1)))
;; 執行這個函式
(greeting "Tom")