emacs代码浏览+跳转

emacs代码浏览+跳转
分类: Linux/Unix Emacs Android 2208人阅读 评论(0) 收藏 举报

折腾半年多了,总算是找到个比较合适的方式。

我的选择是cedet+ecb+global

gnu-global是一个兼容tag工具,看名字就知道它打算怎么干活的了。gtags是emacs下与global交互的插件

首先一次去下载上面三个的源码,global是gtags,

cedet官网http://cedet.sourceforge.net/

ecb官网http://ecb.sourceforge.net/

然后ubuntu下不要使用sudo apt-get install 来的global,版本问题可能会和你下载gtags不兼容,有个参数不识别。

下载地址http://www.gnu.org/s/global/download.html

下载后解压,$./configure 

$make 

$sudo make install 

然后源码包里有个gtags.el这是我们的emacs插件

把cedet,ecb,gtags插件放到你保存插件的位置,我的都在~/emacs/下面,然后每个插件有自己单独的目录。



  1. ;;配置cedet  
  2. (add-to-list 'load-path "~/emacs/cedet-1.0pre7/common")  
  3. (add-to-list 'load-path "~/emacs/cedet-1.0pre7/contrib")  
  4. ;;(load-file "~/emacs/cedet-1.0pre7/common/cedet.el")  
  5. (require 'cedet)  
  6. (require 'semantic-ia)  
  7. (global-ede-mode 1)                      ; Enable the Project management system  
  8. (semantic-load-enable-code-helpers)      ; Enable prototype help and smart completion   
  9. (global-srecode-minor-mode 1)            ; Enable template insertion menu  
  10. (require 'semantic-tag-folding nil 'noerror)  
  11. (global-semantic-tag-folding-mode 1)  
  12. (global-set-key [f12] 'semantic-ia-fast-jump)  
  13. (global-set-key [S-f12]  
  14.                 (lambda ()  
  15.                   (interactive)  
  16.                   (if (ring-empty-p (oref semantic-mru-bookmark-ring ring))  
  17.                       (error "Semantic Bookmark ring is currently empty"))  
  18.                   (let* ((ring (oref semantic-mru-bookmark-ring ring))  
  19.                          (alist (semantic-mrub-ring-to-assoc-list ring))  
  20.                          (first (cdr (car alist))))  
  21.                     (if (semantic-equivalent-tag-p (oref first tag)  
  22.                                                    (semantic-current-tag))  
  23.                         (setq first (cdr (car (cdr alist)))))  
  24.                     (semantic-mrub-switch-tags first))))  
  25. ;(define-key c-mode-map [M-S-f12] 'semantic-analyze-proto-impl-toggle)  
  26. (global-set-key (kbd "M-q") 'semantic-ia-complete-symbol-menu)  
  27. (define-key semantic-tag-folding-mode-map (kbd "C-c , -") 'semantic-tag-folding-fold-block)  
  28. (define-key semantic-tag-folding-mode-map (kbd "C-c , +") 'semantic-tag-folding-show-block)  
  29. (define-key semantic-tag-folding-mode-map (kbd "C-_") 'semantic-tag-folding-fold-all)  
  30. (define-key semantic-tag-folding-mode-map (kbd "C-+") 'semantic-tag-folding-show-all)  
  31.   
  32.   
  33. ;; (setq semanticdb-project-roots (list (expand-file-name "/")))  
  34. (defconst cedet-user-include-dirs  
  35.   (list   
  36.    "/home/backfire/work/android/kernel/include"  
  37.    "/home/backfire/work/android/kernel/arch/arm/include"  
  38.    "/home/backfire/work/android/kernel/arch/arm/mach-XXX/include"  
  39.    ""))  
  40. ;; (defconst cedet-win32-include-dirs  
  41. ;;   (list "C:/MinGW/include"  
  42. ;;         "C:/MinGW/include/c++/3.4.5"  
  43. ;;         "C:/MinGW/include/c++/3.4.5/mingw32"  
  44. ;;         "C:/MinGW/include/c++/3.4.5/backward"  
  45. ;;         "C:/MinGW/lib/gcc/mingw32/3.4.5/include"  
  46. ;;         "C:/Program Files/Microsoft Visual Studio/VC98/MFC/Include"))  
  47. (require 'semantic-c nil 'noerror)  
  48. (let ((include-dirs cedet-user-include-dirs))  
  49.   ;; (when (eq system-type 'windows-nt)  
  50.   ;;   (setq include-dirs (append include-dirs cedet-win32-include-dirs)))  
  51.   (mapc (lambda (dir)  
  52.           (semantic-add-system-include dir 'c++-mode)  
  53.           (semantic-add-system-include dir 'c-mode))  
  54.         include-dirs))  
;;配置cedet
(add-to-list 'load-path "~/emacs/cedet-1.0pre7/common")
(add-to-list 'load-path "~/emacs/cedet-1.0pre7/contrib")
;;(load-file "~/emacs/cedet-1.0pre7/common/cedet.el")
(require 'cedet)
(require 'semantic-ia)
(global-ede-mode 1)                      ; Enable the Project management system
(semantic-load-enable-code-helpers)      ; Enable prototype help and smart completion 
(global-srecode-minor-mode 1)            ; Enable template insertion menu
(require 'semantic-tag-folding nil 'noerror)
(global-semantic-tag-folding-mode 1)
(global-set-key [f12] 'semantic-ia-fast-jump)
(global-set-key [S-f12]
                (lambda ()
                  (interactive)
                  (if (ring-empty-p (oref semantic-mru-bookmark-ring ring))
                      (error "Semantic Bookmark ring is currently empty"))
                  (let* ((ring (oref semantic-mru-bookmark-ring ring))
                         (alist (semantic-mrub-ring-to-assoc-list ring))
                         (first (cdr (car alist))))
                    (if (semantic-equivalent-tag-p (oref first tag)
                                                   (semantic-current-tag))
                        (setq first (cdr (car (cdr alist)))))
                    (semantic-mrub-switch-tags first))))
;(define-key c-mode-map [M-S-f12] 'semantic-analyze-proto-impl-toggle)
(global-set-key (kbd "M-q") 'semantic-ia-complete-symbol-menu)
(define-key semantic-tag-folding-mode-map (kbd "C-c , -") 'semantic-tag-folding-fold-block)
(define-key semantic-tag-folding-mode-map (kbd "C-c , +") 'semantic-tag-folding-show-block)
(define-key semantic-tag-folding-mode-map (kbd "C-_") 'semantic-tag-folding-fold-all)
(define-key semantic-tag-folding-mode-map (kbd "C-+") 'semantic-tag-folding-show-all)


;; (setq semanticdb-project-roots (list (expand-file-name "/")))
(defconst cedet-user-include-dirs
  (list 
   "/home/backfire/work/android/kernel/include"
   "/home/backfire/work/android/kernel/arch/arm/include"
   "/home/backfire/work/android/kernel/arch/arm/mach-XXX/include"
   ""))
;; (defconst cedet-win32-include-dirs
;;   (list "C:/MinGW/include"
;;         "C:/MinGW/include/c++/3.4.5"
;;         "C:/MinGW/include/c++/3.4.5/mingw32"
;;         "C:/MinGW/include/c++/3.4.5/backward"
;;         "C:/MinGW/lib/gcc/mingw32/3.4.5/include"
;;         "C:/Program Files/Microsoft Visual Studio/VC98/MFC/Include"))
(require 'semantic-c nil 'noerror)
(let ((include-dirs cedet-user-include-dirs))
  ;; (when (eq system-type 'windows-nt)
  ;;   (setq include-dirs (append include-dirs cedet-win32-include-dirs)))
  (mapc (lambda (dir)
          (semantic-add-system-include dir 'c++-mode)
          (semantic-add-system-include dir 'c-mode))
        include-dirs))

基本是用的 Meteor Liu的配置。

F12快速跳转,shift+F12跳回。这个不是很好用,一般我只是在本文见内跳转采用。

然后是代码折叠的配置,不想用鼠标的话就可以看看。

include路径是用来补全的,我用的是M-q,但是用ac+gtags的时候比较多。这个大部分时间是闲置了


然后配置ecb,这个是分隔窗口类似ide的配件,主要用的就是tag-list类似的功能,别的其实很少用。


  1. ;;配置ecb  
  2. (add-to-list 'load-path "~/emacs/ecb-2.40")  
  3. (require 'ecb)  
  4. ;;关掉每日提示  
  5. (setq ecb-tip-of-the-day nil)  
  6.   
  7. ;; 各窗口间切换  
  8. (global-set-key [C-left] 'windmove-left)  
  9. (global-set-key [C-right] 'windmove-right)  
  10. (global-set-key [C-up] 'windmove-up)  
  11. (global-set-key [C-down] 'windmove-down)  
  12.    
  13. ;; 隐藏和显示ecb窗口  
  14. (define-key global-map [(control f1)] 'ecb-hide-ecb-windows)  
  15. (define-key global-map [(control f2)] 'ecb-show-ecb-windows)  
  16.    
  17. ;; 使某一ecb窗口最大化  
  18. ;(define-key global-map "/C-c1" 'ecb-maximize-window-directories)  
  19. ;(define-key global-map "/C-c2" 'ecb-maximize-window-sources)  
  20. ;(define-key global-map "/C-c3" 'ecb-maximize-window-methods)  
  21. ;(define-key global-map "/C-c4" 'ecb-maximize-window-history)  
  22. ;; 恢复原始窗口布局  
  23. ;(define-key global-map "/C-c`" 'ecb-restore-default-window-sizes)  
;;配置ecb
(add-to-list 'load-path "~/emacs/ecb-2.40")
(require 'ecb)
;;关掉每日提示
(setq ecb-tip-of-the-day nil)

;; 各窗口间切换
(global-set-key [C-left] 'windmove-left)
(global-set-key [C-right] 'windmove-right)
(global-set-key [C-up] 'windmove-up)
(global-set-key [C-down] 'windmove-down)
 
;; 隐藏和显示ecb窗口
(define-key global-map [(control f1)] 'ecb-hide-ecb-windows)
(define-key global-map [(control f2)] 'ecb-show-ecb-windows)
 
;; 使某一ecb窗口最大化
;(define-key global-map "/C-c1" 'ecb-maximize-window-directories)
;(define-key global-map "/C-c2" 'ecb-maximize-window-sources)
;(define-key global-map "/C-c3" 'ecb-maximize-window-methods)
;(define-key global-map "/C-c4" 'ecb-maximize-window-history)
;; 恢复原始窗口布局
;(define-key global-map "/C-c`" 'ecb-restore-default-window-sizes)

ctrl加箭头在各个窗口间移动,别的几个快捷键按习惯来,不需要就不要看了。

然后说几个常用的配置,你可以调整左边窗口的默认宽度,你可以配置分隔的样式,具体配置需要你去看看ecb的手册,

强制性的,否则你会觉得ecb不好用,查看ecb帮助,先启动ecb,然后M-x ecb-show-help。就会打开ecb的info。


配置global

  1. ;;配置gtags  
  2. (add-to-list 'load-path "~/emacs/global")  
  3. ;(autoload 'gtags-mode "gtags" "" t)  
  4. ;(setq c-mode-hook '(lambda ()  
  5. ;            (gtags-mode 1)))  
  6. (global-set-key (kbd "C-c g f") 'gtags-find-tag)  
  7. (global-set-key (kbd "C-c g p") 'gtags-pop-stack)  
  8. (global-set-key (kbd "C-c g s") 'gtags-select-tag)  
;;配置gtags
(add-to-list 'load-path "~/emacs/global")
;(autoload 'gtags-mode "gtags" "" t)
;(setq c-mode-hook '(lambda ()
;		     (gtags-mode 1)))
(global-set-key (kbd "C-c g f") 'gtags-find-tag)
(global-set-key (kbd "C-c g p") 'gtags-pop-stack)
(global-set-key (kbd "C-c g s") 'gtags-select-tag)

这个也推荐看下手册,先启动gtags再启动cedet的semantic会有冲突,所以我的gtags-mode都是手动启动,自己把gtags-mode这个命令绑到舒服的按键上。

然后是我的3个常用快捷键,

  1. C-c g f查找tag,<SPAN style="LINE-HEIGHT: 16px; FONT-FAMILY: Verdana, 'BitStream vera Sans', Tahoma, Helvetica, sans-serif; COLOR: rgb(85,85,85)"></SPAN><PRE class=plain name="code">C-c g p返回,</PRE><PRE class=plain name="code"><SPAN style="LINE-HEIGHT: 16px; FONT-FAMILY: Verdana, 'BitStream vera Sans', Tahoma, Helvetica, sans-serif; COLOR: rgb(85,85,85)"></SPAN><PRE class=plain name="code">C-c g s,多个tags时选择一个tags,这个还有待研究,手册上说的任何emacs命令就可以选择,但是我没用处来。</PRE><PRE class=plain name="code"></PRE><PRE class=plain name="code"></PRE><PRE class=plain name="code">gtags和ac可以配置补全,很好用,不过补全傻了点,不过基本是够用了。</PRE><P></P>  
  2. <PRE></PRE>  
  3. <PRE></PRE>  
  4. <P></P>  
  5. <P><SPAN style="FONT-FAMILY: Verdana, 'BitStream vera Sans', Tahoma, Helvetica, sans-serif; COLOR: #555555"><SPAN style="LINE-HEIGHT: 16px"><BR>  
  6. </SPAN></SPAN></P>  
  7. <P><SPAN style="FONT-FAMILY: Verdana, 'BitStream vera Sans', Tahoma, Helvetica, sans-serif; COLOR: #555555"><SPAN style="LINE-HEIGHT: 16px">这个配置搞android还是满合适的。</SPAN></SPAN></P>  
  8. <P><BR>  
  9. </P>  
  10. <P><BR>  
  11. </P>  
  12. <P><BR>  
  13. </P>  
  14. <P><BR>  
  15. </P>  
  16.   
  17. </PRE> 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值