青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

初步認識emacs的lisp編程

參考:Learning GNU Emacs 3/e,9.8.The Lisp Modes,11.Emacs Lisp Programming

Emacs有三種Lisp模式,其命令名稱如下:

emacs-lisp-mode 用于Emacs Lisp代碼的編輯(文件名.emacs或后綴.el)
lisp-mode 用來編輯另一個Lisp系統的Lisp代碼(后綴.l或.lisp)
lisp-interaction-mode 用來編輯和運行Emacs Lisp代碼(交互模式)

本文只討論 lisp-interaction-mode模式。

缺省情況下*scratch*就是處于這種模式,無后綴的文件名一般也會讓Emacs進入Lisp交互模式,當然你可以使用變量auto-mode-alist進行設置。

鍵 入 M-x lisp-interaction-mode Enter(回車)可以讓任何buffer進入Lisp交互模式;如要新建一個Lisp交互buffer,只需鍵入C-x b(即switch-to-buffer命令),輸入buffer名,然后令該buffer進入Lisp交互模式。

Lisp交互模式和 Emacs Lisp模式完全一致,除一個重要特性外:C-j已綁定到eval-print-last-sexp命令上。該命令提取point之前的那個S- expression,對其進行評估,然后在buffer里打印結果。如果要使用其它模式里綁定到C-j的常見功能newline-and- indent,你必須按下Enter,并緊跟Tab鍵。

記住 S-expression是任何符合Lisp語法的表達式。因此,可以使用 Lisp交互模式的C-j來檢查變量的值,確認函數定義,運行函數等等。比如,如果你輸入auto-save-interval并按下C-j,就會顯示該 變量的值(缺省為300)。如果你輸入一個defun并在其最右邊的括號后按下C-j,Emacs會保存所定義的函數(供以后調用)并輸出其名稱;這種情 況下,C-j類似C-M-x(即eval-defun命令),不過光標必須位于所定義的函數之后(因為有可能在定義前或中間)。如果你調用了一個函數, Emacs就會評估(運行)該表達式并顯示函數的所有返回值。

Lisp交互模式的C-j提供了很棒的功能,你可以用它來增量方式開發和調試Emacs Lisp代碼;因為Emacs Lisp是種“真正的”Lisp,它甚至可用來開發其它Lisp系統的代碼片斷。

基本Lisp實體

你需要熟悉Lisp基本元素包括函數、變量和atom(原子)。函數是Lisp的唯一程序單元(program unit),涵蓋了其它語言的過程、子程序、程序甚至操作符等標記。

函 數被定義作上述實體的列表(list),通常是對其它現存函數調用的列表。所有函數都有返回值(return value)(類似Perl函數和non-void Java函數);函數的返回值就是list里最后一項的值,一般是最后調用的函數返回的值。在其它函數里的函數調用等價于其它語言的語句 (statement),函數的語法如下:

(function-name argument1 argument2 ...)

等價于Java的:

method_name (argument1, argument2, ...);

這一語法用于所有函數,包括那些等價于其它語言的算術或比較運算符。例如,在Java或Perl里2加4,你會用表達式2+4,而在Lisp里你會使用如下寫法:

(+ 2 4)

類似的,4 >= 2的Lisp方式:

(>= 4 2)

Lisp中的變量和其它語言的相似,不過沒有類型。Lisp變量能夠推測任何類型的值(值本身沒有類型,不過變量對其能存放的內容不加任何限制)。

原子(atom)是個任意類型的值,包括整數、浮點(實)數、字符、字符串、布爾值、符號(symbol)和Emacs特殊類型如buffer、window和process。各種atom的語法如下:
  • 整數:和你常用的一樣,有符號,范圍-2+27至2+27 - 1;
  • 浮點數:可用十進制和科學計數法表示的實數。例如5489可寫成5489、5.489e3、546.9e1等;
  • 字符:以問號開頭,如 ?a 。Esc、Newline和Tab可分別簡寫為\e、\n和\t;其它控制字符可以加\C-前綴來表示,例如C-a表示為?\C-a。整數也可用來表示字符,如ASCII表等。
  • 字符串:用雙引號包圍;字符串里的引號標記和\需要加上\,"Jane said, \"See Dick run.\""是個合法字符串。字符串可以分割成多行,不需特殊語法。結束引號前的所有內容包括所有斷行符都是字符串值的一部分。
  • 布爾值:大部分情況下真值為t,假值為nil,如果能預估到布爾值,則任何非nil值都被看作真值。nil也被用作null或nonvalue。

  • 符號:Lisp實體名,如變量或函數名。有時需要引用實體的名字而非其值,這時可以在名字前加上單引號(')。
setq用來賦值給變量,是個函數,而不象其它語言里用來賦值的專門語法=或:=。setq接收兩個參數:一個變量名和一個值。也可以進行多次賦值,如:
(setq thisvar thisvalue
thatvar thatvalue
theothervar theothervalue)
也可用其它方法設置值或變量,不過setq是使用最廣的方法。

函數定義

首先熟悉一下Lisp語法的特殊表示。- 用作“割斷”字符用來分隔變量、函數等名稱里的字(word),這是Lisp編程慣用法,類似C和Ada里的“_”。

A more important issue has to do with all of the parentheses in Lisp code. Lisp is an old language that was designed before anyone gave much thought to language syntax (it was still considered amazing that you could use any language other than the native processor's binary instruction set), so its syntax is not exactly programmer-friendly. Yet Lisp's heavy use of lists?aand thus its heavy use of parentheses?ahas its advantages, as we'll see toward the end of this chapter.

讓我們從一個實例開始。
1 (defun count-words-buffer ( )
2 (let ((count 0))
3 (save-excursion
4 (goto-char (point-min))
5 (while (< (point) (point-max))
6 (forward-word 1)
7 (setq count (1+ count)))
8 (message "buffer contains %d words." count))))
defun: 指定函數名和參數來定義函數。注意defun本身是一個函數――被調用時,定義一個新函數。(defun返回把所定義的函數作為一個symbol返回。) 函數的參數顯示為在括號內的一個名字list;本例,函數沒有參數。如果在參數前加關鍵字&optional就表示參數是optional(可選 的)。如果參數是optional的,在函數調用時未指定該參數,則認為其值為nil。
(let ((var1 value1) (var2 value2) ... )
statement-block)
let:1.定義(或聲明)一個變量list;2.變量設置初始值,同setq;3.創建一個語句塊(類似函數體),在此塊內這些變量可用,let塊即這些變量的scope(作用域)。let里定義的變量可用setq改變其值,不過要小心使用setq。

save -excursion:Emacs內建函數,保存光標原來的位置(因為 count-words-buffer函數要移動光標以便計算字數)。調用 save-excursion就是要求Emacs記住實例函數開始執行時的光標位置,并在執行完函數體內的所有語句后返回至初始光標位置。

goto -char:Emacs內建函數,其參數是個(內嵌)函數調用,調用內建函數point-min。point是Emacs內部名稱,表示光標的當前位置。 point-min返回當前buffer里第一個字符的位置值,幾乎總是1;這樣goto-char調用時其參數值為1,效果等同于把point移至 buffer起始處。

(while condition statement-block)

和let 及save-excursion一樣,while也建立了一個語句塊。condition是個值(atom、變量或返回一個值的函數)。while對這個 值進行測試,如果其值不是nil,則認為條件(condition)為真,語句塊得以執行,然后condition再次被測試,之后重復上述過程。當然也 可以寫個無限循環,如果你試圖執行這樣的語句,Emacs會掛起,鍵入C-g終止。

在實例函數中,condition是函數 < ,即帶兩個參數的小于函數,類似Java或Perl里的<運算符。第一個參數是另一個函數,它返回point的當前字符位置;第二個參數返回 buffer里的最大(最后)字符位置,即buffer的長度。函數="">< (和其它關系函數)返回一個布爾值,t 或 nil。

上 述循環的語句塊由兩條語句組成。第6行會把point往前移動一個字(word,即相當于M-f)。第7行,循環計數器加一;函數 1+ 是(+ 1 variable-name)的簡寫方式。注意第三個右括號(第7行)和while前面的左括號匹配。這樣,在計算字數時,while循環會讓Emacs 一次一個字(word)遍歷整個當前buffer。

實例函數的最后一個語句使用內建函數message在minibuffer里打印一行信息,提示buffer所含的字數。message函數的格式類似C語言。

Message格式字符串
格式字符串 含義
%s 字符串或symbol
%c 字符
%d 整數
%e 科學計數法表示的浮點數
%f 十進制表示的浮點數
%g 任意格式的浮點數,產生最短的字符串

將Lisp函數變為Emacs命令

函 數 count-words-buffer已編寫完成,接下來該如何運行?在交互模式中,可以把光標移到函數的結束括號,然后鍵入C-j(或 Linefeed),讓Emacs執行函數定義。你應該看到該函數的名字會再次出現在buffer里;defun函數的返回值就是已定義的符號(即函數名 稱)。

函數定義之后,可以在Lisp交互窗口中輸入一行 (count-words-buffer) ,然后在結束括號后再次按下 C-j 。

如 果你象其它Emacs命令一樣用M-x來執行上述函數,M-x count-words-buffer Enter,會得到錯誤提示信息 [No match]。這是因為你并未在Emacs中“注冊”該函數,使其可供交互(interactive)使用。實現這一功能的函數是 interactive ,形式如下:

(interactive "prompt-string")

上述語句必須出現在函數開始處,即緊隨defun和文檔說明字符串所在行之后。使用 interactive 會讓Emacs把函數注冊為一個命令,并提示用戶輸入defun語句中聲明的參數。提示字符串為可選。

提示字符串有一個特殊的格式:你要為想提示用戶輸入的每個參數都提供一段提示字符串,這些段用“\n”分隔。

用于interactive函數的參數代碼
代 碼
提示用戶輸入
b
現存buffer的名稱
e
事件(鼠標動作或 function key press)
f
現存文件的名稱
n
數字(整數)
s
字符串
上述代碼都有一個大寫的變種
B 可能不存在的buffer名稱
F 可能不存在的文件名稱
N
數字,unless command is invoked with a prefix argument, in which case use the prefix argument and skip this prompt
S 符號

示例:
(defun replace-string (from to)
(interactive "sReplace string: \nsReplace string %s with: ")
...)
回 到 count-words-buffer 命令:它不需參數,因此 interactive 命令不需要提示字符串。另外可以再給我們的命令添加一個文檔說明字符串(doc string),它會顯示在describe-function(C-h f)之類的在線幫助工具中。Doc string是普通的Lisp字符串,可選,行數長度任意,不過一般來說,第一行是個簡要完整的句子,說明命令的功能。注意字符串里的任意雙引號前必須加 上 \ 。
(defun count-words-buffer ( )
"Count the number of words in the current buffer;
print a message in the minibuffer with the result."

(interactive)
(save-excursion
(let ((count 0))
(goto-char (point-min))
(while (< (point) (point-max))
(forward-word 1)
(setq count (1+ count)))
(message "buffer contains %d words." count))))

posted on 2006-07-19 11:04 王光平 閱讀(1725) 評論(2)  編輯 收藏 引用 所屬分類: linux世界

評論

# re: 初步認識emacs的lisp編程 2011-12-12 22:43 chenshu

這行代碼看上去不對,(1 + count) => (+ count 1) 才對吧。
(setq count (1+ count)))  回復  更多評論   

# re: 初步認識emacs的lisp編程[未登錄] 2012-02-03 09:40 123

@chenshu
是(1+ )
不是(1 + )  回復  更多評論   

<2008年2月>
272829303112
3456789
10111213141516
17181920212223
2425262728291
2345678

導航

統計

留言簿(4)

隨筆分類

隨筆檔案

搜索

最新評論

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            久热精品在线| 一区二区国产日产| 美女在线一区二区| 久久久亚洲高清| 欧美国产高清| 欧美精品三级| 欧美视频中文字幕在线| 欧美日韩一区二区在线视频 | 老司机一区二区| 免费观看一区| 99国产精品99久久久久久| 99热这里只有成人精品国产| 一区二区精品国产| 香蕉久久a毛片| 亚洲美女少妇无套啪啪呻吟| 亚洲国产日韩欧美在线99| 一个色综合导航| 久久精品麻豆| 日韩视频永久免费观看| 日韩一级精品视频在线观看| aa国产精品| 免费在线看一区| 亚洲一区二区三区影院| 久久久久久久综合狠狠综合| 欧美精品一级| 在线日韩中文| 久久久久国产精品人| 亚洲精品视频在线观看网站| 久久久人成影片一区二区三区观看| 欧美日本久久| 国产精品网站在线观看| 亚洲天堂免费观看| 欧美韩日精品| 99精品欧美| 99爱精品视频| 欧美视频中文字幕在线| 亚洲一区二区三区免费观看| 亚洲美女毛片| 欧美日韩在线视频一区二区| 亚洲视频精选| 亚洲一区二区成人| 国产亚洲精品v| 美女黄毛**国产精品啪啪| 老巨人导航500精品| 亚洲九九爱视频| 一区二区精品在线观看| 国产午夜精品全部视频播放 | 国产亚洲人成网站在线观看| 中日韩美女免费视频网址在线观看| 亚洲日本成人在线观看| 欧美国产亚洲精品久久久8v| 日韩一级精品视频在线观看| 亚洲九九爱视频| 久久久久久久久蜜桃| 免费亚洲一区二区| 亚洲欧美日韩国产综合精品二区| 亚洲欧美综合v| 亚洲黑丝在线| 亚洲欧美在线x视频| 亚洲国产经典视频| 欧美影院精品一区| 亚洲新中文字幕| 夜夜嗨av色综合久久久综合网| 国产日韩欧美不卡在线| 亚洲高清不卡在线| 国产欧美日韩精品在线| 亚洲精品黄网在线观看| 国产精品美女在线| 亚洲大片精品永久免费| 国产亚洲欧美另类中文| 亚洲视频大全| 亚洲欧美日韩区| 欧美精品一区二区在线播放| 久久一区二区三区四区| 国产老肥熟一区二区三区| 一区二区三区久久网| 中文精品视频一区二区在线观看| 亚洲女同精品视频| 亚洲一区二区三区精品动漫| 欧美精品一区二区三区在线播放 | 欧美精品 日韩| 亚洲日本成人| 午夜精品一区二区三区四区| 欧美日本一区| 日韩一级精品视频在线观看| 91久久亚洲| 国产精品久久久久久久久久久久 | 亚洲欧洲日本国产| 久久视频免费观看| 你懂的视频欧美| 亚洲黄色精品| 国产亚洲精品aa| 欧美精品福利| 久久精品一区蜜桃臀影院| 亚洲黄色成人久久久| 亚洲自拍偷拍视频| 国语对白精品一区二区| 欧美激情视频一区二区三区免费| 亚洲日本欧美| 久久久久久999| 亚洲欧美综合精品久久成人| 亚洲国产精品va在线看黑人动漫 | 国产精品乱人伦中文| 欧美一级片在线播放| 久久爱www.| 欧美国产综合视频| 欧美粗暴jizz性欧美20| 国产精品五区| 一区二区三区高清在线| 久久成人免费视频| 国产精品日韩一区二区三区| 久久九九精品99国产精品| 亚洲男人第一网站| 老司机精品导航| 国产精品网站在线观看| 亚洲欧美国产另类| 好看的亚洲午夜视频在线| 久久精品视频免费播放| 午夜精品久久久久久久久久久久久| 国产日韩欧美在线| 欧美在线免费观看视频| 欧美韩日一区二区三区| 免费成人黄色| 国产日本欧美一区二区三区| 免费高清在线一区| 欧美一区二区高清| 久久国产精品99国产| 日韩视频在线免费观看| 欧美激情亚洲精品| 欧美顶级艳妇交换群宴| 美女视频黄免费的久久| 久久精品视频导航| 欧美成年人视频网站| 亚洲精品影院| 亚洲欧美欧美一区二区三区| 亚洲午夜免费视频| 午夜精品久久久久久99热软件| 亚洲一区二区三区免费观看 | 国产精品卡一卡二卡三| 国产日韩欧美一区二区| 精品99一区二区三区| 一区二区三区精密机械公司| 在线亚洲欧美视频| 欧美一区二区在线观看| 另类春色校园亚洲| 亚洲午夜女主播在线直播| 久久久精品日韩欧美| 欧美色精品在线视频| 狠狠色噜噜狠狠狠狠色吗综合| 亚洲视频网在线直播| 久久亚洲欧洲| 一本色道久久88综合日韩精品 | 亚洲天堂男人| 久久久水蜜桃av免费网站| 一区二区三区偷拍| 久久精品夜色噜噜亚洲aⅴ| 亚洲欧洲一区二区三区在线观看 | 美女脱光内衣内裤视频久久影院| 亚洲人成精品久久久久| 久久久蜜桃精品| 欧美日韩中国免费专区在线看| 激情综合亚洲| 久久国产精品久久久久久| 一本综合精品| 国产午夜亚洲精品理论片色戒| 亚洲欧美大片| 性欧美1819sex性高清| 国产午夜精品视频免费不卡69堂| 亚洲欧美日韩精品在线| 亚洲午夜精品久久| 国产日韩一区二区三区在线播放| 亚洲欧美日韩另类| 久久婷婷蜜乳一本欲蜜臀| 久久本道综合色狠狠五月| 亚洲欧洲精品一区二区三区| 欧美激情精品久久久六区热门| 亚洲国产高清在线观看视频| 亚洲激情在线观看视频免费| 欧美日韩精品系列| 久久久中精品2020中文| 玖玖在线精品| 欧美在线视频一区二区| 欧美韩日一区二区| 欧美大成色www永久网站婷| 久久男人资源视频| 国产精品99久久久久久人| 欧美一区二区在线看| 亚洲免费观看视频| 欧美一级黄色网| 欧美在线视频观看| 欧美日韩在线一区二区| 国内视频一区| 欧美伊人久久| 国产一区二区精品| 国产亚洲欧美色| 美女成人午夜| 亚洲男女自偷自拍| 欧美v国产在线一区二区三区| 亚洲国产成人av好男人在线观看| 亚洲电影在线看|