编辑器配置

;##########################################################################
;                  Emacs基本信息设置
;;##########################################################################
;(setq server-auth-dir "D:\21_emacs")
;(setq server-name "emacs-server-file")
;(server-start)

;;Emacs路径相关配置
;(setenv "HOME" "D:\21_emacs")
;(setq default-directory "~/")
;(setenv "PATH" "d:/emacs-24.3/bin")
;; 对exec-path和PATH的处理
;;(load-file "~/.emacs.d/path-set/path-set.el")
;;设置个人信息
(setq user-full-name "mutou")
(setq user-mail-address "muhongzhang@gmail.com")


;;##########################################################################
;;                  Emacs窗口配置相关
;;##########################################################################
;; 设置标题栏
(setq frame-title-format "mutou")

;;关闭emacs启动时的画面
(setq inhibit-startup-message t)

;;关闭gnus启动时的画面
(setq gnus-inhibit-startup-messge t)

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

;;启动自动最大化(数据自己调整,注意格式,如(top . 0),圆点前后都要留有空格)
(setq initial-frame-alist '((top . 0) (left . 0) (width . 120) (height . 52)))
(setq default-frame-alist '((width .120) (height . 52)))

;;不要工具条
(tool-bar-mode -1)

;;不要菜单条
;(menu-bar-mode -0)

;; 去掉滚动条
(scroll-bar-mode -1)

;;显示行列号
(setq column-number-mode t)
(setq line-number-mode t)
(global-linum-mode t)

;;把 fill-column 设为 120. 这样的文字更好读
(setq default-fill-column 120)

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

;; 显示时间设置
(display-time-mode 1);;启用时间显示设置,在minibuffer上面的那个杠上
(setq display-time-24hr-format t);;时间使用24小时制
(setq display-time-day-and-date t);;时间显示包括日期和具体时间
(setq display-time-use-mail-icon t);;时间栏旁边启用邮件设置
(setq display-time-interval 30);;时间的变化频率,单位

;;防止页面滚动时跳动
;;scroll-margin 2 可以在靠近屏幕边沿3行时就开始滚动
;;scroll-step 1 设置为每次翻滚一行,可以使页面更连续
(setq scroll-step 1 scroll-margin 2 scroll-conservatively 10000)

;;鼠标滚轮,默认的滚动太快,这里改为3行
(defun up-slightly () (interactive) (scroll-up 3))
(defun down-slightly () (interactive) (scroll-down 3))
(global-set-key [mouse-4] 'down-slightly)
(global-set-key [mouse-5] 'up-slightly)

;;当光标在行尾上下移动的时候,始终保持在行尾
(setq track-eol t)

;;##########################################################################
;;                  操作习惯设置
;;##########################################################################
;;改变Emacs固执的要你回答yes的行为。按 y 或空格键表示 yes,n 表示 no
(fset 'yes-or-no-p 'y-or-n-p)

;; 括号匹配高亮
(show-paren-mode t)

;;进行语法加亮。
(setq global-font-lock-mode t)

;设置默认字体(默认字体用Courier New)
;25版本如果打开的文件中带中文就会特别卡,改为宋体后使用C-v翻页仍然有点卡顿,改为黑体雅黑感觉就不卡了)
(set-default-font "新宋体-10")
;;(set-default-font "微软雅黑-10")
;;(set-default-font "10x20")
;;(set-default-font "STHeiti-10")
;;(set-default-font "Droid Sans Mono-10")

;;高亮当前行
(global-hl-line-mode 1)
;;淡绿色,适合无背景颜色
;;(set-face-background 'hl-line "#90EE90")
;;(set-face-background 'hl-line "#7CFC00") ;;草坪绿
;;(set-face-background 'hl-line "#3e4446")  ;;灰黑色
(set-face-background 'hl-line "#FFFFE0") ;;浅黄
(set-face-foreground 'highlight nil)

;;颜色相关
;(load-file "~/.emacs.d/color-theme/my-color-theme.el")

;;设置粘贴缓冲条目数量.用一个很大的kill ring(最多的记录个数). 这样防止我不小心删掉重要的东西
(setq kill-ring-max 100)

;;设置打开文件的缺省路径
(setq default-directory "c:/")

;;长Emacs可以直接打开和显示图片
(setq auto-image-file-mode t)

;;当有两个文件相同的缓存时,使用前缀的目录名称buffer名字,不用原来的foobar形式
(setq uniquify-buffer-name-style 'forward)

;;颜色主题
(add-to-list 'custom-theme-load-path "~/.emacs.d/themes")
;(load-theme 'spolsky t)
;(load-theme 'sublime t)
;(color-theme-sublime)

;;设置中文语言环境
;;(set-language-environment 'Chinese-GB)
;;写文件的编码方式
;;(set-buffer-file-coding-system 'gb2312)
(set-buffer-file-coding-system 'utf-8)
;;终端方式的编码方式
(set-terminal-coding-system 'utf-8)
;;键盘输入的编码方式
;;(set-keyboard-coding-system 'gb2312)
(set-keyboard-coding-system 'utf-8)
;;读取或写入文件名的编码方式
(setq file-name-coding-system 'utf-8)

;;打开就启用text模式
(setq default-major-mode 'text-mode)

;;高亮显示选中的区域  
(transient-mark-mode t)   

;;可以递归的使用 minibuffer
(setq enable-recursive-minibuffers t)

;;org-mode自动换行
(add-hook 'org-mode-hook (lambda () (setq truncate-lines nil)))

;;ido的配置,这个可以使你在用C-x C-f打开文件的时候在后面有提示;
;;这里是直接打开了ido的支持,在emacs23中这个是自带的.
(ido-mode t)

(setq ido-save-directory-list-file nil)
;;ido模式中不保存目录列表,解决退出Emacs时ido要询问编码的问题。

;;不用TAB字符来indent, 这会引起很多奇怪的错误。编辑Makefile的时候也不用担心,因为makefile-mode会把TAB键设置成真正的TAB字符,并且加亮显示的。
(setq-default indent-tabs-mode nil)
(setq default-tab-width 4);;tab键为4个字符宽度
(setq tab-stop-list ())

;打开压缩文件时自动解压缩。
;(auto-compression-mode 1)

;;关闭自动保存  当前buffer关闭
(setq auto-save-default nil)
(setq auto-save-mode nil)

;;不生成临时文件
(setq-default make-backup-files nil)

;;设定不产生备份文件
(setq make-backup-files nil)

;;使用鼠标中键可以粘贴
;;(setq x-select-enable-clipboard t)
;;(setq mouse-yank-at-point t)

;;自动的在文件末增加一新行
(setq require-final-newline t)
(setq track-eol t)

;; 当浏览 man page 时,直接跳转到man buffer
(setq Man-notify-method 'pushy)

;;设置一下备份时的版本控制,这样更加安全。  
(setq version-control t)  
(setq kept-new-versions 3)  
(setq delete-old-versions t)  
(setq kept-old-versions 2)  
(setq dired-kept-versions 1)  

;;光标显示为一竖线  
;;(setq-default cursor-type 'bar) 

;;是用aspell程序作为Emacs的拼写检查成学
(setq-default ispell-program-name "aspell")

;;使用narrow功能时的一个设置
(put 'narrow-to-region 'disabled nil)

;;启动Emacs自动设置为两个窗口(上下各一个)
;;(split-window-vertically)

;;==========字体解码优先顺序=========== 
;;从王垠那拷过来的,不用怎么再改吧。  
;;(setq font-encoding-alist  
;;(append '(("MuleTibetan-0" (tibetan . 0))  
;;("GB2312" (chinese-gb2312 . 0))  
;;("JISX0208" (japanese-jisx0208 . 0))  
;;("JISX0212" (japanese-jisx0212 . 0))  
;;("VISCII" (vietnamese-viscii-lower . 0))  
;;("KSC5601" (korean-ksc5601 . 0))  
;;("MuleArabic-0" (arabic-digit . 0))  
;;("MuleArabic-1" (arabic-1-column . 0))  
;;("MuleArabic-2" (arabic-2-column . 0))) font-encoding-alist)) 

;;约会提醒
(setq appt-issue-message t)

;; 设置时间戳,标识出最后一次保存文件的时间。
;;(setq time-stamp-active t)
;;(setq time-stamp-warn-inactive t)
;;(setq time-stamp-format "%:y-%02m-%02d %3a %02H:%02M:%02S mutou")


;;##########################################################################
;;                  键盘绑定
;;##########################################################################
;;设置C-/为undo,M-/为set-mark(默认已经设置了)
;(global-set-key (kbd "C-/") 'undo)

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

;;设置home键指向buffer开头,end键指向buffer结尾
(global-set-key [home] 'beginning-of-buffer)
(global-set-key [end] 'end-of-buffer)
(global-set-key (kbd "C-x g") 'beginning-of-buffer)
(global-set-key (kbd "C-x C-g") 'end-of-buffer)

;;设置M-g为goto-line
(global-set-key (kbd "M-g") 'goto-line)

;;取消control+space键设为mark
;;(global-set-key (kbd "C-SPC") 'nil)

;;用来set-mark
;;(global-set-key (kbd "C-x C-2") 'set-mark-command)
 
;;window jump 
;(global-set-key (kbd "s-k") 'windmove-up) 
;(global-set-key (kbd "s-j") 'windmove-down) 
;(global-set-key (kbd "s-h") 'windmove-left) 
;(global-set-key (kbd "s-l") 'windmove-right) 

;;F11全屏(默认配置)

;;F12最大化设置(不好使) //FIXME
;(global-set-key [F12] 'my-maximized)
;(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))
;)

;; 分2-4屏(没用过更大的显示器了),绑定M-0到'other-window 
(defun smart-split ()
  (interactive)
  (delete-other-windows)
  (split-window-horizontally) ;; 最少分两屏
  (other-window 1)
  (switch-to-next-buffer)
  (other-window 1)
  (unless (< (window-width) 120) ;; 240+ 三屏
  (split-window-horizontally)
  (balance-windows)
  (switch-to-next-buffer)
  (other-window 1))
  (unless (< (window-width) 100) ;; 300+ 四屏
  (split-window-horizontally)
  (balance-windows)
  (switch-to-next-buffer)
  (other-window 1))
  (recenter))

;(progn 
;(keydef "M-0" other-window) 
;(keydef "M-4" kill-this-buffer)
;(keydef "M-1" delete-other-windows)
;(keydef "M-2" smart-split)
;(keydef "M-3" split-window-horizontally))

(global-set-key [(control tab)] 'other-window)

;; "C-,"设为屏幕左移命令
;;(global-set-key (kbd "C-,") 'scroll-left)
;; "C-."设为屏幕右移命令
;;(global-set-key (kbd "C-.") 'scroll-right)

;;设置F11快捷键指定Emacs 的日历系统
;;(global-set-key [f11] 'calendar)

;;设置F12 快速察看日程安排
;;(global-set-key [f12] 'list-bookmarks)

(global-set-key [(meta p)] 'scroll-up-line)
(global-set-key [(meta n)] 'scroll-down-line)

;;--------默认设置快捷键--------------
;;预编译快捷键
;;C-c C-p
;;C-c C-n
;;C-c C-u (在#elif间跳转)

;;在上下层括号之间跳转
;;C-M-d
;;C-M-u

;;C语言中tab不起作用,使用如下键替代
;;C-Q <TAB>
;;alt+i

;;向前后移动一段话
;;M-{ 
;;M-}

;;在*scratch* buffer中(lisp-interaction-mode)模式中,输入lisp命令,
;;可以直接在行尾运行C-j,则可以在buffer中插入当前的运算记过。
;;或者在行尾运行C-x C-e,则可以在minibuffer查看运行结果。
;;对于学习Elisp有用。
;;==================键盘绑定结束============================================


;;##########################################################################
;;         语言环境字符集设置(utf-8)
;;##########################################################################
(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乱码,好像没作用

;;##########################################################################
;;            编程设置
;;##########################################################################
;;在模式栏中显示当前光标所在函数
(which-function-mode)

;;自动缩进的宽度设置为4
(setq c-basic-offset 4)  

;;代码折叠
;;能把一个代码块缩起来,需要的时候再展开
;; 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
(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)

;;自动补全括号
;;输入左边的括号,就会自动补全右边的部分.包括(), "", [] , {} , 等等。
(defun my-c-mode-auto-pair ()
  (interactive)
  (make-local-variable 'skeleton-pair-alist)
  (setq skeleton-pair-alist '(
    (?` ?` _ "''")
    (?\( ? _ " )")
    (?\[ ? _ " ]")
    (?{ \n > _ \n ?} >)))
  (setq skeleton-pair t)
  (local-set-key (kbd "(") 'skeleton-pair-insert-maybe)
  (local-set-key (kbd "{") 'skeleton-pair-insert-maybe)
  (local-set-key (kbd "`") 'skeleton-pair-insert-maybe)
  (local-set-key (kbd "[") 'skeleton-pair-insert-maybe))

(add-hook 'c-mode-hook 'my-c-mode-auto-pair)
(add-hook 'c++-mode-hook 'my-c-mode-auto-pair)

;;把c语言风格设置为k&r风格
;;(add-hook 'c-mode-hook '(lambda () (c-set-style "k&r")))

;;css-mode.el编辑css文件
(autoload 'css-mode "css-mode" "CSS editing mode" t)

;;把buffer的内容连同颜色转为html格式
(autoload 'htmlize-buffer "htmlize" "HTMLize mode" t)

;;folding.el 编辑文本的一部分,其它部分折叠起来
(autoload 'folding-mode "folding" "Folding mode" t)
(autoload 'turn-off-folding-mode "folding" "Folding mode" t)
(autoload 'turn-on-folding-mode "folding" "Folding mode" t)

;;预处理设置
(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)

;;将文件模式和文件后缀关联起来
(setq auto-mode-alist
      (append '(("\\.py\\'" . python-mode)
                ("\\.s?html?\\'" . html-helper-mode)
                ("\\.asp\\'" . html-helper-mode)
                ("\\.phtml\\'" . html-helper-mode)
                ("\\.css\\'" . css-mode))
              auto-mode-alist))

;;Shell使用ansi color
(autoload 'ansi-color-for-comint-mode-on "ansi-color" nil t)
(add-hook 'shell-mode-hook 'ansi-color-for-comint-mode-on)

;;增大使用查找函数和变量的寻找范围  
(setq apropos-do-all t)

;;##########################################################################
;;                  日历设置
;;##########################################################################
;;设置日历的一些颜色
(setq calendar-load-hook
'(lambda ()
(set-face-foreground 'diary-face "skyblue")
(set-face-background 'holiday-face "slate blue")
(set-face-foreground 'holiday-face "white")))

;;设置我所在地方的经纬度,calendar里有个功能是日月食的预测,和你的经纬度相联系的。
;; 让emacs能计算日出日落的时间,在 calendar 上用 S 即可看到
(setq calendar-latitude +39.54)
(setq calendar-longitude +116.28)
(setq calendar-location-name "北京")

;; 设置阴历显示,在 calendar 上用 pC 显示阴历
(setq chinese-calendar-celestial-stem
  ["甲" "乙" "丙" "丁" "戊" "己" "庚" "辛" "壬" "癸"])
(setq chinese-calendar-terrestrial-branch
  ["子" "丑" "寅" "卯" "辰" "巳" "戊" "未" "申" "酉" "戌" "亥"])

;; 设置 calendar 的显示
(setq calendar-remove-frame-by-deleting t)
(setq calendar-week-start-day 1) ; 设置星期一为每周的第一天
(setq mark-diary-entries-in-calendar t) ; 标记calendar上有diary的日期
(setq mark-holidays-in-calendar nil) ; 为了突出有diary的日期,calendar上不标记节日
(setq view-calendar-holidays-initially nil) ; 打开calendar的时候不显示一堆节日

;; 去掉不关心的节日,设定自己在意的节日,在 calendar 上用 h 显示节日
(setq christian-holidays nil)
(setq hebrew-holidays nil)
(setq islamic-holidays nil)
(setq solar-holidays nil)
(setq general-holidays '((holiday-fixed 1 1 "元旦")
                         (holiday-fixed 2 14 "情人节")
                         (holiday-fixed 3 14 "白色情人节")
                         (holiday-fixed 4 1 "愚人节")
                         (holiday-fixed 5 1 "劳动节")
                         (holiday-float 5 0 2 "母亲节")
                         (holiday-fixed 6 1 "儿童节")
                         (holiday-float 6 0 3 "父亲节")
                         (holiday-fixed 7 1 "建党节")
                         (holiday-fixed 8 1 "建军节")
                         (holiday-fixed 9 10 "教师节")
                         (holiday-fixed 10 1 "国庆节")
                         (holiday-fixed 12 25 "圣诞节")))

;;Calendar模式支持各种方式来更改当前日期
;;(这里的“前”是指还没有到来的那一天,“后”是指已经过去的日子)
;; q 退出calendar模式
;; C-f 让当前日期向前一天
;; C-b 让当前日期向后一天
;; C-n 让当前日期向前一周
;; C-p 让当前日期向后一周
;; M-} 让当前日期向前一个月
;; M-{ 让当前日期向后一个月
;; C-x ] 让当前日期向前一年
;; C-x [ 让当前日期向后一年
;; C-a 移动到当前周的第一天
;; C-e 移动到当前周的最后一天
;; M-a 移动到当前月的第一天
;; M-e 多动到当前月的最后一天
;; M-< 移动到当前年的第一天
;; M-> 移动到当前年的最后一天

;;Calendar模式支持移动多种移动到特珠日期的方式
;; g d 移动到一个特别的日期
;; o 使某个特殊的月分作为中间的月分
;; . 移动到当天的日期
;; p d 显示某一天在一年中的位置,也显示本年度还有多少天。
;; C-c C-l 刷新Calendar窗口

;; Calendar支持生成LATEX代码。
;; t m 按月生成日历
;; t M 按月生成一个美化的日历
;; t d 按当天日期生成一个当天日历
;; t w 1 在一页上生成这个周的日历
;; t w 2 在两页上生成这个周的日历
;; t w 3 生成一个ISO-SYTLE风格的当前周日历
;; t w 4 生成一个从周一开始的当前周日历
;; t y 生成当前年的日历

;;EMACS Calendar支持配置节日:
;; h 显示当前的节日
;; x 定义当天为某个节日
;; u 取消当天已被定义的节日
;; e 显示所有这前后共三个月的节日。
;; M-x holiday 在另外的窗口的显示这前后三个月的节日。

;; 另外,还有一些特殊的,有意思的命令:
;; S 显示当天的日出日落时间(是大写的S)
;; p C 显示农历可以使用
;; g C 使用农历移动日期可以使用

;;##########################################################################
;;          日记设置
;;##########################################################################
;; 默认的日记文件
;;(setq diary-file "~/diary/diary")
;;(setq diary-mail-addr "muhongzhang@gmail.com")
;;(add-hook 'diary-hook 'appt-make-list)

;;当你创建了一个'~/diary'文件,你就可以使用calendar去查看里面的内容。你可以查看当天的事件,相关命令如下 :
;; d 显示被选中的日期的所有事件
;; s 显示所有事件,包括过期的,未到期的等等

;; 创建一个事件的样例:
;; 02/11/1989
;; Bill B. visits Princeton today
;; 2pm Cognitive Studies Committee meeting
;; 2:30-5:30 Liz at Lawrenceville
;; 4:00pm Dentist appt
;; 7:30pm Dinner at George's
;; 8:00-10:00pm concert

;; 创建事件的命令:
;; i d 为当天日期添加一个事件
;; i w 为当天周创建一个周事件
;; i m 为当前月创建一个月事件
;; i y 为当前年创建一个年事件
;; i a 为当前日期创建一个周年纪念日
;; i c 创建一个循环的事件

;;##########################################################################
;;            其他扩展
;;##########################################################################
;;============临时记号============
;;有时你需要跳到另一个文件进行一些操作,然后很快的跳回来。你当然可以 使用 bookmark或者寄存器
;;但是这些实在是太慢了。你多想拥有vi那样的 ma, mb, 'a, 'b 的操作。现在你可以用几行 elisp 达到类似的目的
(defun ska-point-to-register()
  "Store cursorposition _fast_ in a register.
Use ska-jump-to-register to jump back to the stored position." 
  (interactive)
  (setq zmacs-region-stays t)
  (point-to-register 8))

(defun ska-jump-to-register()
  "Switches between current cursorposition and position  
that was stored with ska-point-to-register."
  (interactive)
  (setq zmacs-region-stays t)
  (let ((tmp (point-marker)))
        (jump-to-register 8)
        (set-register 8 tmp)))
(global-set-key [(control ?\.)] 'ska-point-to-register);;C-.
(global-set-key [(control ?\,)] 'ska-jump-to-register);;C-,

;;============go-to-char============
;;go-to-char非常感谢Oliver Scholz提供这个函数给我。
;;这个函数是一个vi的 "f" 命令的替代品。vi的用户知道,vi有 一个特别好的命令 "f"。当你按 "fx", x 是任意一个字符时 
;;光标就会移动到下一个 "x" 处。这之后只要按 ";"(分号),光标就到再 下一个 "x"。
;;我一直觉得 Emacs没有这样一个方便的命令,但是Oliver给了 我一个完美的答案:
;;有了这段代码之后,当你按 C-c a x (x 是任意一个字符) 时,光 标就会到下一个 x 处。再次按 x,光标就到下一个 x。比如 C-c a w w w w ...,
;;我觉得这个方式比 vi 的 "f" 要快。  
(defun my-go-to-char (n char)
  "Move forward to Nth occurence of CHAR.
Typing `my-go-to-char-key' again will move forwad to the next Nth occurence of CHAR."
  (interactive "p\ncGo to char: ")
  (search-forward (string char) nil nil n)
  (while (char-equal (read-char)
             char)
    (search-forward (string char) nil nil n))
  (setq unread-command-events (list last-input-event)))
(define-key global-map (kbd "C-c C-f") 'my-go-to-char)


;;============自动补全功能============(由于缺少senator,因此不好使)
;;自动补全功能,这是从王垠的网站直接Copy过来的,引用一些他对此的说明
;;设置以下 hippie-expand 的补全方式。它是一个优先列表, hippie-expand 会优先使用表最前面
;;的函数来补全这是说,首先使用当前的buffer补全,如果找不到,就到别的可见的窗口里寻找,
;;如还找不到,那么到所有打开的buffer去找,如果还……那么到kill-ring里,到文件名,到简称列表  
;;里,到list,当前使用的匹配方式会在 echo 区域显示。  
;;特别有意思的是 try-expand-line,它可以帮你补全整整一行文字。我很多时后有两行文字大致相  
;;同,只有几个字不一样,但是我懒得去拷贝粘贴以下。那么我就输入这行文字的前面几个字。然后  
;;多按几下 M-/ 就能得到那一行。  
  
;;hippie的自动补齐策略,优先调用了senator的分析结果:
(autoload 'senator-try-expand-semantic "senator")  
(setq hippie-expand-try-functions-list  
'(  
    senator-try-expand-semantic      
    try-expand-line  
    try-expand-line-all-buffers  
    try-expand-list  
    try-expand-list-all-buffers  
    try-expand-dabbrev  
    try-expand-dabbrev-visible  
    try-expand-dabbrev-all-buffers  
    try-expand-dabbrev-from-kill  
    try-complete-file-name  
    try-complete-file-name-partially  
    try-complete-lisp-symbol  
    try-complete-lisp-symbol-partially  
    try-expand-whole-kill))  
(global-set-key [(meta p)] 'hippie-expand)
  
;;自定义自动补齐命令,这部分是抄hhuu的,如果在单词中间就补齐,否则就是tab。  
(defun my-indent-or-complete ()  
  (interactive)  
  (if (looking-at "\\>")  
      (hippie-expand nil)  
    (indent-for-tab-command))  
  )  
;;(global-set-key [(meta p)] 'my-indent-or-complete)
  
  
;;============拷贝代码自动格式化============
;;Emacs 里对代码的格式化支持的非常好,不但可以在编辑的时候自动帮你格式化,还可以选中一块代码,  
;;按 Ctrl-Alt-\ 对这块代码重新进行格式化.如果要粘贴一块代码的话,粘贴完了紧接着按 Ctrl-Alt-\,  
;;就可以把新加入的代码格式化好。可是,对于这种粘贴加上重新格式化的机械操作,Emacs 应该可以将  
;;它自动化才能配得上它的名气,把下面的代码加到配置文件里,你的 Emacs 就会拥有这种能力了  
(dolist (command '(yank yank-pop))  
  (eval  
   `(defadvice ,command (after indent-region activate)  
      (and (not current-prefix-arg)  
           (member major-mode  
                   '(  
                     c-mode  
                     c++-mode  
                     clojure-mode  
                     emacs-lisp-mode  
                     haskell-mode  
                     js-mode  
                     latex-mode  
                        lisp-mode  
                     objc-mode  
                     perl-mode  
                     cperl-mode  
                     plain-tex-mode  
                     python-mode  
                     rspec-mode  
                        ruby-mode  
                     scheme-mode))  
           (let ((mark-even-if-inactive transient-mark-mode))  
             (indent-region (region-beginning) (region-end) nil))))))  


;;##########################################################################
;;-------------插件设置----------------
;;##########################################################################
;;;;============auto-header============
;;(add-to-list 'load-path "~/.emacs.d/plugins/")  
;;(require 'auto-header)  
;;  
;;;;加载auto-header.el文件,自动添加文件头  
;;(require 'auto-header)  
;;;; 设置文件头中的姓名  
;;(setq header-full-name "muhongzhang")  
;;;; 设置邮箱  
;;(setq header-email-address "muhongzhang@gmail.com")  
;;;; 设置每次保存时要更新的项目  
;;(setq header-update-on-save  
;;    '(  filename  
;;        modified  
;;        counter  
;;        copyright))  
;;;; 设置文件头的显示格式  
;;(setq header-field-list  
;;'(  filename  ;文件名  
;;    ;;blank     ;空行,下同  
;;    ;;copyright ;;版权  
;;    version  
;;    author    ;作者  
;;    created   ;创建人  
;;    ;;blank  
;;    description   ;描述  
;;    ;;blank  
;;    ;;modified_by ;更改者  
;;   ;; blank  
;;    ;;status  ;状态,是否发布  
;;    ;;更新  
;;    ;;blank  
;;  ))  

;;---------------------------------
;;============smex-mode============
;;---------------------------------
;;C-s/C-r switches to the next/previous match
;;show most recently executed commands
(load-file "~/.emacs.d/plugins/smex/smex.el")
(require 'smex) ; Not needed if you use package.el
  (smex-initialize) ; Can be omitted. This might cause a (minimal) delay
                    ; when Smex is auto-initialized on its first run.

(global-set-key (kbd "M-x") 'smex)
(global-set-key (kbd "M-X") 'smex-major-mode-commands)
;; This is your old M-x.
(global-set-key (kbd "C-c C-c M-x") 'execute-extended-command)


;;---------------------------------
;;========== sr-speedbar   ========
;;比自带的speedbar更高级的文件浏览器
;;---------------------------------
(load-file "~/.emacs.d/plugins/sr_speedbar/sr-speedbar.el")
(require 'sr-speedbar)
;;(global-set-key (kbd "s-s") 'sr-speedbar-toggle)


;;---------------------------------
;;========== mode-icons    ========
;;FIXME:安装完mode-icons后,可以显示出图标,但是mode-line没了。
;;目前还不知道什么原因,可能是和powerline等没有协同好。
;;因此暂不使用
;;---------------------------------
;;(add-to-list 'load-path "~/.emacs.d/plugins/mode-icons/mode-icons")
;;(require 'mode-icons)
;;(mode-icons-mode)
;;(setq mode-icons-change-mode-name nil)
;;(setq mode-icons-desaturate-inactive nil)

;;---------------------------------
;;========== spaceline-al-icons ========
;;---------------------------------
;;(add-to-list 'load-path "~/.emacs.d/plugins/spaceline-al-icons")
;;(require 'spaceline-all-the-icons)
;;(use-package spaceline-all-the-icons 
;;  :after spaceline
;;  :config (spaceline-all-the-icons-theme))

;;---------------------------------
;;==========   tarbar      ========
;;显示buffer的tab
;;---------------------------------
(add-to-list 'load-path "~/.emacs.d/plugins/tabbar")
(require 'tabbar)
(tabbar-mode)
;;Tabbar mode会自动帮你把Emacs里的文件分组。
;;可是,默认的分组方法并不是每个人都喜欢,它会把后缀名相同的文件分为一组,
;;比如说perl脚本都扔在一个组里,yaml文件又扔在另一个组里。
;;写代码的时候,在这两个组里切换实在是太麻烦了!
;;我就喜欢把除了Emacs Buffer之外的文件都放成一组,即我自己打开的文件放成一组。
;;于是,我用下面这段代码来实现自己的想法:
;;(setq tabbar-buffer-groups-function
;;    (lambda (b) (list "All Buffers")))
;;(setq tabbar-buffer-list-function
;;    (lambda ()
;;        (remove-if
;;          (lambda(buffer)
;;             (find (aref (buffer-name buffer) 0) " *"))
;;          (buffer-list))))
;;默认用M-j,M-k绑定tabbar-backward/tabbar-forward
;;(define-prefix-command 'lwindow-map)
;;(global-set-key (kbd "") 'tabbar-backward-group)
;;(global-set-key (kbd "") 'tabbar-forward-group)
;;(global-set-key (kbd "") 'tabbar-backward)
;;(global-set-key (kbd "") 'tabbar-forward)
(global-set-key [(meta j)] 'tabbar-backward)  
(global-set-key [(meta k)] 'tabbar-forward)


;;---------------------------------
;;========== tarbar-ruler   ========
;;显示buffer的tab
;;FIXME:安装完此插件后,有一个warning:提示缺少icon-mode。
;;由于icon-mode模式有问题,因此暂不使用此插件。
;;---------------------------------
;;(add-to-list 'load-path "~/.emacs.d/plugins/tabbar-ruler")
;;(setq tabbar-ruler-global-tabbar t) ; If you want tabbar
;;(require 'tabbar-ruler)


;;---------------------------------
;;============  helm ==============(NOT OK)
;;---------------------------------
;(add-to-list 'load-path "~/.emacs.d/plugins/helm/helm")
;(load-file "~/.emacs.d/plugins/helm/helm/helm-config.el")
;(require 'helm-config)

;;---------------------------------
;;=========== evil-mode ===========
;;extensible vi layer for Emacs
;;模拟vi快捷键
;;---------------------------------
;;;; Enable evil
;;(setq evil-toggle-key "")    ; remove default evil-toggle-key C-z, manually setup later
;;(setq evil-want-C-i-jump nil)    ; don't bind [tab] to evil-jump-forward
;;(require 'evil)
;;(evil-mode 1)
;;    
;;;; remove all keybindings from insert-state keymap, use emacs-state when editing
;;(setcdr evil-insert-state-map nil)
;;    
;;;; ESC to switch back normal-state
;;(define-key evil-insert-state-map [escape] 'evil-normal-state)
;;
;;;; TAB to indent in normal-state
;;(define-key evil-normal-state-map (kbd "TAB") 'indent-for-tab-command)
;;    
;;;; Use j/k to move one visual line insted of gj/gk
;;(define-key evil-normal-state-map (kbd "<remap> <evil-next-line>") 'evil-next-visual-line)
;;(define-key evil-normal-state-map (kbd "<remap> <evil-previous-line>") 'evil-previous-visual-line)
;;(define-key evil-motion-state-map (kbd "<remap> <evil-next-line>") 'evil-next-visual-line)
;;(define-key evil-motion-state-map (kbd "<remap> <evil-previous-line>") 'evil-previous-visual-line)

;;---------------------------------
;;=========== magit ===============
;;在emacs中实现git大多数功能
;;---------------------------------

;;---------------------------------
;;=========== flymake =============
;;flymake实时语法检查,通吃所有语言
;;---------------------------------

;;---------------------------------
;;=========== ecb =================
;;---------------------------------

;;---------------------------------
;;==========smart-mode-line========
;;=========== powerline ===========
;;Vim下我用的是powerline。
;;Emacs 版的powerline无法用在终端下,
;;所以找到了这个smart-mode-line
;;---------------------------------
;;---颜色单一,且不能变色---
;;(add-to-list 'load-path "~/.emacs.d/plugins/powerline")
;;(require 'powerline)
;;(powerline-default-theme)
;;powerline-center-theme
;;powerline-center-evil-theme
;;powerline-vim-theme
;;powerline-nano-theme
;;powerline-revert回到mode-line-format初始模式

;;---颜色可以,但不能变色---
(add-to-list 'load-path "~/.emacs.d/plugins/emacs-powerline")
(require 'powerline)
;;You can change the mode-line color using the standard method:
;;(setq powerline-arrow-shape 'arrow)   ;; the default
;;(setq powerline-arrow-shape 'curve)   ;; give your mode-line curves
;;(setq powerline-arrow-shape 'arrow14) ;; best for small fonts

;;Additionally, you can modify directly in powerline.el:
;;(custom-set-faces
;; '(mode-line ((t (:foreground "#030303" :background "#bdbdbd" :box nil))))
;; '(mode-line-inactive ((t (:foreground "#f9f9f9" :background "#666666" :box nil)))))

;;Change the :foreground, :background, powerline-color1, powerline-color2 to whatever you wish.
;;(setq powerline-color1 "grey22")
;;(setq powerline-color2 "grey40")

;;---------------------------------
;;==========smart-mode-line========
;;Vim下我用的是powerline。
;;Emacs 版的powerline无法用在终端下,
;;所以找到了这个smart-mode-line
;;---------------------------------
;;------Smart mode-line------(没有配置OK)
;;(add-to-list 'load-path "~/.emacs.d/plugins/rich-minority")
;;(add-to-list 'load-path "~/.emacs.d/plugins/smart-mode-line")
;;(require 'smart-mode-line)
;;(add-to-list 'load-path "~/.emacs.d/plugins/smart-mode-line/themes")
;;(require 'smart-mode-line-powerline-theme)

;; These two lines are just examples
;;(setq powerline-arrow-shape 'curve)
;;(setq powerline-default-separator-dir '(right . left))

;; These two lines you really need.
;;(setq sml/theme 'light-powerline)
;;(sml/setup)
;;(setq sml/name-width        40
;;      sml/line-number-format    "%4l"
;;      sml/mode-width        'full
;;      sml/themea        'light-powerline
;;      sml/no-confirm-load-theme t)

;;;;Hidden minor-mode, by rich-minority
;;(setq rm-excluded-modes
;;      '(" Guide"            ;; guide-key mode
;;    " hc"                ;; hardcore mode
;;    " AC"                ;; auto-complete
;;    " vl"                ;; global visual line mode enabled
;;    " Wrap"                ;; shows up if visual-line-mode is enabled for that buffer
;;    " Omit"                ;; omit mode in dired
;;    " yas"                ;; yasnippet
;;    " drag"                ;; drag-stuff-mode
;;    " VHl"                ;; volatile highlights
;;    " ctagsU"            ;; ctags update
;;    " Undo-Tree"            ;; undo tree
;;    " wr"                ;; Wrap Region
;;    " SliNav"            ;; elisp-slime-nav
;;    " Fly"                ;; Flycheck
;;    " PgLn"                ;; page-line-break
;;    " GG"                ;; ggtags
;;    " ElDoc"            ;; eldoc
;;    " hl-highlight"            ;; hl-anything
;;    ))

;;---------------------------------
;;========== ellp          ========
;;利用package包管理安装emacs插件
;;---------------------------------
;;常用快捷键,
;;M-x package-list-packages
;;i  - 选择要安装的包
;;d - 选择要删除的包
;;U - 升级已安装的包
;;x  - 执行操作
;;d - 选择要删除的包
(require 'package)
(setq package-enable-at-startup nil)
;;(add-to-list 'package-archives '("melpa" . "http://melpa.milkbox.net/packages/") t)
;;(add-to-list 'package-archives '("gnu" . "http://elpa.gnu.org/packages/") t)
;;(add-to-list 'package-archives '("marmalade" . "http://marmalade-repo.org/packages/") t)
;;(add-to-list 'package-archives '("elpa" . "http://tromey.com/elpa/") t)
;;(add-to-list 'package-archives '("melpa-stable" . "http://melpa-stable.milkbox.net/packages/") t)
;;(add-to-list 'package-archives ' ("elpy" . "http://jorgenschaefer.github.io/packages/") t)

;;(setq package-archives '(("gnu" . "https://elpa.gnu.org/packages/")
;;             ("marmalade" . "https://marmalade-repo.org/packages/")
;;             ("melpa" . "https://melpa.milkbox.net/packages/")
;;             ("melpa-stable" . "https://melpa-stable.milkbox.net/packages/")
;;             ("elpy" . "http://jorgenschaefer.github.io/packages/")))


;;(setq package-archives '(("gnu" . "http://elpa.emacs-china.org/gnu/")
;;             ("marmalade" . "http://elpa.emacs-china.org/marmalade/")
;;             ("melpa" . "http://elpa.emacs-china.org/melpa/")
;;             ("melpa-stable" . "http://elpa.emacs-china.org/melpa-stable/")))

(setq package-archives '(("gnu"   . "http://mirrors.tuna.tsinghua.edu.cn/elpa/gnu/")
                         ("melpa" . "http://mirrors.tuna.tsinghua.edu.cn/elpa/melpa/")))

;;(package-initialize)

;;(add-to-list 'load-path "D:\08_Tools\emacs\emacs-24.4-bin-i686-pc-mingw32\share\emacs\24.4\site-lisp"
;;(require 'xcscope) ;;加载xcscope
;;(require 'cedet) ;;加载cedet
;;(require 'ecb) ;;加载ecb
;;(require 'session) ;;加载session
;;(add-hook 'after-init-hook 'session-initialize) ;; 启动时初始化session
;;(require 'doxymacs) ;; 启动doxymacs

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值