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

初步認(rèn)識(shí)emacs的lisp編程

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

Emacs有三種Lisp模式,其命令名稱(chēng)如下:

emacs-lisp-mode 用于Emacs Lisp代碼的編輯(文件名.emacs或后綴.el)
lisp-mode 用來(lái)編輯另一個(gè)Lisp系統(tǒng)的Lisp代碼(后綴.l或.lisp)
lisp-interaction-mode 用來(lái)編輯和運(yùn)行Emacs Lisp代碼(交互模式)

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

缺省情況下*scratch*就是處于這種模式,無(wú)后綴的文件名一般也會(huì)讓Emacs進(jìn)入Lisp交互模式,當(dāng)然你可以使用變量auto-mode-alist進(jìn)行設(shè)置。

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

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

記住 S-expression是任何符合Lisp語(yǔ)法的表達(dá)式。因此,可以使用 Lisp交互模式的C-j來(lái)檢查變量的值,確認(rèn)函數(shù)定義,運(yùn)行函數(shù)等等。比如,如果你輸入auto-save-interval并按下C-j,就會(huì)顯示該 變量的值(缺省為300)。如果你輸入一個(gè)defun并在其最右邊的括號(hào)后按下C-j,Emacs會(huì)保存所定義的函數(shù)(供以后調(diào)用)并輸出其名稱(chēng);這種情 況下,C-j類(lèi)似C-M-x(即eval-defun命令),不過(guò)光標(biāo)必須位于所定義的函數(shù)之后(因?yàn)橛锌赡茉诙x前或中間)。如果你調(diào)用了一個(gè)函數(shù), Emacs就會(huì)評(píng)估(運(yùn)行)該表達(dá)式并顯示函數(shù)的所有返回值。

Lisp交互模式的C-j提供了很棒的功能,你可以用它來(lái)增量方式開(kāi)發(fā)和調(diào)試Emacs Lisp代碼;因?yàn)镋macs Lisp是種“真正的”Lisp,它甚至可用來(lái)開(kāi)發(fā)其它Lisp系統(tǒng)的代碼片斷。

基本Lisp實(shí)體

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

函 數(shù)被定義作上述實(shí)體的列表(list),通常是對(duì)其它現(xiàn)存函數(shù)調(diào)用的列表。所有函數(shù)都有返回值(return value)(類(lèi)似Perl函數(shù)和non-void Java函數(shù));函數(shù)的返回值就是list里最后一項(xiàng)的值,一般是最后調(diào)用的函數(shù)返回的值。在其它函數(shù)里的函數(shù)調(diào)用等價(jià)于其它語(yǔ)言的語(yǔ)句 (statement),函數(shù)的語(yǔ)法如下:

(function-name argument1 argument2 ...)

等價(jià)于Java的:

method_name (argument1, argument2, ...);

這一語(yǔ)法用于所有函數(shù),包括那些等價(jià)于其它語(yǔ)言的算術(shù)或比較運(yùn)算符。例如,在Java或Perl里2加4,你會(huì)用表達(dá)式2+4,而在Lisp里你會(huì)使用如下寫(xiě)法:

(+ 2 4)

類(lèi)似的,4 >= 2的Lisp方式:

(>= 4 2)

Lisp中的變量和其它語(yǔ)言的相似,不過(guò)沒(méi)有類(lèi)型。Lisp變量能夠推測(cè)任何類(lèi)型的值(值本身沒(méi)有類(lèi)型,不過(guò)變量對(duì)其能存放的內(nèi)容不加任何限制)。

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

  • 符號(hào):Lisp實(shí)體名,如變量或函數(shù)名。有時(shí)需要引用實(shí)體的名字而非其值,這時(shí)可以在名字前加上單引號(hào)(')。
setq用來(lái)賦值給變量,是個(gè)函數(shù),而不象其它語(yǔ)言里用來(lái)賦值的專(zhuān)門(mén)語(yǔ)法=或:=。setq接收兩個(gè)參數(shù):一個(gè)變量名和一個(gè)值。也可以進(jìn)行多次賦值,如:
(setq thisvar thisvalue
thatvar thatvalue
theothervar theothervalue)
也可用其它方法設(shè)置值或變量,不過(guò)setq是使用最廣的方法。

函數(shù)定義

首先熟悉一下Lisp語(yǔ)法的特殊表示。- 用作“割斷”字符用來(lái)分隔變量、函數(shù)等名稱(chēng)里的字(word),這是Lisp編程慣用法,類(lèi)似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.

讓我們從一個(gè)實(shí)例開(kāi)始。
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: 指定函數(shù)名和參數(shù)來(lái)定義函數(shù)。注意defun本身是一個(gè)函數(shù)――被調(diào)用時(shí),定義一個(gè)新函數(shù)。(defun返回把所定義的函數(shù)作為一個(gè)symbol返回。) 函數(shù)的參數(shù)顯示為在括號(hào)內(nèi)的一個(gè)名字list;本例,函數(shù)沒(méi)有參數(shù)。如果在參數(shù)前加關(guān)鍵字&optional就表示參數(shù)是optional(可選 的)。如果參數(shù)是optional的,在函數(shù)調(diào)用時(shí)未指定該參數(shù),則認(rèn)為其值為nil。
(let ((var1 value1) (var2 value2) ... )
statement-block)
let:1.定義(或聲明)一個(gè)變量list;2.變量設(shè)置初始值,同setq;3.創(chuàng)建一個(gè)語(yǔ)句塊(類(lèi)似函數(shù)體),在此塊內(nèi)這些變量可用,let塊即這些變量的scope(作用域)。let里定義的變量可用setq改變其值,不過(guò)要小心使用setq。

save -excursion:Emacs內(nèi)建函數(shù),保存光標(biāo)原來(lái)的位置(因?yàn)?count-words-buffer函數(shù)要移動(dòng)光標(biāo)以便計(jì)算字?jǐn)?shù))。調(diào)用 save-excursion就是要求Emacs記住實(shí)例函數(shù)開(kāi)始執(zhí)行時(shí)的光標(biāo)位置,并在執(zhí)行完函數(shù)體內(nèi)的所有語(yǔ)句后返回至初始光標(biāo)位置。

goto -char:Emacs內(nèi)建函數(shù),其參數(shù)是個(gè)(內(nèi)嵌)函數(shù)調(diào)用,調(diào)用內(nèi)建函數(shù)point-min。point是Emacs內(nèi)部名稱(chēng),表示光標(biāo)的當(dāng)前位置。 point-min返回當(dāng)前buffer里第一個(gè)字符的位置值,幾乎總是1;這樣goto-char調(diào)用時(shí)其參數(shù)值為1,效果等同于把point移至 buffer起始處。

(while condition statement-block)

和let 及save-excursion一樣,while也建立了一個(gè)語(yǔ)句塊。condition是個(gè)值(atom、變量或返回一個(gè)值的函數(shù))。while對(duì)這個(gè) 值進(jìn)行測(cè)試,如果其值不是nil,則認(rèn)為條件(condition)為真,語(yǔ)句塊得以執(zhí)行,然后condition再次被測(cè)試,之后重復(fù)上述過(guò)程。當(dāng)然也 可以寫(xiě)個(gè)無(wú)限循環(huán),如果你試圖執(zhí)行這樣的語(yǔ)句,Emacs會(huì)掛起,鍵入C-g終止。

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

上 述循環(huán)的語(yǔ)句塊由兩條語(yǔ)句組成。第6行會(huì)把point往前移動(dòng)一個(gè)字(word,即相當(dāng)于M-f)。第7行,循環(huán)計(jì)數(shù)器加一;函數(shù) 1+ 是(+ 1 variable-name)的簡(jiǎn)寫(xiě)方式。注意第三個(gè)右括號(hào)(第7行)和while前面的左括號(hào)匹配。這樣,在計(jì)算字?jǐn)?shù)時(shí),while循環(huán)會(huì)讓Emacs 一次一個(gè)字(word)遍歷整個(gè)當(dāng)前buffer。

實(shí)例函數(shù)的最后一個(gè)語(yǔ)句使用內(nèi)建函數(shù)message在minibuffer里打印一行信息,提示buffer所含的字?jǐn)?shù)。message函數(shù)的格式類(lèi)似C語(yǔ)言。

Message格式字符串
格式字符串 含義
%s 字符串或symbol
%c 字符
%d 整數(shù)
%e 科學(xué)計(jì)數(shù)法表示的浮點(diǎn)數(shù)
%f 十進(jìn)制表示的浮點(diǎn)數(shù)
%g 任意格式的浮點(diǎn)數(shù),產(chǎn)生最短的字符串

將Lisp函數(shù)變?yōu)镋macs命令

函 數(shù) count-words-buffer已編寫(xiě)完成,接下來(lái)該如何運(yùn)行?在交互模式中,可以把光標(biāo)移到函數(shù)的結(jié)束括號(hào),然后鍵入C-j(或 Linefeed),讓Emacs執(zhí)行函數(shù)定義。你應(yīng)該看到該函數(shù)的名字會(huì)再次出現(xiàn)在buffer里;defun函數(shù)的返回值就是已定義的符號(hào)(即函數(shù)名 稱(chēng))。

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

如 果你象其它Emacs命令一樣用M-x來(lái)執(zhí)行上述函數(shù),M-x count-words-buffer Enter,會(huì)得到錯(cuò)誤提示信息 [No match]。這是因?yàn)槟悴⑽丛贓macs中“注冊(cè)”該函數(shù),使其可供交互(interactive)使用。實(shí)現(xiàn)這一功能的函數(shù)是 interactive ,形式如下:

(interactive "prompt-string")

上述語(yǔ)句必須出現(xiàn)在函數(shù)開(kāi)始處,即緊隨defun和文檔說(shuō)明字符串所在行之后。使用 interactive 會(huì)讓Emacs把函數(shù)注冊(cè)為一個(gè)命令,并提示用戶(hù)輸入defun語(yǔ)句中聲明的參數(shù)。提示字符串為可選。

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

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

示例:
(defun replace-string (from to)
(interactive "sReplace string: \nsReplace string %s with: ")
...)
回 到 count-words-buffer 命令:它不需參數(shù),因此 interactive 命令不需要提示字符串。另外可以再給我們的命令添加一個(gè)文檔說(shuō)明字符串(doc string),它會(huì)顯示在describe-function(C-h f)之類(lèi)的在線(xiàn)幫助工具中。Doc string是普通的Lisp字符串,可選,行數(shù)長(zhǎng)度任意,不過(guò)一般來(lái)說(shuō),第一行是個(gè)簡(jiǎn)要完整的句子,說(shuō)明命令的功能。注意字符串里的任意雙引號(hào)前必須加 上 \ 。
(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 王光平 閱讀(1719) 評(píng)論(2)  編輯 收藏 引用 所屬分類(lèi): linux世界

評(píng)論

# re: 初步認(rèn)識(shí)emacs的lisp編程 2011-12-12 22:43 chenshu

這行代碼看上去不對(duì),(1 + count) => (+ count 1) 才對(duì)吧。
(setq count (1+ count)))  回復(fù)  更多評(píng)論   

# re: 初步認(rèn)識(shí)emacs的lisp編程[未登錄](méi) 2012-02-03 09:40 123

@chenshu
是(1+ )
不是(1 + )  回復(fù)  更多評(píng)論   

<2009年8月>
2627282930311
2345678
9101112131415
16171819202122
23242526272829
303112345

導(dǎo)航

統(tǒng)計(jì)

留言簿(4)

隨筆分類(lèi)

隨筆檔案

搜索

最新評(píng)論

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            久久综合九色欧美综合狠狠| 亚洲午夜久久久| 久久麻豆一区二区| 久久久久久97三级| 亚洲精品123区| 日韩视频一区二区在线观看 | 亚欧美中日韩视频| 国产亚洲在线| 欧美电影资源| 欧美日韩国产成人在线免费| 香蕉精品999视频一区二区| 亚洲一卡久久| 亚洲福利在线视频| 99视频精品在线| 国产一区二区无遮挡| 欧美成人综合网站| 欧美日韩直播| 玖玖在线精品| 欧美三级午夜理伦三级中文幕 | 亚洲高清在线观看| 亚洲免费观看视频| 国产一区二区三区高清在线观看| 欧美国产一区在线| 亚洲在线中文字幕| 国产午夜精品久久久久久免费视 | 欧美一区永久视频免费观看| 亚洲欧洲日本国产| 翔田千里一区二区| 亚洲精品欧美在线| 性色av一区二区三区| 亚洲精品久久视频| 久久国产一二区| 亚洲免费在线观看| 欧美岛国激情| 久久在线免费观看| 国产精品美女www爽爽爽| 亚洲高清av在线| 国产嫩草一区二区三区在线观看| 亚洲高清久久网| 狠狠色狠狠色综合人人| 亚洲视频在线观看网站| 最新中文字幕一区二区三区| 午夜精品一区二区三区在线播放| 一区二区三区日韩精品| 免费不卡中文字幕视频| 久久色中文字幕| 国产一区二区剧情av在线| 一区二区三区蜜桃网| 亚洲人体一区| 欧美成人嫩草网站| 免费在线看一区| 韩国一区电影| 午夜视频一区二区| 性欧美精品高清| 国产精品免费看久久久香蕉| 一区二区高清视频在线观看| 一本一本久久a久久精品综合麻豆 一本一本久久a久久精品牛牛影视 | 蜜臀av国产精品久久久久| 久久综合狠狠综合久久激情| 国产一区二区三区四区hd| 午夜精品一区二区三区在线| 午夜综合激情| 国产无遮挡一区二区三区毛片日本| 亚洲一级在线| 久久精品1区| 激情成人av| 玖玖综合伊人| 亚洲高清视频在线| 亚洲美洲欧洲综合国产一区| 欧美日韩第一区| 一区二区激情视频| 欧美一区二区三区的| 国产情侣一区| 久久久水蜜桃| 亚洲国产美女| 亚洲一区三区视频在线观看| 国产精品一区二区男女羞羞无遮挡| 亚洲欧美日韩电影| 久久久久亚洲综合| 亚洲三级免费观看| 欧美天天影院| 久久精品国产清高在天天线| 欧美a级大片| 国产精品99久久久久久宅男| 亚洲精品乱码久久久久久黑人| 亚洲精品三级| 9i看片成人免费高清| 国产精品免费观看视频| 欧美中文字幕在线观看| 久久综合一区二区| aa级大片欧美三级| 国产欧美一级| 欧美91大片| 亚洲欧美日韩天堂| 亚洲第一伊人| 久久国产欧美精品| 亚洲精品国久久99热| 国产精品天天摸av网| 久久在线播放| 亚洲一级黄色| 亚洲国产高清在线观看视频| 小辣椒精品导航| 亚洲高清在线精品| 国产精品日日摸夜夜摸av| 久久久久久久性| 亚洲色在线视频| 欧美va亚洲va香蕉在线| 亚洲一区二区三区777| 欲色影视综合吧| 国产精品爽爽ⅴa在线观看| 久久视频在线看| 午夜久久久久久| 亚洲最快最全在线视频| 欧美成人国产| 久久精品国产99国产精品澳门| 99精品视频免费观看视频| 尤物yw午夜国产精品视频明星| 欧美亚洲成人网| 欧美日韩二区三区| 蜜臀91精品一区二区三区| 久久精视频免费在线久久完整在线看| 99视频一区二区三区| 亚洲国产高清aⅴ视频| 免费在线欧美黄色| 久久久99免费视频| 香蕉成人久久| 小黄鸭精品密入口导航| 亚洲丝袜av一区| 99综合电影在线视频| 亚洲精品国产精品国自产在线 | 在线免费观看欧美| 国外成人在线视频网站| 国产亚洲精品一区二555| 国产精品日日摸夜夜添夜夜av| 欧美三级欧美一级| 欧美精品一区三区| 欧美另类极品videosbest最新版本| 久久精品视频亚洲| 久久免费视频观看| 久久婷婷国产综合国色天香| 久久人人爽人人爽| 你懂的国产精品永久在线| 狼狼综合久久久久综合网| 久久亚洲国产成人| 蜜臀99久久精品久久久久久软件| 巨乳诱惑日韩免费av| 欧美不卡福利| 欧美日韩国产成人在线| 国产精品vip| 国产免费成人在线视频| 国产亚洲va综合人人澡精品| 国产亚洲观看| 1204国产成人精品视频| 亚洲人妖在线| 亚洲欧美日韩一区二区| 欧美中文字幕在线播放| 久久影视精品| 亚洲欧洲日产国码二区| 中日韩视频在线观看| 亚洲激情图片小说视频| 欧美日韩在线电影| 国产精品亚洲片夜色在线| 国产精品制服诱惑| 国产午夜精品理论片a级探花 | 欧美成人中文字幕| 欧美视频一区| 狠狠干成人综合网| 亚洲乱码久久| 欧美一区二区在线免费播放| 老鸭窝毛片一区二区三区| 亚洲精品美女91| 欧美影院成人| 欧美麻豆久久久久久中文| 国产精自产拍久久久久久| 亚洲第一页自拍| 亚洲在线播放| 免费不卡在线观看| 在线一区二区三区四区五区| 久久激情五月婷婷| 欧美日韩亚洲综合| 亚洲第一成人在线| 西瓜成人精品人成网站| 91久久精品一区二区三区| 欧美一级二级三级蜜桃| 欧美精品乱人伦久久久久久| 国产亚洲欧美一区二区三区| 日韩午夜在线| 免费不卡亚洲欧美| 亚洲欧美日韩区| 欧美性色aⅴ视频一区日韩精品| 狠狠色丁香婷婷综合影院| 亚洲欧美日韩在线不卡| 亚洲丰满在线| 久久久最新网址| 国产日韩成人精品| 亚洲先锋成人| 99re热这里只有精品视频| 麻豆成人综合网| 激情成人在线视频| 欧美一区二区视频在线|