EMACS

掌握Emacs的快捷键可以说是Emacs爱好者的基本功,也是提高编辑速度和质量所必备的,但是初学者可能记不住那么多的快捷键必要时可以翻一下,最常用的快捷键数量也就数十个。Emacs的快捷键都是绑定于ctrl和alt(或称meta)上的,例如c-x就是ctrl+x,m-x就是alt+x。当然所有的按键都可以自定义。

当要退出编辑时C-x C-c 代表着,先按C-x 再按C-c才可以退出编辑环境.

文件操作

  • C-x C-v 打开一个文件,取代当前缓冲
  • C-x C-s 保存文件
  • C-x C-w 存为新文件
  • C-x i 插入文件
  • C-x C-q 切换为只读或者读写模式
  • C-x C-c 退出Emacs

编辑操作

  • C-f 前进一个字符
  • C-b 后退一个字符
  • M-f 前进一个字
  • M-b 后退一个字
  • C-a 移到行首
  • C-e 移到行尾
  • M-a 移到句首
  • M-e 移到句尾
  • C-p 后退一行
  • C-n 前进一行
  • M-x goto-line 跳到指定行
  • C-v 向下翻页
  • M-v 向上翻页
  • M-< 缓冲区头部
  • M-> 缓冲区尾部
  • C-M-f 向前匹配括号
  • C-M-b 向后匹配括号
  • C-l 当前行居中
  • M-n or C-u n 重复操作随后的命令n次
  • C-u 重复操作随后的命令4次
  • C-u C-u 重复操作随后的命令8次
  • C-x ESC ESC 执行历史命令记录,M-p选择上一条命令,M-n选择下一条命令
  • C-d 删除一个字符
  • M-d 删除一个字
  • C-k 删除一行
  • M-k 删除一句
  • C-w 删除标记区域
  • C-y 粘贴删除的内容

注意:C-y可以粘贴连续C-k删除的内容;先按C-y,然后按M-y可以选择粘贴被删除的内容

  • C-@ 标记开始区域
  • C-x h 标记所有文字
  • C-x C-x 交换光标位置和区域标记区开头
  • M-w 复制标记区域
  • C-_ or C-x u 撤消操作

执行SHELL命令

  • M-x shell 打开SHELL
  • M-! 执行SHELL命令 (shell-command)
  • M-1 M-! 执行SHELL命令,命令输出插入光标位置,不打开新输出窗口
  • M-| 针对某一特定区域执行命令(shell-command-on-region), 比如 C-x h M-|uuencode

窗口操作

  • C-x 0 关闭本窗口
  • C-x 1 只留下一个窗口
  • C-x 2 垂直均分窗口
  • C-x 3 水平均分窗口
  • C-x o 切换到别的窗口
  • C-x s 保存所有窗口的缓冲
  • C-x b 选择当前窗口的缓冲区
  • C-x ^ 纵向扩大窗口
  • C-x } 横向扩大窗口

缓冲区列表操作

  • C-x C-b 打开缓冲区列表
  • d or k 标记为删除
  • ~ 标记为未修改状态
  • % 标记为只读
  • s 保存缓冲
  • u 取消标记
  • x 执行标记的操作
  • f 在当前窗口打开该缓冲区
  • o 在其他窗口打开该缓冲区

目录操作

  • C-x d 打开目录模式
  • s 按日期/文件名排序显示
  • v 阅读光标所在的文件
  • q 退出阅读的文件
  • d 标记为删除
  • x 执行标记
  • D 马上删除当前文件
  • C 拷贝当前文件
  • R 重命名当前文件
  • + 新建文件夹
  • Z 压缩文件
  • ! 对光标所在的文件执行SHELL命令
  • g 刷新显示
  • i 在当前缓冲区的末尾插入子目录的内容
  • [n]m 标记光标所在的文件,如果指定n,则从光标所在的文件起后n个文件被标记
  • [n]u 取消当前光标标记的文件,n的含义同上
  • t 反向标记文件
  • %-m 正则标记
  • q 退出目录模式

说明:在目录模式中,如果输入!,在命令行中包含*或者?,有特殊的含义。*匹配当前光标所在的文件和所有标记的文件,?分别在每一个标记的文件上执行该命令。

程序编译

  • M-x compile 执行编译操作
  • M-x gdb GDB排错
  • M-x dbx DBX排错
  • M-x xdb XDB排错
  • M-x sdb SDB排错

搜索模式

  • C-s key 向前搜索
  • C-s 查找下一个
  • ENTER 停止搜索
  • C-r key 反向搜索
  • C-s C-w 以光标所在位置的字为关键字搜索
  • C-s C-s 重复上次搜索
  • C-r C-r 重复上次反向搜索
  • C-s ENTER C-w 进入单词搜索模式
  • C-r ENTER C-w 进入反向单词搜索模式
  • M-x replace-string ENTER search-string ENTER 替换
  • M-% search-string ENTER replace-string ENTER 交互替换
  • C-r 在进入查找/替换模式后,该命令进入迭代编辑模式
  • C-M-x 退出迭代编辑模式,返回到查找/替换模式
  • C-M-s 向前正则搜索
  • C-M-r 向后正则搜索
  • C-M-% 正则交互替换

SHELL模式

  • C-c C-c 相当于Bash下的C-c
  • C-c C-z 相当于Bash下的C-z
  • C-c C-d 相当于Bash下的C-d
  • M-p 执行前一条命令
  • C-n 执行下一条命令
  • C-c C-o 删除最后一条命令产生的输出
  • C-c C-r 屏幕滚动到最后一条命令输出的开头
  • C-c C-e 屏幕滚动到最后一套命令输出的结尾
  • C-c C-p 查看前一条命令的输出
  • C-c C-n 查看后一条命令的输出

打印资料

  • M-x print-buffer 先使用pr,然后使用lpr
  • M-x lpr-buffer 直接使用lpr
  • M-x print-region
  • M-x lpr-region

收发邮件

  • M-x mail 发送邮件, C-c C-s 发送,C-c C-c 发送并退出
  • M-x rmail 接受邮件

EMACS编程

emacs最大的问题在于入门门槛较高。它看起来和多数人想象中的IDE相差甚远,很多人看到emacs的第一眼就觉得它是个记事本(还是个非常难用的记事本),稍微好些的往往觉得emacs也就是个ultraEditor而已,真是暴殄天物了。

本例基本编程环境是:

  • Debian GNU/Linux sid 操作系统
  • Gnome 2.10.0 桌面环境
  • GUN Emacs 23.0.0.1 for debian
  • 使用 Gnu tool chains(gcc,make,gdb等等)

后面的叙述都基于上述环境。另外,本文主要针对C/C++程序开发,对其他语言有些也适用。

基本流程

写C++程序基本几个步骤:

  • 编辑代码
  • 编写Makefile
  • 编译代码,修改编译错误
  • 调试代码,修改逻辑错误

当然,往往还需要阅读别人的代码。

根据上述步骤,本文主要针对以下几个方面:

  • 配置Emacs,建立便利的代码编辑环境和Makefile编写环境。
  • 在Emacs中编译代码,并修改编译错误。
  • 在Emacs中配合GDB调试程序。
  • 利用cscope和ecb在emacs中阅读代码。

基本环境设置

编辑环境配置

要写C++程序,当然要用到cc-mode插件。CC-Mode原本是支持C语言的,但现在也能支持很多语言,比如 C++,JavaObjective-CCORBAAWKPike等等。CC-Mode是gnu-emacs的标准插件。如果您要求不高,那么默认的配置或许就能满足。CC-Mode的各种行为都可以自由地定制.

这里本例的.emacs文件中关于CC-Mode配置的部分,仅供参考:

;;;; CC-mode配置  http://cc-mode.sourceforge.net/
(require 'cc-mode)
(c-set-offset 'inline-open 0)
(c-set-offset 'friend '-)
(c-set-offset 'substatement-open 0)
;;;;本例的C/C++语言编辑策略
 
(defun my-c-mode-common-hook()
  (setq tab-width 4 indent-tabs-mode nil)
  ;;; hungry-delete and auto-newline
  (c-toggle-auto-hungry-state 1)
  ;;按键定义
  (define-key c-mode-base-map [(control \`)] 'hs-toggle-hiding)
  (define-key c-mode-base-map [(return)] 'newline-and-indent)
  (define-key c-mode-base-map [(f7)] 'compile)
  (define-key c-mode-base-map [(meta \`)] 'c-indent-command)
  ;;  (define-key c-mode-base-map [(tab)] 'hippie-expand)
  (define-key c-mode-base-map [(tab)] 'my-indent-or-complete)
  (define-key c-mode-base-map [(meta ?/)] 'semantic-ia-complete-symbol-menu)

注意一下,上面最后两行是代码自动补齐的快捷键。

;;预处理设置
(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)
)
(add-hook 'c-mode-common-hook 'my-c-mode-common-hook)
 
;;;;我的C++语言编辑策略
(defun my-c++-mode-hook()
(setq tab-width 4 indent-tabs-mode nil)
(c-set-style "stroustrup")
;;  (define-key c++-mode-map [f3] 'replace-regexp)
)

自动补齐

自动补齐通常用的都是hippie-expand。不过有时候会觉得这个自动补齐“傻”了一点,常会补齐出一些毫不相干的东西,因为hippie-expand是根据你敲过的词和kill-ring等进行判断的,并不对程序语法进行分析。

所以你还需要安装一个代码分析工具,然后把它加进hippie-expand的扩展策略里去。我们可以用semantic。

Semantic是CEDET 中的一个工具,CEDET是Collection of Emacs Development Environment Tools的缩写,它包含了好几个工具,都挺不错的。

您可以在.emacs中对Semantic进行配置,下面是本例的.emacs相关的配置,仅供参考:

导入cedet:

(load-file "~/lib/emacs-lisp/cedet-1.0pre3/common/cedet.el")

配置Semantic的检索范围:

(setq semanticdb-project-roots 
(list
(expand-file-name "/")))

自定义自动补齐命令,如果在单词中间就补齐,否则就是tab。

(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)

hippie的自动补齐策略,优先调用了senator的分析结果:

(autoload 'senator-try-expand-semantic "senator")
 
(setq hippie-expand-try-functions-list
      '(
        senator-try-expand-semantic
        try-expand-dabbrev
        try-expand-dabbrev-visible
        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配置中有这么两行:

(define-key c-mode-base-map [(tab)] 'my-indent-or-complete)
define-key c-mode-base-map [(meta ?/)] 'semantic-ia-complete-symbol-menu)

这样,我们在CC-Mode中就可以调用自定义的hippie补全了,快捷键是Tab。

另外还把快捷键“Alt + / ”绑定到了semantic-ia-complete-symbol-menu命令上,这是semantic的命令,它会根据分析结果弹出补齐的菜单,效果如下图显示:

Thumbs semantic-ia.jpg

CEDET中还有一个不错的工具是speedbar,你可以用它在多个文件中快速切换。在本例的.emacs配置文件里,把speedbar关联到了F5上:

(global-set-key [(f5)] 'speedbar)

这样用F5就可以调出speedbar,效果如下:

Thumbs speedbar.jpg

编译和调试程序

按上面的配置,写完程序和Makefile文件后,在Emacs源代码窗口中按F7就可以进行编译。因为在my-c-mode-common-hook()函数里,有这么一行:

(define-key c-mode-base-map [(f7)] 'compile)

默认情况下,emacs的compile命令是调用make -k,本例把它改成了make。你也可以把它改成其他的,比如gcc之类的。改下面的“make”就行了。

'(compile-command "make")

Emacs会划分一个窗格显示编译的消息,在编译结束后,emacs会自动将编译器的输出和程序关联起来,告诉你第几行的程序有问题。直接在出错的行号上按Enter,就可以跳转到相应文件的相应行。其实我通常都是用鼠标中键去点出错行号:)

搞定了编译错误后,接着要和逻辑错误斗争了。其实对简单的程序来说,把中间结果打印到终端是最简单好用的调试办法:)不过稍微复杂点的程序就会晕菜了,这时我们就需要拿gdb跟踪程序流程了。

你用下面的命令就可以启动gdb了。

M-x gdb

gdb的命令就不在这里说了,它的文档几乎到处都是。emacs把gdb的命令和快捷键做了绑定,对于常用的命令,还是输入快捷键比较方便。比如,C-c C-n是Next line,C-c C-s是step in,其实用的最多的快捷键也就是这两个。

下面是本例的gdb效果图:

Thumbs gdb.jpg

阅读代码

在emacs下读代码通常有三种工具,最简单的是etags,最复杂的是ecb(emacs code browser),位于中间的是cscope。

etags和ctags一样,只不过前者是用于emacs的,后者是用于vi的。

使用tags之前要先对源代码分析建立tags文件,在代码所在目录中运行:etags -R 即可。



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值