emacs配置文件

来源:互联网 发布:JAVA 发送get请求 最新 编辑:程序博客网 时间:2024/05/22 00:25

转载自解秋生的百度空间 

分类齐全,内容全面   高手啊!

注释:Emacs默认是不为用户创建.emacs文件的,需要用户自己在主文件~/ 下创建(以"."开始表示隐藏文件,用ctrl+h来显示)

;------------个人信息与使用说明-------------

;;请在~/下创建.saves和.semanticdb文件夹
;;设置有用的个人信息。
(setq user-full-name "Qiusheng Xie")
(setq user-mail-address "xqs83@126.com")

;--------------基本设置----------------
;关闭启动画面
(custom-set-variables '(inhibit-startup-screen t))

;;设置背景色和字体色
(set-foreground-color "grey")
(set-background-color "black")

;关闭烦人的出错时的提示声
(setq visible-bell t)

;光标靠近鼠标指针时,让鼠标指针自动让开,别挡住视线
;(mouse-avoidance-mode 'animate)


;滚动页面时比较舒服,不要整页的滚动
(setq     scroll-step 1
scroll-margin 3
scroll-conservatively 10000)

;光标不闪
(blink-cursor-mode nil)
;;光标显示为一竖线
;(setq-default cursor-type 'bar)

;; 不显示工具栏
(tool-bar-mode -1)
;; 总是不显示菜单,按ctrl+鼠标右键还是能调出菜单
(menu-bar-mode -1)


;; 支持emacs和外部程序的粘贴
(setq x-select-enable-clipboard t)

;设置kill-ring-max为200
(setq kill-ring-max 200)

;在模式栏中显示行号列号
(column-number-mode t)
(line-number-mode t)

;;在buffer左侧显示行号
;(dolist (hook (list
;'c-mode-hook
;'c++-mode-hook
;'emacs-lisp-mode-hook
;'lisp-interaction-mode-hook
;'lisp-mode-hook
;'emms-playlist-mode-hook
;'java-mode-hook
;'asm-mode-hook
;'haskell-mode-hook
;'rcirc-mode-hook
;'emms-lyrics-mode-hook
;'erc-mode-hook
;'sh-mode-hook
;'makefile-gmake-mode-hook
;))
;(add-hook hook (lambda () (linum-mode 1))))

;显示匹配括号
(show-paren-mode t)
(setq show-paren-style 'parentheses)

;以 y/n代表 yes/no
(fset 'yes-or-no-p 'y-or-n-p)

;;display time
(display-time-mode t)
;;;;启动Emacs Server
(server-start)

;;;;高亮当前行
(require 'hl-line)
(global-hl-line-mode t)


;滚动条在右侧
(set-scroll-bar-mode 'right)

;最大化
(defun my-maximized ()
(interactive)
(x-send-client-message
nil 0 nil "_NET_WM_STATE" 32
'(2 "_NET_WM_STATE_MAXIMIZED_HORZ" 0))
(x-send-client-message
nil 0 nil "_NET_WM_STATE" 32
'(2 "_NET_WM_STATE_MAXIMIZED_VERT" 0))
)
;启动时最大化
;(my-maximized)

;在标题栏显示buffer的名字
(setq frame-title-format "%b@emacs")

;;设置备份策略
(setq make-backup-files t);;启用备份功能
(setq vc-make-backup-files t);;使用版本控制系统的时候也启用备份功能
(setq version-control t);;启用版本控制,即可以备份多次
(setq kept-old-versions 2);;备份最原始的版本两次,即第一次编辑前的文档,和第二次编辑前的文档
(setq kept-new-versions 6);;备份最新的版本6次,理解同上
(setq delete-old-versions t);;删掉不属于以上3中版本的版本
(setq backup-directory-alist '(("." . "~/.saves")));;设置备份文件的路径到~/.saves中
(setq backup-by-copying t);;备份设置方法,直接拷贝

(setq backup-enable-predicate 'ecm-backup-enable-predicate);;设置备份条件
;;关闭匹配下列目录或文件的备份功能
(defun ecm-backup-enable-predicate (filename)
(and (not (string= "/tmp/" (substring filename 0 5)))
(not (string-match "semanticdb" filename))
))


;关闭自动保存模式
(setq auto-save-mode nil)
;不生成 #filename# 临时文件
(setq auto-save-default nil)

;;可以递归的使用 minibuffer
;(setq enable-recursive-minibuffers t)
(setq max-mini-window-height 1)


;; 在行首 C-k 时,同时删除该行
(setq-default kill-whole-line t)

;; 自动的在文件末增加一新行
(setq require-final-newline t)
;; 当光标在行尾上下移动的时候,始终保持在行尾。
(setq track-eol t)
;; 当浏览 man page 时,直接跳转到 man buffer。
(setq Man-notify-method 'pushy)
;; 当使用 M-x COMMAND 后,过 1 秒钟显示该 COMMAND 绑定的键
(setq suggest-key-bindings 1)

;-------------全局快捷键----------------
;;;F1:列举我的书签
(global-set-key (kbd "<f1>") 'list-bookmarks)
;;;Ctrl+F1:设置我的书签
(global-set-key [C-f1] 'bookmark-set)

;; F2:保存buffer
(global-set-key (kbd "<f2>") 'save-buffer )

;;;Ctrl+F2:保存当前桌面
(global-set-key [C-f2] 'desktop-save)

;;F3:跳转到寄存器保存的位子
(global-set-key (kbd "<f3>") 'jump-to-register)
;;Ctrl+F3:记录当前光标位子到寄存器
(global-set-key [C-f3] 'point-to-register)

; F4:激活speedbar
(global-set-key [(f4)] 'speedbar-get-focus)


;; F5:最大化当前buffer:
(global-set-key [(f5)] 'delete-other-windows)
;; F6:关闭buffer
(global-set-key [(f6)] 'kill-buffer-and-window)


;编译和调试
(global-set-key [f7] 'compile)
(global-set-key [C-f7] 'gdb)
(setq-default compile-command "make")
(global-set-key [C-f8] 'previous-error)
(global-set-key [f8] 'next-error)

; F9:格式化代码
(global-set-key [f9] 'c-indent-line-or-region)
; F10:注释 / 取消注释
(global-set-key [f10] 'comment-or-uncomment-region)

;Ctrl+F11:复制区域到寄存器
(global-set-key [C-f11] 'copy-to-register)
;;F11:粘贴寄存器内容
(global-set-key [(f11)] 'insert-register)


;;定义F12键为激活ecb
(global-set-key [f12] 'ecb-activate)
;;定义Ctrl+F12为停止ecb
(global-set-key [C-f12] 'ecb-deactivate)

(global-set-key [(control tab)] 'other-window);切换窗口
(global-set-key (kbd "C-z") 'undo);撤消
(global-set-key (kbd "C-a") 'mark-whole-buffer);全选
(global-set-key [(meta g)] 'goto-line);跳到某行
(global-set-key (kbd "C-/") 'hs-toggle-hiding)


(global-set-key (kbd "C-x b") 'ibuffer);打开ibuffer
(global-set-key (kbd "C-x v") 'browse-kill-ring);打开browse-kill-ring

;;;C-x c 复制整行, 而"C-u 5 C-x c"复制 5 行
(global-set-key (kbd "C-x c") 'copy-lines);;;复制一行或者多行
(global-set-key (kbd "C-x d") 'zl-delete-line);;删除一行
(global-set-key (kbd "C-x a") 'kill-match-paren);;删除匹配括号间内容

(global-set-key [(meta left)]  'tabbar-backward);;切换前一个tab
(global-set-key [(meta right)] 'tabbar-forward);;切换下一个tab
(global-set-key [(meta up)] 'tabbar-backward-group)
(global-set-key [(meta down)] 'tabbar-forward-group)


(global-set-key [(tab)] 'my-indent-or-complete);Tab补全或缩进

;--------------编程相关----------------
;;;;打开代码折叠功能
(add-hook 'c-mode-hook 'hs-minor-mode)
(add-hook 'c++-mode-hook 'hs-minor-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++风格
(add-hook 'c-mode-hook 'my-c-cpp-mode)
(add-hook 'c++-mode-hook 'my-c-cpp-mode)
(defun my-c-cpp-mode()
;; 将回车代替C-j的功能,换行的同时对齐
(define-key c-mode-map [return] 'newline-and-indent)
(interactive)
(define-key c++-mode-map [return] 'newline-and-indent)
(interactive)
;; 设置程序的对齐风格
(c-set-style "K&R")
;;在模式栏中显示当前光标所在函数
(which-function-mode)
;; 自动模式,在此种模式下当你键入{时,会自动根据你设置的对齐风格对齐
;;;(c-toggle-auto-state);此处关闭是觉得输入;后的自动换行功能不习惯
;; 此模式下,当按Backspace时会删除最多的空格
(c-toggle-hungry-state)
;; 自动缩进的宽度设置为4
(setq c-basic-offset 4)
;;用空格代替tab
(setq-default indent-tabs-mode nil)
;Alt+Return 智能补全
(define-key c-mode-base-map [M-return] 'semantic-ia-complete-symbol-menu)
)

;;删除匹配括号间内容
(defun kill-match-paren (arg)
(interactive "p")
(cond ((looking-at "[([{]") (kill-sexp 1) (backward-char))
((looking-at "[])}]") (forward-char) (backward-kill-sexp 1))
(t (self-insert-command (or arg 1)))))

;;;删除一行
(defun zl-delete-line nil
"delete the whole line"
(interactive)
(beginning-of-line);光标移动到行首
(push-mark);做个标记
(beginning-of-line 2);移动到下一行行首
(kill-region (point) (mark)));光标和标记之间的删掉

;;;复制一行或者多行
;;;C-c C-w 复制整行, 而"C-u 5 C-c w"复制 5 行
(defun copy-lines(&optional arg)
(interactive "p")
(save-excursion
(beginning-of-line)
(set-mark (point))
(next-line arg)
(kill-ring-save (mark) (point))
)
)



;--------------自动补全----------------

;;;自定义hippie-expand补全或缩进函数
(defun my-indent-or-complete ()
(interactive)
(if (looking-at "\\>")
(hippie-expand nil)
(indent-for-tab-command)
)
)

;; hippie-expand 自动补全策略
(setq hippie-expand-try-functions-list
'(
senator-try-expand-semantic        ;优先调用senator的分析结果
try-expand-dabbrev-visible         ;dabbrev策略, 可见窗口优先
try-expand-dabbrev                 ;dabbrev策略
try-expand-dabbrev-all-buffers     ;dabbrev策略, 包括所有窗口(除了当前窗口)
try-expand-dabbrev-from-kill       ;dabbrev策略, 从所有删除记录里搜索
try-complete-file-name             ;补全文件名
try-complete-file-name-partially   ;补全文件名, 匹配优先
try-expand-list                    ;补全list
try-expand-list-all-buffers        ;补全list, 包括所有窗口(除了当前窗口)
try-expand-line                    ;整行补全
try-expand-line-all-buffers        ;整行补全, 包括所有窗口(除了当前窗口)
try-complete-lisp-symbol           ;补全符号, 符号太多了, 设置低优先级利于高效补全
try-complete-lisp-symbol-partially ;补全符号, 包括所有窗口(除了当前窗口)
try-expand-whole-kill              ;kill-ring里面补全
))


;;; 配置semantic,代码分析,智能补全
(setq semanticdb-default-save-directory (expand-file-name "~/.semanticdb")) ;设置semantic.cache路径
(setq semanticdb-project-roots (list (expand-file-name "/"))) ;配置Semantic的检索范围
(autoload 'senator-try-expand-semantic "senator") ;优先调用了senator的分析结果
(add-hook 'semantic-init-hooks 'semantic-idle-completions-mode) ;空闲时进行补全分析
(setq-default semantic-idle-scheduler-idle-time 432000) ;避免semantic占用CPU过多

;;; 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")))))
(add-hook 'c++-mode-common-hook
(lambda ()
(setq semanticdb-project-system-databases
(list (semanticdb-create-database
semanticdb-new-database-class
"/usr/include")))))


;--------------外部扩展----------------
;以下需要安装(用apt安装)semantic, speedbar, eieio, cedet, cscope, ecb

;;配置semantic
(semantic-load-enable-code-helpers)

;;配置speedbar
(autoload 'speedbar-frame-mode "speedbar" "Popup a speedbar frame" t)
(autoload 'speedbar-get-focus "speedbar" "Jump to speedbar frame" t)
(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 1)


;inhibit tags grouping and sorting
(setq speedbar-tag-hierarchy-method
'(speedbar-simple-group-tag-hierarchy
))

;;配置ecb
(setq ecb-tip-of-the-day nil)
(setq ecb-tree-indent 4)
(setq ecb-windows-height 0.5)
(setq ecb-windows-width 0.20)
(setq ecb-auto-compatibility-check nil)
(setq ecb-version-check nil)

;;配置cscope
(require 'xcscope)
;不自动更新cscope.out
(setq cscope-do-not-update-database t)

;以下需要安装(从信箱下载)session, tabbar,browse-kill-ring

;;配置session和Desktop
(require 'session)
(add-hook 'after-init-hook 'session-initialize)
;;使用M-x desktop-save保存回话,使用M-x desktop-clear清除上次保存的回话
(load "desktop")
(desktop-load-default)
(desktop-read)

;;配置tabbar
(require 'tabbar)
(tabbar-mode t)

;;配置browse-kill-ring
(require 'browse-kill-ring)
(browse-kill-ring-default-keybindings)

;;doxymacs
(require 'doxymacs)
(add-hook 'c-mode-common-hook'doxymacs-mode)
(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)

;;END