emacs

表格计算和

org-table-sum

计算完成后,结果会显示在minibuffer中,并且复制在剪切板中。

| index | name     | age |
|-------+----------+-----|
|     1 | xiaodong |  33 |
|     2 | xiaowang |  44 |
|     3 | wangsan  |  32 |
|     4 | zhangsi  |  22 |
|     5 | liqi     |  43 |
|     6 | total    | 174 |

hook

通常major-mode会提供一个hook,命令规范通常是mode的名字加上-hook,进入该mode后会调用hook中添加的函数。

可以使用setq来设置hook变量,如 (setq 'text-mode-hook (lambda () (...))), 推荐使用add-hook,如(add-hook 'text-mode-hook (lambda () (...)))

列表基本函数

car 是 “contents of the address part of the register”(寄存器地址部分的内容)
cons 是"construct"(构造)
cdr 是"contents of decrement part of the register"(寄存器后部内容)

car

一个列表的car,返回该列表的第一个元素,car为非破坏性的函数。

(car '(rose violet daisy buttercup))
返回
rose

cdr

一个列表的cdr返回除该列表的第一 个元素外的所有内容。

(cdr '(rose violet daisy buttercup))

返回
(violet daisy buttercup)

cons

cons将一个元素放到一个列表的开始处,它往 列表中插入元素.
空列表不能作为第一个参量,因为空列表什么也没有。

(cons 'buffercup ())
输出
(buffercup)

查询列表的长度

使用length函数,返回一个列表中有多少个元素。
如:

(length '(buttercup))

一般来说,使用length作用于非列表对象,会得到一个错误消息。不过,个人测试字符串,可以成功。

nthcdr函数

该函数功能类似于cdr, 不过该函数带有参数n,表示移除去n个元素的列表.该函数是非破坏性的。

如:

(nthcdr 2 '(pine fir oak maple))
返回
(oak maple)

(nthcdr 0 '(pine fir oak  maple))
返回
(pine fir oak maple)

(nthcdr 5 '(pine fir oak maple))
返回
nil

setcar

使用新元素代替列表中的第一个元素,使用空列表会报错。

(setq animals '(giraffe antelope tiger lion))

(setcar animals 'newelement)

输出animals
(newelement antelope tiger lion)

setcdr函数

与setcar函数类似,不同之处在于它替换的是第二个及以后的元素,而不是第一个。

(setq animals '(giraffe antelope tiger lion))

(setcdr animals 'newelement)

输出
(giraffe newelement)

顺序控制函数

let*

let与let函数类似,区别在于let声明中就能使用前面声明的变量,如:

(defun circle-area (radix)
    "get the area of circle"
    (let* ((pi 3.1415926)
             (area  (* pi radix radix)))
    (message "area:%f" area)))

lambda表达式

lambda格式与defun完全一样。如:

(lambda (arguments-list)
    "documents string"
    body...)

调用方式

(funcall (lambda (name)
    (message "name:%s" name)) "zhangsan")

;;;;;同时,可以将lambda表达式赋值给其它变量
(setq fun (lambda (name)
                   (message "name:%s" name)))
(funcall fun "zhangsan")

progn

将多个表达式顺序执行,格式:

(progn 
    (setq name "zhangsan")
    (message "name:%s" name))

条件判断

(if condition
    then-statement
    else-statement)

(cond 
    (case1 do-when-case1)
    (case2 do-when-case2)
    ...)

;;;;递归实现斐波那契函数
(defun fib (n)
  (cond ((= n 1) 1)
        ((= n 0) 0)
        (t (+ (fib (1- n))
              (fib (- n 2))))))

循环

格式如下:

(while condition
    body)

(defun factorial (n)
    (let ((res 1))
       (while  (> n 0)
           (setq res (* res n)
                    n (-n 1)))
    res))
    
;;;;;;打印列表元素
(defun print-element-of-list (list)
    (while list
        (print (car list))
        (setq list (cdr list))))

逻辑运算

与其它语言类似,使用and, or, not. and, or也具有短路性质。

字符

在emacs中,字符就是整数。但是目前字符串中的字符被限制在 0-524287 之间。如:

?A             ;; 65
?a             ;; 97

字符比较测试

;;;;;;;比较两个字符是否一致
(char-equal ?a ?a)

;;;;;成功返回t,失败返回nil
(string< "abc" "abc")
(string= "abc" "abc")
(string> "ab" "aa")

;;;;;;;;判断一个对象是不是字符串或者nil,成功返回t
(string-or-null-p var) 

;;;;;;;判断一个对象是不是字符或者字符串
(char-or-string-p var)

;;;;;;;;;判断字符串是否为空
(string-empty-p var)

构造函数

(make-string 5  ?x)     ;;; "xxxxx"
(string ?a ?b ?c)         ;;;; "abc"


;;;;;;;根据已有字符串生成
(concat "abc" "def")      ;;;;; "abcdef"
(substring "01234567" 3) ;;;;;;;;; "34567"
(substring "0123456789" 3 5)      ;;;;; "34"

转换函数

;;;;;;;;;字符,字符串互转
(string-to-char "a")
(char-to-string ?a)

;;;;;;字符串,数字
(string-to-number "256")
(number-to-string 256)
(format "%#o" 256)     ;;; "0400"
(format "%#x"  256)    ;;;; "0x100"

;;;;;; 列表或向量与字符串
(vconcat "abdef") ;;;;;;;[ 97 98 100 101 102]
(append "abcdef" nil)    ;;;;;;;;;;;(97 98 99 100 101 102)
(concat '(?a ?b ?c ?d ?e)) ;;;;;;;; "abcde"

大小写

(downcase "What Is Your Name") ;;;;;;;;; "what is your name"
(downcase ?A)            ;;;;;;;;;;;;;;;; 97
(upcase "what is your name")       ;;;;;;;;; "WHAT IS YOUR NAME"
(upcase ?a)                 ;;;;;;;;;;;;;;;;;; 65

(capitalize "what is your name") ;;;;;;;;;;; "What Is Your Name"

字符串比较

;;;;;;;;; string-match的参量是一个regexp
(string-match "34" "01234567890") ;;;;;;;; 3

(string-match "2*" "232*2=696")      ;;;;;;;; 0
(string-match (regexp-quote "2*") "232*2=696")   ;;;;;;;;;2
;;;;;;;; 在匹配到数据后,会记录匹配的位置,可以用match-data, match-beginning, match-end等函数来访问

你可能感兴趣的:(emacs)