⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 2.html

📁 网上一个牛人整理的关于linux内核编译
💻 HTML
📖 第 1 页 / 共 5 页
字号:
&nbsp;&nbsp;&nbsp; w3-mode&nbsp;&nbsp;&nbsp;&nbsp; WWW browser. 在x-win上不满意,但可以接受...<p>
<br>
Tags<p>
Tags 是一个显为人知的功能? 所以我想提一下. 这不是emacs发明的,<br>
而是vi 原本的特异功能. emacs只是发扬光大而已.<br>
假设你有一个目录, 里面是一个程式的原始码, 比如说, tin 的原始码,<br>
放在 ~/tin-1.3beta 下面. 你想看它们.<p>
首先, 叫emacs cd到该目录:<br>
&nbsp;&nbsp;&nbsp; M-x cd<p>
然後, 建立tag table.<br>
tag table 就是一张对照表, 记录哪个符号(variable/function call)<br>
对映到哪个档案的哪个地方. 有这张表, emacs可以让我们快速的在程<br>
式码内游走. 一般这张表是一个档案, 叫作TAGS (大写)<p>
&nbsp;&nbsp; M-! etags *.[ch]<p>
M-! 是执行external shell command的意思. etags就是emacs的建表程式.<br>
你只要告诉它你的source code在那□即可.<p>
vi的话是使用ctags这个程式, 它建出来的档名叫tags (小写). 因为<br>
我们介绍emacs, 所以不管它.<p>
然後, 怎麽看程式? 你知道所有的C 程式都是由main()开始, 所以你想<br>
找到main()在哪个档案. 这时只要按&nbsp; 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&nbsp; (或C-x d)<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 游走/编辑 目录, 就是档案总管的意思 :)<p>
M-x man&nbsp;&nbsp; 就是man page<br>
M-x shell 开个command prompt, 不过不能跑vi,elm, tin...<br>
M-x gnus&nbsp; 读新闻/读信<br>
M-x rmail 读信<br>
M-x vm&nbsp;&nbsp;&nbsp; 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>
&nbsp;&nbsp; C-h F&nbsp;&nbsp; Emacs FAQ<br>
&nbsp;&nbsp; C-h t&nbsp;&nbsp; Emacs 使用教学<br>
&nbsp;&nbsp; C-h n&nbsp;&nbsp; Emacs NEWS file, 介绍最近改版的新功能<br>
&nbsp;&nbsp; C-h i&nbsp;&nbsp; Info system. Info是gnu用来取代man page的系统,<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 基本上和文字模示的WWW差不多. 有许多重要的资讯<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 可以在这边找到. 如果你是新手, 建议你在x-win下<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 看. 不然, 按键 m (menuitem), SPC next page<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; l (last node: node就是章节的意思) u (up node)<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; d (directory, 索引). BS (Backspace, back a page).<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 如果全部只按SPC, 就跟man 一样.<br>
&nbsp;&nbsp; C-h k&nbsp;&nbsp; describe key, 告诉你按这个键执行那个lisp function.<br>
&nbsp;&nbsp; C-h f&nbsp;&nbsp; describe function. 告诉你function在作什麽.<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 如果只按SPC, emacs会给你所有lisp 函数的列表, 和说明.<br>
&nbsp;&nbsp; C-h v&nbsp;&nbsp; describe variable 同function.<br>
&nbsp;&nbsp; C-h a&nbsp;&nbsp; apropos的意思(approximate).&nbsp; 给lisp function的部份<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 字串, emacs帮你找.<br>
&nbsp;&nbsp; C-h b&nbsp;&nbsp; 列出目前所有的keybinding<br>
&nbsp;&nbsp; C-h m&nbsp;&nbsp; mode help. 列出目前的mode的特殊说明.<br>
&nbsp;&nbsp; C-c C-h 列出以C-c 开头的所有key-binding. 虽然说Emacs<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 可以定义按键, 可是Ctrl- 开头的所有组合大概都用光了,<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 只有C-c算是可以自定指令. 不过有些mode也侵犯这个空间.<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 目前的convention是C-c &lt;chr&gt; 留给user, C-c C-&lt;chr&gt;<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 留给package.<p>
有以上这些help, 你的emacs/elisp功力会随著时间成长.<p>
<br>
Elisp 简介:<p>
Emacs有三份手册.第一份是使用手册, 第二份是Elisp 手册, 第三份是<br>
Elisp 简介.&nbsp; 第三份的程度是入门级, 值得看. Elisp手册其实也写的<br>
很简单, 还教你lisp, 不过有点长, 适合参考.<p>
因为我lisp没有仔细学过, 所以:<br>
以下所言, 如有巧合, 那才是真的.<p>
Basic data type<br>
&nbsp; 字串 (string) &quot;Hello, World&quot;<br>
&nbsp; 字元 (char)&nbsp; ?a&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ; 问号开头<br>
&nbsp; atom &amp; list:<br>
&nbsp;&nbsp;&nbsp;&nbsp; (1 2 3 4)&nbsp; 是一个list, 由 4个 atom 组成.<br>
&nbsp; pair:&nbsp; 中间是句点.<br>
&nbsp;&nbsp;&nbsp;&nbsp; (apple . 2)<br>
 alist (associated list)<br>
&nbsp;&nbsp;&nbsp;&nbsp; 就是一堆 pair的集合,就像perl/tcl的associative array.<br>
&nbsp;&nbsp;&nbsp;&nbsp; 或者说是一个资料库, 一堆 (key, value) pair.<br>
&nbsp;&nbsp;&nbsp;&nbsp; '((Apple&nbsp;&nbsp;&nbsp;&nbsp; . 1)<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (Orange&nbsp;&nbsp;&nbsp; . 2)<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (PineApple . 3))<br>
&nbsp; vector (?)<br>
&nbsp;&nbsp;&nbsp;&nbsp; emacs 19用vector 来表示按键(key strok sequence)<br>
&nbsp;&nbsp;&nbsp;&nbsp; [f1] [f2] [f1 a]<p>
&nbsp; nil&nbsp; 就是空的list, 或者表示 false<br>
&nbsp; t&nbsp;&nbsp;&nbsp; true<br>
Forms<br>
&nbsp; 我们写程式最好有样版让我们填空最简单了.<br>
&nbsp; Form 就是样版, 不过意义不太一样.<br>
&nbsp; Form 就是Elisp 可以接受的句型.<br>
&nbsp; lisp 解译器 预设是对list的每个元素求值(evaluate),<br>
&nbsp; 除非是 special form, 有特殊的定义. 比如说<p>
&nbsp; (defun FUNC (ARG-LIST)<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; BODY ...)<br>
 就是一个special form, 用来定义函式, 所以FUNC 不会被<br>
&nbsp; 求值, 被当成symbol, ...<p>
&nbsp; (quote (LIST))<p>
&nbsp; 这也是个special form, 叫 lisp 把 (LIST)当做symbol就好了,<br>
&nbsp; 不要 evaluate.<p>
&nbsp; quote 很常用, 所以有个缩写:<br>
&nbsp; '(LIST)&nbsp; 等於 (quote (LIST))<br>
&nbsp; 'Asymbol 可以表示一个Atom, 名称叫Asymbol<p>
&nbsp; set 可以产生/定义新的变数.<br>
&nbsp; (set 'hello 1)<br>
&nbsp; ; hello = 1<br>
&nbsp; ; 注意我们用 'hello, 所以lisp不会evaluate hello的值.<p>
&nbsp; 这家伙很常用, 也有简写.<br>
&nbsp; (setq hello 1)<br>
&nbsp; setq 就是set quote 的缩写. 这是个 special form, 不会对<br>
&nbsp; 第二个元素求值.<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>
&nbsp; (这跟C 的int delete_char() 意思一样, 它传回int,<br>
&nbsp;&nbsp; 并且删掉某个char)<p>
定义函式:<p>
(defun NAME (ARGS-LIST)<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &quot;注解&quot;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ; optional<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (interactive)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ; optional<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; BODY)<p>
定义一个叫NAME的函式. BODY 是一堆expression.<br>
注解是用来给C-h f显示的.<br>
(interactive) 表示这个函示会和user/buffer作用.<br>
(interactive &quot;B&quot;) 表示执行此函式先问user一个buffer的名字,<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 然後当作参数传给它. (如, 当user透过key-binding<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 或者 M-x 呼叫此函式时)<br>
(interactive &quot;BAppend to buffer: \nr&quot;)<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 问user buffer name时, 提示号 Append to buffer:<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 此function有两个引数,第一个是B, 就是buffer<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 第二个是r, region<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 用\n 隔开.<br>
(interactive &quot;p&quot;) 用C-u 设的prefix 把它当作参数传给我.<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 预设值==4. C-u C-f 向右移四个字<p>
一些lisp 函式:<p>
(list 1 2 3 4)&nbsp;&nbsp; 产生 '(1 2 3 4)<br>
(car '(1 2 3 4)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1<br>
(cdr '(1 2 3 4)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; '(2 3 4)<br>
(cons 1 '(2 3 4))&nbsp;&nbsp;&nbsp;&nbsp; '(1 2 3 4)<br>
(cons 1 2)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (1 . 2)<br>
(cons 0 (cons 1&nbsp; (cons 2 nil)))<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 等於&nbsp; '(0 1 2)<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {list 是用 pair 串起来的,<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 用C 表示:<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; pair: {Object *first, Object *second};<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; *(pair[i].first) == i;<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; pair[i].second == pair[i+1]; }<p>
(cons '(1 2) '(3 4))&nbsp; '((1 2) 3 4)<br>
(setq a 1)<br>
(1+ a)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ; a+1<br>
(+ 2 a)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ; a+2<br>
(* 1 2 3 4)<br>
(current-buffer)&nbsp; ; 传回目前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 &quot;Hello&quot;)&nbsp;&nbsp; ; 在minibuffer显示Hello<br>
(if (test)<br>
&nbsp;&nbsp;&nbsp;&nbsp; (then-part)<br>
&nbsp;&nbsp;&nbsp;&nbsp; (else-part))<br>
(cond ((test1) BODY1)<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ((test2) BODY2)<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (t&nbsp; OTHER-WISE)<br>
(let ((var1 value)&nbsp; ; local variable<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; var2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ; no value<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (var3 value)<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ...)<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; BODY ...)<br>
(lambda (ARG-LIST) ...) 同 defun, 但是没有名字 (anonymous).<br>
可以存到变数去:<br>
(setq hello (lambda () (message &quot;Hello,World&quot;)))<br>
(funcall hello)<br>
(goto-char (point-max))<br>
(defvar VAR VALUE &quot;*注解&quot;) 如果VAR 不存在才定义. 有注解可以用<br>
&nbsp;&nbsp; C-h v 看. 注解打*号表是使用者可以直接改/ 这个变数本来就是<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 给使用者设定用的.<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 可以用 M-x edit-options 来线上设定 (emacs结束就没有了,<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 不过edit-options可以给你所有可修改的变数的列表,你可以<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -