Emacs的使用和配置

这里是我的Emacs备忘录


Table of Contents



光标移动



C-p    向上一行
C-n    向下一行
C-f    向前一个光标
C-b    向后一个光标
M-f    向前一个单词
M-b    向后一个单词
C-a    行首
C-b    行尾
M-a    句首
M-b    句尾

C-v    向下一页
M-v    向上一页
C-M-v    另一个窗口向下一页
C-M-V    另一个窗口向上一页

M-<    文件头
M->    文件尾

C-l    光标位置置于屏幕中间

C-u n 或 M-n   重复执行n次后继命令


复制、粘贴



M-w 复制 C-w 剪切/删除 C-y 粘贴


删除



C-d     删除光标上的字符
DEL     删除光标前的字符

M-d     删除光标后的单词
M-DEL   删除光标前的单词

C-k     从光标位置删除到行尾
C-S-Backspace  删除当前行

C-y     恢复删除最近的一个
M-y     循环恢复删除上一个


查找与替换




简单查找替换



C-s     向前递增查找
C-r     反向递增查找

C-s C-w 向前递增查找,把光标所在的单词作为查找对象
C-r C-w 反向递增查找,把光标所在的单词作为查找对象

replace-string  查找替换光标后所有的内容

M-%     查询替换操作



对于M-%,需要注意的是其相关的一些操作:



SPACE或y    用新字符串替换原来的,并进入下一个位置
DEL或n      不替换,进入下一个位置
.          在当前位置做替换后退出查询-替换操作
,          替换,并显示替换情况(再按空格或y进入下一个位置)
!          对后面的内容全部进行替换,不再提问
^          返回上一个替换了的位置
RETURN或q   退出查询替换操作
C-r        进入递归编辑状态
C-w        删除此处内容并进入递归编辑状态(好进行其他修改)
M-C-c      退出递归编辑状态,继续完成查询-替换操作
C-]        退出递归编辑状态和查询替换操作



正则表达式查找与替换



C-M-s Return      向前查找正则表达式
C-M-r Return      反向查找正则表达式

C-M-s       向前递归查找正则表达式
C-M-r       反向递归查找正则表达式

query-replace-regexp  查询-替换正则表达式
replace-regexp    无条件替换正则表达式(慎用)



正则表达式中的字符:



^          匹配行首
$          匹配行尾
.          匹配任意单个字符
.*         匹配任意个字符
\<         匹配单词的开头
\>         匹配单词的结尾
[]         匹配[]中的任何一个字符,如[a-z]匹配任何一个小写字母


文本块操作



C-@     标记文本块的开始

C-x C-x 互换插入点和文本标记的位置

M-h     标记整个段落
C-x C-p 标记整个页面
C-x h   标记整个缓冲区


矩形模式



Keystrokes             Command name                                             Action
C-x r  k                kill-rectangle                                  Delete a rectangle and store it.
C-x r  d                delete-rectangle                                Delete a rectangle and do not store it.
C-x r  y                yank-rectangle                                  Insert the last rectangle killed
C-x r c                 clear-rectangle                                 Using spaces, blank out the area marked as a rectangle and do not store it.
C-x r o                 open-rectangle                                  Insert a blank rectangle in the area marked.
C-x r r r               copy-rectangle-to-register                  Copy rectangle to register r (where r is any character) .
C-x r i r               insert-register                                 Insert rectangle from register r (where r is any character).
(none)                 delete-whitespace-rectangle             if a rectangle includes initial whitespace, deletes it, narrowing rectangle.
C-x r t string          Enter string-rectangle                      Change contents of marked rectangle to string (if string is narrower
                                                                    or wider than rectangle, dimensions change accordingly).
(none)                  string-insert-rectangle                     Prompts for string and inserts rectangle.


Tab 操作



M-[    前一个Tab Group
M-]    后一个Tab Group
M-p    前一个Tab
M-n    后一个Tab


Buffer 管理



C-x C-b 进入buffer管理窗口


在C/C++代码中的操作



M-a     移动到当前语句的开始
M-e     移动到当前语句的末尾

C-M-a   移动到当前函数的开始
C-M-e   移动到当前函数的结尾

M-q     若光标在注释文本中间,则进行段落重排,保留缩进和前导字符

C-M-h   把光标放在当前函数开头,把文本块标记放在函数结尾,
        即把函数整个选作为一个文本块。

C-c C-q 对整个函数进行缩进
C-x h   选定整个buffer,  然后C-M-\可以对代码进行重新排版

C-c C-u 移动到当前预处理条件的开始位置
C-c C-p 移动到上一个预处理条件
C-c C-n 移动到下一个预处理条件

M-;     对当前行进行注释
C-x C-x 快速返回移动前的光标位置

C-c C-c 对一块代码进行注释;取消注释用命令 uncomment-region


Emacs中的Register



Emacs中的register

在多个文件中逛的时候,我们常常需要快速切换到先前访问的某个位置。因此,我们需要把文件及其光标位置暂时存放在某个地方。

在Emacs中,我们可以使用register暂时性保存这些信息。

将当前光标所在位置保存入一个register中:



C-x r SPACE + register名(一个字符,比如a吧)



然后我们就可以到处瞎逛,若要回到保存的register a位置,我们可以输入:



C-x r j a



挺好用的吧:)

如果你记性和我一样不好,恐怕会常常想看看自己保存了哪些register,我们可以输入:



M-x view-register 查看某一个register M-x list-registers 查看所有的register



其实我常用的就是以上功能,为了使笔记稍微完整一点,下面开始Copy 《GNU Emacs Manual》的相关章节:

在下面,我们使用r来命名所有的register:



Save Positions in Registers



C-x r SPC r
    Save position of point in register r (point-to-register). 
C-x r j r
    Jump to the position saved in register r (jump-to-register).



Saving Text in Registers



C-x r s r
    Copy region into register r (copy-to-register). 
C-x r i r
    Insert text from register r (insert-register). 
M-x append-to-register RET r
    Append region to text in register r. 
M-x prepend-to-register RET r
    Prepend region to text in register r.



Saving Rectangles in Registers


C-x r r r
    Copy the region-rectangle into register r (copy-rectangle-to-register). With numeric argument, delete it as well. 
C-x r i r
    Insert the rectangle stored in register r (if it contains a rectangle) (insert-register).


Saving Window Configurations in Registers


C-x r w r
    Save the state of the selected frame's windows in register r (window-configuration-to-register). 
C-x r f r
    Save the state of all frames, including all their windows, in register r (frame-configuration-to-register).


Keeping Numbers in Registers



C-u number C-x r n r
    Store number into register r (number-to-register). 
C-u number C-x r + r
    Increment the number in register r by number (increment-register). 
C-x r g r
    Insert the number from register r into the buffer.


Etags




建立Etags文件:



在代码目录中运行etags -R

如果要向现有tags表中添加,则运行etags -a



访问Tag文件:



M-x visit-tags-table


常用热键



M-. 访问tag C-u M-. 访问下一个tag M-* 返回


Emacs 中的 GNU-Serv



常常使用console的人往往也改不了这么个习惯,就是进了X就开个终端,然后在里头埋头干活,看到什么文件想修改就vi一把。我也是这个习惯。vi比emacs启动快多了。

GNU-Serv改变了这个情形。

首先要安装gnu-serv这个包,在我的机器上apt-get install gnu-serv就可以了。

接下来修改.emacs文件


(require 'gnuserv)
(gnuserv-start)


接下来修改.bashrc文件


alias e='gnuclient'


这样,在终端下就可以通过 e foo来编辑foo文件了,它会自动关联到已经打开的emacs中。

更强大的功能在于,你还可以在远程执行gnuclinet,在本机编辑文件后自动存放到远程机器上。


Emacs中的Bookmark



Emacs中的bookmark

将当前页面加入bookmark



M-x bookmark-set



修改.bashrc,将list-bookmarks绑定到F9上,将bookmark-set绑定到F10


(global-set-key [(f9)] 'list-bookmarks)
(global-set-key [(f10)] 'bookmark-set)


这样,就可以通过F9键访问书签,通过F10将当前页添加为书签了


Emacs 配置的一些tips




在GBK环境下配置Emacs使之可以阅读UTF-8文档



其实可以给 utf-8 优先级:



(prefer-coding-system 'utf-8)



对于 windows,不是以 utf-8 为主,再加上:

(setq file-name-coding-system 'gbk)
(set-terminal-coding-system 'gbk)
(set-keyboard-coding-system 'gbk)
(setq locale-coding-system 'gbk)
(set-selection-coding-system 'gbk)
(set-clipboard-coding-system 'ctext)
(set-clipboard-coding-system 'gbk)
(set-terminal-coding-system 'gbk)
(set-buffer-file-coding-system 'gbk)
(modify-coding-system-alist 'process "." 'gbk)
(setq default-process-coding-system '(gbk . gbk))

可能还有更简单的设置。但是这样配置对识别 utf-8 文件应该是没有问题。


Author: Le Cao
Date: 2010-10-12 23:00:53 CST
HTML generated by org-mode TAG=7.01g in emacs 23