📄 emacs--order.txt
字号:
M-x shell 开个command prompt, 不过不能跑vi,elm, tin...
M-x gnus 读新闻/读信
M-x rmail 读信
M-x vm view mail
M-x mh-rmail 读信 (package mh-e)
M-x mh-smail 送信 (package mh-e)
强列建议改用emacs读news/bbs. 世界会更美好!
读信的话就要看你的感觉. 这些读信程式都会把信从系统的mail folder
搬到自己的目录下, 占用quota, 我不喜欢 :p 建议elm或mutt.
除非参加mailling list配合procmail. 不然不实用.
用mh-e 须要装mh 这个外部程式, 不太好. 建议vm 或 gnus.
写完信, C-c C-c 就可以送信.
如果你的资料用rcs/sccs作版本管理, emacs自动会起动version control
(minor mode.), c-x c-q 变成check-in/check-out.
如何取得更多的资讯:
Emacs的lisp 经过多年的发展,已成为完整的self-documenting系统.
很多东西都可以线上找到你要的资讯.
前面说过,或者你已经不小心按backspace遇到了, C-h (就是backspace
的ascii码) 在emacs里面是help的意思, 它可以带出一串指令.
常用的有:
C-h F Emacs FAQ
C-h t Emacs 使用教学
C-h n Emacs NEWS file, 介绍最近改版的新功能
C-h i Info system. Info是gnu用来取代man page的系统,
基本上和文字模示的WWW差不多. 有许多重要的资讯
可以在这边找到. 如果你是新手, 建议你在x-win下
看. 不然, 按键 m (menuitem), SPC next page
l (last node: node就是章节的意思) u (up node)
d (directory, 索引). BS (Backspace, back a page).
如果全部只按SPC, 就跟man 一样.
C-h k describe key, 告诉你按这个键执行那个lisp function.
C-h f describe function. 告诉你function在作什麽.
如果只按SPC, emacs会给你所有lisp 函数的列表, 和说明.
C-h v describe variable 同function.
C-h a apropos的意思(approximate). 给lisp function的部份
字串, emacs帮你找.
C-h b 列出目前所有的keybinding
C-h m mode help. 列出目前的mode的特殊说明.
C-c C-h 列出以C-c 开头的所有key-binding. 虽然说Emacs
可以定义按键, 可是Ctrl- 开头的所有组合大概都用光了,
只有C-c算是可以自定指令. 不过有些mode也侵犯这个空间.
目前的convention是C-c <chr>; 留给user, C-c C-<chr>;
留给package.
有以上这些help, 你的emacs/elisp功力会随著时间成长.
Elisp 简介:
Emacs有三份手册.第一份是使用手册, 第二份是Elisp 手册, 第三份是
Elisp 简介. 第三份的程度是入门级, 值得看. Elisp手册其实也写的
很简单, 还教你lisp, 不过有点长, 适合参考.
因为我lisp没有仔细学过, 所以:
以下所言, 如有巧合, 那才是真的.
Basic data type
字串 (string) "Hello, World"
字元 (char) ?a ; 问号开头
atom & list:
(1 2 3 4) 是一个list, 由 4个 atom 组成.
pair: 中间是句点.
(apple . 2)
alist (associated list)
就是一堆 pair的集合,就像perl/tcl的associative array.
或者说是一个资料库, 一堆 (key, value) pair.
'((Apple . 1)
(Orange . 2)
(PineApple . 3))
vector (?)
emacs 19用vector 来表示按键(key strok sequence)
[f1] [f2] [f1 a]
nil 就是空的list, 或者表示 false
t true
Forms
我们写程式最好有样版让我们填空最简单了.
Form 就是样版, 不过意义不太一样.
Form 就是Elisp 可以接受的句型.
lisp 解译器 预设是对list的每个元素求值(evaluate),
除非是 special form, 有特殊的定义. 比如说
(defun FUNC (ARG-LIST)
BODY ...)
就是一个special form, 用来定义函式, 所以FUNC 不会被
求值, 被当成symbol, ...
(quote (LIST))
这也是个special form, 叫 lisp 把 (LIST)当做symbol就好了,
不要 evaluate.
quote 很常用, 所以有个缩写:
'(LIST) 等於 (quote (LIST))
'Asymbol 可以表示一个Atom, 名称叫Asymbol
set 可以产生/定义新的变数.
(set 'hello 1)
; hello = 1
; 注意我们用 'hello, 所以lisp不会evaluate hello的值.
这家伙很常用, 也有简写.
(setq hello 1)
setq 就是set quote 的缩写. 这是个 special form, 不会对
第二个元素求值.
valuation
在Emacs下, C-x C-e 可以执行(evaluate, 求值)游标左边的叙述.
结果会出现在minibuffer.
lisp-interaction-mode中 C-j 可以evaluate, 并且把结果append到 buffer.
lisp 程式由一堆list 构成.称为expression.
每个expression 都回传回一个值.
有些expression有副作用, 如删掉一个字.
(这跟C 的int delete_char() 意思一样, 它传回int,
并且删掉某个char)
定义函式:
(defun NAME (ARGS-LIST)
"注解" ; optional
(interactive) ; optional
BODY)
定义一个叫NAME的函式. BODY 是一堆expression.
注解是用来给C-h f显示的.
(interactive) 表示这个函示会和user/buffer作用.
(interactive "B") 表示执行此函式先问user一个buffer的名字,
然後当作参数传给它. (如, 当user透过key-binding
或者 M-x 呼叫此函式时)
(interactive "BAppend to buffer: \nr")
问user buffer name时, 提示号 Append to buffer:
此function有两个引数,第一个是B, 就是buffer
第二个是r, region
用\n 隔开.
(interactive "p") 用C-u 设的prefix 把它当作参数传给我.
预设值==4. C-u C-f 向右移四个字
一些lisp 函式:
(list 1 2 3 4) 产生 '(1 2 3 4)
(car '(1 2 3 4) 1
(cdr '(1 2 3 4) '(2 3 4)
(cons 1 '(2 3 4)) '(1 2 3 4)
(cons 1 2) (1 . 2)
(cons 0 (cons 1 (cons 2 nil)))
等於 '(0 1 2)
{list 是用 pair 串起来的,
用C 表示:
pair: {Object *first, Object *second};
*(pair.first) == i;
pair.second == pair[i+1]; }
(cons '(1 2) '(3 4)) '((1 2) 3 4)
(setq a 1)
(1+ a) ; a+1
(+ 2 a) ; a+2
(* 1 2 3 4)
(current-buffer) ; 传回目前buffer的资料物件
(switch-to-buffer (other-buffer))
(set-buffer)
(buffer-size)
(setq current-pos (point))
(point-min)
(point-max)
(message "Hello") ; 在minibuffer显示Hello
(if (test)
(then-part)
(else-part))
(cond ((test1) BODY1)
((test2) BODY2)
(t OTHER-WISE)
(let ((var1 value) ; local variable
var2 ; no value
(var3 value)
...)
BODY ...)
(lambda (ARG-LIST) ...) 同 defun, 但是没有名字 (anonymous).
可以存到变数去:
(setq hello (lambda () (message "Hello,World")))
(funcall hello)
(goto-char (point-max))
(defvar VAR VALUE "*注解") 如果VAR 不存在才定义. 有注解可以用
C-h v 看. 注解打*号表是使用者可以直接改/ 这个变数本来就是
给使用者设定用的.
可以用 M-x edit-options 来线上设定 (emacs结束就没有了,
不过edit-options可以给你所有可修改的变数的列表,你可以
放到.emacs档内.
(directory-files "./" t "\\..*")
return a list of files under directory X
(load "xxxx.el") 同#include <stdio.h>;
给使用者设定用的.
可以用 M-x edit-options 来线上设定 (emacs结束就没有了,
不过edit-options可以给你所有可修改的变数的列表,你可以
放到.emacs档内.
(directory-files "./" t "\\..*")
return a list of files under directory X
(load "xxxx.el") 同#include <stdio.h>;
(setq load-path (cons "~/emacs" load-path)) ; load的search path.
(autoload ...) 不像load会直接evaluate 整个档案, 而是需要时再
load.
(local-unset-key [(control c)])
(local-set-key [(control c) a] 'forward-sexp)
sexp 就是一个expession, n个expression如果用括号括起来就算一个.
(expression的定义随语言的不同而有不同, 在C, lisp
tex, html, fortran 下皆有差异)
基本命令
C-x C-c : 退出Emacs
C-x C-f : 打开一个文件,如果文件不存在,则创建一个文件
C-g : 取消未完成的命令
编辑
C-z (redefined): Undo;原来C-z是挂起Emacs(然后用fg命令调出);C-x u 是默认的命令; 移动一下光标,再C-z就可以redo
M-d : 删除光标后的词语
移动光标
C-v : 向前翻页
M-v : 向后翻页
M-r : 将光标移动到屏幕中间那行
C-a : 移到行首
M-a : 移到句首,从行首到句首之间可能有空格
C-e : 移到行尾
M-e : 移到句尾
M-{ : 向上移动一段
M-} : 向下移动一段
C-right : 向前移动一个单词
C-left : 向后移动一个单词
C-up : 向前移动一段
C-down : 向后移动一段
M-< : 移到整个文本开头
M-> : 移到整个文本末尾
C-u 数字 命令 : 执行多次(数字表示次数)该命令;“M-数字 命令” 也可以
M-x goto-line : 移动到某一行
C-l : 重绘屏幕,效果就是当前编辑行移动窗口中央
Buffer 相关
C-x k : 关闭当前buffer
C-x b : 切换到前一个编辑的buffer
C-x C-b : 列出当前所有buffer
C-x C-s : 保存当前buffer
C-x s : 保存所有未保存的buffer,会提示你是否需要保存
C-x C-w : 文件另存为
拷贝与粘贴
M-space (redefined): 设置mark; C-@ 是默认命令
C-w (redefined) : 剪切一块区域;如果没有设置mark,则是剪切一行
M-w (redefined) : 拷贝一块区域;如果没有设置mark, 则是拷贝一行
C-k : 从当前位置剪切到行尾
C-y : 粘贴
M-y : 用C-y拉回最近被除去的文本后,换成 M-y可以拉回以前被除去的文本。键入多次的M-y可以拉回更早以前被除去的文本。
C-x r k : 执行矩形区域的剪切
C-x r y : 执行矩形区域的粘贴
窗口操作
C-x 0 : 关闭当前窗口
C-x 1 : 将当前窗口最大化
C-x 2 : 垂直分割窗口
C-x 3 : 水平分割窗口
M-o (redefined) : 在窗口之间切换; C-x o 是默认命令
C-x 5 1/2/3/0 : 对frame类似的操作
C-x < : 窗口内容右卷
C-x > : 窗口内容左卷(这两个命令在垂直分割窗口后比较有用)
(C-u) C-x ^ : 加高当前窗口,如果有C-u,则每次加高4行
(C-u) C-x } : 加宽当前窗口
(C-u) C-x { : 压窄当前窗口
ESC C-v : 在其它窗口进行卷屏操作
搜索和替换
C-s : 向前搜索(增量式搜索);连续C-s,跳到下一个搜索到的目标
C-s RET : 普通搜索
C-r : 向前搜索
C-s RET C-w : 按单词查询
M-% : 查询替换,也就是替换前会询问一下
M-x replace-string : 普通替换
Tags
M-! etags .c .h : 创建TAGS文件
M-. : 跳到tag所在位置
M-x list-tags : 列出tags
Bookmark
C-x r m : 设置书签bookmark
C-x r b : 跳到bookmark处
帮助
C-h ? : 查看帮助信息
C-h f : 查看一个函数
C-h v : 查看一个变量
C-h k : 查看一个键绑定 (C-h c 也是查看键绑定,但是信息较简略)
C-h C-f : 查看一个函数的Info,非常有用
C-h i : 看Info
其它
C-M-\ : 对选中区域,按照某种格式(比如C程序)进行格式化
C-x h : 全部选中
M-! : 执行外部shell命令
M-x shell : 模拟shell的buffer
M-x term : 模拟terminal, C-c k 关闭terminal
C-x C-q : 修改buffer的只读属性
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -