Simon的emacs 配置

;; Inhibit spalsh message
(setq inhibit-startup-message t)
(setq inhibit-splash-screen t)
(setq initial-scratch-message nil)
;;load path
(add-to-list 'load-path "~/.emacs.d/site-lisp/")
;;一些保存路径
(setq todo-file-do "~/.emacs.d/todo/do")
(setq todo-file-done "~/.emacs.d/todo/done")
(setq todo-file-top "~/.emacs.d/todo/top")
(setq diary-file "~/.emacs.d/diary")

;; stop when error occupied
(add-hook 'after-init-hook (lambda() (setq debug-on-error t)))
;; determine OS type
(defvar running-on-windows
  (equal system-type 'windows-nt)
  "If use emacs on windows, it is true."
  )
(defvar running-on-linux
  (equal system-type 'gnu/linux)
  "If use emacs on Linux, it is true."
  )
;; Set language
(when running-on-linux
  (set-language-environment 'utf-8)
  ;; default-coding-systems include [keyboard/terminal/file-name]-coding-system
  (set-default-coding-systems 'utf-8)
  (set-clipboard-coding-system 'utf-8)
  (set-buffer-file-coding-system 'utf-8)
  (set-selection-coding-system 'utf-8)
  (setq-default pathname-coding-system 'utf-8)
  )
;;If Run On windows
(when running-on-windows

  ;;去除工具条
  (tool-bar-mode nil)
  ;;去除菜单栏
  (menu-bar-mode nil)
  ;;推荐关闭行号窗口中的滚动条
  (set-scroll-bar-mode nil)
  ;;最大化Emacs窗口
  (require 'maxframe)
  (add-hook 'window-setup-hook 'maximize-frame t)
  (setq ascii-font "-outline-Courier New-normal-r-normal-normal-13-97-96-96-c-*-iso8859-1")
  (setq chinese-font "-outline-宋体-normal-r-normal-normal-13-*-96-96-c-*-iso10646-1")
  (defun wheer-set-font (en-font cn-font)
    (create-fontset-from-fontset-spec
     (replace-regexp-in-string "iso8859-1" "fontset-wheer" en-font))
    (set-fontset-font "fontset-wheer" 'gb18030 cn-font)
    (set-fontset-font "fontset-wheer" 'latin en-font)
    (set-fontset-font "fontset-default" 'gb18030 cn-font)
    (set-fontset-font "fontset-default" 'latin en-font)
    (set-default-font "fontset-wheer")
    (setq default-frame-alist
          (append '((font . "fontset-wheer")) default-frame-alist)))
  (wheer-set-font ascii-font chinese-font)
  (set-language-environment "Chinese-GB18030")
  (setq file-name-coding-system 'gb18030)
  )
;; convert dos to UNIX, or UNIX to dos. emacs command: 'C-x RET f unix/dos RET'
(defun dos2unix()
  "convert dos to unix"
  (interactive)
  (goto-char (point-min))
  (while (search-forward "rn" nil t) (replace-match "n"))
  )
(defun unix2dos()
  "convert unix to dos"
  (interactive)
  (goto-char (point-min))
  (while (search-forward "n" nil t) (replace-match "rn"))
  )
(dos2unix)
;; start emacs server in default
(server-mode)
;;(server-start)
;; set read-only when open a file
;;(add-hook 'find-file-hook (lambda()(setq buffer-read-only t)))
;;(setq kill-read-only-ok t)
;;(setq buffer-read-only t)
;;高亮显示匹配的括号
(show-paren-mode t)
(setq show-paren-style 'parentheses)
;; save emacs history and desktop
(savehist-mode t)
;; Display battery
(display-battery-mode t)
;;Show Row Number
(require 'setnu)
;;Set title name is buffer name, file(%f) frame(%F), buffer(%b)
(setq frame-title-format "%b")
;; Set autosave
(setq auto-save-interval 50)
(setq auto-save-timeout 10)
;; highlight selection
(setq transient-mark-mode t)
;; Nicer scroll
(setq scroll-step 1)
;; stop ring
(setq visible-bell nil)
;; Don't ask yes-or-no, use y-or-n
;;(fset 'yes-or-no-p 'y-or-n-p)
(defalias 'yes-or-no-p 'y-or-n-p)
;; Please stop blinking!
(if (fboundp 'blink-cursor-mode) (blink-cursor-mode 0))
;; make temp buffer fit to size
(setq even-window-heights nil)
(temp-buffer-resize-mode t)
(setq temp-buffer-max-height
      (lambda(buffer) (min 15 (/ (- (frame-height) 2) 2))))
;; Display tiem stamp
(setq time-stamp-toggle-active t)
;;使用Ibuffer
(require 'ibuffer)
(global-set-key (kbd "C-x C-b") 'ibuffer)
;;颜色设置

;;在非窗口环境的时候置颜色
(cond
 ((not window-system)
  ;; 如果不在 window 环境中(字符界面时)
  (setq frame-background-mode 'dark)
  ;; 设置背景为黑的,这样 Emacs 的很多缺省颜色会和黑色背景协调。
  (eval-after-load "log-view"
    ;; 设置 log-view 的颜色。
    '(progn
       (set-face-attribute 'log-view-file-face nil :foreground "blue" :weight 'bold)
       (set-face-attribute 'log-view-message-face nil :foreground "yellow" :weight 'bold))))
 ;;窗口环境下的设置
 ((window-system)
  (setq default-frame-alist
        '(
          (foreground-color . "Wheat")
          (background-color . "DarkSlateGray")
          (cursor-color     . "Orchid")
          )
        )))

;;状态栏显示行号
(setq column-number-mode t)
(setq line-number-mode t)
;;enable to bidirectionally copy and paste between X app with emacs;可以从外面拷东西
(setq x-select-enable-clipboard t)
;; 显示时间
(setq display-time-24hr-format t)
(setq display-time-day-and-date t)
(display-time)
;;可以操作压缩文档
(auto-compression-mode 1)
;;鼠标自动避开指针;如当你输入的时候;指针到了鼠标的位置;鼠标有点挡住视线了
(mouse-avoidance-mode 'animate)
;; 设置默认模式为Text
(setq default-major-mode 'text-mode)
;; 让Emacs可以打开和显示图片
(auto-image-file-mode)
;; highlight selection 高亮当前行
(require 'hl-line)
(global-hl-line-mode t)
;; 配置Shell颜色
(autoload 'ansi-color-for-comint-mode-on "ansi-color" nil t)
(add-hook 'shell-mode-hook 'ansi-color-for-comint-mode-on)
(setq ansi-color-for-comint-mode t)
;; ========================
;; ==== Feature Setting ====
;; ========================
;; Emacs 中,改变文件时,默认都会产生备份文件(以 ~ 结尾的文件)。可以完全去掉
;; (并不可取),也可以制定备份的方式。这里采用的是,把所有的文件备份都放在一
;; 个固定的地方("~/var/tmp")。对于每个备份文件,保留最原始的两个版本和最新的
;; 五个版本。并且备份的时候,备份文件是复本,而不是原件。
(setq version-control t)
(setq kept-old-versions 2)
(setq kept-new-versions 5)
(setq delete-old-versions t)
(setq backup-directory-alist '(("." . "~/var/tmp")))
(setq backup-by-copying t)
;; 在行首 C-k 时,同时删除该行。
(setq-default kill-whole-line t)
;; auto-newline  子模式,自动换行缩进;
;; hungry-delete 子模式,一个 Backspace 删除尽可能多的空白;
;; which-func-mode 在模式行中显示当前行在哪个函数中。
(add-hook 'c-mode-common-hook
          (lambda ()
            (c-toggle-auto-hungry-state 1)
            (which-func-mode 1)))

;;可以递归的删除目录
(setq dired-recursive-deletes t)
;;可以递归的进行拷贝
(setq dired-recursive-copies t)
;;  1\. s s 按照文件大小排序。
;;  2\. s x 按照文件扩展名排序。
;;  3\. s t 按照文件访问时间排序。
;;  4\. s n 按照文件名称的字母顺序排序。
(add-hook 'dired-mode-hook (lambda ()
                             (interactive)
                             (make-local-variable  'dired-sort-map)
                             (setq dired-sort-map (make-sparse-keymap))
                             (define-key dired-mode-map "s" dired-sort-map)
                             (define-key dired-sort-map "s"
                               '(lambda () "sort by Size"
                                  (interactive) (dired-sort-other (concat dired-listing-switches "S"))))
                             (define-key dired-sort-map "x"
                               '(lambda () "sort by eXtension"
                                  (interactive) (dired-sort-other (concat dired-listing-switches "X"))))
                             (define-key dired-sort-map "t"
                               '(lambda () "sort by Time"
                                  (interactive) (dired-sort-other (concat dired-listing-switches "t"))))
                             (define-key dired-sort-map "n"
                               '(lambda () "sort by Name"
                                  (interactive) (dired-sort-other (concat dired-listing-switches ""))))))
;; ========================
;; ==== Compile Setting ====
;; ========================
(defun smart-compile ()
  "Simply compile your file according to the file type."
  (interactive)
  (save-some-buffers t)
  (let
      ((compile-command nil)
       (alist
        (list '(".c$" .  "gcc -Wall ")
              '(".cc$" . "g++")
              '(".cpp$" . "g++"))))
    (while (not (null alist))
      (if (string-match (caar alist) (buffer-file-name))
          (setq compile-command
                (concat (cdar alist) " " """ (buffer-file-name) """ " -ggdb3 " )))
      (setq alist (cdr alist)))
    (if (null compile-command)
        (setq compile-command
              (read-from-minibuffer "Compile command: ")))
    (compile compile-command)
    ))
;; set compile command
;; (setq compile-command  '"gcc -Wall -O2  %b -ggdb3 -o")
;; enable windmove key binding, S-up/down/left/right
(windmove-default-keybindings)
;; font lock
(global-font-lock-mode t)
;; cwarn
(global-cwarn-mode t)
;; define my mode function, and bind it to many edit mode.
(defun my-common-mode()
  ;; convert tab to space
  (setq-default indent-tabs-mode nil)
  ;; hideshow mode
 (hs-minor-mode)
  )
;; for c and c++
(defun my-cc-mode()
  ;; load my define mode
  (my-common-mode)
  ;; use "stroustrup" as basical c style, but modify tab width in below.
  (c-set-style "stroustrup")
  (setq default-tab-width 2)
  ;; use (defvar Variable) to impl dynamic variable
  (defvar c-basic-offset)
  (setq c-basic-offset 2)
  ;; useful key binding. use (defvar Variable) to impl dynamic variable
  (defvar c-mode-base-map)
  (define-key c-mode-base-map [(f5)] 'smart-compile)
  (define-key c-mode-base-map [(f6)] 'gdba)
  )
;;(add-hook 'text-mode-hook 'my-common-mode)
;;(add-hook 'makefile-mode-hook 'my-common-mode)
(add-hook 'c-mode-common-hook 'my-cc-mode)
(add-hook 'cc-mode-common-hook 'my-cc-mode)
(add-hook 'idl-mode-hook 'my-cc-mode)
(add-hook 'java-mode-hook 'my-common-mode)
(add-hook 'diff-mode-hook 'my-common-mode)
(add-hook 'perl-mode-hook 'my-common-mode)
(add-hook 'php-mode-hook 'my-common-mode)
(add-hook 'lisp-mode-hook 'my-common-mode)
(add-hook 'emacs-lisp-mode-hook 'my-common-mode)
;; gdb
(setq gdb-many-windows t)
;; ========================
;; =====  Key bind  ====
;; ========================
(global-set-key [f3] (quote setnu-mode))

;;跳转到 Emacs 的另一个窗口
(global-set-key (kbd "") 'other-window)
(global-set-key (kbd "") 'dired)
(global-set-key (kbd "") 'shell-command)
(global-set-key (kbd "C-") 'shell)
(global-set-key (kbd "") 'eshell)
(global-set-key (kbd "C-c C-g") 'goto-line)
;; ========================
;; ==  3rd part plugins  ==
;; ========================
;;ecb setting
(when (locate-library "ecb")
  (require 'ecb-autoloads) ;;加载ecb
  (setq ecb-auto-activate nil
        ecb-tip-of-the-day nil
        ecb-tree-indent 4
        ecb-windows-height 0.5
        ecb-windows-width 0.18
        ecb-auto-compatibility-check nil
        ecb-version-check nil
        inhibit-startup-message t)
  ;;ecb绑定
  (global-set-key (kbd "C-x C-1") 'ecb-goto-window-directories)
  (global-set-key (kbd "C-x C-2") 'ecb-goto-window-sources)
  (global-set-key (kbd "C-x C-3") 'ecb-goto-window-methods)
  (global-set-key (kbd "C-x C-4") 'ecb-goto-window-history)
  (global-set-key (kbd "C-x C-0") 'ecb-goto-window-edit-last)
  ;; set F12 to activate ecb and Ctrl + F12 to deactive it.
  (global-set-key (kbd "") 'ecb-activate)
  (global-set-key (kbd "C-") 'ecb-deactivate)
  )
;; cedet
(when (locate-library "cedet")
  (require 'cedet)
  )
;; session
(when (locate-library "session")
  (require 'session)
  (add-hook 'after-init-hook 'session-initialize)
  )
;;doxymacs
(when (locate-library "doxymacs")
  (require 'doxymacs)
  (add-hook 'c-mode-common-hook 'doxymacs-mode)
  ;; 启动doxymacs-mode
  (add-hook 'c++-mode-common-hook 'doxymacs-mode)
  ;; 启动doxymacs-mode
  )
;; xcscope
(when (locate-library "xcscope")
  (require 'xcscope)
  ;; define a function to set list entry window height, and add it to hook
  (defun cscope-set-list-entry-window-height (wanted-height)
    "set cscope-list-entry-window height."
    (interactive)
    (shrink-window (- (window-height) wanted-height))
    (recenter 1))
  (add-hook 'cscope-list-entry-hook
            (lambda() (cscope-set-list-entry-window-height 11)))
  )
;; ========================
;; ==  custom set   ==
;; ========================
(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.
 '(display-time-mode t)
 '(ecb-gzip-setup (quote cons))
 '(ecb-options-version "2.32")
 '(ecb-tar-setup (quote cons))
 '(ecb-wget-setup (quote cons))
 '(transient-mark-mode t)
 '(weblogger-config-alist (quote (("Simon" ("user" . "admin") ("server-url" . "http://www.9wy.net/xmlrpc.php") ("weblog" . "1"))))))
(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.
 )
;; Set personal infomation
(setq user-full-name "SimonCHEN")
(setq user-mail-address "[email protected]")
;;Calendar Setting
;; 设置 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的时候不显示一堆节日
;; 让emacs能计算日出日落的时间,在 calendar 上用 S 即可看到
(setq calendar-latitude +31.27)
(setq calendar-longitude +104.10)
(setq calendar-location-name "SiChuan")
;; 去掉不关心的节日,设定自己在意的节日,在 calendar 上用 h 显示节日
(setq christian-holidays nil)
(setq hebrew-holidays nil)
(setq islamic-holidays nil)
(setq solar-holidays nil)