Chinaunix首页 | 论坛 | 博客
  • 博客访问: 486689
  • 博文数量: 42
  • 博客积分: 2100
  • 博客等级: 大尉
  • 技术积分: 580
  • 用 户 组: 普通用户
  • 注册时间: 2008-01-07 21:07
文章分类

全部博文(42)

文章存档

2011年(1)

2010年(18)

2009年(16)

2008年(7)

分类: 嵌入式

2010-06-20 21:33:18

说明:

1、文中字母说明:

c-x是指按Ctrl+x组合键

m-x是指按Alt+x组合键

没有c-m-的,就是输入该字母本身

 

2、本文主要是简单介绍一下emacs的操作命令,再介绍emacs的配置。喜欢emacs也罢,喜欢vim也罢,由它们去吧。

1、基本命令使用

(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配置,主要是针对写代码的。比如多窗口调试,自动补齐,函数、变量查找等等。

2、软件安装

先简单写一下几个工具的安装,我将它们的压缩包都放在.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(查找变量/函数)

解压,进入该目录,./configuremake

加载:

(add-to-list 'load-path "~/.emacs.d/cscope-15.7a/contrib/xcscope")

(require 'xcscope)

 

(4)doxymacs(根据代码写出文档)

解压,进入该目录,./configuremakemake 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目录,所以会出错。

我主要使用该工具的注释风格,我试过根据代码生成文档,但没有成功。这个过程有点复杂。

上面就是这几个工具的简单安装过程,下面再写一下配置。

3、配置及使用

(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-15.7a/contrib/xcscope")

(require 'xcscope)

它的一些默认的命令如下:

查找定义:

下面的截图9中说明了查找一个变量的定义。我同时打开3窗口,都是同一个文件,我的光标定位于左上方的窗口的V4L2_PIX_FMT_YUYV,再按C-c s g,之后,在该窗口显示找到的定义的那个文件,在最下窗口显示路径及命中的变量,图中光标在右上方窗口中,纯粹是为了说明问题,不具有实际意义。

图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目录下)

文件: emacs.d.rar
大小: 3KB
下载: 下载

 

3、折叠代码所用的hide-region.el,不过我设置不成功。

文件: hide-region.rar
大小: 1KB
下载: 下载

 

4、行号所用的line-num.el,在RF上成功了。

 

文件: line-num.rar
大小: 2KB
下载: 下载

阅读(2980) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~