;;-*- mode: lisp; coding: utf-8 -*- ;; Tested Emacs version: 23.1.1, 23.2, 24.3 ;;^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ;; Convention ;;^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ;; ; - turn on or off some feature by add or erase it ;; ;; - remark (should not be ereased) ;; ;;o;; - obsolete (used for mark obsolete version) ;; ;;^^^ - region begin ;; ;;{{-- - group begin ;; ;;[[-- - section begin ;; ;;((-- - subsection begin ;; ;;<<-- - item begin ;; ;;-- - entry ;; ;;-->> - item end ;; ;;--)) - subsection end ;; ;;--]] - section end ;; ;;--}} - group end ;; ;;vvv - region end ;;^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ;; Prepare Setup ;;^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ (defgroup myemacs nil "group myemacs" :group 'local :prefix 'myemacs) ;;^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ;; Subroutines ;;^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ;;-->>Path Parse (defun fun-path (path) "substitute enviroment varibles in path" (substitute-in-file-name path) ) (defun fun-path-list (path-list) "parse path list" (let (value) (dolist (elt path-list value) (setq value (cons (fun-path elt) value)) ) ) ) ;;-->>Maximize Frame (defun fun-x-maximize-frame() "Maximize the current frame for X" (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) ) ) (defun fun-w32-maximize-frame() "Maximize the current frame for MS-Windows" (interactive) (w32-send-sys-command 61488) ) (defun fun-maximize-frame() (interactive) (cond ((eq window-system 'x) (fun-x-maximize-frame)) ((eq window-system 'w32) (fun-w32-maximize-frame)) ((eq window-system 'nil) ()) ) ) ;;^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ;; Env ;;^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ;;HOME DIRECTORY : set at HKEY_LOCAL_MACHINE\SOFTWARE\GNU\Emacs\HOME or enviroment variable "HOME" ;;when Emacs start, it load .emacs under HOME DIRECTORY or with arguments `--no-init-file --load PATH/.emacs' (when (eq system-type 'windows-nt) (setenv "SOFT_DRIVE" "D:") (setenv "WORK_DRIVE" "E:") ;;use the enviroment variable "HOME" to load .emacs;we can set it to a new directory as the new home (setenv "SOFTWARE" (fun-path "$SOFT_DRIVE/software")) (setenv "HOME" (fun-path "$SOFTWARE/home")) (setenv "WINLINUX" (fun-path "$SOFTWARE/winlinux")) (setenv "MINGW" (fun-path "$SOFTWARE/MinGW")) ;;use env("PATH") to search program , such as eshell (setenv "PATH" (concat (fun-path (concat "$WINLINUX/emacs-23.2/bin;" "$WINLINUX/cscope;" "$WINLINUX/shell.w32-ix86;" "$WINLINUX/win-bash_0_6;" "$WINLINUX/unzip-5.51-1-bin/bin;" "$WINLINUX/llvm/bin;" "$WINLINUX/clang/bin;" "$WINLINUX/w3m;" "$WINLINUX/ISpell;" )) (getenv "PATH"))) ) (defun fun-setup-dir () "setup directory based on OS" (cond ((eq system-type 'gnu/linux) (progn (setenv "SRC" "~/src") (setenv "DOC" "~/doc") )) ((eq system-type 'windows-nt) (progn (setenv "SRC" (fun-path "$WORK_DRIVE/src")) (setenv "DOC" (fun-path "$WORK_DRIVE/doc")) )) (t (error "not supported os")) ) (setenv "EMACSD" (directory-file-name (file-name-directory load-file-name))) (message "env EMACSD : %s" (getenv "EMACSD")) (setq myemacsd (getenv "EMACSD")) (setq mylispd (concat myemacsd "/site-lisp")) (setenv "ISPELL_DICT" (fun-path "$EMACSD/data/ISpell")) (setenv "KERNEL_SRC" (fun-path"$SRC/linux-2.6.32.60")) ) (fun-setup-dir) ;;--Include Path List (defun fun-myemacs-include-dir-list-project () "return list of project include directories" (list "../include/" "include/" )) (defun fun-myemacs-include-dir-list-system () "return list of system include directories, which usually are output of `echo "" | gcc -v -x c++ -E -'" (cond ((eq system-type 'windows-nt) (split-string " d:/software/mingw/bin/../lib/gcc/mingw32/4.8.1/include/c++ d:/software/mingw/bin/../lib/gcc/mingw32/4.8.1/include/c++/mingw32 d:/software/mingw/bin/../lib/gcc/mingw32/4.8.1/include/c++/backward d:/software/mingw/bin/../lib/gcc/mingw32/4.8.1/include d:/software/mingw/bin/../lib/gcc/mingw32/4.8.1/../../../../include d:/software/mingw/bin/../lib/gcc/mingw32/4.8.1/include-fixed d:/software/mingw/bin/../lib/gcc/mingw32/4.8.1/../../../../mingw32/include ")) ((eq system-type 'gnu/linux) (split-string " /usr/lib/gcc/i686-redhat-linux/4.4.5/../../../../include/c++/4.4.5 /usr/lib/gcc/i686-redhat-linux/4.4.5/../../../../include/c++/4.4.5/i686-redhat-linux /usr/lib/gcc/i686-redhat-linux/4.4.5/../../../../include/c++/4.4.5/backward /usr/local/include /usr/lib/gcc/i686-redhat-linux/4.4.5/include /usr/include ")) ) ) (defun fun-myemacs-include-dir-list-kernel () "return list of kernel include directories" (if (file-exists-p (getenv "KERNEL_SRC")) (fun-path-list '( "$KERNEL_SRC/include" "$KERNEL_SRC/arch/x86/include" )) nil ) ) (defcustom myemacs-include-dir-list-system (fun-myemacs-include-dir-list-system) "system include dirs" :type '(repeat string) :group 'myemacs ) (defcustom myemacs-include-dir-list-project (fun-myemacs-include-dir-list-project) "system include dirs" :type '(repeat string) :group 'myemacs ) (defcustom myemacs-include-dir-list-kernel (fun-myemacs-include-dir-list-kernel) "system include dirs" :type '(repeat string) :group 'myemacs ) (defun fun-get-system-include-dir-list () (let ( (value) (dir-list-list '( myemacs-include-dir-list-system myemacs-include-dir-list-project myemacs-include-dir-list-kernel ))) (dolist (dir-list dir-list-list value) (when (boundp dir-list) (setq value (append value (symbol-value dir-list))) ) ) ) ) (setq system-include-dir-list (fun-get-system-include-dir-list)) ;;^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ;;Common (group based on `GNU Emacs Manual') ;;^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ;;====================================== ;;{{-- Important General Concepts ;;[[--Entering Emacs ;;You can also force Emacs to display a file or directory at startup by setting the variable `initial-buffer-choice' to a non-`nil' value.(In that case, even if you specify one or more files on the command line, Emacs opens but does not display them.) ;(setq initial-buffer-choice t) ;;The value of `initial-buffer-choice' can be either the name of the desired file or directory, or `t', which means to display the `*scratch*' buffer. (setq inhibit-startup-screen t) ;;If the variable `inhibit-startup-screen' is non-`nil', Emacs does not display the startup screen. ;;[[-- Exiting Emacs ;;If the value of the variable `confirm-kill-emacs' is non-`nil', `C-x C-c' assumes that its value is a predicate function, and calls that function. If the result of the function call is non-`nil', the session is killed, otherwise Emacs continues to run. (setq confirm-kill-emacs 'yes-or-no-p) ;;====================================== ;;{{-- Fundamental Editing Commands ;;[[-- Basic ;;--Inserting Text ;;To insert a non-graphic character, or a character that your keyboard does not support, first "quote" it by typing `C-q' (`quoted-insert'). ;;`C-q' followed by any non-graphic character (even `C-g') inserts that character. For instance, `C-q <DEL>' inserts a literal `DEL' character. ;;`C-q' followed by a sequence of octal digits inserts the character with the specified octal character code. (setq read-quoted-char-radix 16) ;;To use decimal or hexadecimal instead of octal, set the variable `read-quoted-char-radix' to 10 or 16. ;;[[-- Minibuffer (setq resize-mini-windows t) ;;A value of t means resize them to fit the text displayed in them. (setq completion-auto-help 'lazy) ;;Emacs only shows the completion list buffer on the second attempt to complete (setq history-delete-duplicates t) ;;adding a new element deletes from the list all other elements that are equal to i (icomplete-mode t) ;;Icomplete mode presents a constantly-updated display that tells you what completions are available for the text you've entered so far ;;<<-- Minibuffer Edit (setq enable-recursive-minibuffers t) ;;[[-- Help ;;((-- Misc Help ;;--InfoMode ;; C-u C-h i : open a file in info-mode (defun fun-reopen-in-info-mode () (let ((file-name (buffer-file-name))) (kill-buffer (current-buffer)) (info file-name) ) ) (add-to-list 'auto-mode-alist '("\\.info\\'" . fun-reopen-in-info-mode)) ;;((-- Help Echo (setq help-at-pt-display-when-idle t) ;;To display help text automatically whenever it is available on the character after point ;;====================================== ;;{{-- Important Text-Changing Commands ;;[[-- Mark (delete-selection-mode t) ;;inserting text while the mark is active causes the selected text to be deleted first ;;[[-- Yanking ;;-- Yanking Earlier Kills (setq kill-ring-max 200) ;;The length of the kill ring is controlled by the variable `kill-ring-max'; no more than that many blocks of killed text are saved. ;;[[-- Display ;;--Horizontal Scrolling (setq hscroll-margin 8) ;;The variable `hscroll-margin' controls how close point can get to the window's edges before automatic scrolling occurs. ;;--Follow Mode ;;"Follow mode" is a minor mode that makes two windows, both showing the same buffer, scroll as a single tall "virtual window." ;(follow-mode t) ;;Highlight Interactively ;(global-highlight-changes-mode t) ;;Highlight Changes mode is a minor mode that "highlights" the parts of the buffer were changed most recently, by giving that text a different face. (global-hi-lock-mode t) ;;Hi Lock mode is a minor mode that highlights text that matches regular expressions you specify. ;;--Displaying Boundaries (setq default-indicate-buffer-boundaries '((top . left) (bottom . left) (t . nil))) ;;--Useless Whitespace (setq-default show-trailing-whitespace t) ;; You can make trailing whitespace at the end of a line visible by setting the buffer-local variable `show-trailing-whitespace' to `t'. ;;--Optional Mode Line (size-indication-mode t) ;;When Size Indication mode is enabled, the size of the accessible part of the buffer appears in the mode line (column-number-mode t) ;;When Column Number mode is enabled, the column number appears in the mode line (setq line-number-mode t) ;;When Line Number mode is enabled, the line number appears in the mode line. ;;--Text Display ;;--Tab ;(setq tab-width 4) ;;The number of spaces per tab is controlled by the variable `tab-width', and is made local by changing it ;(setq default-tab-width 4) ;; controls the default value of `tab-width' for buffers where you have not set it locally. ;;--Cursor Display (setq visible-cursor t) ;;Some text terminals offer two different cursors: the normal cursor and the very visible cursor, where the latter may be e.g. bigger or blinking. (global-hl-line-mode t) ;;To make the cursor even more visible, you can use HL Line mode, a minor mode that highlights the line containing point. ;;--Line Truncation ;;You can explicitly enable line truncation for a particular buffer with the command `M-x toggle-truncate-lines'. ;(setq-default truncate-lines t) ;;If variable `truncate-lines' is non-`nil', long lines are truncated; if it is `nil', they are continued onto multiple screen lines. ;;[[-- Search (setq default-case-fold-search nil) ;;If you set the variable `case-fold-search' to `nil', then all letters must match exactly, including case ;;====================================== ;;{{-- Major Structures of Emacs ;;[[-- Files ;;((-- File Names ;;--Default Directory ;;default-directory : set the default file path(f.e. open file); ;;The default directory is kept in the variable `default-directory', which has a separate value in every buffer. (defun fun-set-default-directory(dir) "set default-directory" (if (file-exists-p dir) (setq default-directory dir) (setq default-directory (getenv "HOME")) ) ) (fun-set-default-directory (getenv "KERNEL_SRC")) ;;((-- Saving ;;<<-- Backup ;;--Single or Numbered Backups (setq make-backup-files t) ;;For most files, the variable `make-backup-files' determines whether to make backup files (setq version-control t) ;;The variable `version-control' determines whether to make single backup files or multiple numbered backup files. ;;You can customize the variable `backup-directory-alist' to specify that files matching certain patterns should be backed up in specific directories. (setq backup-directory-alist '( ("." . "~/.backup/emacs/") )) ;;--Automatic Deletion of Backups ;;The two variables `kept-old-versions' and `kept-new-versions' control this deletion. Their values are, respectively, the number of oldest (lowest-numbered) backups to keep and the number of newest (highest-numbered) ones to keep, each time a new backup is made. The backups in the middle (excluding those oldest and newest) are the excess middle versions--those backups are deleted. These variables' values are used when it is time to delete excess versions, just after a new backup version is made; the newly made backup is included in the count in `kept-new-versions'. By default, both variables are 2. ;;If `delete-old-versions' is `t', Emacs deletes the excess backup files silently. If it is `nil', the default, Emacs asks you whether it should delete the excess backup versions. (setq kept-old-versions 2) (setq kept-new-versions 3) (setq delete-old-versions t) ;;--File Conveniences (recentf-mode t) ;;When recentf mode is enabled, it maintains a menu for visiting files that were operated on recently. ;;[[-- Buffers ;;((-- Misc Buffer ;;--ReadOnly ;;open file read only:find-file-read-only(C-x C-r) ;;read write switch:toggle-read-only(C-x C-q) (defvar var-read-only-major-mode-list '( c-mode c++-mode text-mode ) "read only major modes" ) (defun fun-read-only-hook-major-mode() "when file opened is of a certain major mode, make it read only" (when (memq major-mode var-read-only-major-mode-list) (toggle-read-only 1) ) ) ;(add-hook 'find-file-hooks 'fun-read-only-hook-major-mode) (add-hook 'find-file-hooks 'toggle-read-only) ;;[[-- Windows ;;--Window Convenience ;(scroll-all-mode t) ;;When Scroll-All mode is on, scrolling commands entered in one window apply to all visible windows in the same frame. ;;[[-- Frame ;;--Mouse Avoidance (mouse-avoidance-mode 'animate) ;;Mouse Avoidance mode keeps the mouse pointer away from point, to avoid obscuring text you want to edit ;;{{-- Advanced Features ;;[[-- Major Modes ;;--Choosing Modes (setq default-major-mode 'text-mode) ;;When you visit a file that does not specify a major mode to use, or when you create a new buffer with `C-x b', the variable `default-major-mode' specifies which major mode to use ;;[[-- Indentation ;;--Tab Stops ;;C-h v tab-stop-list : view value of variable tab-stop-list ;;You can change the tab stops used by `M-i' and other indentation commands, so that they need not be spaced every eight characters, or even regularly spaced. The tab stops are stored in the variable `tab-stop-list', as a list of column numbers in increasing order. ;;o;;(setq tab-stop-list '(4 8 12 16 20 24 28 32 36 40 44 48 52 56 60 64 68 72 76 80 84 88 92 96)) (defun fun-set-tab-stop-list(step end) "set tab stops" (setq tab-stop-list ()) (setq idx (/ end step)) (while (> idx 0) (setq tab-stop-list (cons (* idx step) tab-stop-list)) (setq idx (- idx 1)) ) ) (fun-set-tab-stop-list 4 90) ;;--Just Spaces (setq-default indent-tabs-mode nil) ;;Emacs normally uses both tabs and spaces to indent lines.If you prefer, all indentation can be made from spaces only. To request this, set `indent-tabs-mode' to `nil' ;;[[-- Text ;;--Sentences ;;The variable `sentence-end' controls how to recognize the end of a sentence. If non-`nil', its value should be a regular expression, which is used to match the last few characters of a sentence, together with the whitespace following the sentence (*note Regexps::). If the value is `nil', the default, then Emacs computes sentence ends according to various criteria such as the value of `sentence-end-double-space'. (setq sentence-end "\\([。!?]\\|……\\|[.?!][]\"')}]*\\($\\|[ \t]\\)\\)[ \t\n]*") (setq sentence-end-double-space nil) ;;[[-- Programs ;;((-- Parentheses ;; could be bad, will not let you save at all, until you correct the error (defun fun-write-file-check-parens () "check-parens when write-file" (add-hook 'local-write-file-hooks 'check-parens) ) (add-hook 'emacs-lisp-mode-hook 'fun-write-file-check-parens) ;;<<-- Matching (show-paren-mode t) ;;Whenever point is before an opening delimiter or after a closing delimiter, both that delimiter and its opposite delimiter are highlighted ;;((-- Documentation ;;-- Man Page ;(setq Man-notify 'newframe) (setq Man-notify 'bully) (setq Man-switches "-a") ;;((-- Hideshow (add-hook 'c-mode-hook 'hs-minor-mode) ;;Hideshow minor mode provides selective display of portions of a program, known as "blocks" ;;[[-- Maintaining ;;--Tags ;;Selecting a Tags Table ;;You can specify a precise list of tags tables by setting the variable `tags-table-list' to a list of strings (setq tags-table-list '( "~/work/link/etags/" )) ;;[[-- Dired ;;--Entering Dired ;;The variable `dired-listing-switches' specifies the options to give to `ls' for listing the directory; this string _must_ contain `-l'. If you use a numeric prefix argument with the `dired' command, you can specify the `ls' switches with the minibuffer before you enter the directory specification. (setq dired-listing-switches "-al --file-type --group-directories-first") ;;[[-- Customization ;;((-- Minor Modes ;;--LineNumber (require 'linum) ;; require feature linum (global-linum-mode 1) ;; Toggle Linum mode in every possible buffer ;;((-- Easy Customization ;;<<-- Saving Customizations ;(let ((cust-file (fun-path "$EMACSD/emacs-custom.el"))) ; (when (and (file-exists-p cust-file) (file-writable-p cust-file)) ; (load-file cust-file)) ; (setq custom-file cust-file) ;) ;;^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ;;Elisp (group based on `GNU Emacs Lisp Reference Manual') ;;^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ;;{{-- Frames ;;[[-- Frame Titles (setq frame-title-format "%b @ %f") ;;This variable specifies how to compute a name for a frame when you have not explicitly specified one. ;;{{-- Processes ;;[[-- Subprocess Creation ;;-- exec-path ;;`start-process'/`call-process'/`call-process-region' use `exec-path' to search PROGRAM ;;emacs initial variable `exec-path' based on the value of env("PATH") before .emacs load, so set it here explicitly; (when (eq system-type 'windows-nt) (setq exec-path (append exec-path (split-string (getenv "PATH") "[\f\t\n\r\v;]+" t))) ) ;;{{-- Display ;;[[-- Faces ;;M-: (font-family-list) : view font family list (defun fun-setup-face() "set face" (set-face-attribute 'default nil :foundry "unknown" :width 'normal :height 120 :weight 'normal :slant 'normal :foreground "black" :background "white" ) (cond ((member "AR PL UKai CN" (font-family-list)) (set-face-attribute 'default nil :family "AR PL UKai CN")) ((member "Consolas" (font-family-list)) (set-face-attribute 'default nil :family "Consolas" :height 105)) ) (cond ((member "微软雅黑" (font-family-list)) (set-fontset-font "fontset-default" 'han "-outline-微软雅黑-normal-normal-normal-sans-16-*-*-*-p-*-iso8859-1") ) ) ) (fun-setup-face) ;;^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ;;CC Mode (group based on `CC Mode Manual') ;;^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ;;{{-- Getting Started (setq c-basic-offset 4) ;;^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ;; GNU Emacs 23.1.1 builtins ;;^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ;;{{-- speedbar.elc (require 'speedbar) (speedbar-change-initial-expansion-list "quick buffers") (setq speedbar-use-images nil) ;;{{-- ffap.elc ;(ffap-bindings) ;;{{-- ibuffer.elc (if (require 'ibuffer) (global-set-key (kbd "C-x C-b") 'ibuffer) ) ;;{{-- ido.elc (if (require 'ido) (ido-mode t) ;;Turning on ido-mode will remap (via a minor-mode keymap) the default keybindings for the `find-file' and `switch-to-buffer' families of commands to the ido versions of these functions. ) ;;{{-- hippie-expand.elc (setq hippie-expand-try-functions-list '( try-expand-dabbrev try-expand-dabbrev-visible try-expand-dabbrev-all-buffers try-expand-dabbrev-from-kill try-complete-file-name-partially try-complete-file-name try-expand-all-abbrevs try-expand-list try-expand-line try-complete-lisp-symbol-partially try-complete-lisp-symbol )) (global-set-key [(meta ?/)] 'hippie-expand) ;;{{-- windmove.elc (when (fboundp 'windmove-default-keybindings) (windmove-default-keybindings)) (windmove-default-keybindings 'meta) ;(global-set-key (kbd "C-c <left>") 'windmove-left) ;(global-set-key (kbd "C-c <right>") 'windmove-right) ;(global-set-key (kbd "C-c <up>") 'windmove-up) ;(global-set-key (kbd "C-c <down>") 'windmove-down) ;;========================================================== ;;all above is about setup of GNU Emacs 23.1.1 builtins ;; ;;below are setup of plugins, most of which come from http://www.emacswiki.org/ (such as Category *) ;;========================================================== (defcustom myemacs-noplugins t "t for not plugin plugins;nil for plugin plugins" :type 'boolean :group 'myemacs ) (defmacro plugin (feature filename setup &rest args) "plugin a plugin" (interactive) `(when (not ,myemacs-noplugins) (require ,feature ,filename t) (when (and (featurep ,feature)) (let* ( (library (locate-library ,filename)) (librarydir (directory-file-name (file-name-directory library))) ) (,setup librarydir ,@args) (message "plugin[%s] librarydir[%s]" ,feature librarydir) ) ) ) ) (when (file-exists-p mylispd) (dolist (dir (directory-files mylispd t "^[^.][-a-zA-Z0-9.]*$" t)) (add-to-list 'load-path dir) )) ;;^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ;; Plugins - Common ;;^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ;;---------------------------------------------------------- ;; Category Buffer Switching ;;---------------------------------------------------------- ;;{{-- swbuff (defun plugin-swbuff (librarydir) "plugin swbuff" (setq swbuff-exclude-buffer-regexps '("^ .*" "^\\*.*\\*")) ) (plugin 'swbuff "swbuff.el" plugin-swbuff) ;;{{-- tabbar (defun plugin-tabbar (librarydir) "plugin tabbar" (interactive) (tabbar-mode) ; (global-set-key (kbd "C-{") 'tabbar-backward-group) ; (global-set-key (kbd "C-}") 'tabbar-forward-group) ; (global-set-key (kbd "C-<") 'tabbar-backward) ; (global-set-key (kbd "C->") 'tabbar-forward) ) (plugin 'tabbar "tabbar.el" plugin-tabbar) ;;---------------------------------------------------------- ;; Category Completion ;;---------------------------------------------------------- ;;{{-- auto-complete (defun plugin-auto-complete (librarydir) "plugin auto-complete" (interactive) (add-to-list 'ac-dictionary-directories (concat librarydir "/dict")) (ac-config-default) (setq ac-quick-help-prefer-pos-tip) (setq ac-use-quick-help t) (setq ac-quick-help-delay 0.2) (setq ac-dwim t) ;(setq ac-auto-start nil) (ac-set-trigger-key "<C-return>") (define-key ac-mode-map [(control tab)] 'auto-complete) (setq ac-fuzzy-enable t) (setq-default ac-sources '(ac-source-abbrev ac-source-dictionary ac-source-words-in-same-mode-buffers)) (add-hook 'emacs-lisp-mode-hook 'ac-emacs-lisp-mode-setup) (add-hook 'c-mode-hook 'ac-cc-mode-setup) (add-hook 'auto-complete-mode-hook 'ac-common-setup) (global-auto-complete-mode t) ) (plugin 'auto-complete-config "auto-complete-config.el" plugin-auto-complete) ;;{{-- auto-complete-clang (defun plugin-auto-complete-clang (librarydir) "plugin auto-complete-clang" (interactive) ; (setq ac-clang-auto-save t) (setq ac-clang-flags (mapcar (lambda (item) (concat "-I" item)) system-include-dir-list)) (add-hook 'c-mode-hook (lambda() (setq ac-sources (append '(ac-source-clang ac-source-yasnippet) ac-sources)))) ) (plugin 'auto-complete-clang "auto-complete-clang.el" plugin-auto-complete-clang) ;;{{-- auto-complete-gccsensee (defun plugin-auto-complete-gccsense (librarydir) "plugin auto-complete-gccsensee" (interactive) (let ((bindir (concat (file-name-directory librarydir) "bin"))) (setenv "PATH" (concat bindir path-separator (getenv "PATH"))) (add-to-list 'exec-path bindir)) (add-hook 'c-mode-common-hook (lambda () ; (flymake-mode) (gccsense-flymake-setup))) (defun ac-complete-gccsense-self-insert (arg) (interactive "p") (self-insert-command arg) (ac-complete-gccsense)) (defun my-c-mode-ac-complete-hook () (local-set-key "." 'ac-complete-gccsense-self-insert) (local-set-key ">" 'ac-complete-gccsense-self-insert)) (add-hook 'c-mode-common-hook 'my-c-mode-ac-complete-hook) ) (plugin 'gccsense "etc/gccsense.el" plugin-auto-complete-gccsense) ;;---------------------------------------------------------- ;; Category Windows ;;---------------------------------------------------------- ;;{{-- window-number (defun plugin-window-number (librarydir) "plugin window-number" (interactive) (window-number-mode) (window-number-meta-mode) ) (plugin 'window-number "window-number.el" plugin-window-number) ;;{{-- win-switch (defun plugin-win-switch (librarydir) "plugin win-switch" (interactive) ;; (global-set-key "\C-xo" 'win-switch-dispatch) (win-switch-setup-keys-ijkl "\C-xo") ) (plugin 'win-switch "win-switch.el" plugin-win-switch) ;;{{-- switch-window (defun plugin-switch-window (librarydir) "plugin switch-window" (interactive) (global-set-key (kbd "C-x o") 'switch-window) ) (plugin 'switch-window "switch-window.el" plugin-switch-window) ;;---------------------------------------------------------- ;; Category Region ;;---------------------------------------------------------- ;;{{-- rect-mark (defun plugin-rect-mark (librarydir) "plugin rect-mark" (interactive) (global-set-key (kbd "C-x r C-SPC") 'rm-set-mark) (global-set-key (kbd "C-x r C-x") 'rm-exchange-point-and-mark) (global-set-key (kbd "C-x r C-w") 'rm-kill-region) (global-set-key (kbd "C-x r M-w") 'rm-kill-ring-save) (autoload 'rm-set-mark "rect-mark" "Set mark for rectangle." t) (autoload 'rm-exchange-point-and-mark "rect-mark" "Exchange point and mark for rectangle." t) (autoload 'rm-kill-region "rect-mark" "Kill a rectangular region and save it in the kill ring." t) (autoload 'rm-kill-ring-save "rect-mark" "Copy a rectangular region to the kill ring." t) ) (plugin 'rect-mark "rect-mark.el" plugin-rect-mark) ;;{{-- Move Line (defun move-line-up () (interactive) (transpose-lines 1) (forward-line -2)) (defun move-line-down () (interactive) (forward-line 1) (transpose-lines 1) (forward-line -1)) ;;o;;(global-set-key (kbd "M-<up>") 'move-line-up) ;;o;;(global-set-key (kbd "M-<down>") 'move-line-down) ;;{{-- Move Text (defun plugin-move-text (librarydir) "plugin move-text" (interactive) (move-text-default-bindings) ) (plugin 'move-text "move-text.el" plugin-move-text) ;;---------------------------------------------------------- ;; Category Spelling ;;---------------------------------------------------------- ;;{{-- ispell (defun plugin-ispell (librarydir) "plugin ispell" (interactive) (add-to-list 'ispell-dictionary-alist `("ispell-dict-english" "[a-zA-Z\304\326\334\344\366\337\374]" "[^a-zA-Z\304\326\334\344\366\337\374]" "[']" t ("-C" "-d" ,(fun-path "$ISPELL_DICT/English/english")) "~latin1" iso-8859-1)) (defun my-ispell-dict-english () "Switch to the my-english dictionary." (interactive) (ispell-change-dictionary "ispell-dict-english")) (require 'easymenu) (easy-menu-add-item nil '("tools" "spell") ["Select ispell-dict-english Dict" my-ispell-dict-english t]) (my-ispell-dict-english) ) ;(require 'ispell "ispell.el" plugin-ispell) ;;---------------------------------------------------------- ;; Category Template ;;---------------------------------------------------------- ;;{{-- YASnippet ;;YASnippet is a template system for Emacs. It allows you to type an abbreviation and automatically expand it into function templates. (defun plugin-yasnippet (librarydir) "plugin yasnippet" (interactive) (yas-global-mode 1) (yas-load-directory (concat librarydir "/snippets")) ;; default TAB key is occupied by auto-complete (global-set-key (kbd "C-c ; u") 'yas/expand) ;; default hotkey `C-c & C-s` is still valid (global-set-key (kbd "C-c ; s") 'yas/insert-snippet) ;; use yas/completing-prompt when ONLY when `M-x yas/insert-snippet' (defadvice yas-insert-snippet (around use-completing-prompt activate) "Use `yas-completing-prompt' for `yas-prompt-functions' but only here..." (let ((yas-prompt-functions '(yas-completing-prompt))) ad-do-it)) ) (plugin 'yasnippet "yasnippet.el" plugin-yasnippet) ;;---------------------------------------------------------- ;; Category Undo ;;---------------------------------------------------------- ;;{{-- undo tree (defun plugin-undo-tree (librarydir) "plugin undo-tree" (interactive) ) ;(plugin 'undo-tree "undo-tree.el" plugin-undo-tree) ;;{{-- browse-kill-ring (defun plugin-browse-kill-ring (librarydir) "plugin browse-kill-ring" (interactive) (global-set-key (kbd "C-c k") 'browse-kill-ring) ;(browse-kill-ring-default-keybindings) ) (plugin 'browse-kill-ring "browse-kill-ring.el" plugin-browse-kill-ring) ;;{{-- smex ;;Smex is a M-x enhancement for Emacs. Built on top of IDO, it provides a convenient interface to your recently and most frequently used commands. And to all the other commands, too. (defun plugin-smex (librarydir) "plugin smex" (interactive) ;;-- Delayed Initiation (global-set-key [(meta x)] (lambda () (interactive) (or (boundp 'smex-cache) (smex-initialize)) (global-set-key [(meta x)] 'smex) (smex))) (global-set-key [(shift meta x)] (lambda () (interactive) (or (boundp 'smex-cache) (smex-initialize)) (global-set-key [(shift meta x)] 'smex-major-mode-commands) (smex-major-mode-commands))) ;;-- Hyphen on Space (defadvice smex (around space-inserts-hyphen activate compile) (let ((ido-cannot-complete-command `(lambda () (interactive) (if (string= " " (this-command-keys)) (insert ?-) (funcall ,ido-cannot-complete-command))))) ad-do-it)) ;;-- Update less often (defun smex-update-after-load (unused) (when (boundp 'smex-cache) (smex-update))) (add-hook 'after-load-functions 'smex-update-after-load) ;;-- Using acronyms (defadvice ido-set-matches-1 (after ido-acronym-matches activate) (if (> (length ido-text) 1) (let ((regex (concat "^" (mapconcat 'char-to-string ido-text "[^-]*-") "[^-]*$"))) (setq ad-return-value (append (reverse (remove-if-not (lambda (i) (string-match regex i)) items)) ad-return-value))))) ) (plugin 'smex "smex.el" plugin-smex) ;;{{-- ascii (require 'ascii "ascii.el") ;;^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ;; Plugins - Programming ;;^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ;;{{-- ctypes ;;Enhanced Font lock support for custom defined types. (defun plugin-ctypes (librarydir) "plugin ctypes" (interactive) (ctypes-auto-parse-mode t) ) (plugin 'ctypes "ctypes.el" plugin-ctypes) ;;{{-- c-eldoc (defun plugin-c-eldoc (librarydir) "plugin c-eldoc" (interactive) (setq eldoc-echo-area-use-multiline-p t) (add-hook 'c-mode-hook 'c-turn-on-eldoc-mode) ) (plugin 'c-eldoc "c-eldoc.el" plugin-c-eldoc) ;;{{-- Cscope (defun plugin-cscope (librarydir) "plugin cscope" (interactive) ;(add-hook 'c-mode-common-hook '(lambda () (require 'xcscope))) ;only c-mode (setq-default cscope-display-cscope-buffer nil) ) (plugin 'xcscope (fun-path "contrib/xcscope/xcscope.el") plugin-cscope) ;;{{-- CEDET (defun plugin-cedet (librarydir) "plugin cedet" (interactive) ;;See cedet/common/cedet.info for configuration details. ;;[[-- Semantic (add-hook 'speedbar-load-hook (lambda () (require 'semantic-sb))) ;; * This enables some tools useful for coding, such as summary mode imenu support, and the semantic navigator (semantic-load-enable-code-helpers) ;;--Idle Schedule ;;C-h m : view semantic-idle-scheduler-mode minor mode is enabled (setq semantic-idle-scheduler-timer 1) ;;Timer used to schedule tasks in idle time. default value is 2 seconds (require 'semantic-c nil 'noerror) ;;required by semantic-add-system-include ;;--semantic include ;;In C/C++ code, semantic tries to distinguish between project and system headers based on `""' or `<>' delimiters. ;;project include(" " delimiter) (setq semanticdb-project-roots (list (expand-file-name "/"))) ;;system include(< > delimiter) ;;o;;(let ((system-include-dirs const-system-include-dir-list-project)) ;;o;; (setq system-include-dirs ;;o;; (append system-include-dirs const-system-include-dir-list-kernel)) ;;o;; (when (eq system-type 'windows-nt) ;;o;; (setq system-include-dirs ;;o;; (append system-include-dirs const-system-include-dir-list-win32))) ;;o;; (mapc (lambda (dir) ;;o;; (semantic-add-system-include dir 'c++-mode) ;;o;; (semantic-add-system-include dir 'c-mode)) ;;o;; system-include-dirs)) (setq system-include-mode-list (list 'c++-mode 'c-mode )) (defun fun-add-system-includes (dir-list &optional mode-list) "add system include dirs" (mapc (lambda (dir) (if (not mode-list) (semantic-add-system-include dir) (mapc (lambda (mode) (semantic-add-system-include dir mode) ) mode-list)) ) dir-list) ) ;;C-h v semantic-dependency-system-include-path : view the value have set under mode when open a c file (fun-add-system-includes system-include-dir-list system-include-mode-list) ;;semantic jump (defun fun-semantic-ia-fast-jump-back() "jump back of semantic-ia-fast-jump" (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))) ) (when (semantic-equivalent-tag-p (oref first tag) (semantic-current-tag)) (setq first (cdr (car (cdr alist))))) (semantic-mrub-switch-tags first) ) ) (defun fun-semantic-ia-fast-jump-or-back (&optional back) "jump or jump back with semantic-ia-fast-jump" (interactive "P") (if back (semantic-ia-fast-jump-back) (semantic-ia-fast-jump (point)) ) ) (defun fun-setup-semantic-jump-keybindings() "semantic-jump keybindings. jump in the same file only with semantic, prefer to use cscope for cross-file . cross-file jump with semantic is so slow" (local-set-key [f12] 'semantic-ia-fast-jump) (local-set-key [S-f12] 'fun-semantic-ia-fast-jump-back) ;;(local-set-key [C-f12] 'fun-semantic-ia-fast-jump-or-back) -- not right (define-key c-mode-base-map [M-S-f12] 'semantic-analyze-proto-impl-toggle) (define-key c-mode-base-map (kbd "M-n") 'semantic-ia-complete-symbol-menu) ) (add-hook 'c-mode-hook 'fun-setup-semantic-jump-keybindings) (add-hook 'c++-mode-hook 'fun-setup-semantic-jump-keybindings) ;;semantic jump with stack (defvar var-mru-tag-stack '() "Tag stack, when jumping to new tag, current tag will be stored here, and when jumping back, it will be removed." ) (defun fun-push-mru-tag (point) "Push tag info into var-mru-tag-stack" (interactive "d") (let* ((tag (semantic-mrub-find-nearby-tag point))) (if tag (let ((bookmark (semantic-bookmark (semantic-tag-name tag) :tag tag))) (semantic-mrub-update bookmark point 'mark) (add-to-list 'var-mru-tag-stack bookmark) (prin1 (format "push tag [%s]" (semantic-tag-name tag))) ) (error "No tag to push!")) ) ) (defun fun-push-mru-tag-and-ia-fast-jump(point) "Push tag of current postion and call (semantic-ia-fast-jump)" (interactive "d") (fun-push-mru-tag point) (semantic-ia-fast-jump point) ) (defun fun-push-mru-tag-and-complete-jump(point) "Push tag of current postion and call (semantic-ia-complete-jump)" (interactive "d") (fun-push-mru-tag point) (semantic-complete-jump) ) (defun fun-push-mru-tag-and-symref (point) "Push tag of current postion and call (semantic-symref)" (interactive "d") (fun-push-mru-tag point) (semantic-symref) ) (defun fun-pop-mru-tag-and-switch-tags() "Pop tag and Return to point of previous tag." (interactive) (if (car var-mru-tag-stack) (semantic-mrub-switch-tags (pop var-mru-tag-stack)) (error "var-mru-tag-stack is empty!") ) ) (defun fun-setup-semantic-stack-jump-keybindings() "semantic-mru-tag-stack-jump keybindings : prefix m for mru" (interactive) (local-set-key "\C-cmj" 'fun-push-mru-tag-and-ia-fast-jump) (local-set-key "\C-cmJ" 'fun-push-mru-tag-and-complete-jump) (local-set-key "\C-cmr" 'fun-push-mru-tag-and-symref) (local-set-key "\C-cmu" 'fun-pop-mru-tag-and-switch-tags) (local-set-key (kbd "C-c m SPC") 'fun-push-mru-tag) ) (add-hook 'c-mode-hook 'fun-setup-semantic-stack-jump-keybindings) ;;semanticdb (require 'semanticdb) (global-semanticdb-minor-mode 1) ;;jump in the same file only with semantic, prefer to use cscope for cross-file . cross-file jump with semantic is so slow (defun fun-set-semanticdb-find-default-throttle() "set semanticdb-find-default-throttle" (interactive) (setq-mode-local c-mode semanticdb-find-default-throttle '( file unloaded system project recursive ) ) ) (fun-set-semanticdb-find-default-throttle) ) ;;move built-in cedet out of directory lisp to lisp-backup for emacs 24.3 (plugin 'cedet "common/cedet.el" plugin-cedet) ;;--}} CEDET ;;{{-- ECB ;; Load the ECB first after starting if by `ecb-activate' (defun plugin-ecb (librarydir) "plugin ecb" (interactive) ;;ecb-upgrade.el : ecb is to old (defconst ecb-required-cedet-version-max '(1 2 4 9)) (setq stack-trace-on-error t) ;;Each source-path is the starting-node of the complete directory-structure below this path and can be browsed with the directories-interactor. (setq ecb-source-path `( (,(fun-path "$SRC/linux-2.6.32.60/") "linux-2.6.32.60") (,(fun-path "$SRC/httpd-2.2.24/") "httpd-2.2.24") (,(fun-path "$SRC") "src") ) ) ;;--ECB Autoload & Autoactivate (require 'ecb-autoloads) ;(setq ecb-auto-activate t) (defun fun-setup-ecb-keybindings() "ecb keybindings : t for toggle, e for ecb" (interactive) (local-set-key "\C-cte" 'ecb-minor-mode) ) (add-hook 'c-mode-hook 'fun-setup-ecb-keybindings) ;;--ECBLayout (let ((ecb-cust-layout-file (fun-path "$EMACSD/emacs-ecb-cust-layout.el"))) (when (file-readable-p ecb-cust-layout-file) (load-file ecb-cust-layout-file))) (defun fun-ecb-layout-switch (layout-name) "set ecb-layout" (interactive "slayout-name:") (when (not (ecb-find-assoc-value layout-name ecb-layout-window-sizes)) (cond ((string-equal layout-name "leftright1") (add-to-list 'ecb-layout-window-sizes (quote ("leftright1" (0.17 . 0.2) (0.17 . 0.3) (0.17 . 0.4) (0.25 . 0.9) )))) ((string= layout-name "top1") (add-to-list 'ecb-layout-window-sizes '("top1" (0.25 . 0.3) (0.25 . 0.3) (0.5 . 0.3) ))) ((string= layout-name "left9") (add-to-list 'ecb-layout-window-sizes '("left9" (0.25 . 0.9) ))) (t (error (format "%s is not in the case, please add it" layout-name)) ) )) (ecb-layout-switch layout-name) ) (fun-ecb-layout-switch "right-m") ;;--ECB Misc (setq ecb-tip-of-the-day nil) ;;Show tip of the day at start time of ECB. ) (when (featurep 'cedet) (plugin 'ecb "ecb.el" plugin-ecb)) ;;--}} ECB ;;---------------------------------------------------------- ;; File management ;;---------------------------------------------------------- ;;{{-- sr-speedbar (defun plugin-sr-speedbar (librarydir) "plugin sr-speedbar" (interactive) (setq sr-speedbar-width 50) (setq sr-speedbar-max-width 100) (global-set-key "\C-cts" 'sr-speedbar-toggle) ) (plugin 'sr-speedbar "sr-speedbar.el" plugin-sr-speedbar) ;;^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ;; Plugins - Programmer Utils ;;^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ;;---------------------------------------------------------- ;; File changes ;;---------------------------------------------------------- ;;{{-- ediff-trees (defun plugin-ediff-trees (librarydir) "plugin ediff-trees" (interactive) ) (plugin 'ediff-trees "ediff-trees.el" plugin-ediff-trees) ;;{{-- dircmp-mode (defun plugin-dircmp-mode (librarydir) "plugin dircmp-mode" (interactive) (setq-default dircmp-compare-permissions nil) (setq-default dircmp-compare-times nil) (setq-default dircmp-compare-group nil) (setq-default dircmp-compare-owner nil) ) (plugin 'dircmp-mode "dircmp-mode/dircmp.el" plugin-dircmp-mode) ;;---------------------------------------------------------- ;; Documenting code ;;---------------------------------------------------------- ;;{{-- doxymacs (defun plugin-doxymacs (librarydir) "plugin doxymacs" (interactive) (add-hook 'c-mode-common-hook 'doxymacs-mode) ) (when (file-exists-p (fun-path "$EMACSD/site-lisp/doxymacs-1.8.0")) ;; doxymacs need xmlparse (add-to-list 'load-path (fun-path "$EMACSD/site-lisp/doxymacs-1.8.0/no-autconf")) (plugin 'doxymacs "doxymacs.el" plugin-doxymacs) ) (defun my-javadoc-return () "Advanced `newline' command for Javadoc multiline comments. Insert a `*' at the beggining of the new line if inside of a comment." (interactive "*") (let* ((last (point)) (is-inside (if (search-backward "*/" nil t) ;; there are some comment endings - search forward (search-forward "/*" last t) ;; it's the only comment - search backward (goto-char last) (search-backward "/*" nil t)))) ;; go to last char position (goto-char last) ;; the point is inside some comment, insert `*' (if is-inside (progn (newline-and-indent) (insert "*")) ;; else insert only new-line (newline)))) (add-hook 'c-mode-hook (lambda () (local-set-key (kbd "<RET>") 'my-javadoc-return))) ;;^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ;; Plugins - External Utilities ;;^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ;;---------------------------------------------------------- ;; RFC relative ;;---------------------------------------------------------- ;;{{-- rfc ;;ref : http://www.emacswiki.org/emacs/rfc-el ;;You may need to comment out (require 'w3) line if you do not have a w3 package installed (since it is too old). ;; sed -i -e 's/ (require.*w3)/;&/' rfc.el ;;Usage : After installation & configuration, try M-x rfc-index (defun plugin-rfc (librarydir) "plugin rfc" (interactive) (setq rfc-url-save-directory (fun-path "$DOC/rfc/cache")) (setq rfc-index-url "http://www.ietf.org/rfc/rfc-index.txt") (setq rfc-archive-alist (list (concat rfc-url-save-directory "/rfc.zip") rfc-url-save-directory "http://www.ietf.org/rfc/" )) (setq rfc-insert-content-url-hook '(rfc-url-save)) ;;Key bindings (defvar rfc-index-mode-map nil "Keymap for RFC index mode") (if rfc-index-mode-map nil (setq rfc-index-mode-map (make-sparse-keymap)) (suppress-keymap rfc-index-mode-map) (let ((map rfc-index-mode-map)) (define-key map "\C-m" 'rfc-index-goto-nearest) (define-key map "g" 'rfc-goto-number) (define-key map "\C-j" 'rfc-index-follow-nearest) (define-key map "f" 'rfc-index-follow-number) (define-key map "o" 'rfc-index-follow-obsoleted) (define-key map "O" 'rfc-index-follow-obsoletes) (define-key map "u" 'rfc-index-follow-updates) (define-key map "U" 'rfc-index-follow-updated) (define-key map [mouse-2] 'rfc-index-mouse-2) (define-key map "n" 'scroll-up) (define-key map "p" 'scroll-down) (define-key map " " 'scroll-up) (define-key map "\C-?" 'scroll-down) (define-key map "s" 'isearch-forward) (define-key map "r" 'isearch-backward) (define-key map "q" 'rfc-index-kill-buffer) )) ) (plugin 'rfc "rfc.el" plugin-rfc) ;;{{-- get-rfc (defun plugin-get-rfc (librarydir) "plugin get-rfc" (interactive) (setq get-rfc-open-in-new-frame nil) (setq get-rfc-local-rfc-directory (fun-path "$DOC/rfc/cache/")) ;;(setq get-rfc-no-wget t) (put 'rfc 'bounds-of-thing-at-point (lambda () (and (thing-at-point-looking-at "[Rr][Ff][Cc][- #]?\\([0-9]+\\)") (cons (match-beginning 0) (match-end 0))))) (autoload 'get-rfc-view-rfc "get-rfc" "Get and view an RFC" t nil) (autoload 'get-rfc-view-rfc-at-point "get-rfc" "View the RFC at point" t nil) (autoload 'get-rfc-grep-rfc-index "get-rfc" "Grep rfc-index.txt" t nil) ) (plugin 'get-rfc "rfc/get-rfc.el" plugin-get-rfc) ;;{{-- rfcview (defun plugin-rfcview (librarydir) "plugin rfcview" (interactive) (autoload 'rfcview-mode "rfcview" nil t) (let ((speedbar (fun-path "$EMACSD/site-lisp/cedet-1.1/speedbar"))) (when (file-exists-p speedbar) (add-to-list 'load-path speedbar) (eval-after-load "speedbar" '(load-library (concat librarydir "/sb-rfcview"))) )) (custom-set-variables '(speedbar-supported-extension-expressions (append speedbar-supported-extension-expressions '("rfc[0-9]+\\.txt")))) ) (plugin 'rfcview "rfcview/rfcview.el" plugin-rfcview) ;;{{-- irfc (defun plugin-irfc (librarydir) "plugin irfc" (interactive) (setq irfc-buffer-name-includes-title nil) (setq irfc-assoc-mode t) (when (file-exists-p (fun-path "$DOC/rfc/RFC-all")) (setq irfc-directory (fun-path "$DOC/rfc/RFC-all")) ) (add-to-list 'load-path librarydir) (require 'anything-irfc "irfc/anything-irfc" t) ) (plugin 'irfc "irfc/irfc.el" plugin-irfc) ;;{{-- ffap-rfc (defun plugin-ffap-rfc (librarydir) "plugin ffap-rfc" (interactive) (require 'ffap-rfc-directories) (eval-after-load "ffap" '(require 'ffap-rfc-space)) (setq ffap-rfc-directories (fun-path-list '( "$DOC/rfc/cache" "$DOC/rfc/RFC-all" ))) (setq ffap-rfc-path "/[email protected]:/in-notes/rfc%s.txt") (defadvice ffap-file-at-point (after ffap-file-at-point-after-advice ()) (if (string= ad-return-value "/") (setq ad-return-value nil))) (ad-activate 'ffap-file-at-point) ;; (ad-deactivate 'ffap-file-at-point) ) ;(eval-after-load "ffap" '(plugin-ffap-rfc)) ;;--rfc ;(setq auto-mode-alist (cons '("/rfc[0-9]+\\.txt\\(\\.gz\\)?\\'" . rfcview-mode) auto-mode-alist)) (setq auto-mode-alist (cons '("/rfc[0-9]+\\.txt\\(\\.gz\\)?\\'" . irfc-mode) auto-mode-alist)) ;;{{-- dictionary ;(require 'dictionary "dictionary.el" t) ;;^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ;; Category Web Browser ;;^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ;;{{-- emacs-w3m (defun plugin-w3m (librarydir) "plugin emacs-w3m" (interactive) (setq browse-url-browser-function 'w3m-browse-url) (autoload 'w3m-browse-url "w3m" "Ask a WWW browser to show a URL." t) ;; optional keyboard short-cut (global-set-key "\C-xm" 'browse-url-at-point) (setq w3m-use-cookies t) ) ;(plugin 'w3m "w3m.el" plugin-w3m) ;;^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ;; Category Emulation ;;^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ;;{{-- evil ;;Evil is an extensible vi layer for Emacs. It provides Vim features like Visual selection and text objects, and is the successor to Vimpulse and vim-mode (defun plugin-evil (librarydir) "plugin evil" (interactive) (evil-mode 1) ) ;(plugin 'evil "evil.el" plugin-evil) ;;{{-- vim-current-buffer (defun vim-current-buffer () (interactive) "Open current buffer file in gvim" (let ((gvim-program (fun-path "$SOFTWARE/Vim/vim74/gvim.exe")) (gvim-file-name (buffer-file-name (current-buffer)))) (if gvim-file-name (progn (kill-buffer (current-buffer) ) ;; need to understand the start-process and how to handle the process exit ;; to be implemented: when process ends, will reopen file in emacs (setq result (start-process "gvim" nil gvim-program gvim-file-name))) (error "Current buffer doesn't point to a file yet.")) (unless result (find-file gvim-file-name)))) ;;^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ;; Plugins - Misc ;;^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ;;{{-- helm (defun plugin-helm (librarydir) "plugin helm" (interactive) ) (plugin 'helm-config "helm-config.el" plugin-helm) ;;^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ;; Plugins - Useless ;;^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ;;{{-- tree-widget (require 'dir-tree "dir-tree.el" t) ;;{{-- gdiff (require 'gdiff "gdiff.el" t) ;;{{-- findstr ;(autoload 'findstr "findstr" "Run Windows NT findstr to match expression in files." t) ;;^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ;;Post Setup ;;^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ (fun-maximize-frame) ;(setq ecb-auto-activate t) (let ((cust-file (fun-path "$EMACSD/emacs-custom.el"))) (when (and (file-exists-p cust-file) (file-writable-p cust-file)) (load-file cust-file)) (setq custom-file cust-file) )