2008年的时候,在vmware中开始学习ubuntu。
什么都不会,安装软件基本上是google以后apt-get。
后来ubuntu有了software center,就直接装。
于是乎问题来了。
ubuntu维护的软件版本有时候会赶不上开发者的进度。
emacs就是一个例子。
cedet1.0pre4和emacs2.32就出现无法jump的问题。
但cedet1.0正式版就可以正常jump。
去年学习emacs,每次换环境,都要在synaptic package manager中勾选cedet等,然后ubuntu自动安装到相关目录。
因为插件多,感觉比较麻烦。
后来发现用户目录下也有.emacs.d的文件夹,里面也可以存放插件的文件。
因此emacs的迁移就简单了。
首先从sourceforge下载需要的插件,自然都是最新的。
cedet:http://cedet.sourceforge.net/
ecb:http://ecb.sourceforge.net
doxymacs:http://doxymacs.sourceforge.net
xcscope: http://cscope.sourceforge.net
或者还有自己收集的插件等。
解压到用户目录的.emacs.d目录中。
然后在用户目录的.emacs文件中指向.emacs.d目录即可。
以后只要ubunut下安装emacs即可。复制.emacs文件,.emacs.d目录到用户目录下即可。
善意的提示:在ubuntu下启动桌面特效的话,启动过程可能无法正确设置最大化窗口。
顺便贴一份我的配置:
;load-path
(add-to-list 'load-path "~/.emacs.d/lisp")
(setq load-path (cons "~/emacs" load-path))
(require 'xcscope) ;;加载xcscope
;;记录所有操作
(require 'session)
(add-hook 'after-init-hook 'session-initialize)
(add-hook 'c-mode-common-hook 'doxymacs-mode) ;; 启动doxymacs-mode
(add-hook 'c++-mode-common-hook 'doxymacs-mode) ;; 启动doxymacs-mode
(custom-set-variables
;; custom-set-variables was added by Custom.
;; If you edit it by hand, you could mess it up, so be careful.
;; Your init file should contain only one such instance.
;; If there is more than one, they won't work right.
'(ecb-options-version "2.32")
'(session-use-package t nil (session))
'(column-number-mode t);默认显示行号的同时,也显示列号
'(display-time-mode t);显示当前时间
'(inhibit-startup-screen t);关闭启动画面
'(show-paren-mode t);显示与当前光标所在位置的括号匹配的另一个括号
)
(column-number-mode t)
(transient-mark-mode t)
(setq line-number-mode t)
(setq default-tab-width 8)
(setq x-select-enable-clipboard t)
(setq mouse-yank-at-point t)
(customize-set-variable 'scroll-bar-mode' right)
(setq visible-bell t);关闭出错时的蜂鸣提示声
(mouse-avoidance-mode'animate);当鼠标箭头与光标相近时,使鼠标箭头自动移开
(blink-cursor-mode nil);光标不闪烁
(setq-default cursor-type 'bar);光标显示为一竖线
;;(tool-bar-mode -1);; 不显示emcas的工具栏
;;(menu-bar-mode -1);; 不显示emcas的菜单栏,按ctrl+鼠标右键仍能调出该菜单
(setq x-select-enable-clipboard t);; 支持emacs和外部程序之间进行粘贴
(fset 'yes-or-no-p 'y-or-n-p);以 'y/n'字样代替原默认的'yes/no'字样
(setq frame-title-format "%b@emacs");在最上方的标题栏显示当前buffer的名字
(setq make-backup-files nil);关闭自动备份功能
(setq auto-save-mode nil);关闭自动保存模式
(setq auto-save-default nil);不生成名为#filename# 的临时文件
(setq require-final-newline t);; 自动的在当前的buffer文件的最后加一个空行
(global-set-key "\r" 'align-newline-and-indent);;自动缩进<C-j>变为<Enter>
(setq echo-keystrokes 0.1);; 尽快显示按键序列提示
(global-font-lock-mode t);; 语法高亮
;;;;;;;;
(setq default-input-method 'chinese-py-punct)
;; 用来显示当前光标在哪个函数
(require 'which-func)
(which-func-mode 1)
(setq which-func-unknown "unknown")
;; 用M-x执行某个命令的时候,在输入的同时给出可选的命令名提示
(icomplete-mode 1)
(define-key minibuffer-local-completion-map (kbd "SPC") 'minibuffer-complete-word)
(global-hl-line-mode 1);;高亮当前行
(set-face-background 'default "#334455");背景设定FDFCC1
(set-face-foreground 'default "wheat")
(custom-set-faces
;; custom-set-faces was added by Custom.
;; If you edit it by hand, you could mess it up, so be careful.
;; Your init file should contain only one such instance.
;; If there is more than one, they won't work right.
)
(global-set-key [(f3)] 'shell) ;;执行shell
;; move window (Shift + cursor)
(windmove-default-keybindings)
(setq windmove-wrap-around t)
(global-set-key [C-\;] 'ecb-goto-window-edit-last) ;;切换到编辑窗口
(global-set-key [C-\'] 'ecb-goto-window-methods) ;;切换到函数窗口
(global-set-key [C-.] 'cscope-find-global-definition) ;;搜索定义
(global-set-key [C-,] 'cscope-pop-mark) ;; 跳出转向
(global-set-key [(meta return)] 'semantic-ia-complete-symbol-menu) ;;设置Alt+Enter为自动补全菜单
(add-hook 'c-mode-common-hook (
lambda()
( c-set-style "k&r" )
(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)
) ) ;;设置C语言默认格式
(add-hook 'c++-mode-common-hook ( lambda() ( c-set-style "k&r" ) ) ) ;;设置C++语言默认格式
;;;;;;;;;;;;;;;;;启动时最大化;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(defun toggle-fullscreen (&optional f)
(interactive)
(let ((current-value (frame-parameter nil 'fullscreen)))
(set-frame-parameter nil 'fullscreen
(if (equal 'fullboth current-value)
(if (boundp 'old-fullscreen) old-fullscreen nil)
(progn (setq old-fullscreen current-value)
'fullboth)))))
(global-set-key [C-f11] 'toggle-fullscreen)
; Make new frames fullscreen by default. Note: this hook doesn't do
; anything to the initial frame if it's in your .emacs, since that file is
; read _after_ the initial frame is created.
(add-hook 'after-make-frame-functions 'toggle-fullscreen)
(setq initial-frame-alist '((top . 0) (left . 0) (width . 1366) (height . 768)))
;;(require 'display-line-number)
;;(global-display-line-number-mode 1)
;;;;;;;;;;;;;;;;web方式显示行号;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(set-scroll-bar-mode 'right);滚动条在右侧
;(set-scroll-bar-mode nil) ; 不显示滚动条, even in x-window system (recommended)
;;(require 'wb-line-number)
;;(wb-line-number-toggle)
(require 'cc-mode)
(c-set-offset 'inline-open 0)
(c-set-offset 'friend '-)
(c-set-offset 'substatement-open 0)
(autoload 'gtags-mode "gtags" "" t);gtags-mode is true
;##cedet(Collection of Emacs Development Environment Tools);;;;;;
(load-file "/home/用户目录/.emacs.d/cedet-1.0/common/cedet.el")
(require 'cedet) ;;加载cedet
;读取子目录中的特别的 .el 文件
(global-ede-mode 1); Enable the Project management system
(semantic-load-enable-code-helpers); Enable prototype help and smart completion
(semantic-load-enable-minimum-features)
(semantic-load-enable-guady-code-helpers)
(semantic-load-enable-excessive-code-helpers)
(semantic-load-enable-semantic-debugging-helpers)
(global-srecode-minor-mode 1); Enable template insertion menu
(global-set-key [(f4)] 'speedbar-get-focus);speedbar快捷键[F4]
(define-key c-mode-base-map [(tab)] 'my-indent-or-complete)
(define-key c-mode-base-map [(meta ?/)] 'semantic-ia-complete-symbol-menu)
(setq semantic-default-submodes '(global-semantic-idle-scheduler-mode
global-semanticdb-minor-mode
global-semantic-idle-summary-mode
global-semantic-mru-bookmark-mode))
(defconst cedet-user-include-dirs
(list ".." "../include" "../inc" "../common" "../public"
"../.." "http://www.cnblogs.com/include" "http://www.cnblogs.com/inc" "http://www.cnblogs.com/common" "http://www.cnblogs.com/public"))
(require 'semantic-c nil 'noerror)
(let ((include-dirs cedet-user-include-dirs))
(mapc (lambda (dir)
(semantic-add-system-include dir 'c++-mode)
(semantic-add-system-include dir 'c-mode))
include-dirs))
(enable-visual-studio-bookmarks) ;; 启动VS书签子程序
(require 'semantic-util-modes)
;;(semantic-stickyfunc-mode 0)
;; 代码跳转
(require 'semantic-ia)
(global-set-key [f12] 'semantic-ia-fast-jump)
(global-set-key [C-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))))
(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
)
)
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(add-to-list 'load-path "/home/用户目录/.emacs.d/ecb");读取安装el的路径
(require 'ecb)
(require 'ecb-autoloads)
(setq ecb-auto-activate t);自动启动ecb
(setq ecb-auto-activate t;自动启动ecb
ecb-tip-of-the-day nil;不显示每日提醒
inhibit-startup-message t;去掉Emacs和gnus启动时的引导界面
ecb-auto-compatibility-check nil;
ecb-version-check nil;
ecb-primary-secondary-mouse-buttons (quote mouse-1--C-mouse-1)
)
(custom-set-variables
'(ecb-source-path (quote ("~/workplay")))
)
;;(semantic-mode 1)
(global-set-key [C-f1] 'ecb-deactivate) ;;定义Ctrl+F1为停止ecb
(global-set-key [f1] 'ecb-activate) ;;定义F1键为激活ecb
;;;; 各窗口间切换
(global-set-key [M-left] 'windmove-left)
(global-set-key [M-right] 'windmove-right)
(global-set-key [M-up] 'windmove-up)
(global-set-key [M-down] 'windmove-down)
;;;; 使某一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)
;##doxymacs;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(add-to-list 'load-path "/home/用户目录/.emacs.d/doxymacs");读取安装el的路径
(require 'doxymacs) ;; 启动doxymacs
;;注释高亮,针对C和C++程序
(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)
(doxymacs-mode);doxymacs-mode常true
(global-set-key [(f2)] 'doxymacs-mode);doxymacs-mode快捷键[F2]
(add-hook 'c-mode-common-hook 'doxymacs-mode) ;; 启动doxymacs-mode
(add-hook 'c++-mode-common-hook 'doxymacs-mode) ;; 启动doxymacs-mode
;##GDB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(global-set-key [(f8)] 'gdb-restore-windows);gdb-restore-windows快捷键[F8]
(setq gdb-use-separate-io-buffer nil) ; 不需要"IO buffer"时,则设为nil
(gud-tooltip-mode) ; 调试期支持鼠标查看变量
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;##compile;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(define-key c-mode-base-map [(f7)] 'compile);emacs的compile命令快捷键F7
(setq compile-command "make");默认的make -k命令,变为make命令
(setq compile-command-clean "make clean");默认的make -k命令,变为make命令
(global-set-key [C-f7] '(lambda () (interactive) (compile compile-command-clean)))
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;; set tabbar
(add-to-list 'load-path "/home/用户目录/.emacs.d/emacs-goodies-el");读取安装el的路径
(require 'tabbar)
(tabbar-mode 1)
(global-set-key [(meta l)] 'tabbar-backward)
(global-set-key [(meta k)] 'tabbar-forward)
;; debug
(require 'gdb-ui)
(defun gdb-or-gud-go ()
"If gdb isn't running; run gdb, else call gud-go."
(interactive)
(if (and gud-comint-buffer
(buffer-name gud-comint-buffer)
(get-buffer-process gud-comint-buffer)
(with-current-buffer gud-comint-buffer (eq gud-minor-mode 'gdba)))
(gud-call (if gdb-active-process "continue" "run") "")
(ecb-deactivate)
(gdb (gud-query-cmdline 'gdb))))
(defun gud-break-remove ()
"Set/clear breakpoin."
(interactive)
(save-excursion
(if (eq (car (fringe-bitmaps-at-pos (point))) 'breakpoint)
(gud-remove nil)
(gud-break nil))))
(defun gud-kill ()
"Kill gdb process."
(interactive)
(with-current-buffer gud-comint-buffer (comint-skip-input))
(set-process-query-on-exit-flag (get-buffer-process gud-comint-buffer) nil)
(kill-buffer gud-comint-buffer)
(ecb-activate) )
(defun gdb-tooltip-hook ()
(gud-tooltip-mode 1)
(let ((process (ignore-errors (get-buffer-process (current-buffer)))))
(when process
(set-process-sentinel process
(lambda (proc change)
(let ((status (process-status proc)))
(when (or (eq status 'exit)
(eq status 'signal))
(gud-tooltip-mode -1))))))))
(setq gdb-many-windows t)
(global-set-key [f5] 'gdb-or-gud-go)
(global-set-key [C-f5] 'gud-kill)
;;(load-library "multi-gud.el")
;;(load-library "multi-gdb-ui.el")
(global-set-key [f9] 'gud-break)
(global-set-key [C-f9] 'gud-break-remove)
(defun kill-buffer-when-shell-command-exit ()
"Close current buffer when `shell-command' exit."
(let ((process (ignore-errors (get-buffer-process (current-buffer)))))
(when process
(set-process-sentinel process
(lambda (proc change)
(when (string-match "\\(finished\\|exited\\Debugger\\)" change) ;;(when (string-match "\\(finished\\|exited\\)" change)
(kill-buffer (process-buffer proc))))
)
)
)
)
(setq semanticdb-project-roots
(list
(expand-file-name "/")))
(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)
(delete-selection-mode 1)
;; 退出gdb的时候关闭gdb对应的buffer
(add-hook 'gdb-mode-hook 'kill-buffer-when-shell-command-exit)
;; 退出term的时候关闭term对应的buffer
(add-hook 'term-mode-hook 'kill-buffer-when-shell-command-exit)
(add-hook 'gdb-mode-hook '(lambda ()
(define-key c-mode-base-map [(f10)] 'gud-next)
(define-key c-mode-base-map [(f11)] 'gud-step)
(define-key c-mode-base-map [(C-f11)] 'gud-finish)))