10/08
25
10/08
7
光标控制命令
命令 光标移动
h或^h 向左移一个字符
j或^j或^n 向下移一行
k或^p 向上移一行
l或空格 向右移一个字符
G 移到文件的最后一行
nG 移到文件的第n行
w 移到下一个字的开头
W 移到下一个字的开头,忽略标点符号
b 移到前一个字的开头
B 移到前一个字的开头,忽略标点符号
L 移到屏幕的最后一行
M 移到屏幕的中间一行
H 移到屏幕的第一行
e 移到下一个字的结尾
E 移到下一个字的结尾,忽略标点符号
( 移到句子的开头
) 移到句子的结尾
{ 移到段落的开头
} 移到下一个段落的开头
0或| 移到当前行的第一列
n| 移到当前行的第n列
^ 移到当前行的第一个非空字符
$ 移到当前行的最后一个字符
+或return 移到下一行的第一个字符
- 移到前一行的第一个非空字符
在vi中添加文本
命令 插入动作
a 在光标后插入文本
A 在当前行插入文本
i 在光标前插入文本
I 在当前行前插入文本
o 在当前行的下边插入新行
O 在当前行的上边插入新行
:r file 读入文件file内容,并插在当前行后
:nr file 读入文件file内容,并插在第n行后
escape 回到命令模式
^v char 插入时忽略char的指定意义,这是为了插入特殊字符
在vi中删除文本
命令 删除操作
x 删除光标处的字符,可以在x前加上需要删除的字符数目
nx 从当前光标处往后删除n个字符
X 删除光标前的字符,可以在X前加上需要删除的字符数目
nX 从当前光标处往前删除n个字符
dw 删至下一个字的开头
ndw 从当前光标处往后删除n个字
dG 删除行,直到文件结束
dd 删除整行
ndd 从当前行开始往后删除
db 删除光标前面的字
ndb 从当前行开始往前删除n字
:n,md 从第m行开始往前删除n行
d或d$ 从光标处删除到行尾
dcursor_command 删除至光标命令处,如dG将从当产胆行删除至文件的末尾
^h或backspace 插入时,删除前面的字符
^w 插入时,删除前面的字
修改vi文本
每个命令前面的数字表示该命令重复的次数
命令 替换操作
rchar 用char替换当前字符
R text escape 用text替换当前字符直到换下Esc键
stext escape 用text代替当前字符
S或cctext escape 用text代替整行
cwtext escape 将当前字改为text
Ctext escape 将当前行余下的改为text
cG escape 修改至文件的末尾
ccursor_cmd text escape 从当前位置处到光标命令位置处都改为text
在vi中查找与替换
命令 查找与替换操作
/text 在文件中向前查找text
?text 在文件中向后查找text
n 在同一方向重复查找
N 在相反方向重复查找
ftext 在当前行向前查找text
Ftext 在当前行向后查找text
ttext 在当前行向前查找text,并将光标定位在text的第一个字符
Ttext 在当前行向后查找text,并将光标定位在text的第一个字符
:set ic 查找时忽略大小写
:set noic 查找时对大小写敏感
:s/oldtext/newtext 用newtext替换oldtext
:m,ns/oldtext/newtext 在m行通过n,用newtext替换oldtext
& 重复最后的:s命令
:g/text1/s/text2/text3 查找包含text1的行,用text3替换text2
:g/text/command 在所有包含text的行运行command所表示的命令
:v/text/command 在所有不包含text的行运行command所表示的命令
在vi中复制文本
命令 复制操作
yy 将当前行的内容放入临时缓冲区
nyy 将n行的内容放入临时缓冲区
p 将临时缓冲区中的文本放入光标后
P 将临时缓冲区中的文本放入光标前
dsfsd "(a-z)nyy 复制n行放入名字为圆括号内的可命名缓冲区,省略n表示当前行
"(a-z)ndd 删除n行放入名字为圆括号内的可命名缓冲区,省略n表示当前行
"(a-z)p 将名字为圆括号的可命名缓冲区的内容放入当前行后
"(a-z)P 将名字为圆括号的可命名缓冲区的内容放入当前行前
在vi中撤消与重复
命令 撤消操作
u 撤消最后一次修改
U 撤消当前行的所有修改
. 重复最后一次修改
, 以相反的方向重复前面的f、F、t或T查找命令
; 重复前面的f、F、t或T查找命令
"np 取回最后第n次的删除(缓冲区中存有一定次数的删除内容,一般为9)
n 重复前面的/或?查找命令
N 以相反方向重复前面的/或?命令
保存文本和退出vi
命令 保存和/或退出操作
:w 保存文件但不退出vi
:w file 将修改保存在file中但不退出vi
:wq或ZZ或:x 保存文件并退出vi
:q! 不保存文件,退出vi
:e! 放弃所有修改,从上次保存文件开始再编辑
vi中的选项
选项 作用
:set all 打印所有选项
:set nooption 关闭option选项
:set nu 每行前打印行号
:set showmode 显示是输入模式还是替换模式
:set noic 查找时忽略大小写
:set list 显示制表符(^I)和行尾符号
:set ts=8 为文本输入设置tab stops
:set window=n 设置文本窗口显示n行
vi的状态
选项 作用
:.= 打印当前行的行号
:= 打印文件中的行数
^g 显示文件名、当前的行号、文件的总行数和文件位置的百分比
:l 使用字母"l"来显示许多的特殊字符,如制表符和换行符
在文本中定位段落和放置标记
选项 作用
{ 在第一列插入{来定义一个段落
[[ 回到段落的开头处
]] 向前移到下一个段落的开头处
m(a-z) 用一个字母来标记当前位置,如用mz表示标记z
'(a-z) 将光标移动到指定的标记,如用'z表示移动到z
在vi中连接行
选项 作用
J 将下一行连接到当前行的末尾
nJ 连接后面n行
光标放置与屏幕调整
选项 作用
H 将光标移动到屏幕的顶行
nH 将光标移动到屏幕顶行下的第n行
M 将光标移动到屏幕的中间
L 将光标移动到屏幕的底行
nL 将光标移动到屏幕底行上的第n行
^e(ctrl+e) 将屏幕上滚一行
^y 将屏幕下滚一行
^u 将屏幕上滚半页
^d 将屏幕下滚半页
^b 将屏幕上滚一页
^f 将屏幕下滚一页
^l 重绘屏幕
z-return 将当前行置为屏幕的顶行
nz-return 将当前行下的第n行置为屏幕的顶行
z. 将当前行置为屏幕的中央
nz. 将当前行上的第n行置为屏幕的中央
z- 将当前行置为屏幕的底行
nz- 将当前行上的第n行置为屏幕的底行
vi中的shell转义命令
选项 作用
:!command 执行shell的command命令,如:!ls
:!! 执行前一个shell命令
:r!command 读取command命令的输入并插入,如:r!ls会先执行ls,然后读入内容
:w!command 将当前已编辑文件作为command命令的标准输入并执行command命令,如:w!grep all
:cd directory 将当前工作目录更改为directory所表示的目录
:sh 将启动一个子shell,使用^d(ctrl+d)返回vi
:so file 在shell程序file中读入和执行命令
vi中的宏与缩写
(避免使用控制键和符号,不要使用字符K、V、g、q、v、*、=和功能键)
选项 作用
:map key command_seq 定义一个键来运行command_seq,如:map e ea,无论什么时候都可以e移到一个字的末尾来追加文本
:map 在状态行显示所有已定义的宏
:umap key 删除该键的宏
:ab string1 string2 定义一个缩写,使得当插入string1时,用string2替换string1。当要插入文本时,键入string1然后按Esc键,系统就插入了string2
:ab 显示所有缩写
:una string 取消string的缩写
在vi中缩进文本
选项 作用
^i(ctrl+i)或tab 插入文本时,插入移动的宽度,移动宽度是事先定义好的
:set ai 打开自动缩进
:set sw=n 将移动宽度设置为n个字符
n<< 使n行都向左移动一个宽度
n>> 使n行都向右移动一个宽度,例如3>>就将接下来的三行每行都向右移动一个移动宽度
10/07
29
我个人了解到免费并支持私有库的代码管理平台有Unfuddle,Bitbucket,Sprintloops和Beantalk,这里说说四个平台作为代码托管平台的优缺点。大家可以根据需要进行选择.
Unfuddle 是提供软件项目管理与代码托管的服务平台,代码托管支持两种VCS:Subversion与Git。Unfuddle与Google Code一样支持两种版本控制系统;而与Google Code比较,Unfuddle除了VCS上支持的不同外(Google Code支持Subver与Mercurial),还有它支持private库。Unfuddle免费的Plan提供200mb的存储空间,可创建无限个代码库(Repository)。但Project只能有一个,同时代码库必须与Project绑定才能使用(激活状态),这意味这免费的Plan实际上只能有一个代码库处于激活状态,而其他的皆属于archived状态。另外免费的Plan也不支持SSL连接和文件附件。所以想要项目管理与代码托管在同一个平台的用户是不错的选择,不过这个服务器速度在国内会差一些.
Bitbucket未提供项目管理,只提供代码托管平台,使用的VCS是Mercurial。免费的Plan挺强大的:1GB的存储空间,无限制Public库和1个私有库,HTTP/SSL连接支持,第三方服务集成支持,邮件发送支持。最低收费($5/月)的Plan和免费的Plan的差别在于空间多出1.5G,private库多出4个以及支持 Cname服务。总的来说,若熟悉 Mercurial,需要大的空间,Bitcket应该是个不错的选择。测试速度也不错.
springloops打出的口号是唯一一家专注于Web开发团队源代码管理的平台。他支持在代码提交后通过FTP/sFTP的方式直接发布到服务器上,集成Basecamp,使用Subversion。免费的 Plan提供100m的空间,无限制项目,但同时只能有3个项目处于激活状态;可通过FTP/sFTP直接发布,但不支持在commit后发布;无限制合作人员;无SSL支持;无域名绑定支持。测试速度不错
Beantalk同Unfuddle一样支持 Subversion与 Git两种版本控制系统。他的页面设计很精美,同样可通过FTP与sFTP发布项目,可集成Basecamp,Twitter,Campfire等第三方服务,可对HTML页面进行编辑预览。免费的Plan注册链接比较隐秘,放置于收费Plan的下方一行字。提供100m的存储空间,3个用户。由于还未了解Mercurial,而Subversion集中式的控制机制让我觉得很受控制,所以还是以支持Git的平台为首选。测试速度不错
http://www.bitsun.com/documents/gittutorcn.htm
http://hi.baidu.com/yuhongchun027/blog/item/442c467e9ec335350cd7daf5.html
http://www.joomlagate.com/article/joomla-review/why-subversion-will-be-replaced-by-git-for-version-control/
Unfuddle 是提供软件项目管理与代码托管的服务平台,代码托管支持两种VCS:Subversion与Git。Unfuddle与Google Code一样支持两种版本控制系统;而与Google Code比较,Unfuddle除了VCS上支持的不同外(Google Code支持Subver与Mercurial),还有它支持private库。Unfuddle免费的Plan提供200mb的存储空间,可创建无限个代码库(Repository)。但Project只能有一个,同时代码库必须与Project绑定才能使用(激活状态),这意味这免费的Plan实际上只能有一个代码库处于激活状态,而其他的皆属于archived状态。另外免费的Plan也不支持SSL连接和文件附件。所以想要项目管理与代码托管在同一个平台的用户是不错的选择,不过这个服务器速度在国内会差一些.
Bitbucket未提供项目管理,只提供代码托管平台,使用的VCS是Mercurial。免费的Plan挺强大的:1GB的存储空间,无限制Public库和1个私有库,HTTP/SSL连接支持,第三方服务集成支持,邮件发送支持。最低收费($5/月)的Plan和免费的Plan的差别在于空间多出1.5G,private库多出4个以及支持 Cname服务。总的来说,若熟悉 Mercurial,需要大的空间,Bitcket应该是个不错的选择。测试速度也不错.
springloops打出的口号是唯一一家专注于Web开发团队源代码管理的平台。他支持在代码提交后通过FTP/sFTP的方式直接发布到服务器上,集成Basecamp,使用Subversion。免费的 Plan提供100m的空间,无限制项目,但同时只能有3个项目处于激活状态;可通过FTP/sFTP直接发布,但不支持在commit后发布;无限制合作人员;无SSL支持;无域名绑定支持。测试速度不错
Beantalk同Unfuddle一样支持 Subversion与 Git两种版本控制系统。他的页面设计很精美,同样可通过FTP与sFTP发布项目,可集成Basecamp,Twitter,Campfire等第三方服务,可对HTML页面进行编辑预览。免费的Plan注册链接比较隐秘,放置于收费Plan的下方一行字。提供100m的存储空间,3个用户。由于还未了解Mercurial,而Subversion集中式的控制机制让我觉得很受控制,所以还是以支持Git的平台为首选。测试速度不错
http://www.bitsun.com/documents/gittutorcn.htm
http://hi.baidu.com/yuhongchun027/blog/item/442c467e9ec335350cd7daf5.html
http://www.joomlagate.com/article/joomla-review/why-subversion-will-be-replaced-by-git-for-version-control/
10/07
24
'去掉utf-8 BOM
'保留utf-8 BOM
:set nobomb
'保留utf-8 BOM
:set bomb
10/07
23
Python基本安装:
* http://www.python.org/ 官方标准Python开发包和支持环境,同时也是Python的官方网站;
* http://www.activestate.com/ 集成多个有用插件的强大非官方版本,特别是针对Windows环境有不少改进;
* http://www.python.org/ 官方标准Python开发包和支持环境,同时也是Python的官方网站;
* http://www.activestate.com/ 集成多个有用插件的强大非官方版本,特别是针对Windows环境有不少改进;
10/07
16
vim -b file
then
:%!xxd
10/07
10
http://www.neu.edu.cn/cxsj/online/C1/Lisp%E8%AF%AD%E8%A8%80.htm
http://www.lisperati.com/casting.html
http://www.lisperati.com/casting.html
10/07
9
符号
C- 意思是按住 Ctrol 键
M- 意指 Meta 键 (键盘上若无Meta 键,则可以ALT ESC 键来取而代之)
DEL 意指退格键 (不是 删除(Delete) key)
RET 意指回车键
SPC 意指空格键
ESC 意指Escape键
TAB 意指Tab键
像 "C-M-" (or "M-C") 这样连在一起的意味着同时按住 Control 和 Meta 键不放.
用方向键
C-p 、 C-b 、 C-f 和 C-n 这四个命令。它们的功能和方向键是一样的,如下图所示:
上一行 C-p (Prev line)
.
.
.
向左移 C-b .... 。.... 向右移 C-f (Forward character)
(Backward ) .
.
.
下一行 C-n (Next line)
“P N B F”四个字母分别代表了四个词,用这四个词记忆这些组合键会更容易:
P 代表 previous(上一行),
N 代表 next(下一行),
B 代表 backward(回
退),
F 则代表 forward(前进)
进入Emacs
要进入GNU Emacs,只需键入它的名字 emacs
离开Emacs
挂起Emacs: C-z
永久离开Emacs C-x C-c
文件
读取文件到Emacs C-x C-f
保存文件到磁盘 C-x C-s
保存所有文件 C-x s
插入其它文件的内容到当前缓冲 C-x i
用将要读取的文件替换当前文件 C-x C-v
将当前缓冲写入指定的文件 C-x C-w
Version control checkin/checkout C-x C-q
取得帮助
进入帮助系统很简单,只需要输入C-h(或F1)并跟随要获取帮助的对象,初次使用Emacs的用户可以输入C-h t进入使用手册
离开帮助窗口 C-x 1
滚动帮助窗口 C-M-v
匹配:显示与字符a串匹配的命令 C-h a
显示一个键的功能 C-h c
详细描述一个功能 C-h f
取得详细模式的信息 C-h m
错误恢复
取消当前要执行的命令 C-g
恢复系统崩溃后丢失的文件 M-x recover-file
撤销更新 C-x u或C-_
使缓冲回复到初始内容 M-x revert-buffer
Redraw garbaged scree n C-l
增量查找(Incremental Search)
向前查找 C-s
向后查找 C-r
规则表达式查找 C-M-s
反向规则表达式查找 C-M-r
选择前一个查找字符串 M-p
选择下一个查找字符串 M-n
退出增量查找 RET
取消上一个字符的作用 DEL(Backspace)
退出当前查找模式 C-g
在查找的过程中可重复使用C-s和C-r来改变查找方向
移动(Motion)
向前一个字符 C-f
向后一个字符 C-b
向前一个字 M-f
向后一个字 M-b
向上一行 C-p
向下一行 C-n
到行首 C-a
到行尾 C-e
到句首 M-a
到句尾 M-e
到段首 M-{
到段尾 M-}
到页首 C-x [
到页尾 C-x ]
到表达式首部 C-M-f
到表达式尾部 C-M-b
到函数首部 C-M-a
到函数尾部 C-M-e
到缓冲首部 M-<
到缓冲尾部 M->
滚动到下一屏 C-v
滚动到上一屏 M-v
滚动到右边一屏(内容向左移动) C-x <
滚动到左边一屏(内容向右移动) C-x >
滚动当前行到屏幕中央 C-u C-l
Killing和Deleting
向前delete字符 C-d
向后delete字符 DEL(Backspace)
向前delete到字首 M-d
向后delete到字尾 M-DEL(Backspace)
向前delete到行首 M-0 C-k
向后delete到行尾 C-k
向前delete到句首 C-x DEL(Backspace)
向后delete到句尾 M-k
向前delete到表达式首部 M-- C-M-k
向后delete到表达式尾部 C-M-k
Kill区域 C-w
拷贝区域到Kill Ring M-w
Kill到下一个给定字符出现的位置 M-z
拉回(yank)上次kill的内容 C-y
用更早kill的内容取代拉回的上次kill的内容 M-y
标记(Marking)
标记当前位置 C-SPC或C-@
以字符为单位使用移动命令动态标记区域 C-x C-x
以字为单位使用移动命令动态标记区域 M-@
标记一段 M-h
标记一页 C-x C-p
标记一个表达式 C-M-@
标记一个函数 C-M-h
标记整个缓冲区 C-x h
Query Replace
交互式地替换一个文本串 M-%
交互式地替换一个规则表达式 M-x query-replace-regexp
替换当前的并移动到下一处 SPE
替换当前的但不移动到下一处 ,
不替换当前的并移动到下一处 L(Backspace)
替换所有剩下的符合条件的文本 !
退出替换模式 RET
进入递归的编辑模式 C-r
退出递归的编辑模式 C-M-c
多窗口(Multiple Windows)
(When two commands are shown,the second is for “other frame”)
删除所有其它窗口 C-x 1
上下分割当前窗口 C-x 2 C-x 5 2
左右分割当前窗口 C-x 3
删除当前窗口 C-x 0 C-x 5 0
滚动其它窗口 C-M-v
切换光标到另一个窗口 C-x o
选择另一个窗口中的缓冲 C-x 4 b C-x 5 b
显示另一个窗口中的缓冲 C-x 4 C-o C-x 5 C-o
在另一窗口中查找并打开文件 C-x 4 f C-x 5 f
在另一窗口中以只读方式打开文件 C-x 4 r C-x 5 r
在另一窗口中运行dired命令 C-x 4 d C-x 5 d
在另一窗口中查找tag C-x 4 . C-x 5 .
增加窗口高度 C-x ^
减小窗口宽度 C-x {
增加窗口宽度 C-x }
格式(Formatting)
缩进当前行(与模式相关) TAB
缩进区域(与模式相关) C-M-
缩进表达式(与模式相关) C-M-q
Indent region rigidly arg. Columns C-x TAB
在光标后插入一个新的行 C-o
静态地将一行下移 C-M-o
删除光标附近的空行(留下一行) C-x C-o
与上一行合并成一行 M-^
删除光标附近的所有空格 M-
删除光标附近的空格(留下一格) M-SPC
Fill paragraph M-q
Set fill column C-x f
设置每一行开始的前缀 C-x .
设置字体 M-g
Case Change
将一个字设置为大写 M-u
将一个字设置为小写 M-l
将一个字首字母设置为大写 M-c
将一个区域设置为大写 C-x C-u
将一个区域设置为小写 C-x C-l
The Minibuffer
(the following keys are defined in the minibuffer)
最大程度地补全命令 TAB
补全命令中的一个字 SPC
完成并执行一个命令 RET
列出命令所有可能的后续部分 ?
列出在当前命令之前输入的命令 M-p
列出在当前命令之后输入的命令 M-n
用规则表达式在命令历史记录中向后搜寻 M-r
用规则表达式在命令历史记录中向前搜寻 M-s
重复执行上一条命令 C-x ESC ESC
缓冲(Buffer)
选择另一个缓冲 C-x b
列出所有的缓冲 C-x C-b
Kill一个缓冲 C-x k
置换(Transposing)
字符置换 C-t
字置换 M-t
行置换 C-x C-t
表达式置换 C-M-t
拼写检查(Spelling Check)
对当前的字进行拼写检查 M-$
检查区域内所有的字 M-x ispell-origin
检查缓冲内所有的字 M-x ispell-buffer
标记 (Tags)
查找标记 M-.
查找标记下一次出现的位置 C-u M-.
指定一个新的标记文件 M-x visit-tags-table
Regexp search on all files in tabs table M-x tags-search
在所有文件中执行查询-替换 M-x tags-query-replace
继续进行上一次标记查找或查询-替换 M-,
Shells
执行一个shell命令 M-!
在一个区域上执行sheel命令 M-|
通过shell命令过滤区域 C-u M-|
在窗口中启动一个shell M-x shell
矩形(Rectangles)
拷贝一个矩形到寄存器 C-x r r
Kill矩形 C-x r k
拉回矩形 C-x r y
打开一个矩形, 将文本移动至右边 C-x r o
清空矩形 C-x r c
为矩形中每一行加上一个字符串前缀 C-x r t
规则表达式(Regular Expressions)
除换行符外的所有单个字符 .
零个或多个重复 *
一个以上的重复 +
零个或一个重复 ?
转译字符
选择(or) |
分组 (…)
与第n个组相同的文本 n
At work break b
Not at work break B
寄存器(Register)
存储区域到寄存器 C-x r s
插入矩形内容到缓冲 C-x r i
存储光标位置到寄存器 C-x r SPC
跳跃到寄存器中存储的光标位置 C-x r j
键盘宏(Keyboard Macros)
开始定义一个键盘宏 C-x (
结束键盘宏的定义 C-x )
执行上一次定义的键盘宏 C-x e
追加到上一个键盘宏 C-u C-x (
为上一个键盘宏命名 M-x name-last-kbd-macro
在缓冲中插入Lisp M-x insert-kbd-macro
Tags
Tags 是一个显为人知的功能? 所以我想提一下. 这不是emacs发明的, 而是vi 原本的特异功能. emacs只是发扬光大而已.
假设你有一个目录, 里面是一个程式的原始码, 比如说, tin 的原始码, 放在 ~/tin-1.3beta 下面. 你想看它们.
首先, 叫emacs cd到该目录: M-x cd
然后, 建立tag table. tag table 就是一张对照表, 记录哪个符号(variable/function call) 对映到哪个档案的哪个地方. 有这张表, emacs可以让我们快速的在程式码内游走. 一般这张表是一个档案, 叫作TAGS (大写)
M-! etags *.c
M-! 是执行external shell command的意思. etags就是emacs的建表程式. 你只要告诉它你的source code在那里即可.
vi的话是使用ctags这个程式, 它建出来的档名叫tags (小写). 因为我们介绍emacs, 所以不管它.
然 后, 怎么看程式? 你知道所有的C 程式都是由main()开始, 所以你想找到main()在哪个档案. 这时只要按 M-. 然后emacs会问你tag table在哪里. 因为我们已经cd到该目录, 直接按enter就好了. 然后输入main, emacs就会把你带到main(){ ... }去.
如果 你看到某个程式片断呼叫一个你没看过的函式, 你可以把游标移到该函式的名字上, M-. ENTER 就搞定了.
如果 emacs找错了 (比如有变数和函式同名, emacs跳到变数去), 那你可以用 C-u M-. 找下一个.
在编辑程式码的时候, M-SPC 很有用, 它会把游标附近的空白缩成一个. 在其它地方也有效.
拼写检查
当然只是针对英文。
Ispell
选中一块区域,或者对整个编辑缓冲区进行拼写检查: M-x ispell-buffer RET, 这时会打开ispell缓冲区,C-h可以查看一些拼写检查的帮助信息。
检查单词。在一个单词上执行M-$,会对这个单词进行拼写检查。
单词拼写补全。在一个未拼完的单词后执行ESC TAB(M-TAB)。
只要启用过Ispell, 他就将一直在后台运行。M-x ispell-kill-ispell,可以杀死这个进程。
感觉很好用。
flyspell
一个扩展,可以在编辑的时候直接进行拼写检查,也就是spell-check on the fly。它也是利用Ispell。
M-x flyspell-mode RET
Tips
改变buffer的只读属性
M-x toggle-read-only
在C模式下输入tab
C-q TAB : 对TAB不做解释,直接输入
C- 意思是按住 Ctrol 键
M- 意指 Meta 键 (键盘上若无Meta 键,则可以ALT ESC 键来取而代之)
DEL 意指退格键 (不是 删除(Delete) key)
RET 意指回车键
SPC 意指空格键
ESC 意指Escape键
TAB 意指Tab键
像 "C-M-" (or "M-C") 这样连在一起的意味着同时按住 Control 和 Meta 键不放.
用方向键
C-p 、 C-b 、 C-f 和 C-n 这四个命令。它们的功能和方向键是一样的,如下图所示:
上一行 C-p (Prev line)
.
.
.
向左移 C-b .... 。.... 向右移 C-f (Forward character)
(Backward ) .
.
.
下一行 C-n (Next line)
“P N B F”四个字母分别代表了四个词,用这四个词记忆这些组合键会更容易:
P 代表 previous(上一行),
N 代表 next(下一行),
B 代表 backward(回
退),
F 则代表 forward(前进)
进入Emacs
要进入GNU Emacs,只需键入它的名字 emacs
离开Emacs
挂起Emacs: C-z
永久离开Emacs C-x C-c
文件
读取文件到Emacs C-x C-f
保存文件到磁盘 C-x C-s
保存所有文件 C-x s
插入其它文件的内容到当前缓冲 C-x i
用将要读取的文件替换当前文件 C-x C-v
将当前缓冲写入指定的文件 C-x C-w
Version control checkin/checkout C-x C-q
取得帮助
进入帮助系统很简单,只需要输入C-h(或F1)并跟随要获取帮助的对象,初次使用Emacs的用户可以输入C-h t进入使用手册
离开帮助窗口 C-x 1
滚动帮助窗口 C-M-v
匹配:显示与字符a串匹配的命令 C-h a
显示一个键的功能 C-h c
详细描述一个功能 C-h f
取得详细模式的信息 C-h m
错误恢复
取消当前要执行的命令 C-g
恢复系统崩溃后丢失的文件 M-x recover-file
撤销更新 C-x u或C-_
使缓冲回复到初始内容 M-x revert-buffer
Redraw garbaged scree n C-l
增量查找(Incremental Search)
向前查找 C-s
向后查找 C-r
规则表达式查找 C-M-s
反向规则表达式查找 C-M-r
选择前一个查找字符串 M-p
选择下一个查找字符串 M-n
退出增量查找 RET
取消上一个字符的作用 DEL(Backspace)
退出当前查找模式 C-g
在查找的过程中可重复使用C-s和C-r来改变查找方向
移动(Motion)
向前一个字符 C-f
向后一个字符 C-b
向前一个字 M-f
向后一个字 M-b
向上一行 C-p
向下一行 C-n
到行首 C-a
到行尾 C-e
到句首 M-a
到句尾 M-e
到段首 M-{
到段尾 M-}
到页首 C-x [
到页尾 C-x ]
到表达式首部 C-M-f
到表达式尾部 C-M-b
到函数首部 C-M-a
到函数尾部 C-M-e
到缓冲首部 M-<
到缓冲尾部 M->
滚动到下一屏 C-v
滚动到上一屏 M-v
滚动到右边一屏(内容向左移动) C-x <
滚动到左边一屏(内容向右移动) C-x >
滚动当前行到屏幕中央 C-u C-l
Killing和Deleting
向前delete字符 C-d
向后delete字符 DEL(Backspace)
向前delete到字首 M-d
向后delete到字尾 M-DEL(Backspace)
向前delete到行首 M-0 C-k
向后delete到行尾 C-k
向前delete到句首 C-x DEL(Backspace)
向后delete到句尾 M-k
向前delete到表达式首部 M-- C-M-k
向后delete到表达式尾部 C-M-k
Kill区域 C-w
拷贝区域到Kill Ring M-w
Kill到下一个给定字符出现的位置 M-z
拉回(yank)上次kill的内容 C-y
用更早kill的内容取代拉回的上次kill的内容 M-y
标记(Marking)
标记当前位置 C-SPC或C-@
以字符为单位使用移动命令动态标记区域 C-x C-x
以字为单位使用移动命令动态标记区域 M-@
标记一段 M-h
标记一页 C-x C-p
标记一个表达式 C-M-@
标记一个函数 C-M-h
标记整个缓冲区 C-x h
Query Replace
交互式地替换一个文本串 M-%
交互式地替换一个规则表达式 M-x query-replace-regexp
替换当前的并移动到下一处 SPE
替换当前的但不移动到下一处 ,
不替换当前的并移动到下一处 L(Backspace)
替换所有剩下的符合条件的文本 !
退出替换模式 RET
进入递归的编辑模式 C-r
退出递归的编辑模式 C-M-c
多窗口(Multiple Windows)
(When two commands are shown,the second is for “other frame”)
删除所有其它窗口 C-x 1
上下分割当前窗口 C-x 2 C-x 5 2
左右分割当前窗口 C-x 3
删除当前窗口 C-x 0 C-x 5 0
滚动其它窗口 C-M-v
切换光标到另一个窗口 C-x o
选择另一个窗口中的缓冲 C-x 4 b C-x 5 b
显示另一个窗口中的缓冲 C-x 4 C-o C-x 5 C-o
在另一窗口中查找并打开文件 C-x 4 f C-x 5 f
在另一窗口中以只读方式打开文件 C-x 4 r C-x 5 r
在另一窗口中运行dired命令 C-x 4 d C-x 5 d
在另一窗口中查找tag C-x 4 . C-x 5 .
增加窗口高度 C-x ^
减小窗口宽度 C-x {
增加窗口宽度 C-x }
格式(Formatting)
缩进当前行(与模式相关) TAB
缩进区域(与模式相关) C-M-
缩进表达式(与模式相关) C-M-q
Indent region rigidly arg. Columns C-x TAB
在光标后插入一个新的行 C-o
静态地将一行下移 C-M-o
删除光标附近的空行(留下一行) C-x C-o
与上一行合并成一行 M-^
删除光标附近的所有空格 M-
删除光标附近的空格(留下一格) M-SPC
Fill paragraph M-q
Set fill column C-x f
设置每一行开始的前缀 C-x .
设置字体 M-g
Case Change
将一个字设置为大写 M-u
将一个字设置为小写 M-l
将一个字首字母设置为大写 M-c
将一个区域设置为大写 C-x C-u
将一个区域设置为小写 C-x C-l
The Minibuffer
(the following keys are defined in the minibuffer)
最大程度地补全命令 TAB
补全命令中的一个字 SPC
完成并执行一个命令 RET
列出命令所有可能的后续部分 ?
列出在当前命令之前输入的命令 M-p
列出在当前命令之后输入的命令 M-n
用规则表达式在命令历史记录中向后搜寻 M-r
用规则表达式在命令历史记录中向前搜寻 M-s
重复执行上一条命令 C-x ESC ESC
缓冲(Buffer)
选择另一个缓冲 C-x b
列出所有的缓冲 C-x C-b
Kill一个缓冲 C-x k
置换(Transposing)
字符置换 C-t
字置换 M-t
行置换 C-x C-t
表达式置换 C-M-t
拼写检查(Spelling Check)
对当前的字进行拼写检查 M-$
检查区域内所有的字 M-x ispell-origin
检查缓冲内所有的字 M-x ispell-buffer
标记 (Tags)
查找标记 M-.
查找标记下一次出现的位置 C-u M-.
指定一个新的标记文件 M-x visit-tags-table
Regexp search on all files in tabs table M-x tags-search
在所有文件中执行查询-替换 M-x tags-query-replace
继续进行上一次标记查找或查询-替换 M-,
Shells
执行一个shell命令 M-!
在一个区域上执行sheel命令 M-|
通过shell命令过滤区域 C-u M-|
在窗口中启动一个shell M-x shell
矩形(Rectangles)
拷贝一个矩形到寄存器 C-x r r
Kill矩形 C-x r k
拉回矩形 C-x r y
打开一个矩形, 将文本移动至右边 C-x r o
清空矩形 C-x r c
为矩形中每一行加上一个字符串前缀 C-x r t
规则表达式(Regular Expressions)
除换行符外的所有单个字符 .
零个或多个重复 *
一个以上的重复 +
零个或一个重复 ?
转译字符
选择(or) |
分组 (…)
与第n个组相同的文本 n
At work break b
Not at work break B
寄存器(Register)
存储区域到寄存器 C-x r s
插入矩形内容到缓冲 C-x r i
存储光标位置到寄存器 C-x r SPC
跳跃到寄存器中存储的光标位置 C-x r j
键盘宏(Keyboard Macros)
开始定义一个键盘宏 C-x (
结束键盘宏的定义 C-x )
执行上一次定义的键盘宏 C-x e
追加到上一个键盘宏 C-u C-x (
为上一个键盘宏命名 M-x name-last-kbd-macro
在缓冲中插入Lisp M-x insert-kbd-macro
Tags
Tags 是一个显为人知的功能? 所以我想提一下. 这不是emacs发明的, 而是vi 原本的特异功能. emacs只是发扬光大而已.
假设你有一个目录, 里面是一个程式的原始码, 比如说, tin 的原始码, 放在 ~/tin-1.3beta 下面. 你想看它们.
首先, 叫emacs cd到该目录: M-x cd
然后, 建立tag table. tag table 就是一张对照表, 记录哪个符号(variable/function call) 对映到哪个档案的哪个地方. 有这张表, emacs可以让我们快速的在程式码内游走. 一般这张表是一个档案, 叫作TAGS (大写)
M-! etags *.c
M-! 是执行external shell command的意思. etags就是emacs的建表程式. 你只要告诉它你的source code在那里即可.
vi的话是使用ctags这个程式, 它建出来的档名叫tags (小写). 因为我们介绍emacs, 所以不管它.
然 后, 怎么看程式? 你知道所有的C 程式都是由main()开始, 所以你想找到main()在哪个档案. 这时只要按 M-. 然后emacs会问你tag table在哪里. 因为我们已经cd到该目录, 直接按enter就好了. 然后输入main, emacs就会把你带到main(){ ... }去.
如果 你看到某个程式片断呼叫一个你没看过的函式, 你可以把游标移到该函式的名字上, M-. ENTER 就搞定了.
如果 emacs找错了 (比如有变数和函式同名, emacs跳到变数去), 那你可以用 C-u M-. 找下一个.
在编辑程式码的时候, M-SPC 很有用, 它会把游标附近的空白缩成一个. 在其它地方也有效.
拼写检查
当然只是针对英文。
Ispell
选中一块区域,或者对整个编辑缓冲区进行拼写检查: M-x ispell-buffer RET, 这时会打开ispell缓冲区,C-h可以查看一些拼写检查的帮助信息。
检查单词。在一个单词上执行M-$,会对这个单词进行拼写检查。
单词拼写补全。在一个未拼完的单词后执行ESC TAB(M-TAB)。
只要启用过Ispell, 他就将一直在后台运行。M-x ispell-kill-ispell,可以杀死这个进程。
感觉很好用。
flyspell
一个扩展,可以在编辑的时候直接进行拼写检查,也就是spell-check on the fly。它也是利用Ispell。
M-x flyspell-mode RET
Tips
改变buffer的只读属性
M-x toggle-read-only
在C模式下输入tab
C-q TAB : 对TAB不做解释,直接输入






