📄 2.html
字号:
w3-mode WWW browser. 在x-win上不满意,但可以接受...<p>
<br>
Tags<p>
Tags 是一个显为人知的功能? 所以我想提一下. 这不是emacs发明的,<br>
而是vi 原本的特异功能. emacs只是发扬光大而已.<br>
假设你有一个目录, 里面是一个程式的原始码, 比如说, tin 的原始码,<br>
放在 ~/tin-1.3beta 下面. 你想看它们.<p>
首先, 叫emacs cd到该目录:<br>
M-x cd<p>
然後, 建立tag table.<br>
tag table 就是一张对照表, 记录哪个符号(variable/function call)<br>
对映到哪个档案的哪个地方. 有这张表, emacs可以让我们快速的在程<br>
式码内游走. 一般这张表是一个档案, 叫作TAGS (大写)<p>
M-! etags *.[ch]<p>
M-! 是执行external shell command的意思. etags就是emacs的建表程式.<br>
你只要告诉它你的source code在那□即可.<p>
vi的话是使用ctags这个程式, 它建出来的档名叫tags (小写). 因为<br>
我们介绍emacs, 所以不管它.<p>
然後, 怎麽看程式? 你知道所有的C 程式都是由main()开始, 所以你想<br>
找到main()在哪个档案. 这时只要按 M-. 然後emacs会问你tag table<br>
在哪里. 因为我们已经cd到该目录, 直接按enter就好了. 然後输入main,<br>
emacs就会把你带到main(){ ... }去.<p>
如果 你看到某个程式片断呼叫一个你没看过的函式, 你可以把游标<br>
移到该函式的名字上, M-. ENTER 就搞定了.<p>
如果 emacs找错了 (比如有变数和函式同名, emacs跳到变数去),<br>
那你可以用 C-u M-. 找下一个.<p>
在编辑程式码的时候, M-SPC 很有用, 它会把游标附近的空白缩成一个.<br>
在其它地方也有效.<p>
Emacs的一些package:<p>
M-x dired (或C-x d)<br>
游走/编辑 目录, 就是档案总管的意思 :)<p>
M-x man 就是man page<br>
M-x shell 开个command prompt, 不过不能跑vi,elm, tin...<br>
M-x gnus 读新闻/读信<br>
M-x rmail 读信<br>
M-x vm view mail<br>
M-x mh-rmail 读信 (package mh-e)<br>
M-x mh-smail 送信 (package mh-e)<p>
强列建议改用emacs读news/bbs. 世界会更美好!<p>
读信的话就要看你的感觉. 这些读信程式都会把信从系统的mail folder<br>
搬到自己的目录下, 占用quota, 我不喜欢 :p 建议elm或mutt.<br>
除非参加mailling list配合procmail. 不然不实用.<br>
用mh-e 须要装mh 这个外部程式, 不太好. 建议vm 或 gnus.<br>
写完信, C-c C-c 就可以送信.<p>
如果你的资料用rcs/sccs作版本管理, emacs自动会起动version control<br>
(minor mode.), c-x c-q 变成check-in/check-out.<p>
如何取得更多的资讯:<p>
Emacs的lisp 经过多年的发展,已成为完整的self-documenting系统.<br>
很多东西都可以线上找到你要的资讯.<p>
前面说过,或者你已经不小心按backspace遇到了, C-h (就是backspace<br>
的ascii码) 在emacs里面是help的意思, 它可以带出一串指令.<br>
常用的有:<p>
C-h F Emacs FAQ<br>
C-h t Emacs 使用教学<br>
C-h n Emacs NEWS file, 介绍最近改版的新功能<br>
C-h i Info system. Info是gnu用来取代man page的系统,<br>
基本上和文字模示的WWW差不多. 有许多重要的资讯<br>
可以在这边找到. 如果你是新手, 建议你在x-win下<br>
看. 不然, 按键 m (menuitem), SPC next page<br>
l (last node: node就是章节的意思) u (up node)<br>
d (directory, 索引). BS (Backspace, back a page).<br>
如果全部只按SPC, 就跟man 一样.<br>
C-h k describe key, 告诉你按这个键执行那个lisp function.<br>
C-h f describe function. 告诉你function在作什麽.<br>
如果只按SPC, emacs会给你所有lisp 函数的列表, 和说明.<br>
C-h v describe variable 同function.<br>
C-h a apropos的意思(approximate). 给lisp function的部份<br>
字串, emacs帮你找.<br>
C-h b 列出目前所有的keybinding<br>
C-h m mode help. 列出目前的mode的特殊说明.<br>
C-c C-h 列出以C-c 开头的所有key-binding. 虽然说Emacs<br>
可以定义按键, 可是Ctrl- 开头的所有组合大概都用光了,<br>
只有C-c算是可以自定指令. 不过有些mode也侵犯这个空间.<br>
目前的convention是C-c <chr> 留给user, C-c C-<chr><br>
留给package.<p>
有以上这些help, 你的emacs/elisp功力会随著时间成长.<p>
<br>
Elisp 简介:<p>
Emacs有三份手册.第一份是使用手册, 第二份是Elisp 手册, 第三份是<br>
Elisp 简介. 第三份的程度是入门级, 值得看. Elisp手册其实也写的<br>
很简单, 还教你lisp, 不过有点长, 适合参考.<p>
因为我lisp没有仔细学过, 所以:<br>
以下所言, 如有巧合, 那才是真的.<p>
Basic data type<br>
字串 (string) "Hello, World"<br>
字元 (char) ?a ; 问号开头<br>
atom & list:<br>
(1 2 3 4) 是一个list, 由 4个 atom 组成.<br>
pair: 中间是句点.<br>
(apple . 2)<br>
alist (associated list)<br>
就是一堆 pair的集合,就像perl/tcl的associative array.<br>
或者说是一个资料库, 一堆 (key, value) pair.<br>
'((Apple . 1)<br>
(Orange . 2)<br>
(PineApple . 3))<br>
vector (?)<br>
emacs 19用vector 来表示按键(key strok sequence)<br>
[f1] [f2] [f1 a]<p>
nil 就是空的list, 或者表示 false<br>
t true<br>
Forms<br>
我们写程式最好有样版让我们填空最简单了.<br>
Form 就是样版, 不过意义不太一样.<br>
Form 就是Elisp 可以接受的句型.<br>
lisp 解译器 预设是对list的每个元素求值(evaluate),<br>
除非是 special form, 有特殊的定义. 比如说<p>
(defun FUNC (ARG-LIST)<br>
BODY ...)<br>
就是一个special form, 用来定义函式, 所以FUNC 不会被<br>
求值, 被当成symbol, ...<p>
(quote (LIST))<p>
这也是个special form, 叫 lisp 把 (LIST)当做symbol就好了,<br>
不要 evaluate.<p>
quote 很常用, 所以有个缩写:<br>
'(LIST) 等於 (quote (LIST))<br>
'Asymbol 可以表示一个Atom, 名称叫Asymbol<p>
set 可以产生/定义新的变数.<br>
(set 'hello 1)<br>
; hello = 1<br>
; 注意我们用 'hello, 所以lisp不会evaluate hello的值.<p>
这家伙很常用, 也有简写.<br>
(setq hello 1)<br>
setq 就是set quote 的缩写. 这是个 special form, 不会对<br>
第二个元素求值.<br>
valuation<p>
在Emacs下, C-x C-e 可以执行(evaluate, 求值)游标左边的叙述.<br>
结果会出现在minibuffer.<p>
lisp-interaction-mode中 C-j 可以evaluate, 并且把结果append到 buffer.<p>
lisp 程式由一堆list 构成.称为expression.<br>
每个expression 都回传回一个值.<br>
有些expression有副作用, 如删掉一个字.<br>
(这跟C 的int delete_char() 意思一样, 它传回int,<br>
并且删掉某个char)<p>
定义函式:<p>
(defun NAME (ARGS-LIST)<br>
"注解" ; optional<br>
(interactive) ; optional<br>
BODY)<p>
定义一个叫NAME的函式. BODY 是一堆expression.<br>
注解是用来给C-h f显示的.<br>
(interactive) 表示这个函示会和user/buffer作用.<br>
(interactive "B") 表示执行此函式先问user一个buffer的名字,<br>
然後当作参数传给它. (如, 当user透过key-binding<br>
或者 M-x 呼叫此函式时)<br>
(interactive "BAppend to buffer: \nr")<br>
问user buffer name时, 提示号 Append to buffer:<br>
此function有两个引数,第一个是B, 就是buffer<br>
第二个是r, region<br>
用\n 隔开.<br>
(interactive "p") 用C-u 设的prefix 把它当作参数传给我.<br>
预设值==4. C-u C-f 向右移四个字<p>
一些lisp 函式:<p>
(list 1 2 3 4) 产生 '(1 2 3 4)<br>
(car '(1 2 3 4) 1<br>
(cdr '(1 2 3 4) '(2 3 4)<br>
(cons 1 '(2 3 4)) '(1 2 3 4)<br>
(cons 1 2) (1 . 2)<br>
(cons 0 (cons 1 (cons 2 nil)))<br>
等於 '(0 1 2)<br>
{list 是用 pair 串起来的,<br>
用C 表示:<br>
pair: {Object *first, Object *second};<br>
*(pair[i].first) == i;<br>
pair[i].second == pair[i+1]; }<p>
(cons '(1 2) '(3 4)) '((1 2) 3 4)<br>
(setq a 1)<br>
(1+ a) ; a+1<br>
(+ 2 a) ; a+2<br>
(* 1 2 3 4)<br>
(current-buffer) ; 传回目前buffer的资料物件<br>
(switch-to-buffer (other-buffer))<br>
(set-buffer)<br>
(buffer-size)<br>
(setq current-pos (point))<br>
(point-min)<br>
(point-max)<br>
(message "Hello") ; 在minibuffer显示Hello<br>
(if (test)<br>
(then-part)<br>
(else-part))<br>
(cond ((test1) BODY1)<br>
((test2) BODY2)<br>
(t OTHER-WISE)<br>
(let ((var1 value) ; local variable<br>
var2 ; no value<br>
(var3 value)<br>
...)<br>
BODY ...)<br>
(lambda (ARG-LIST) ...) 同 defun, 但是没有名字 (anonymous).<br>
可以存到变数去:<br>
(setq hello (lambda () (message "Hello,World")))<br>
(funcall hello)<br>
(goto-char (point-max))<br>
(defvar VAR VALUE "*注解") 如果VAR 不存在才定义. 有注解可以用<br>
C-h v 看. 注解打*号表是使用者可以直接改/ 这个变数本来就是<br>
给使用者设定用的.<br>
可以用 M-x edit-options 来线上设定 (emacs结束就没有了,<br>
不过edit-options可以给你所有可修改的变数的列表,你可以<br>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -