Emacs实现C++ 语法高亮、自动补全、各种跳转
觉得这篇博文发表出来后,可能会引起一些争议,很多人眼中Emacs已经太陈旧了,根本无法和自己心目中的IDE齐驱并驾,最开始接触Emacs是在前年的这个时候,当时公司里面来了一群linux高人,当时还在做.NET的开发,天成的VS程序员看到了Emacs这个界面酷酷的编辑器悠然心动,最开始以为是VIM后来发现它叫Emacs。
点击(此处)折叠或打开
- (add-to-list 'load-path' "~/.emacs.d/plugins")
点击(此处)折叠或打开
- ;;-------------------------------------------------------------
- ;;Auto complete
- ;;-------------------------------------------------------------
- (add-to-list 'load-path "~/.emacs.d/plugins/auto-complete-1.3.1/")
- (require 'auto-complete-config)
- (add-to-list 'ac-dictionary-directories "~/.emacs.d/plugins/auto-complete-1.3.1//ac-dict")
- (ac-config-default)
然后载入了AutoComplete 这里的配置在用emacs M-x -》 load-file =》.../auto-complete-1.3.1/etc/install.el 后会给出一个正确的配置,一般使用这个即可
点击(此处)折叠或打开
- ;;-------------------------------------------------------------
- ;;yasnippet
- ;;-------------------------------------------------------------
- (add-to-list 'load-path
- "~/.emacs.d/plugins/yasnippet")
- (require 'yasnippet)
- (yas/global-mode 1)
载入yasnippet 这是一个模板补全工具 简单来说 for【tab】 就会自动帮你补全出一个for的大概结构,支持自定义模板。
点击(此处)折叠或打开
- (require 'auto-complete-clang)
- (setq ac-auto-start nil)
- (setq ac-quick-help-delay 0.5)
- (define-key ac-mode-map [(control tab)] 'auto-complete)
载入auto complete clang 可以使用clang当做语法解释器给Auto complete使用
点击(此处)折叠或打开
- (defun my-ac-config ()
- (setq ac-clang-flags (split-string "-I/usr/include -I/usr/local/include -I/usr/include/c++/4.6 -I/home/cc/Documents/trunk/tools/x86/cppunit/include -I/home/cc/Documents/trunk/tools/x86/TinyXML -I/home/cc/Documents/trunk/tools/x86/libpcap-1.2.1/build/include -I/home/cc/Documents/trunk/Utility/Header -I/home/cc/Documents/trunk/Comm/Header "))
- (setq-default ac-sources '(ac-source-abbrev ac-source-dictionary ac-source-words-in-same-mode-buffers))
- (add-hook 'emacs-lisp-mode-hook 'ac-emacs-lisp-mode-setup)
- (add-hook 'c-mode-common-hook 'ac-cc-mode-setup)
- (add-hook 'ruby-mode-hook 'ac-ruby-mode-setup)
- (add-hook 'css-mode-hook 'ac-css-mode-setup)
- (add-hook 'auto-complete-mode-hook 'ac-common-setup)
- (global-auto-complete-mode t))
- (defun my-ac-cc-mode-setup ()
- (setq ac-sources (append '(ac-source-clang ac-source-yasnippet) ac-sources)))
- (add-hook 'c-mode-common-hook 'my-ac-cc-mode-setup)
- (my-ac-config)
然后紧接着对补全模式进行配置,在第2行配置了要扫描的头文件的路径,补全的时候会根据这些文件中的符号进行补全,下面的add-hook 如果不需要可以去掉
点击(此处)折叠或打开
- ;;-------------------------------------------------------------
- ;;language config
- ;;-------------------------------------------------------------
- (ansi-color-for-comint-mode-on)
- (set-language-environment 'Chinese-GB)
- (set-keyboard-coding-system 'utf-8)
- (set-clipboard-coding-system 'utf-8)
- (set-terminal-coding-system 'utf-8)
- (set-buffer-file-coding-system 'utf-8)
- (set-default-coding-systems 'utf-8)
- (set-selection-coding-system 'utf-8)
- (modify-coding-system-alist 'process "*" 'utf-8)
- (setq default-process-coding-system '(utf-8 . utf-8))
- (setq-default pathname-coding-system 'utf-8)
- (set-file-name-coding-system 'utf-8)
- (setq ansi-color-for-comint-mode t) ;;处理shell-mode乱码,好像没作用
- ;;-------------------------------------------------------------
- ;;Common config
- ;;-------------------------------------------------------------
- (auto-image-file-mode t);打开图片显示功能
- (display-time-mode 1);显示时间,格式如下
- (setq display-time-24hr-format t)
- (setq display-time-day-and-date t)
- (transient-mark-mode t);允许临时设置标记
- (setq frame-title-format '("" buffer-file-name "@emacs" ));在标题栏显示buffer名称
- ;(setq default-fill-column 80);默认显示 80列就换行
- (set-scroll-bar-mode nil) ; 取消滚动栏
- (tool-bar-mode nil) ; 取消工具栏
- (ido-mode t)
- (setq visible-bell t)
- (setq inhibit-startup-message t)
- (setq gnus-inhibit-startup-message t)
- (fset 'yes-or-no-p 'y-or-n-p)
- (setq mouse-yank-at-point t)
- (setq kill-ring-max 200)
- (setq auto-save-mode nil)
- (setq x-select-enable-clipboard t)
- (setq user-full-name "JamesChen")
- (setq user-mail-address "chenpengsmail@qq.com")
- (setq global-font-lock-mode t)
- (setq-default kill-whole-line t)
- (setq show-paren-mode t)
- (setq show-paren-style 'parenthesis)
- (setq mouse-avoidance-mode 'animate)
- (setq auto-image-file-mode t)
- (setq default-major-mode 'text-mode)
- ;;(add-hook 'text-mode-hook 'turn-on-auto-fill) ; 设置缺省主模式是text,,并进入auto-fill次模式.而不是基本模式fundamental-mode
- ;;(setq-default auto-fill-function 'do-auto-fill)
- (setq-default indent-tabs-mode nil)
- (setq default-tab-width 8)
- (setq tab-stop-list ())
- ;;不用 TAB 字符来indent, 这会引起很多奇怪的错误。编辑 Makefile 的时候也不用担心,因为 makefile-mode 会把 TAB 键设置成真正的 TAB 字符,并且加亮显示的。注:还没搞清楚
- (setq column-number-mode t)
- (setq line-number-mode t) ; 显示行号
- (setq display-time-24hr-format t)
- (setq display-time-day-and-date t)
- (display-time) ; 显示时间
- (setq sentence-end "\\([。!?]\\|……\\|[.?!][]\"')}]*\\($\\|[ \t]\\)\\)[ \t\n]*")
- (setq sentence-end-double-space nil) ; 设置 sentence-end 可以识别中文标点。不用在 fill 时在句号后插入两个空格。
- (setq enable-recursive-minibuffers t) ; 可以递归的使用 minibuffer
- (setq scroll-margin 3 scroll-conservatively 10000)
- ;;防止页面滚动时跳动, scroll-margin 3 可以在靠近屏幕边沿3行时就开始滚动,可以很好的看到上下文。
- (setq track-eol t) ; 当光标在行尾上下移动的时候,始终保持在行尾。
- (setq Man-notify-method 'pushy) ; 当浏览 man page 时,直接跳转到 man buffer。
- (setq next-line-add-newlines nil) ; Emacs 21 中已经是缺省设置。按 C-n 或向下键时不添加新行。
- (setq speedbar-show-unknown-files t);;可以显示所有目录以及文件
- (setq dframe-update-speed nil);;不自动刷新,手动 g 刷新
- (setq speedbar-update-flag nil)
- (setq speedbar-use-images nil);;不使用 image 的方式
- (setq speedbar-verbosity-level 0)
- (setq time-stamp-active t)
- (setq time-stamp-warn-inactive t)
- (setq time-stamp-format "%:y-%02m-%02d %3a %02H:%02M:%02S JamesChen") ; 设置时间戳,标识出最后一次保存文件的时间。
- (setq dired-recursive-copies 'top)
- (setq dired-recursive-deletes 'top) ;让 dired 可以递归的拷贝和删除目录。
- (setq gdb-many-windows t)
这里是我对emacs的一些配置大多数收集自网络
点击(此处)折叠或打开
- ;;------------------------------------------------
- ;;cedet 安装
- ;;------------------------------------------------
- (add-hook 'texinfo-mode-hook (lambda () (require 'sb-texinfo)))
- (load-file "~/.emacs.d/plugins/cedet-1.0.1/common/cedet.el")
- (require 'cedet)
- ;;(semantic-load-enable-minimum-features)
- (semantic-load-enable-code-helpers)
- ;;(semantic-load-enable-guady-code-helpers)
- ;(semantic-load-enable-excessive-code-helpers)
- ;(semantic-load-enable-semantic-debugging-helpers)
- ;(autoload 'speedbar-frame-mode "speedbar" "Popup a speedbar frame" t)
- ;(autoload 'speedbar-get-focus "speedbar" "Jump to speedbar frame" t)
- ;(define-key-after (lookup-key global-map [menu-bar tools])
- ; [speedbar]
- ; '("Speedbar" .
- ; speedbar-frame-mode)
- ; [calendar])
- ;; 指定semantic临时文件的路径,避免到处都是临时文件
- (setq semanticdb-default-save-directory "~/backups/emacs/semantic")
- ;;;;C/C++语言启动时自动加载semantic对/usr/include的索引数据库
- (setq semanticdb-search-system-databases t)
- (add-hook 'c-mode-common-hook
- (lambda ()
- (setq semanticdb-project-system-databases
- (list (semanticdb-create-database
- semanticdb-new-database-class
- "/usr/include")))))
- (enable-visual-studio-bookmarks) ;开启高亮书签
- (require 'eassist nil 'noerror) ;开启头文件和源文件之间的跳转功能
- (require 'semantic-tag-folding nil 'noerror) ;;使用semantic的代码折叠功能
点击(此处)折叠或打开
- ;;-----------------------------------------------------------------------
- ;;加载tabbar
- ;;-----------------------------------------------------------------------
- (require 'tabbar)
- (tabbar-mode)
- ;;-----------------------------------------------------------------------
- ;;加载xcscope
- ;;-----------------------------------------------------------------------
- (require 'xcscope)
- ;; C-c s a 设定初始化的目录,一般是你代码的根目录
- ;; C-s s I 对目录中的相关文件建立列表并进行索引
- ;; C-c s s 序找符号
- ;; C-c s g 寻找全局的定义
- ;; C-c s c 看看指定函数被哪些函数所调用
- ;; C-c s C 看看指定函数调用了哪些函数
- ;; C-c s e 寻找正则表达式
- ;; C-c s f 寻找文件
- ;; C-c s i 看看指定的文件被哪些文件include
- ;;-----------------------------------------------------------------------
- ;;highlight-symbol
- ;;-----------------------------------------------------------------------
- (require 'highlight-symbol)
- ;;-----------------------------------------------------------------------
- ;;加载主题插件
- ;;-----------------------------------------------------------------------
- ;;COLOR_THEME
- (add-to-list 'load-path "~/.emacs.d/plugins/color-theme-6.6.0")
- (load-file "~/.emacs.d/plugins/color-theme-6.6.0/color-theme.el")
- (require 'color-theme)
- (color-theme-initialize)
- (color-theme-calm-forest)
- ;;-------------------------------------------------------------
- ;;set GDB config
- ;;-------------------------------------------------------------
- (setq gdb-use-separate-io-buffer t)
- ;;-------------------------------------------------------------
- ;;c / c++ config
- ;;-------------------------------------------------------------
- (defun my-c-mode-common-hook ()
- (setq default-tab-width 4)
- (setq tab-width 4)
- (setq c-basic-offset 4)
- (hs-minor-mode t)
- )
- (add-hook 'c-mode-common-hook 'my-c-mode-common-hook)
- (load-library "hideshow")
- (add-hook 'c-mode-hook 'hs-minor-mode)
- (add-hook 'c++-mode-hook 'hs-minor-mode)
- (add-hook 'java-mode-hook 'hs-minor-mode)
- (add-hook 'perl-mode-hook 'hs-minor-mode)
- (add-hook 'php-mode-hook 'hs-minor-mode)
- (add-hook 'emacs-lisp-mode-hook 'hs-minor-mode)
- ;;能把一个代码块缩起来,需要的时候再展开
- ;; M-x hs-minor-mode
- ;; C-c @ ESC C-s show all
- ;; C-c @ ESC C-h hide all
- ;; C-c @ C-s show block
- ;; C-c @ C-h hide block
- ;; C-c @ C-c toggle hide/show
- ;; C语言设置
- (defun my-c-mode-hook ()
- (c-set-style "cc-mode"))
- (add-hook 'c-mode-hook 'my-c-mode-hook)
- ;; C++设置
- (defun my-c++-mode-hook ()
- (c-set-style "stroustrup"))
- (add-hook 'c++-mode-hook 'my-c++-mode-hook)
- (add-hook 'c-mode-hook 'my-c++-mode-hook)
- ;;--------------------------------------------------------------
- ;;bakup
- ;;--------------------------------------------------------------
- (setq auto-save-default nil) ;不生成 #filename# 文件
- (setq make-backup-files t) ;设定不产生备份文件
- (setq auto-save-mode nil) ;自动保存模式
- ;;(setq-default make-backup-files t) ; 不生成临时文件
- (setq delete-old-versions t)
- (setq version-control 'never) ; 启用版本控制,即可以备份多次
- (setq kept-old-versions 2) ; 备份最原始的版本两次,及第一次编辑前的
- ; 文档,和第二次编辑前的文档
- (setq kept-new-versions 1) ; 备份最新的版本1次,理解同上
- (setq delete-old-versions t) ;删掉不属于以上3中版本的版本
- (setq backup-directory-alist '((" " . "~/backups/emacs/"))) ; 设置备份文件的路径
- (setq backup-by-copying t) ;备份设置方法,直接拷贝
- ;; Emacs 中,改变文件时,默认都会产生备份文件(以 ~ 结尾的文件)。可以完
- ;; 全去掉
- ;; (并不可取),也可以制定备份的方式。这里采用的是,把所有的文件备份都
- ;; 放在一
- ;; 个固定的地方("~/backups")。对于每个备份文件,保留最原始的两个版本和
- ;; 最新的
- ;; 1个版本。并且备份的时候,备份文件是复本,而不是原件。
这里导入了一下琐碎的插件 xcscope 是一个跳转工具,可以再代码定义见和头文件间进行跳转
点击(此处)折叠或打开
- ;;--------------------------------------------------------------
- ;;HOT KEY
- ;;--------------------------------------------------------------
- ;;保留F3、F4、F5、F6、F7、F8 for Xrefactory
- (global-set-key [f1] 'shell) ; 进入shell
- ;(global-set-key "\C-\;c" 'compile) ; 编译
- ;(global-set-key "\C-\'d" 'gdb) ; 调试
- ;(global-set-key "\C-\'f" 'hs-hide-block) ; 折叠
- ;(global-set-key "\C-\'o" 'hs-show-block) ; 展开
- ;(global-set-key "\C-\'n" 'highlight-symbol-next) ; 查找下一个符号
- ;(global-set-key "\C-\'p" 'highlight-symbol-prev) ; 查找上一个符号
- ;(global-set-key "\C-\'h" 'highlight-symbol-at-point) ; 高亮所有
- ;(global-set-key "\C-\'u" 'highlight-symbol-remove-all) ; 取消高亮
- (global-set-key [(control f6)] 'highlight-symbol-at-point);;高亮所有当前符号
- (global-set-key [f6] 'highlight-symbol-next);;查找下一个当前符号
- (global-set-key [(meta f6)] 'highlight-symbol-prev);;查找上一个当前符号
- (global-set-key [(control shift f6)] 'highlight-symbol-remove-all);;去除所有高亮
- ;(define-key global-map "\M-pi" 'cscope-set-initial-directory)
- ;(define-key global-map "\M-pi" 'cscope-unset-initial-directory)
- ;(define-key global-map "\M-pi" 'cscope-find-this-symbol)
- ;(define-key global-map "\M-pi" 'cscope-find-global-definition)
- ;(define-key global-map [(control f7)] 'cscope-find-global-definition-no-prompting)
- ;(define-key global-map [(control f8)] 'cscope-pop-mark)
- ;(define-key global-map [(control f9)] 'cscope-next-symbol)
- ;(define-key global-map [(control f10)] 'cscope-next-file)
- ;(define-key global-map [(control f11)] 'cscope-prev-symbol)
- ;(define-key global-map [(control f12)] 'cscope-prev-file)
- ;(define-key global-map [(meta f9)] 'cscope-display-buffer)
- ;(define-key global-map [(meta f10)] 'cscope-display-buffer-toggle)
- (setq compile-command "make -f Makefile") ; 编译
- (global-set-key [f9] 'compile) ; 编译
- (global-set-key [C-f9] 'gdb) ; 调试
- (global-set-key (kbd "M-\[") 'hs-hide-block) ; 隐藏块
- (global-set-key (kbd "M-\]") 'hs-show-block) ; 显示块
- (global-set-key [C-f11] 'comment-or-uncomment-region) ; 注释 / 取消注释
- ;;(global-set-key [f7] 'c-indent-line-or-region) ; 格式化代码
- (global-set-key [C-tab] 'other-window) ; 切换窗口
- (global-set-key [M-return] 'delete-other-windows) ; 关闭其他窗
- (global-set-key (kbd "C-x C-b") 'ibuffer);; 显示buffer列表
- (global-set-key "\C-x\C-j" 'dired-jump);; 跳转到当前目录的Dired
- ;(global-set-key "\C-xj"
- ;'jump-to-register);; 跳转到寄
- ;存器指定的位置
- (global-set-key (kbd "S-<SPC>") 'set-mark-command) ;用shift+space 来
- ;setmark 了, C-@ 很不好按。
- ;(global-set-key "\C-xg"
- ;'cscope-find-global-definition-no-prompting)
- ;;; 跳转到全局定义
- (global-set-key [C-=] 'my-indent-or-complete) ;自动补全或缩进
- (global-set-key "\C-xk" 'kill-this-buffer) ; 关闭当前buffer
- (global-set-key "\C-\\" 'auto-complete)
- (global-set-key (kbd "S-<up>") 'tabbar-backward-group)
- (global-set-key (kbd "S-<down>") 'tabbar-forward-group)
- (global-set-key (kbd "S-<left>") 'tabbar-backward)
- (global-set-key (kbd "S-<right>") 'tabbar-forward)
- (global-set-key [f12] 'semantic-ia-fast-jump) ; 智能跳转 跳转到定义
- (global-set-key [M-S-f12] 'semantic-analyze-proto-impl-toggle) ;在函数的声明和实现之间来回跳转
- (global-set-key [M-f12] 'eassist-switch-h-cpp) ;头文件和源文件之间跳转的快捷键
- ;;文本界面下禁用此代码折叠
- (when (and window-system (require 'semantic-tag-folding nil 'noerror))
- (global-semantic-tag-folding-mode 1)
- (global-set-key (kbd "C-?") 'global-semantic-tag-folding-mode)
- (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))
最后绑定了常用的快捷键,emacs的快捷键绑定一直让我有点吃不消 ,谁有好帖子可以推荐一下呢,请原谅这里风格的不不统一 。
转载于:https://www.cnblogs.com/JamesChen1988/archive/2012/05/03/2480531.html
Emacs实现C++ 语法高亮、自动补全、各种跳转相关推荐
- editplus配置 linux shell 语法高亮 自动补全
1.文件下载 我们可以从EditPlus官网的User Files获得不同语言的语法高亮和自动补全文件. Bash版本下载地址为:http://www.editplus.com/dn.php?n=ba ...
- emacs c语言 自动补全,Emacs 与 C/C++ 代码自动补全
基于 Emacs 的 company 模式并配合 semantic 文法分析器,实现 Emacs 的 C/C++ 代码自动补全. 关于 Emacs 的代码自动补全 代码自动补全的功能,对于使用 Ema ...
- 跳转定义_解决tensorflow2.0在Pycharm中的自动补全及跳转定义问题
最近尝鲜tf2的小伙伴们在pycharm或者vscode中应该都可能遇到如下问题: 代码能正常运行,但是在pycharm里却无法通过Ctrl+左键跳转到reference的地方,并且光标移到上面还会显 ...
- vscode自动补全函数跳转
.vscode目录下c_cpp_properties.json文件configurations里includePath,compileCommands设置 {"configurations& ...
- 一款SQL自动检查神器,再也不用担心SQL出错了,自动补全、回滚等功能大全
点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试文章 作者:最美分享Coder 来源:http://suo.im/6uI ...
- SQL自动检查神器,再也不用担心SQL出错了,自动补全、回滚等功能大全
点击关注公众号,实用技术文章及时了解 Yearning MYSQL 是一个SQL语句审核平台.提供查询审计,SQL审核等多种功能,支持Mysql,可以在一定程度上解决运维与开发之间的那一环,功能丰富, ...
- gocode+auto-complete搭建emacs的go语言自动补全功能
上篇随笔记录了在emacs中使用go-mode和goflymake搭建了go语言的简单编程环境(推送门),今天来记录一下使用gocode+auto-complete配置emacs中go语言的自动补全功 ...
- linux 函数自动补全,Shell脚本中实现自动补全功能
对于Linuxer来说,自动补全是再熟悉不过的一个功能了.当你在命令行敲下部分的命令时,肯定会本能地按下Tab键补全完整的命令,当然除了命令补全之外,还有文件名补全. Bash-completion ...
- 【Bootstrap】 typeahead自动补全
typeahead 这篇文章记录了我在使用typeahead的一些问题,不是很全,但是基本够用. Bootstrap提供typeahead组件来完成自动补全功能. 两种用法: 直接给标签添加属性 &l ...
最新文章
- Eclipse中SVN设置文件为ignore后重新添加至版本控制
- 【django】【基础】templates
- 《流浪地球》虽好,却存在一个不可回避的硬伤!
- Robot Framework 内置变量
- python:数据库连接操作入门
- 埋点技术:“呵呵,你在网上的一举一动,都在我眼皮子底下”
- app服务器不运行了,springmvc app URL在本地运行,但不在服务器上运行
- ASP.NET MVC 企业级实战 —— 创建用户权限管理范例程序(三)
- 投身管理工作(项目经理修炼手册正文的开头)
- 汪琪玩Excel:只复制可见单元格
- LoadRunner 录制IE 8卡死
- 上海驾照科目二练习笔记
- 微信表情符号 mysql_Emoji表情符号入MySQL数据库报错的解决方案
- 【转载】浅谈蓝牙 Mesh 组网技术
- 苹果屏幕上的小圆点_今天才发现,苹果手机点一下屏幕就能截图,还支持长截图学到了...
- 【Bluetooth蓝牙开发】九、BLE协议之GATT
- 关闭selinux的方法汇总
- iOS动画 Masonry约束弹框动画animateWithDuration:
- Boost:标记的简单双图bimap的测试程序
- 索尼推新款Walkman 同iPod再爭高下
热门文章
- element ui表格中添加开关按钮
- OPPO Reno8配置怎么样 OPPO Reno8值得买吗
- html页面如何按需导入vant,vue脚手架中使用Vant,实现自动按需引入组件,并将px转换为rem...
- 图片编辑软件分享!图片编辑软件大合集。​
- Python的作者及简介
- Python升级之路( Lv14 ) 并发编程初识
- 中首清算:直播新战事:腾讯推斗鱼虎牙合并,制衡B站、快手?
- java hashmap 遍历 for_Java中HashMap遍历
- 墙面有几种装修方法_墙面装修的多种方法如何装修使墙面好看
- 04_HUD_Qt_for_Python开发之路2