分类: 嵌入式
2010-06-20 21:33:18
说明:
1、文中字母说明:
c-x是指按Ctrl+x组合键
m-x是指按Alt+x组合键
没有c-或m-的,就是输入该字母本身
2、本文主要是简单介绍一下emacs的操作命令,再介绍emacs的配置。喜欢emacs也罢,喜欢vim也罢,由它们去吧。
(1)、编辑
emacs foo.c 打开文件(如要同时打开多个可以这样:emacs foo.c bar.c ——默认是水平分割的两个窗口)
c-x c-s 保存文件
c-x c-c 退出emacs(未保存的话会出现提示)
c-x c-f 在emacs中打开文件,这时会提示要打开的文件的路径,可以使用Tab键补全文件名,打开后会覆盖当前那个窗口(可以打开多个窗口,再打开文件)
c-space 开始标记
c-@ 取消标记
m-w 复制选中的
c-w 剪切选中的
c-y 粘贴
c-f 点前移一格
c-b 点后退一格
c-p 点向上一行
c-n 点向下一行
m-f 点向前到下一个单词
m-b 点移动到上一个单词
c-a 点移动到行首
c-e 点移动到行尾
m-a 点移动到句首
m-e 点移动到句尾
m-{ 点移动到段首
m-} 点移动到段尾
c-s 向前搜索
c-r 向后搜索
c-k 删除一行中光标后面的所有东西
c-d 删除点下的字符
m-d 删除点所在的单词
m-g g (再输入行号) 跳到某一行
c-x [ 移至顶
c-x ] 移至底
c-x c-u 选中字符全大写
c-x c-l 选中字符全小写
c-x u 取消操作
c-g 退出某些命令(如,按错了某些命令,可以用这个命令取消它)
好像不能直接使用Tab键的,如要使用,可以:c-q Tab
(2)、编译
m-x compile(即按Alt+x键,再输入compile)启动一个编译
默认的是make -k,可以删除,再输入编译的命令,如gcc foo.c bar.c
编译的结果会在新的窗口显示出来,如出错就可以对照来找了错误之处了。
要关闭编译结果窗口,可以使用c-x 0或删除*compilation*等方法。
(3)、窗口删除、切换、变化等
c-x 2 (水平) c-x 3 (垂直)将本窗口分割成多个窗口——是本窗口的内容被分割!故内容是一样的,可以在选中的窗口的再打开文件、编辑文件等等!!!!:
c-x 0 (这是数字0)关闭本窗口——如果当前只打开一个窗口,输入此命令出现提示,大意是说你尝试关闭唯一的窗口(更准确的说法是buffer)。
c-x ^ 使窗口增高
c-x } 使窗口增宽
c-x { 使窗口变窄
c-x > 窗口显示右边的内容
c-x < 窗口显示左边的内容
c-x o 切换到另一个窗(这是字母o)——跳到指定的还不知道,所以只能一个一个地跳了
c-x c-b 显示当前的emacs打开了多少个buffer(列表有:在缓冲区的文件(或shell),大小,模式、位置)
c-x b 选择某一个buffer,这时会提示选择哪一个
c-x k 关闭某一个buffer,这时会显示默认要删除的文件,回车即删除默认的文件,如果要删除其它的,一定要输入列表中显示的全部名称,如,打开一个shell,要结束它就要输入:c-x k *shell*,这样才行
怎么样?看得头大吧?我当初学习的时候,是拿笔做笔记的,遇到某些记不住的,或好的,都记下来,慢慢地学习,日子久了,也渐渐地熟悉了。所以学习emacs不要怕,只要你克服害怕的心理,不断地使用它,你就会发现它也没那么难。——我的本命年的寒假最大的收获之一就是逼着自己学习emacs,并学会使用它。
好了,下面所讲的emacs配置,主要是针对写代码的。比如多窗口调试,自动补齐,函数、变量查找等等。
先简单写一下几个工具的安装,我将它们的压缩包都放在.emacs.d目录下。关于这几个工具的作用,百度吧。这些工具对emacs版本都有要求,具体的要看各自的README文件。
(1)、cedet(自动补齐)
解压,进入该目录,输入make,具体可以看INSTALL文件。在配置文件中加载:
(load-file "~/.emacs.d/cedet-1.0pre7/common/cedet.el")
(2)、ecb( Emacs Code Browser,即代码浏览器)
解压,make出现错误:
Byte-compiling ECB with LOADPATH= ...
emacs -batch -no-site-file -l ecb-compile-script --eval '(ecb-byte-compile t)'
Cannot open load file: /home/latelee/.emacs.d/ecb-2.40/c:/Programme/emacs-22.3/site-lisp/package-development/cedet/common/cedet.el
make: *** [ecb] 错误 255
原来,它依赖于cedet的,修改Makefile文件,找到CEDET这一行,可以看到,它的默认路径不是我们安装cedet的路径,需要修改。
我的改法是:
CEDET=~/.emacs.d/cedet-1.0pre7(根据实际情况修改路径)
OK!没有问题。注意,它没有make install的,在配置文件中加载:
(add-to-list 'load-path "~/.emacs.d/ecb-2.40")
(require 'ecb)
(3)、cscope(查找变量/函数)
解压,进入该目录,./configure,make。
加载:
(add-to-list 'load-path "~/.emacs.d/cscope
(require 'xcscope)
(4)、doxymacs(根据代码写出文档)
解压,进入该目录,./configure,make,make install,之后,在家目录下会有share目录,在.emacs.d目录下新建一个doxymacs目录,将share复制到其下。在配置文件中可以这样加载:
(add-to-list 'load-path "~/.emacs.d/doxymacs/share/emacs/site-lisp")
(require 'doxymacs)
如果不这样做,在启动emacs时,会出错以下错误:
File error: Cannot open load file, doxymacs
因为根据上面加载路径,它没有在.emacs.d找到doxymacs目录,所以会出错。
我主要使用该工具的注释风格,我试过根据代码生成文档,但没有成功。这个过程有点复杂。
上面就是这几个工具的简单安装过程,下面再写一下配置。
(1)、doxymacs
先讲一下doxymacs,上面说过,我主要用于代码的注释,因为从代码生成文档我还不会。配置文件如下:
;;; 加载
(add-to-list 'load-path "~/.emacs.d/doxymacs/share/emacs/site-lisp")
(require 'doxymacs)
(defun my-doxymacs-font-lock-hook ()
(if (or (eq major-mode 'c-mode) (eq major-mode 'c++-mode))
(doxymacs-font-lock)))
(add-hook 'font-lock-mode-hook 'my-doxymacs-font-lock-hook)
(add-hook 'c-mode-common-hook 'doxymacs-mode)
(add-hook 'c++-mode-common-hook 'doxymacs-mode)
注释形式有很多种。
- C-c d f will insert a Doxygen comment for the next function.
(在某一函数前插入注释)
- C-c d i will insert a Doxygen comment for the current file.
(在当前文件插入注释)
- C-c d ; will insert a Doxygen comment for the current member.
(为一个变量插入注释)
- C-c d m will insert a blank multi-line Doxygen comment.
(多行注释)
- C-c d s will insert a blank single-line Doxygen comment.
(单行注释)
多行注释(C-c d m)如图1所示。(可以看到自己添加的与doxymacs生成的颜色是不同的)
图1 多行注释
函数之前的注释(C-c d f)如图2所示。
图2 函数前注释
一个文件中插入的注释(C-c d i)如图3所示。——关于出现的作者及e-mail是在emacs配置文件中添加的,配置见下文。
图3 文件前注释
(2)、cedet
配置文件如下:
;;; 加载
(load-file "~/.emacs.d/cedet/common/cedet.el")
(global-ede-mode 1)
(global-srecode-minor-mode 1)
;;; 选择一个就可以了,可以看一下每一个的效果再作选择
(semantic-load-enable-code-helpers)
;;; (semantic-load-enable-guady-code-helpers)
;;; (semantic-load-enable-excessive-code-helpers)
;;; 搜索路径
(setq semanticdb-project-roots
(list
(expand-file-name "/")))
;;; 数据库位置,可以随意选择,我选择在家目录下(后面有说明)
(require 'semanticdb)
(setq semanticdb-default-save-directory
(expand-file-name "~/semanticdb"))
(global-semanticdb-minor-mode 1)
;;; 空闲调度时间
(setq-default semantic-idle-scheduler-idle-time 432000)
(setq semanticdb-search-system-databases t)
;;; 针对于结构体和指针的补齐
(global-set-key "." 'semantic-complete-self-insert)
(global-set-key ">" 'semantic-complete-self-insert)
;;; 补齐的其它按键
(global-set-key [(control return)] 'semantic-ia-complete-symbol)
(global-set-key "\C-c?" 'semantic-ia-complete-symbol-menu)
(global-set-key "\C-c>" 'semantic-complete-analyze-inline)
(global-set-key "\C-cp" 'semantic-analyze-proto-impl-toggle)
;;; 可以看一下效果再作选择。那个菜单式补齐(像VC6.0补齐那种)我截图不到,但我负责地告诉你,是可以的。
;;;(global-set-key [(control tab)] 'senator-completion-menu-popup)
;;;(global-set-key [(meta ?/)] 'semantic-ia-complete-symbol-menu)
;;; this will be fine!!
(global-set-key [(meta ?/)] 'semantic-ia-complete-symbol-menu)
自动补齐的一种方式(指针方式)的一种示例如图4所示。
图4 自动补齐
我将cedet的数据库(自动补齐所需要的数据)位置设置为自己的家目录,在没有创建该数据目录前,emacs会寻问是否创建,单击“Yes”即可。如图5所示。
图5 数据库位置
我们看一下这个所谓的数据库的真实面目,说白了,它们就是一些文件,至于文件内容,我是看不懂的。如图6所示。
图6 “数据库”
该工具还有一个功能,就是函数原型与定义之间的切换,我绑定于C-c p上,如下:
(global-set-key "\C-cp" 'semantic-analyze-proto-impl-toggle)
效果如图7所示,图中所示为从函数原型找到函数定义瞬间的截图。那种效果有点炫。
图7 原型to定义
下面这些主要是从曹乐的个人主页()上拷过来,再修改的:
;;; auto complete
(defun my-indent-or-complete()
(interactive)
(if (looking-at "\\>")
(hippie-expand nil)
(indent-for-tab-command))
)
(global-set-key [(control tab)] 'my-indent-or-complete)
(autoload 'senator-try-expand-semantic "senator")
;;; NOTE:i put xxx-dabbrev first
;;; i think it will be fine
(setq hippie-expand-try-functions-list
'(
;;;senator-try-expand-semantic
try-expand-dabbrev
try-expand-dabbrev-visible
senator-try-expand-semantic
try-expand-dabbrev-all-buffers
try-expand-dabbrev-from-kill
try-expand-list
try-expand-list-all-buffers
try-expand-line
try-expand-line-all-buffers
try-complete-file-name-partially
try-complete-file-name
try-expand-whole-kill
)
)
;;; cc-mode
;;; what does it mean?puzzle
(require 'cc-mode)
(c-set-offset 'inline-open 0)
(c-set-offset 'friend '-)
(c-set-offset 'substatement-open 0)
(defun my-c-mode-common-hook()
;; c style,this will be good
(c-set-style "stroustrup")
;; tab is 4 NOT 8
(setq-default tab-width 4)
;; this is better than the next line! so i choose this one
(global-set-key(kbd "RET") 'newline-and-indent)
;; OK here replace "make -k" to "gcc"
(setq compile-command "gcc")
;;; some key map
(define-key c-mode-base-map [(f7)] 'compile)
(define-key c-mode-base-map [(control \`)] 'hs-toggle-hiding)
(define-key c-mode-base-map [(meta \`)] 'c-indent-command)
(define-key c-mode-base-map [(tab)] 'my-indent-or-complete)
;;;(define-key c-mode-base-map [(meta ?/)] 'semantic-ia-complete-symbol)
;;; pre process
(setq c-macro-shrink-window-flag t)
(setq c-macro-preprocessor "cpp")
(setq c-macro-cppflags " ")
(setq c-macro-prompt-flag t)
(setq hs-minor-mode t)
(setq abbrev-mode t)
(setq tab-width 4 indent-tabs-mode nil)
)
(add-hook 'c-mode-common-hook 'my-c-mode-common-hook)
;;; I know it is not very good ,bu I have no good idea
(defun my-c++-mode-hook()
;; c++ style,this will be good
(c-set-style "stroustrup")
;; tab is 4 NOT 8
(setq-default tab-width 4)
;; OK here replace "make -k" to "g++"
(setq compile-command "g++")
;;; some key map
(define-key c-mode-base-map [(f7)] 'compile)
(define-key c-mode-base-map [(control \`)] 'hs-toggle-hiding)
(define-key c-mode-base-map [(meta \`)] 'c-indent-command)
(define-key c-mode-base-map [(tab)] 'my-indent-or-complete)
;;;(define-key c-mode-base-map [(meta ?/)] 'semantic-ia-complete-symbol-menu)
;;; pre process
(setq c-macro-shrink-window-flag t)
(setq c-macro-preprocessor "cpp")
(setq c-macro-cppflags " ")
(setq c-macro-prompt-flag t)
(setq hs-minor-mode t)
(setq abbrev-mode t)
(setq tab-width 4 indent-tabs-mode nil)
)
(add-hook 'c++-mode-hook 'my-c++-mode-hook)
(3)、ecb
配置文件如下:
;;; 加载
(add-to-list 'load-path "~/.emacs.d/ecb-2.40")
(require 'ecb)
;;;(require 'ecb-autoloads)
;;; 不要每日提示
(setq ecb-tip-of-the-day nil)
(setq ecb-version-check nil)
;;; 激活
(global-set-key [(f12)] 'ecb-activate)
;;; 禁止
(global-set-key [(f11)] 'ecb-deactivate)
效果如图8所示,这个工具在阅读代码时,如果配合cscope的话,会很方便。
图8 ecb效果图
(4)、cscope
配置文件如下:
(add-to-list 'load-path "~/.emacs.d/cscope
(require 'xcscope)
它的一些默认的命令如下:
查找定义:
下面的截图9中说明了查找一个变量的定义。我同时打开3窗口,都是同一个文件,我的光标定位于左上方的窗口的V
图9 查找定义示例
这些都是编程所经常要使用到的,下面讲一下其它的配置。
emacs中显示时间:
(display-time-mode 1)
(setq display-time-24hr-format t)
(setq display-time-day-and-date t)
(setq display-time-interval 1)
不要备份文件,即那个讨厌的~。
(setq make-backup-files nil)
不要响铃及开始画面信息:
(setq visible-bell nil)
(setq inhibit-startup-message t)
(setq gnus-inhibit-startup-message t)
(setq inhibit-startup-message t)
行号 (需要line-num.el,附录有,不过在FC上出错,显示不出行号,RF上可以) :
(require 'linum)
(global-linum-mode t)
在多个窗口移动(即Shit/Alt + 光标,这样不用c-c o一个一个移动了):
(windmove-default-keybindings)
(setq windwove-wrap-around t)
(global-set-key [(meta left)] 'windmove-left)
(global-set-key [(meta right)] 'windmove-right)
(global-set-key [(meta up)] 'windmove-up)
(global-set-key [(meta down)] 'windmove-down)
当光标改为竖的(bar):
(setq-default cursor-type 'bar)
不让光标闪烁:
(blink-cursor-mode nil)
鼠标躲开光标(试一试吧,很爽的):
(mouse-avoidance-mode 'animate)
允许emacs与其它程序之间复制内容,比如在终端上复制,可以在emacs中粘贴内容。
(setq x-select-enable-clipboard t)
一些个人信息(上面doxymacs文件前插入注释的作者就是这个了!):
(setq user-full-name "Late Lee")
(setq user-mail-address "latelee@163.com")
多窗口gdb调试(下面有文章演示):
(setq gdb-many-windows t)
又:我学习emacs时间很久了,在网络上找了很久资料,一点点积累起来,所以,配置这些七七八八的东西花费不少时日。现在才写总结,估计有点晚了,有些东西也记不起来的,如果文中有什么出错的地方,希望大家提提意见。毕竟,有错误的文章会误人子弟,害人害己。
1、如果你想自己手动安装文中的工具,可以在google搜索,如果实在不想,可以点击这里的连接来下载:
2、我的一些配置文件,可以根据加载的路径来选择工具安装的目录。
.emacs文件(放至于自己的家目录)
文件:
emacs.rar
大小:
0KB
下载:
下载
代码配置及其它(放至家目录下的.emacs.d目录下)
|
3、折叠代码所用的hide-region.el,不过我设置不成功。
文件:
hide-region.rar
大小:
1KB
下载:
下载
4、行号所用的line-num.el,在RF上成功了。
文件:
line-num.rar
大小:
2KB
下载:
下载