2013-06-12 95 views
1

我從來沒有寫過emacs功能,並想知道是否有人可以幫助我開始。我想有一個函數需要一個突出顯示的區域來解析它(通過「,」),然後用已經內置到emacs中的另一個函數來評估每個塊。emacs的基本功能

突出顯示的代碼可能看起來像這樣:x <- function(w=NULL,y=1,z=20){}(R代碼),我想刮出來w=NULLy=1z=20然後通過每一個功能已經包含emacs的。有關如何開始的任何建議? ( - 「汗一品脫保存的血液一加侖」你真的應該閱讀the elisp intro,它會爲你節省大量的時間)

回答

9

Lisp的功能是使用defun定義。

要打開一個單純的功能成interactive command(其可以使用M-X被調用或結合的鍵),可以使用interactive

該地區(選擇)傳遞給函數,使用"r"代碼:

(defun my-command (beg end) 
    "Operate on each word in the region." 
    (interactive "r") 
    (mapC#'the-emacs-function-you-want-to-call-on-each-arg 
     ;; split the string on any sequence of spaces and commas 
     (split-string (buffer-substring-no-properties beg end) "[ ,]+"))) 

現在,複製上面的形式向*scratch* emacs buffer,將點(光標)上的功能,也就是說, mapcsplit-string,然後點擊通過RET,您將看到一個解釋該功能的*Help* buffer

而點就可以了(不要忘記一些有意義的事來代替the-emacs-function-you-want-to-call-on-each-arg),然後測試是通過選擇w=NULL,y=1,z=20,打的Mx我的命令RET您可以評估通過敲擊CMx的函數定義。

順便提及,C-H˚F我的指令RET現在將示出了在*Help*緩衝器Operate on each word in the region

+0

我相信#是不必要的。從elisp手冊,第12.7節。 「讀取語法'#''是使用'function'的一個簡短手段。以下形式全部等同於: (lambda(x)(* xx)) (function(lambda(x)(* xx )) #'(lambda(x)(* xx))「 – seanmcl

+0

@seanmcl:'lambda'是一個非常特殊的情況。在ELisp(但不是其他的Lisp!)(但不一定是將來!)中,確實'#'foo'和''foo'是等價的,但是在處理函數調用時,應該使用前者。 – sds

+0

你能否解釋爲什麼(對於其他lisps)#應該被使用?從ML/Haskell背景來看,將一個函數與其他數據區別對待似乎很奇怪。當#被省略時(函數與變量)是否讀取不同的單元格? – seanmcl