;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; My init file for GNU Emacs ;; Author: Leiqin Lu ;; July 07, 2000 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; Added by Package.el. This must come before configurations of ;; installed packages. Don't delete this line. If you don't want it, ;; just comment it out by adding a semicolon to the start of the line. ;; You may delete these explanatory comments. (package-initialize) ;; Tell emacs where is your personal elisp lib dir (add-to-list 'load-path "~/.emacs.lisp/") ;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Run as server ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; run emacs in server mode so as emacsclient can connect to: (require 'server) (unless (server-running-p) (server-start)) ;; Gnu Server ;(if (eq system-type 'windows-nt) ; (progn (require 'gnuserv) ; (gnuserv-start) ; (setq gnuserv-frame (selected-frame)))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Define variables ;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; disable startup message: (setq inhibit-startup-message t) ;; change working path: (cd "~/") ;; set shell type: ;(setq shell-file-name "bash") ;; set default and initial major mode: (setq default-major-mode 'text-mode) ; (setq initial-major-mode 'ielm) ;; set auto-mode: (setq auto-mode-alist (append '( ("\\.\\(gr\\|v\\)xml\\'" . sgml-mode) ;; XML files ("\\.exe\\'" . hexl-mode) ;; binary files ) auto-mode-alist)) ;; enable auto-compression: (auto-compression-mode t) ;; set indentation: (setq-default indent-tabs-mode nil) (setq-default tab-width 2) (setq default-tab-width 2) ;; use aspell instead of ispell: (setq-default ispell-program-name "aspell") ;; set colors: (set-background-color "white") (set-foreground-color "black") ;; set show-paren-mode: (show-paren-mode t) (setq show-paren-delay 0.001) ;; highlight the whole expression inside the paren pair: ; (setq show-paren-style 'expression) ;; set font-lock-mode: (global-font-lock-mode t) (setq font-lock-maximum-decoration t) (setq font-lock-support-mode 'jit-lock-mode) ;; no backup files: (setq make-backup-files nil) ;; global-auto-revert-mode: (global-auto-revert-mode 1) ;; set frame line, mode line, header line: (setq frame-title-format '("[" user-login-name "@" system-name "] %f")) ; (setq default-header-line-format (quote ("%f"))) (setq default-mode-line-format (quote ("-" mode-line-mule-info mode-line-modified mode-line-frame-identification (20 "(%l-%c %p-%i) ") #("%b >> %f" 0 2 (help-echo (buffer-file-name))) (vc-mode vc-mode) " " mode-line-modes (which-func-mode ("" which-func-format "--")) (global-mode-string ("--" global-mode-string)) "-%-"))) ;; show line/column number in mode line: (setq line-number-display-limit nil) ; always display line number, no matter how large the buffer is. (line-number-mode t) ; it is on by default. Not used in my mode line format. (column-number-mode t) ; it is off by default. Not used in my mode line format. ; (size-indication-mode t) ; display buffer size in mode line. it is off by default. Not used currently because I customized default-mode-line-format. ; (display-time-mode t) ; show time in mode line. ;; set mode-line-format: ;; don't move cursor to center of frames automatically: (setq scroll-step 1) (setq scroll-conservatively 1) ;; destop auto-saving: (desktop-load-default) ;; desktop auto-reloading when startup: ; (desktop-read) ;; set scroll-bar-mode: ;(hscroll-global-mode t) ;; stop at end of files: (setq next-line-add-newlines nil) ;; query before exit: (setq kill-emacs-query-functions (cons (lambda () (yes-or-no-p "Really kill Emacs?")) kill-emacs-query-functions)) ;; select a tags table: ; (setq tags-table-list '("path1" "path2")) ; (setq tags-file-name "path") ;; customize calendar and diary: ;; I like neither european style (M-x european-calendar) nor american style (M-x american-calendar). ;; so I set my preferred ISO 8601 standard representation: (setq diary-file "~/log/log.xml") (setq calendar-date-display-form '(year "-" month "-" day)) ;; to show in calendar, diary, mode line, etc. (setq diary-date-forms '((year "-" month "-" day) ("]+>"))) ;; so that diary also recognizes ISO 8601 format and my XML log format. More formats for european/american styles can be added to this list. ;; undo-tree (require 'undo-tree) (global-undo-tree-mode) (defalias 'redo 'undo-tree-redo) ;; If non-nil, copy to kill-ring upon mouse adjustments of the region. 如果不是空(non-nil),则将鼠标选中区域复制到 kill-ring。 (setq mouse-drag-copy-region t) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Define functions ;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; kill all buffers at once: (defun kill-all-buffers () "Kill all buffers, leaving *scratch* only" (interactive) (mapcar (lambda (x) (kill-buffer x)) (buffer-list)) (delete-other-windows)) ;; ps-print to file: (defun ps-print-to-file () "Print to file" (interactive) (ps-print-buffer (read-string "Print to file: " (concat buffer-file-name ".ps")))) (defun ps-print-to-file-with-faces () "Print to file with faces" (interactive) (ps-print-buffer-with-faces (read-string "Print to file with faces: " (concat buffer-file-name ".ps")))) ;; save as file: (defun save-as-file () "Save as file" (interactive) (write-file (read-string "Save as:" (concat buffer-file-name ".")) t)) ;; activate appointmens: (defun activate-appointments () "Activate appointments" (interactive) (appt-activate 1)) ;; rotate buffers: (defun rotate-buffer () "Rotate all buffers" (interactive) (progn (bury-buffer) (switch-to-buffer (current-buffer)))) ;; rotate buffers: (defun shift-buffer () "Switch between current and the most recent buffers" (interactive) (progn (bury-buffer) (switch-to-buffer (current-buffer)))) ;; jump to the matching parenthesis: (defun match-paren () "Jump to the matching parenthesis" (interactive) (cond ((looking-at "\\s\(") (forward-list 1) (backward-char 1)) ((looking-at "\\s\)") (forward-char 1) (backward-list 1)))) ;; switch between truncation and continuation mode for line wrapping: (defun switch-truncation-continuation () "Switch between truncation and continuation mode for line wrapping" (interactive) (setq truncate-lines (not truncate-lines)) (setq truncate-partial-width-windows truncate-lines) ; changes to truncate-??? variables don't take effect immediately, ; so do something else to apply the changes: (font-lock-fontify-buffer)) ;; open a new shell: (defun new-shell () "Create a new shell" (interactive) (progn (rename-uniquely) (shell))) (defun new-eshell () "Create a new eshell" (interactive) (progn (rename-uniquely) (eshell))) ;; user specific function to do something: (defun do-something-here () "Do something here" (interactive) (do-something-here-hook)) ;; not a real hook by means of emacs hook variables. ;; default hook. Should be redefined for user purpose: (defun do-something-here-hook () "Do something here hook" (interactive) (copy-region-as-kill (line-beginning-position) (line-end-position)) (message "Default action: copied the current line")) ;; set start mark at current position. euqual to C-Space. ;(defun push-mark-here () ; "An interactive wrapper of push-mark" ; (interactive) ; (push-mark)) ;; set-language-environment hook: (defun configure-langenv () "Setup my favorite language environments" (cond ; ((equal current-language-environment "Chinese-GB") (setq default-input-method "chinese-tonepy")) ((equal current-language-environment "UTF-8") (setq default-input-method "chinese-py-punct")) )) (add-hook 'set-language-environment-hook 'configure-langenv) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Define keys ;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; F1 file (global-set-key [f1] 'find-file) (global-set-key (kbd "C-o") 'find-file) ; windows style (global-set-key [S-f1] 'save-buffer) (global-set-key [f13] 'save-buffer) (global-set-key (kbd "C-s") 'save-buffer) ; windows style (global-set-key [C-f1] 'save-as-file) ; ps-print-to-file (global-set-key [f25] 'save-as-file) ;; F2 buffer (global-set-key [f2] 'rotate-buffer) (global-set-key [S-f2] 'list-buffers) ; switch-to-buffer (global-set-key [f14] 'list-buffers) (global-set-key [C-f2] 'kill-this-buffer) ; kill-buffer prompts before killing. (global-set-key [f26] 'kill-this-buffer) ;; F3 search (global-set-key [f3] 'isearch-forward) (global-set-key (kbd "C-f") 'isearch-forward) ; windows style (global-set-key [S-f3] 'isearch-forward-regexp) (global-set-key [f15] 'isearch-forward-regexp) (global-set-key (kbd "S-f") 'isearch-forward-regexp) ; windows style (global-set-key [C-f3] 'how-many) (global-set-key [f27] 'how-many) (global-set-key (kbd "C-S-f") 'how-many) ; windows style ;; F4 replace (global-set-key [f4] 'query-replace) (global-set-key [S-f4] 'query-replace-regexp) (global-set-key [f16] 'query-replace-regexp) (global-set-key [C-f4] 'kill-region) ; default: C-w. copy-region-as-kill default M-w. ;(global-set-key (kbd "C-c") ') ; windows style. doens't work. (global-set-key [f28] 'kill-region) ; (global-set-key (kbd "C-x") 'kill-region) ; windows style. doesn't work. ;; F5 paste. 在 windows 上,cmd 作为 shell 时,输出的中文是乱码。而 eshell 能正确输出中文。 (global-set-key [f5] 'yank) ; default: C-y (global-set-key (kbd "C-v") 'yank) ; windows style (global-set-key [S-f5] 'yank-top) ; default: M-y for along the ring (global-set-key [f17] 'yank-top) ; (global-set-key [C-f5] ') ; (global-set-key [f29] ') ;; F6 go (global-set-key [f6] 'goto-line) (global-set-key [S-f6] 'match-paren) (global-set-key [f18] 'match-paren) (global-set-key [C-f6] 'other-window) (global-set-key [f30] 'other-window) ;; F7 internationalization (global-set-key [f7] 'toggle-input-method) (global-set-key [S-f7] 'what-cursor-position) ; switch-truncation-continuation (global-set-key [f19] 'what-cursor-position) (global-set-key [C-f7] 'describe-char) (global-set-key [f31] 'describe-char) ;; F8 undo&redo (global-set-key [f8] 'undo) ; default: C-_ , C-x u; or entering M-x undo (global-set-key (kbd "C-z") 'undo) ; windows style. [C-z] doesn't work, maybe because it's default to suspend-frame (global-set-key [S-f8] 'redo) (global-set-key [f20] 'redo) (global-set-key (kbd "C-y") 'redo) ; windows style. [C-y] doesn't work. (global-set-key (kbd "C-S-z") 'redo) ; mac style. [C-S-z] doesn't work. ; (global-set-key [f32] ') ;; F9 shell (global-set-key [f9] 'eshell) (global-set-key [S-f9] 'new-eshell) (global-set-key [f21] 'new-eshell) (global-set-key [C-f9] 'browse-web) (global-set-key [f33] 'browse-web) ;; F10 ;(global-set-key [f10] ') ; (global-set-key [S-f10] ') ; (global-set-key [f22] ') ; (global-set-key [C-f10] ') ; (global-set-key [f34] ') ;; F11 tool (global-set-key [f11] 'calculator) (global-set-key [S-f11] 'calendar) (global-set-key [f23] 'calendar) (global-set-key [C-f11] 'activate-appointments) (global-set-key [f35] 'activate-appointments) ;; F12 (global-set-key [f12] 'other-window) (global-set-key [S-f12] 'suspend-frame) (global-set-key [f24] 'suspend-frame) ; (global-set-key [C-f12] 'kill-emacs) ; (global-set-key [f36] 'kill-emacs) ;; jumping cursors (global-set-key [home] 'beginning-of-line) (global-set-key [S-home] 'beginning-of-buffer) (global-set-key [end] 'end-of-line) (global-set-key [S-end] 'end-of-buffer) ;; page down/up to search repeatly (define-key isearch-mode-map [next] 'isearch-repeat-forward) (define-key isearch-mode-map [prior] 'isearch-repeat-backward) ;; 修改字体大小: ;; For Linux (global-set-key (kbd "") 'text-scale-increase) (global-set-key (kbd "") 'text-scale-decrease) ;; For Windows (global-set-key (kbd "") 'text-scale-increase) (global-set-key (kbd "") 'text-scale-decrease) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Dired mode ;;;;;;;;;;;;;;;;;;;;;;;;; ;; For dired mode. The switches are passed to "ls" or the ls-list package on Windows. ;; Therefore, Dired on Windows supports only some of the possible options: AacirSstu. ;; 'F': adds '/' to directory, '*' to executable file, '@' to symbolic link; ;; 'G': don't display group info; Note: in Windows, -go takes no effect, so add -G. ;; 'l': long listing format; ;; 'g': long listing format without owner info; ignored in some systems; ;; 'o': long listing format without group info. ;; 'U': unsort. In windows, names are already sorted alphabetically and case-insensitively by default, ;; so U should be used in windows to disable case-sensitive sorting. ;; In unix, names are unsorted by default. So U shouldn't be used. (if (eq system-type 'windows-nt) (setq dired-listing-switches "-alU") (setq dired-listing-switches "-al --time-style=long-iso --color=auto")) ;;;;;;;;;;;;;;;;;;;;;;;;;;; Setup AUCTeX ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; (if (eq system-type 'windows-nt) (progn ;; use yap instead of xdvi in windows: (setq TeX-output-view-style (quote (("^dvi$" ("^landscape$" "^pstricks$\\|^pst-\\|^psfrag$") "%(o?)dvips -t landscape %d -o && gv %f") ("^dvi$" "^pstricks$\\|^pst-\\|^psfrag$" "%(o?)dvips %d -o && gv %f") ("^dvi$" ("^a4\\(?:dutch\\|paper\\|wide\\)\\|sem-a4$" "^landscape$") "%(o?)yap %dS -paper a4r -s 0 %d") ("^dvi$" "^a4\\(?:dutch\\|paper\\|wide\\)\\|sem-a4$" "%(o?)yap %dS -paper a4 %d") ("^dvi$" ("^a5\\(?:comb\\|paper\\)$" "^landscape$") "%(o?)yap %dS -paper a5r -s 0 %d") ("^dvi$" "^a5\\(?:comb\\|paper\\)$" "%(o?)yap %dS -paper a5 %d") ("^dvi$" "^b5paper$" "%(o?)yap %dS -paper b5 %d") ("^dvi$" "^letterpaper$" "%(o?)yap %dS -paper us %d") ("^dvi$" "^legalpaper$" "%(o?)yap %dS -paper legal %d") ("^dvi$" "^executivepaper$" "%(o?)yap %dS -paper 7.25x10.5in %d") ("^dvi$" "." "%(o?)yap %dS %d") ("^pdf$" "." "xpdf -remote \"%s\" -raise %o %(outpage)") ("^html?$" "." "netscape %o")))) (setq TeX-view-style (quote (("^a4\\(?:dutch\\|paper\\|wide\\)\\|sem-a4$" "%(o?)yap %dS -paper a4 %d") ("^a5\\(?:comb\\|paper\\)$" "%(o?)yap %dS -paper a5 %d") ("^b5paper$" "%(o?)yap %dS -paper b5 %d") ("^letterpaper$" "%(o?)yap %dS -paper us %d") ("^legalpaper$" "%(o?)yap %dS -paper legal %d") ("^executivepaper$" "%(o?)yap %dS -paper 7.25x10.5in %d") ("^landscape$" "%(o?)yap %dS -paper a4r -s 0 %d") ("." "%(o?)yap %dS %d")))))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;; Customization ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; (custom-set-variables ;; -------- Internationalization -------- ;; set default language environment: '(current-language-environment "UTF-8") ;; -------- PS Print Customization -------- ;; Note that to print program source code, it's optimal to print 2 columns ;; per sheet as landscape and set all font sizes to 7. ;; set paper and print styles: '(ps-paper-type (quote a4)) ;; Paper type is A4 which is default to Letter. '(ps-landscape-mode nil) ;; Print landscape. Default to portrait. '(ps-number-of-columns 1) ;; Number of columns to be printed per sheet. Default to 1. ;; set header/footer/line styles: '(ps-header-lines 1) ;; The header uses 1 line. '(ps-print-header-frame nil) ;; don't print the header frame. '(ps-footer-lines 1) ;; The footer uses 1 line. '(ps-line-number t) ;; The line numbers are to be printed. ;; set font sizes: '(ps-header-font-size (quote (8 . 8))) '(ps-header-title-font-size (quote (8 . 8))) '(ps-footer-font-size (quote (8 . 8))) '(ps-font-size (quote (8 . 8))) '(ps-line-number-font-size 8) ;; set font families '(ps-header-font-family (quote Courier)) ;; Set buffer name style: '(uniquify-buffer-name-style (quote forward) nil (uniquify)) ;; undo limits: '(undo-limit 80000) '(undo-strong-limit 100000) ;; large file threshold for emacs 22: '(large-file-warning-threshold 268435455) ;; warn if file larger than 256MB. ) (custom-set-faces) ;;;;;;;;;;;;;;;;;;;;;;;;;;;; Telnet ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; To run telnet inside Emacs on Windows, you have to ;; 1. use telnet of Cygwin (in inetutils package) and ;; 2. defun telnet with following code. (if (eq system-type 'windows-nt) (progn (require 'telnet) ; (setq telnet-progrom "C:/programs/cygwin/bin/telnet.exe") (defun telnet (host) "Open a network login connection to host named HOST (a string). Communication with HOST is recorded in a buffer `*PROGRAM-HOST*' where PROGRAM is the telnet program being used. This program is controlled by the contents of the global variable `telnet-host-properties', falling back on the value of the global variable `telnet-program'. Normally input is edited in Emacs and sent a line at a time." (interactive "sOpen connection to host: ") (let* ((comint-delimiter-argument-list '(?\ ?\t)) (properties (cdr (assoc host telnet-host-properties))) (telnet-program (if properties (car properties) telnet-program)) (name (concat telnet-program "-" (comint-arguments host 0 nil) )) (buffer (get-buffer (concat "*" name "*"))) (telnet-options (if (cdr properties) (cons "-l" (cdr properties)))) process) (if (and buffer (get-buffer-process buffer)) (pop-to-buffer (concat "*" name "*")) (pop-to-buffer (apply 'make-comint name telnet-program nil telnet-options)) (setq process (get-buffer-process (current-buffer))) ;;(set-process-filter process 'telnet-initial-filter) ;; Don't send the `open' cmd till telnet is ready for it. ;;(accept-process-output process) (erase-buffer) (send-string process (concat "open " host "\n")) (telnet-mode) (setq telnet-remote-echoes nil) (setq telnet-new-line "\n") ;; needed for cygwin 1.3.11 (setq comint-input-sender 'telnet-simple-send) (setq telnet-count telnet-initial-count) (setq comint-process-echoes t)))) )) ;;;;;;;;;;;;;;;;;;;;;;;;;;;; Windows App ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; (if (eq system-type 'windows-nt) (progn (require 'dired) ;; to avoid being warned "dired-get-filename unknown". (defvar winapp-alist '(("txt" . "C:/bin/emacs/bin/emacsclientw.exe") ("xls" . "C:/Program Files/Microsoft Office/OFFICE11/EXCEL.EXE") ("pl" . "C:/bin/perl/bin/perl.exe") ("ulaw" . "play_ulaw.exe"))) (defun open-file-with-winapp () "Open a file with an appropriate windows application" (interactive) (let* ((file (dired-get-filename)) (app (cdr (assoc (file-name-extension file) winapp-alist))) (msg (format "Open %s with %s" file app))) (message msg) (start-process msg "*Messages*" app file))) (add-hook 'dired-mode-hook '(lambda () (local-set-key "r" 'open-file-with-winapp))) (defun dired-clip-filename () "Clip a file name to the kill ring." (interactive) (kill-new (dired-get-filename)) (message (concat "Copied filename: " (current-kill 0)))) (add-hook 'dired-mode-hook '(lambda () (local-set-key "c" 'dired-clip-filename))) )) (if (eq system-type 'gnu/linux) (progn (require 'dired) (defun extract-dfile () "Extract a dfile" (interactive) (message "dfile %s" (dired-get-filename)) (start-process "extract-dfile" "*Messages*" "dfile" "extractall" (dired-get-filename))) (add-hook 'dired-mode-hook '(lambda () (local-set-key "r" 'extract-dfile))) )) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Web Beautify ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; (require 'web-beautify) ;; Not necessary if using ELPA package (eval-after-load 'js2-mode '(define-key js2-mode-map (kbd "C-c b") 'web-beautify-js)) ;; Or if you're using 'js-mode' (a.k.a 'javascript-mode') (eval-after-load 'js '(define-key js-mode-map (kbd "C-c b") 'web-beautify-js)) (eval-after-load 'json-mode '(define-key json-mode-map (kbd "C-c b") 'web-beautify-js)) (eval-after-load 'sgml-mode '(define-key html-mode-map (kbd "C-c b") 'web-beautify-html)) (eval-after-load 'web-mode '(define-key web-mode-map (kbd "C-c b") 'web-beautify-html)) (eval-after-load 'css-mode '(define-key css-mode-map (kbd "C-c b") 'web-beautify-css)) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;; End of my init file for GNU Emacs ;;;;;;;;;;;;;;;;;;;;;;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;