Files
kernel_Notes/Zim/Utils/emacs/tmp.txt
2012-08-08 15:17:56 +08:00

195 lines
6.8 KiB
Plaintext
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
Content-Type: text/x-zim-wiki
Wiki-Format: zim 0.4
Creation-Date: 2011-04-16T16:12:13+08:00
====== tmp ======
Created Saturday 16 April 2011
emacs C编程
2007-04-25 14:50
Emacs对于编辑程序有很多方便的功能下面是在编辑C程序时常用到的一些功能。
(add-hook 'c-mode-hook 'linux-c-mode)
(add-hook 'c++-mode-hook 'linux-cpp-mode)
;; 设置imenu的排序方式为按名称排序
(setq imenu-sort-function 'imenu--sort-by-name)
(defun linux-c-mode()
;; 将回车代替C-j的功能换行的同时对齐
(define-key c-mode-map [return] 'newline-and-indent)
(interactive)
;; 设置C程序的对齐风格
(c-set-style "K&R")
;; 自动模式,在此种模式下当你键入{时,会自动根据你设置的对齐风格对齐
(c-toggle-auto-state)
;; 此模式下当按Backspace时会删除最多的空格
(c-toggle-hungry-state)
;; TAB键的宽度设置为8
(setq c-basic-offset 8)
;; 在菜单中加入当前Buffer的函数索引
(imenu-add-menubar-index)
;; 在状态条上显示当前光标在哪个函数体内部
(which-function-mode)
)
(defun linux-cpp-mode()
(define-key c++-mode-map [return] 'newline-and-indent)
(define-key c++-mode-map [(control c) (c)] 'compile)
(interactive)
(c-set-style "K&R")
(c-toggle-auto-state)
(c-toggle-hungry-state)
(setq c-basic-offset 8)
(imenu-add-menubar-index)
(which-function-mode)
)
一此有用的快捷键:
C-c C-c 注释区域此命令等同于M-x comment-region但C-c C-c仅适用于C程序而M-x comment-region适用于任何程序。
C-u C-c C-c :: 在c-mode下C-c C-c comment-regionC-u C-c C-c是uncomment-region.
C-M-\ 对齐一个区域,用些命令要先保证区域已经被选中,则用系统默认的对齐方式进行对齐。
C-c C-q 自动对齐一个函数。将光标停在一个函数体内,然后按这个键,可以自动将函数的内容按默认的对齐方式对齐。
TAB 重新缩进当前行
C-c . 设置缩进风格按TAB键可列出可用的风格缺省的为gnu其缩进为2个字符linux为8个k&r为5个…
M-/ 自动补齐(缓冲区中能找得到的串)
M-; 行尾加入注释
C-c C-e 扩展宏,察看当前宏的值
C-c C-\ 通过'\'连接多行代码
子模式
auto-state 当你输入时自动缩进,自动换行
hungry-state 当你Backspace时自动删除尽可能多的空白和空行
C-c C-t 同时转换(开/关)auto-state和hungry-state子模式
C-c C-a 转换 auto-state 子模式
C-c C-d 转换 hungry-state 子模式
编译与调试
M-x compile 可以输入命令对程序文件进行编译,编译器的输出在一个另外一个子窗口中显示,将光标移到*compilation* 中的一行错误提示上击回车(或直接鼠标中键)即可在程序中定位错误。
M-x gdb RET 调试
C-x ` (出错信息中)下一个错误,一个窗口显示错误信息,另一个显示源码的出错位置
C-c C-c 转到出错位置
启动gdb调试器后光标在源码文件缓冲区中时
C-x SPC 在当前行设置断点
C-x C-a C-s step
C-x C-a C-n next
C-x C-a C-t tbreak
C-x C-a C-r continue
Etags 使用小结
2007-04-25 14:53
1. Etags 基础
在emacs里可以用etags命令生成emacs专用的tags文件有了此文件之后便可以使用一些emacs tags的命令比如对于编辑C/C++程序的人员可以方便的定位一个函数的定义,或者对函数名进行自动补齐:
[Code]
find -name "*.h" -or -name "*.cpp" |xargs etags --members \
--language=c++
我在使用上述命令时未能成功,但以下命令可以
[Code]
find -name "*.cpp" -exec etags -a {} \;
[Code]
find . -name "*.[chCH]" -print | etags -
上述命令可以在当前目录查找所有的.h和.cpp文件并把它们的摘要提取出来做成TAGS文件具体的etags的用法可以看一下etags的manual。
在.emacs中加入这样的语句
[Code]
(setq tags-file-name "~/sim973/src/TAGS")
这样emacs就会自动读取这个tags文件的内容。
几个重要的命令。
M-. 查找一个tag比如函数定义类型定义等。
C-u M-. 查找下一个tag的位置
M-* 回到上一次运行M-.前的光标位置。
M-TAB 自动补齐函数名。
2. 一些整合的快捷键
易于编译和TAGS的使用搜集自 zslevin 的帖子(LinuxForum GNU Emacs/XEmacs)
C-f5, 设置编译命令
f5, 保存当前窗口然后编译当前窗口文件
[Code]
(defun du-onekey-compile ()
"Save buffers and start compile"
(interactive)
(save-some-buffers t)
(compile compile-command))
(global-set-key [C-f5] 'compile)
(global-set-key [f5] 'du-onekey-compile)
F7, 查找 TAGS 文件(更新 TAGS 表)
C-F7, 在当前目录下生成包含所有递归子目录的 TAGS 文件使用了shell中的find命令
C-. 开个小窗查看光标处的 tag
C-, 只留下当前查看代码的窗口(关闭查看 tag 的小窗)
M-. 查找光标处的 tag并跳转
M-, 跳回原来查找 tag 的地方
C-M-, 提示要查找的 tag并跳转
C-M-. 要匹配的 tag 表达式(系统已定义)
Shift-Tab, C/C++ 和 lisp 等模式中补全函数名一般情况下M-Tab被窗口管理器遮屏了
定义按键,在生成相应 tag 文件时,比如一个目录下所有的 *.cpp 和 *.h 文件使用这样的正则表达式 *.[ch]*,在下面的 C-F7 中可能会用到。
[Code]
(global-set-key [(f7)] 'visit-tags-table) ; visit tags table
(global-set-key [C-f7] 'sucha-generate-tag-table) ; generate tag table
(global-set-key [(control .)] '(lambda () (interactive) (lev/find-tag t)))
(global-set-key [(control ,)] 'sucha-release-small-tag-window)
(global-set-key [(meta .)] 'lev/find-tag)
(global-set-key [(meta ,)] 'pop-tag-mark)
(global-set-key (kbd "C-M-,") 'find-tag)
(define-key lisp-mode-shared-map [(shift tab)] 'complete-tag)
(add-hook 'c-mode-common-hook ; both c and c++ mode
(lambda ()
(define-key c-mode-base-map [(shift tab)] 'complete-tag)))
上面定义的命令需要用到的函数:
[Code]
(defun lev/find-tag (&optional show-only)
"Show tag in other window with no prompt in minibuf."
(interactive)
(let ((default (funcall (or find-tag-default-function
(get major-mode 'find-tag-default-function)
'find-tag-default))))
(if show-only
(progn (find-tag-other-window default)
(shrink-window (- (window-height) 12)) ;; 限制为 12 行
(recenter 1)
(other-window 1))
(find-tag default))))
(defun sucha-generate-tag-table ()
"Generate tag tables under current directory(Linux)."
(interactive)
(let
((exp "")
(dir ""))
(setq dir
(read-from-minibuffer "generate tags in: " default-directory)
exp
(read-from-minibuffer "suffix: "))
(with-temp-buffer
(shell-command
(concat "find " dir " -name \"" exp "\" | xargs etags ")
(buffer-name)))))
(defun sucha-release-small-tag-window ()
"Kill other window also pop tag mark."
(interactive)
(delete-other-windows)
(ignore-errors
(pop-tag-mark)))