summaryrefslogtreecommitdiffstats
path: root/emacs.d/lisp
diff options
context:
space:
mode:
Diffstat (limited to 'emacs.d/lisp')
-rw-r--r--emacs.d/lisp/auto-complete/auto-complete-etags.el60
-rw-r--r--emacs.d/lisp/auto-complete/auto-complete.el1138
-rw-r--r--emacs.d/lisp/cursor-chg.el348
-rw-r--r--emacs.d/lisp/delphi-mode-ench.el8
-rw-r--r--emacs.d/lisp/etags-table.el157
5 files changed, 1710 insertions, 1 deletions
diff --git a/emacs.d/lisp/auto-complete/auto-complete-etags.el b/emacs.d/lisp/auto-complete/auto-complete-etags.el
new file mode 100644
index 0000000..1f0f3cf
--- /dev/null
+++ b/emacs.d/lisp/auto-complete/auto-complete-etags.el
@@ -0,0 +1,60 @@
+;;; auto-complete-etags.el ---
+
+;; Copyright 2009 Yen-Chin,Lee
+;;
+;; Author: Yen-Chin,Lee
+;; Version: $Id: auto-complete-etags.el,v 0.2 2009/04/23 00:38:01 coldnew Exp $
+;; Keywords:
+;; X-URL: not distributed yet
+
+;; This program is free software; you can redistribute it and/or modify
+;; it under the terms of the GNU General Public License as published by
+;; the Free Software Foundation; either version 2, or (at your option)
+;; any later version.
+;;
+;; This program is distributed in the hope that it will be useful,
+;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+;; GNU General Public License for more details.
+;;
+;; You should have received a copy of the GNU General Public License
+;; along with this program; if not, write to the Free Software
+;; Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+
+;;; Commentary:
+
+;;
+
+;; Put this file into your load-path and the following into your ~/.emacs:
+;; (require 'auto-complete-etags)
+
+;;; Code:
+
+(provide 'auto-complete-etags)
+(require 'auto-complete)
+(eval-when-compile
+ (require 'cl))
+
+
+;;;;##########################################################################
+;;;; User Options, Variables
+;;;;##########################################################################
+
+(defface ac-etags-candidate-face
+ '((t (:background "gainsboro" :foreground "deep sky blue")))
+ "Face for etags candidate")
+
+(defface ac-etags-selection-face
+ '((t (:background "deep sky blue" :foreground "white")))
+ "Face for the etags selected candidate.")
+
+(defvar ac-source-etags
+ '((candidates . (lambda ()
+ (all-completions ac-target (tags-completion-table))))
+ (candidate-face . ac-etags-candidate-face)
+ (selection-face . ac-etags-selection-face)
+ (requires . 3))
+ "Source for etags.")
+
+
+;;; auto-complete-etags.el ends here
diff --git a/emacs.d/lisp/auto-complete/auto-complete.el b/emacs.d/lisp/auto-complete/auto-complete.el
new file mode 100644
index 0000000..cdc4e86
--- /dev/null
+++ b/emacs.d/lisp/auto-complete/auto-complete.el
@@ -0,0 +1,1138 @@
+;;; auto-complete.el --- Inline auto completion
+
+;; Copyright (C) 2008, 2009 MATSUYAMA Tomohiro
+
+;; Author: MATSUYAMA Tomohiro <t.matsuyama.pub@gmail.com>
+;; Keywords: convenience
+;; Version: 0.2.0
+
+;; This program is free software; you can redistribute it and/or modify
+;; it under the terms of the GNU General Public License as published by
+;; the Free Software Foundation, either version 3 of the License, or
+;; (at your option) any later version.
+
+;; This program is distributed in the hope that it will be useful,
+;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+;; GNU General Public License for more details.
+
+;; You should have received a copy of the GNU General Public License
+;; along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+;;; Commentary:
+;;
+;; This extension provides a way to complete with popup menu like:
+;;
+;; def-!-
+;; +-----------------+
+;; |defun::::::::::::|
+;; |defvar |
+;; |defmacro |
+;; | ... |
+;; +-----------------+
+;;
+;; You can complete by typing and selecting menu.
+;; Enjoy!
+
+;;; Qualification:
+;;
+;; This extension can work property on GNU Emacs 22 or higher.
+
+;;; Installation:
+;;
+;; To use this extension, locate all .el files of this package to your load-path directory.
+;;
+;; $ cp auto-complete-x.x.x/*.el ~/.emacs.d/
+;;
+;; And write following code into your .emacs.
+;;
+;; (require 'auto-complete)
+;; (global-auto-complete-mode t)
+
+;;; Tips:
+;;
+;; Use C-n/C-p to select candidates
+;; --------------------------------
+;;
+;; Add following code to your .emacs.
+;;
+;; (define-key ac-complete-mode-map "\C-n" 'ac-next)
+;; (define-key ac-complete-mode-map "\C-p" 'ac-previous)
+;;
+;;
+;; Don't start completion automatically
+;; ------------------------------------
+;;
+;; Add following code to your .emacs.
+;;
+;; (setq ac-auto-start nil)
+;; (global-set-key "\M-/" 'ac-start)
+;;
+;; or
+;;
+;; ;; start completion when entered 3 characters
+;; (setq ac-auto-start 3)
+;;
+;;
+;; Stop completion
+;; ---------------
+;;
+;; Add following code to your .emacs.
+;;
+;; (define-key ac-complete-mode-map "\M-/" 'ac-stop)
+;;
+;; Now you can stop completion by pressing M-/.
+;;
+;;
+;; Completion by TAB
+;; -----------------
+;;
+;; Add following code to your .emacs.
+;;
+;; (define-key ac-complete-mode-map "\t" 'ac-complete)
+;; (define-key ac-complete-mode-map "\r" nil)
+;;
+;;
+;; Do What I Mean mode
+;; -------------------
+;;
+;; If DWIM (Do What I Mean) mode is enabled,
+;; the following features is available:
+;;
+;; a. TAB (ac-expand) behave as completion (ac-complete)
+;; when only one candidate is left
+;; b. TAB (ac-expand) behave as completion (ac-complete)
+;; after you select candidate
+;; c. Disapear automatically when you
+;; complete a candidate.
+;;
+;; DWIM mode is enabled by default.
+;; You can enable this feature by
+;; setting `ac-dwim' to t.
+;;
+;; (setq ac-dwim t)
+;;
+;;
+;; Change default sources
+;; ----------------------
+;;
+;; (setq-default ac-sources '(ac-source-abbrev ac-source-words-in-buffer))
+;;
+;;
+;; Change sources for particular mode
+;; ----------------------------------
+;;
+;; (add-hook 'emacs-lisp-mode-hook
+;; (lambda ()
+;; (setq ac-sources '(ac-source-words-in-buffer ac-source-symbols))))
+
+;;; History:
+;;
+;; 2008-03-18
+;; * auto-complete.el 0.2.0 released
+;;
+;; 2008-03-04
+;; * fixed menu position bug
+;;
+;; 2008-03-02
+;; * made a source be able to be just a function which returns candidates
+;; * added ac-source-words-in-all-buffer
+;;
+;; 2008-03-01
+;; * added basic cache facility
+;;
+;; 2008-02-20
+;; * fixed menu position bug at long line (thanks rubikitch <rubikitch@ruby-lang.org>)
+;; * made dictionary source generator (ac-define-dictionary-source)
+;; * devided into some files (auto-complete-ruby.el, auto-complete-yasnippet.el, etc)
+;;
+;; 2008-02-19
+;; * added ac-trigger-commands switch
+;;
+;; 2008-02-10
+;; * added ac-stop function (suggestion from Andy Stewart)
+;; * added ac-override-local-map switch (suggestion from Andy Stewart)
+;;
+;; 2008-02-03
+;; * omni completion redesign
+;; * ac-sources is now buffer local for every buffer
+;; * fixed a menu position bug (thanks Andy Stewart)
+;; * fixed byte-compile warnings (thanks Andy Stewart)
+;;
+;; 2008-01-22
+;; * added face/selection-face property for sources
+;; * supported menu scroll
+;;
+;; 2008-01-20
+;; * omni completion
+;;
+;; 2008-12-24
+;; * suppress errors on command hook
+;;
+;; 2008-12-03
+;; * changed ac-dwim to nil by default
+;; * made menu to be able to adjust width
+;;
+;; 2008-12-03
+;; * renamed ac-find-function to ac-prefix-function
+;; * renamed ac-target to ac-prefix
+;;
+;; 2008-11-26
+;; * auto-complete.el 0.1.0 released
+;;
+;; 2008-11-19
+;; * thanks for Taiki SUGAWARA <buzz.taiki@gmail.com>
+;; * added source ac-source-abbrev
+;; * added source ac-source-symbols
+;; * added ac-expand-common to expand common part
+;;
+;; 2008-11-18
+;; * added ac-auto-start switch
+;; * added ac-dwim switch
+;; * changed menu popup behavior at end of window
+;; * thanks rubikitch <rubikitch@ruby-lang.org>, kazu-yamamoto.
+;; * fixed canceler bug
+;; * changed to use overriding-local-map instead of minor mode map
+;; * changed default key bindings
+;;
+;; 2008-11-16
+;; * supported candidates by using sources
+;; * added automatically start swtich
+;; * fixed some bug
+;; * added source ac-source-files-in-current-dir
+;; * added source ac-source-words-in-buffer
+;; * added source ac-source-yasnippet
+;; * renamed ac-enum-candidates-function to ac-candidate-function
+;; * renamed ac-find-target-function to ac-find-function
+;; * ac-find-function and ac-candidate-function is not buffer local variable now
+;; * made candidates visible when you are end of line
+;;
+;; 2008-11-11
+;; * by reporting from rubikitch <rubikitch@ruby-lang.org>
+;; * renamed hook name
+;; * registered backward-delete-char as special command
+;; * fixed code for creating candidates
+;; * made auto-complete disabled when isearch-mode enabled
+;; * added some major-mode into ac-modes
+;;
+;; 2008-11-09
+;; * auto-complete.el 0.0.1 released
+;; * fixed double-width character displaying problem
+;; * fixed menu position following tab character
+;; * made candidates visible when you are end of window
+
+;;; TODO:
+;;
+;; - test facility
+;; - support composed chars
+;; - fuzzy match
+;; - minibuffer completion
+;; - dictionary
+;; - documentation
+;; - performance issue (cache issue)
+;; - fix narrowing bug (reported by Yuto Hayamizu <y.hayamizu@gmail.com>)
+;; - care about undo (buffer-disable-undo)
+;; - scroll bar (visual)
+;; - show description
+;; - semantic
+;; - use cl
+;; - icon
+;; - refactoring (especially menu)
+;; - linum.el bug (reported by Andy Stewart)
+;; - flymake bug (reported by TiagoCamargo)
+
+;;; Code:
+
+
+
+(defgroup auto-complete nil
+ "Auto completion with popup menu"
+ :group 'convenience
+ :prefix "auto-complete-")
+
+(defcustom ac-candidate-menu-height 10
+ "Max height of candidate menu."
+ :type 'number
+ :group 'auto-complete)
+
+(defcustom ac-candidate-max 10
+ "Max of number of candidates."
+ :type 'number
+ :group 'auto-complete)
+
+(defcustom ac-modes
+ '(emacs-lisp-mode lisp-interaction-mode
+ c-mode cc-mode c++-mode java-mode
+ perl-mode cperl-mode python-mode ruby-mode
+ ecmascript-mode javascript-mode js2-mode php-mode css-mode
+ makefile-mode sh-mode fortran-mode f90-mode ada-mode
+ xml-mode sgml-mode)
+ "Major modes `auto-complete-mode' can run on."
+ :type '(list symbol)
+ :group 'auto-complete)
+
+(defcustom ac-trigger-commands
+ '(self-insert-command)
+ "Trigger commands that specify whether `auto-complete' should start or not."
+ :type '(list symbol)
+ :group 'auto-complete)
+
+(defcustom ac-auto-start t
+ "Non-nil means completion will be started automatically.
+Positive integer means if a length of a word you entered is larger than the value,
+completion will be started automatically.
+If you specify `nil', never be started automatically."
+ :group 'auto-complete)
+
+(defcustom ac-dwim nil
+ "Non-nil means `auto-complete' works based on Do What I Mean."
+ :type 'boolean
+ :group 'auto-complete)
+
+(defcustom ac-override-local-map nil
+ "Non-nil mean use `ac-complete-mode-map' override local map.
+Please set it to non-nil only if you faced to some problem about
+minor-mode keymap conflicts."
+ :type 'boolean
+ :group 'auto-complete)
+
+(defface ac-candidate-face
+ '((t (:background "lightgray" :foreground "black")))
+ "Face for candidate."
+ :group 'auto-complete)
+
+(defface ac-selection-face
+ '((t (:background "blue" :foreground "white")))
+ "Face for the selected candidate."
+ :group 'auto-complete)
+
+(defvar auto-complete-mode-hook nil
+ "Hook for `auto-complete-mode'.")
+
+(defvar ac-menu nil
+ "Menu instance.")
+
+(defvar ac-menu-direction 1
+ "Positive integer means `ac-menu' grows forward.
+Or, `ac-menu' grows backward.")
+
+(defvar ac-menu-offset 0
+ "Offset to contents.")
+
+(defvar ac-menu-scroll 0
+ "Scroll top of `ac-menu'.")
+
+(defvar ac-completing nil
+ "Non-nil means `auto-complete-mode' is now working on completion.")
+
+(defvar ac-saved-window-start nil
+ "Saved window start value for restore.")
+
+(defvar ac-saved-window-hscroll nil
+ "Saved window hscroll value for restore.")
+
+(defvar ac-buffer nil
+ "A buffer where auto-complete is started.")
+
+(defvar ac-point nil
+ "Start point of prefix.")
+
+(defvar ac-old-point nil
+ "Previous start point of prefix.")
+
+(defvar ac-prefix nil
+ "Prefix.")
+(defvaralias 'ac-target 'ac-prefix)
+
+(defvar ac-limit 0
+ "Limit of number of candidates.")
+
+(defvar ac-candidates nil
+ "Current candidates.")
+
+(defvar ac-selection nil
+ "Current candidate index.")
+
+(defvar ac-dwim-enable nil
+ "Non-nil means DWIM completion will be allowed.")
+
+(defvar ac-setup-function 'ac-sources-setup
+ "This function will be called when `auto-complete-mode' is enabled.")
+
+(defvar ac-prefix-function 'ac-sources-prefix
+ "When `auto-complete-mode' finds it can start completion
+or update candidates, it will call this function to find a
+start point of the prefix.
+
+If this function returns a point `auto-complete-mode'
+will set the substring between the point and current point to `ac-prefix'.
+And also it will start completion or update candidates by using
+the `ac-prefix'.
+
+If this function returns `nil', `auto-complete-mode'
+ignore starting completion or stop completing.")
+(defvaralias 'ac-find-function 'ac-prefix-function)
+
+(defvar ac-init-function 'ac-sources-init
+ "This function will be called when candidate menu is setupped.")
+
+(defvar ac-cleanup-function 'ac-sources-cleanup
+ "This function will be called when candidate menu is cleanupped")
+
+(defvar ac-candidate-function 'ac-sources-candidate
+ "This function can return candidates as list by
+using the `TARGET' that is given as a first argument.")
+
+(defvar ac-complete-mode-map
+ (let ((map (make-sparse-keymap)))
+ (define-key map "\t" 'ac-expand)
+ (define-key map "\r" 'ac-complete)
+
+ (define-key map [down] 'ac-next)
+ (define-key map [up] 'ac-previous)
+
+ map)
+ "Keymap for completion.")
+
+(defvar ac-saved-local-map nil
+ "Old keymap before `auto-complete' activated.")
+
+
+
+;;;; Auto completion
+
+(defun ac-setup-menu (point width)
+ "Setup popup menu."
+ (when ac-menu
+ ;; reposition
+ (ac-menu-delete ac-menu)
+ (setq ac-menu nil))
+ (save-excursion
+ (goto-char point)
+ (let ((column (ac-current-physical-column))
+ (line (line-number-at-pos)))
+ (setq ac-saved-window-start (window-start))
+ (setq ac-saved-window-hscroll (window-hscroll))
+ (setq ac-menu-direction
+ (if (and (> line ac-candidate-menu-height)
+ (> ac-candidate-menu-height
+ (-
+ (max 1 (- (window-height)
+ (if mode-line-format 1 0)
+ (if header-line-format 1 0)))
+ (count-lines (window-start) (point)))))
+ -1
+ 1))
+ (let ((window-width (window-width))
+ (right (- (+ column width)
+ (window-hscroll))))
+ (if (and (> right window-width)
+ (>= right width)
+ (>= column width))
+ (setq column (- column width))))
+ (if (> ac-menu-direction 0)
+ (progn
+ (forward-line)
+ (if (eq line (line-number-at-pos))
+ (newline)
+ (forward-line -1))
+ (setq ac-menu (ac-menu-create (1+ line) column width ac-candidate-menu-height))
+ (setq ac-point point))
+ (setq ac-menu (ac-menu-create (- line ac-candidate-menu-height) column width ac-candidate-menu-height))
+ (setq ac-point point)))))
+
+(defun ac-cleanup ()
+ "Destroy popup menu."
+ (ac-deactivate-mode-map)
+ (when ac-menu
+ (ac-menu-delete ac-menu)
+ (set-window-start (selected-window) ac-saved-window-start)
+ (set-window-hscroll (selected-window) ac-saved-window-hscroll))
+ (setq ac-menu nil)
+ (setq ac-menu-scroll 0)
+ (setq ac-completing nil)
+ (setq ac-point nil)
+ (setq ac-candidates nil)
+ (setq ac-selection 0)
+ (setq ac-selection-scroll-top 0)
+ (funcall ac-cleanup-function))
+
+(defun ac-activate-mode-map ()
+ "Activate `ac-complete-mode-map'."
+ (if ac-override-local-map
+ (progn
+ (setq ac-saved-local-map overriding-terminal-local-map)
+ (if (eq ac-saved-local-map ac-complete-mode-map)
+ ;; maybe never reach here
+ (setq ac-saved-local-map nil))
+ (setq overriding-terminal-local-map ac-complete-mode-map))
+ ;; rearrange ac-mode-map pair first
+ (assq-delete-all 'ac-completing minor-mode-map-alist)
+ (push (cons 'ac-completing ac-complete-mode-map) minor-mode-map-alist)))
+
+(defun ac-deactivate-mode-map ()
+ "Deactivate `ac-complete-mode-map'."
+ (when (and ac-override-local-map
+ (eq overriding-terminal-local-map ac-complete-mode-map))
+ (setq overriding-terminal-local-map ac-saved-local-map)
+ (setq ac-saved-local-map nil)))
+
+(defun ac-next ()
+ "Select next candidate."
+ (interactive)
+ (if (interactive-p)
+ (setq ac-dwim-enable t))
+ (if ac-candidates
+ (ac-select-candidate
+ (let ((selection (1+ ac-selection)))
+ (if (= selection (+ ac-menu-offset (min ac-candidate-menu-height (length ac-candidates))))
+ (if (< (+ (- ac-selection ac-menu-offset) ac-menu-scroll) (1- (length ac-candidates)))
+ (prog1 ac-selection
+ (setq ac-menu-scroll (1+ ac-menu-scroll))
+ (ac-redraw-candidates))
+ (setq ac-menu-scroll 0)
+ (ac-redraw-candidates)
+ ac-menu-offset)
+ selection)))))
+
+(defun ac-previous ()
+ "Select previous candidate."
+ (interactive)
+ (if (interactive-p)
+ (setq ac-dwim-enable t))
+ (if ac-candidates
+ (ac-select-candidate
+ (let ((selection (1- ac-selection)))
+ (if (< selection ac-menu-offset)
+ (if (= ac-menu-scroll 0)
+ (prog1 (1- (+ ac-menu-offset (min ac-candidate-menu-height (length ac-candidates))))
+ (setq ac-menu-scroll (- (length ac-candidates) (min ac-candidate-menu-height (length ac-candidates))))
+ (ac-redraw-candidates))
+ (setq ac-menu-scroll (1- ac-menu-scroll))
+ (ac-redraw-candidates)
+ ac-selection)
+ selection)))))
+
+(defun ac-expand-1 ()
+ "Try expansion."
+ (let ((string (overlay-get (ac-menu-line-overlay ac-menu ac-selection) 'real-string)))
+ (delete-region ac-point (point))
+ (insert string)
+ (setq ac-prefix string)))
+
+(defun ac-expand ()
+ "Try expansion but select next if expanded twice."
+ (interactive)
+ (if (and ac-dwim ac-dwim-enable)
+ (ac-complete)
+ (let ((target ac-prefix)
+ (string (ac-expand-1)))
+ (when (equal target string)
+ (ac-next)
+ (ac-expand-1)))))
+
+(defun ac-expand-common ()
+ "Try expansion common part."
+ (interactive)
+ (let ((common (try-completion ac-prefix ac-candidates))
+ (buffer-undo-list t))
+ (when (stringp common)
+ (delete-region ac-point (point))
+ (insert common)
+ (setq ac-prefix common))))
+
+(defun ac-complete ()
+ "Try completion."
+ (interactive)
+ (let* ((candidate (ac-get-selected-candidate))
+ (action (ac-get-candidate-action candidate)))
+ (ac-expand-1)
+ (if action
+ (funcall action))
+ (ac-abort)))
+
+(defun ac-abort ()
+ "Abort completion."
+ (ac-cleanup))
+
+(defun ac-stop ()
+ "Stop completiong."
+ (interactive)
+ (ac-abort))
+
+(defun ac-redraw-candidates ()
+ "Redraw the menu contents."
+ (let ((i ac-menu-offset))
+ ;; show line and set string to the line
+ (mapc
+ (lambda (candidate)
+ (when (< i ac-candidate-menu-height)
+ (ac-menu-show-line ac-menu i)
+ (ac-menu-set-line-string ac-menu i candidate
+ (if (= i ac-selection)
+ (or (ac-get-candidate-property 'selection-face candidate) 'ac-selection-face)
+ (or (ac-get-candidate-property 'candidate-face candidate) 'ac-candidate-face)))
+ (setq i (1+ i))))
+ (nthcdr ac-menu-scroll ac-candidates))
+ ;; ensure lines visible
+ (if (and (> ac-menu-direction 0)
+ (> i (-
+ (max 1 (- (window-height)
+ (if mode-line-format 1 0)
+ (if header-line-format 1 0)))
+ (count-lines (window-start) (point)))))
+ (recenter (- (1+ i))))
+ (if (> i ac-menu-offset)
+ (let ((window-width (window-width))
+ (right (- (+ (ac-menu-column ac-menu) (ac-menu-width ac-menu))
+ (window-hscroll))))
+ (if (> right window-width)
+ (scroll-left (- right window-width)))))
+ ;; hide remaining lines
+ (if (> ac-menu-direction 0)
+ (while (< i ac-candidate-menu-height)
+ (ac-menu-hide-line ac-menu i)
+ (setq i (1+ i)))
+ (dotimes (i ac-menu-offset)
+ (ac-menu-hide-line ac-menu i)))))
+
+(defun ac-update-candidates (candidates)
+ "Update candidates of popup menu."
+ (setq ac-menu-offset (if (> ac-menu-direction 0)
+ 0
+ (- ac-candidate-menu-height
+ (min ac-candidate-menu-height
+ (length candidates)))))
+ (setq ac-selection ac-menu-offset)
+ (setq ac-candidates candidates)
+ (setq ac-dwim-enable (= (length candidates) 1))
+ (if candidates
+ (progn
+ (setq ac-completing t)
+ (ac-activate-mode-map))
+ (setq ac-completing nil)
+ (ac-deactivate-mode-map))
+ (ac-redraw-candidates))
+
+(defun ac-get-selected-candidate ()
+ (overlay-get (ac-menu-line-overlay ac-menu ac-selection) 'real-string))
+
+(defun ac-get-candidate-action (candidate)
+ (ac-get-candidate-property 'action candidate))
+
+(defun ac-propertize-candidate (candidate &rest properties)
+ (apply 'propertize candidate properties))
+
+(defun ac-get-candidate-property (prop candidate)
+ (get-text-property 0 prop candidate))
+
+(defun ac-select-candidate (selection)
+ "Select candidate pointed by `SELECTION'."
+ (when ac-candidates
+ (let ((c1 (nth (+ (- ac-selection ac-menu-offset) ac-menu-scroll) ac-candidates))
+ (c2 (nth (+ (- selection ac-menu-offset) ac-menu-scroll) ac-candidates)))
+ (ac-menu-set-line-string ac-menu ac-selection c1
+ (or (ac-get-candidate-property 'candidate-face c1)
+ 'ac-candidate-face))
+ (ac-menu-set-line-string ac-menu selection c2
+ (or (ac-get-candidate-property 'selection-face c2)
+ 'ac-selection-face))
+ (setq ac-selection selection))))
+
+(defun ac-start ()
+ "Start completion."
+ (interactive)
+ (let* ((point (save-excursion (funcall ac-prefix-function)))
+ (reposition (not (equal ac-point point))))
+ (if (null point)
+ (ac-abort)
+ (setq ac-buffer (current-buffer))
+ (setq ac-point point)
+ (when (not (equal ac-point ac-old-point))
+ (setq ac-old-point point))
+ (setq ac-prefix (buffer-substring-no-properties point (point)))
+ (setq ac-limit ac-candidate-max)
+ (if (or reposition (null ac-menu))
+ (save-excursion
+ (funcall ac-init-function)))
+ (let* ((candidates
+ (if (or ac-completing
+ (not (integerp ac-auto-start))
+ (>= (length ac-prefix) ac-auto-start))
+ (save-excursion
+ (funcall ac-candidate-function))))
+ (current-width (if ac-menu (ac-menu-width ac-menu) 0))
+ (width (let ((w '(0)) s)
+ (dotimes (i ac-candidate-menu-height)
+ (setq s (nth i candidates))
+ (if (stringp s) (push (string-width s) w)))
+ (apply 'max w))))
+ (if (or reposition
+ (null ac-menu)
+ (> width current-width)
+ (< width (- current-width 10)))
+ (ac-setup-menu point (* (ceiling (/ width 10.0)) 10)))
+ (if (and ac-dwim
+ (= (length candidates) 1)
+ (equal (car candidates) ac-prefix)
+ (null (ac-get-candidate-action (car candidates))))
+ (setq candidates nil))
+ (ac-update-candidates candidates)))))
+
+(defun ac-trigger-command-p ()
+ "Return non-nil if `this-command' is a trigger command."
+ (or (memq this-command ac-trigger-commands)
+ (and ac-completing
+ (memq this-command
+ '(delete-backward-char
+ backward-delete-char
+ backward-delete-char-untabify)))))
+
+(defun ac-current-physical-column ()
+ "Current physical column. (not logical column)"
+ (- (point) (save-excursion (vertical-motion 0) (point))))
+
+(defun ac-on-pre-command ()
+ (progn ; ignore-errors
+ (if (and (not (ac-trigger-command-p))
+ (or (not (symbolp this-command))
+ (not (string-match "^ac-" (symbol-name this-command)))))
+ (ac-abort))))
+
+(defun ac-on-post-command ()
+ (progn ; ignore-errors
+ (if (and (or ac-auto-start
+ ac-completing)
+ (not isearch-mode)
+ (ac-trigger-command-p))
+ (ac-start))))
+
+(defun auto-complete-mode-maybe ()
+ "What buffer `auto-complete-mode' prefers."
+ (if (and (not (minibufferp (current-buffer)))
+ (memq major-mode ac-modes))
+ (auto-complete-mode 1)))
+
+(require 'easy-mmode)
+
+(define-minor-mode auto-complete-mode
+ "AutoComplete mode"
+ :lighter " AC"
+ :group 'auto-complete
+ (if auto-complete-mode
+ (progn
+ (funcall ac-setup-function)
+ (add-hook 'post-command-hook 'ac-on-post-command nil t)
+ (add-hook 'pre-command-hook 'ac-on-pre-command nil t)
+ (run-hooks 'auto-complete-mode-hook))
+ (remove-hook 'post-command-hook 'ac-on-post-command t)
+ (remove-hook 'pre-command-hook 'ac-on-pre-command t)
+ (ac-abort)))
+
+(define-global-minor-mode global-auto-complete-mode
+ auto-complete-mode auto-complete-mode-maybe
+ :group 'auto-complete)
+
+
+
+;;;; Basic cache facility
+
+(defvar ac-clear-variables-after-save nil)
+
+(defun ac-clear-variable-after-save (variable)
+ (push variable ac-clear-variables-after-save))
+
+(defun ac-clear-variables-after-save ()
+ (dolist (variable ac-clear-variables-after-save)
+ (set variable nil)))
+
+
+
+;;;; Sources implementation
+
+(defvar ac-sources '(ac-source-words-in-buffer)
+ "Sources for completion.
+
+Source takes a form of just function which returns candidates or alist:
+
+init INIT-FUNC
+ INIT-FUNC will be called before creating candidate every time.
+
+candidates CANDIDATE-FUNC
+ CANDIDATE-FUNC will return a list of string as candidates.
+CANDIDATE-FUNC should care about `ac-limit' that is specified at limit for performance.
+
+action ACTION-FUNC
+ ACTION-FUNC will be called when `ac-complete' is called.
+
+limit LIMIT-NUM
+ A limit of candidates.
+
+requires REQUIRES-NUM
+ This source will be included when `ac-prefix' length is larger than REQUIRES-NUM.")
+(make-variable-buffer-local 'ac-sources)
+
+(defvar ac-sources-prefix-function 'ac-sources-prefix-default
+ "Default prefix function for sources.
+You should override this variable instead of ac-prefix-function.")
+
+(defvar ac-current-sources nil
+ "Current working sources.")
+
+(defvar ac-omni-completion-sources nil
+ "An alist of REGEXP and SOURCES.
+If matched regexp, switch to omni-completion mode and
+use SOURCES as `ac-sources'.")
+(make-variable-buffer-local 'ac-omni-completion-sources)
+
+(defvar ac-sources-omni-completion nil
+ "Non-nil means `auto-complete-mode' is now working on omni-completion.")
+
+(defun ac-sources-setup ()
+ "Implementation for `ac-setup-function' by sources."
+ (make-local-variable 'ac-clear-variables-after-save)
+ (add-hook 'after-save-hook 'ac-clear-variables-after-save nil t))
+
+(defun ac-sources-init ()
+ "Implementation for `ac-init-function' by sources."
+ (or ac-current-sources (setq ac-current-sources ac-sources))
+ (dolist (source ac-current-sources)
+ (let ((init-function (ac-get-source-property 'init source)))
+ (if init-function
+ (funcall init-function)))))
+
+(defun ac-sources-cleanup ()
+ "Implementation for `ac-cleanup-function' by sources."
+ (setq ac-current-sources nil)
+ (setq ac-sources-omni-completion nil))
+
+(defun ac-sources-prefix ()
+ "Implemention for `ac-prefix-function' by sources."
+ (let (point)
+ (dolist (pair ac-omni-completion-sources)
+ (when (looking-back (car pair))
+ (setq ac-current-sources (cdr pair))
+ (setq ac-sources-omni-completion t)
+ (setq ac-completing t)
+ (setq point (match-end 0))))
+ (or point
+ (if (and ac-completing ac-sources-omni-completion)
+ ac-point
+ (setq ac-current-sources ac-sources)
+ (setq ac-sources-omni-completion nil)
+ (funcall ac-sources-prefix-function)))))
+
+(defun ac-sources-prefix-default ()
+ "Default implementation for `ac-sources-prefix-function'."
+ (require 'thingatpt)
+ (car-safe (bounds-of-thing-at-point 'symbol)))
+
+(defun ac-sources-candidate ()
+ "Implementation for `ac-cadidates-function' by sources."
+ (let (candidates)
+ (dolist (source ac-current-sources)
+ (let* ((ac-limit (or (ac-get-source-property 'limit source) ac-limit))
+ (requires (ac-get-source-property 'requires source))
+ cand)
+ (when (or ac-sources-omni-completion
+ (>= (length ac-prefix)
+ (if (integerp requires)
+ requires
+ 1)))
+ (setq cand
+ (delq nil
+ (mapcar (lambda (candidate)
+ (ac-propertize-candidate candidate
+ 'action (ac-get-source-property 'action source)
+ 'face (ac-get-source-property 'candidate-face source)
+ 'candidate-face (ac-get-source-property 'candidate-face source)
+ 'selection-face (ac-get-source-property 'selection-face source)))
+ (funcall (ac-get-source-property 'candidates source))))))
+ (if (and (> ac-limit 1)
+ (> (length cand) ac-limit))
+ (setcdr (nthcdr (1- ac-limit) (copy-sequence cand)) nil))
+ (setq candidates (append candidates cand))))
+ (delete-dups candidates)))
+
+(defun ac-get-source-property (property source)
+ (if (symbolp source)
+ (setq source (symbol-value source)))
+ (if (and (functionp source)
+ (eq property 'candidates))
+ source
+ (if (consp source)
+ (assoc-default property source))))
+
+
+
+;;;; Standard sources
+
+(defun ac-candidate-words-in-buffer ()
+ "Default implemention for `ac-candidate-function'."
+ (if (> (length ac-prefix) 0)
+ (let ((i 0)
+ candidate
+ candidates
+ (regexp (concat "\\b" (regexp-quote ac-prefix) "\\(\\s_\\|\\sw\\)*\\b")))
+ (save-excursion
+ ;; search backward
+ (goto-char ac-point)
+ (while (and (< i ac-limit)
+ (re-search-backward regexp nil t))
+ (setq candidate (match-string-no-properties 0))
+ (unless (member candidate candidates)
+ (push candidate candidates)
+ (setq i (1+ i))))
+ ;; search backward
+ (goto-char (+ ac-point (length ac-prefix)))
+ (while (and (< i ac-limit)
+ (re-search-forward regexp nil t))
+ (setq candidate (match-string-no-properties 0))
+ (unless (member candidate candidates)
+ (push candidate candidates)
+ (setq i (1+ i))))
+ (nreverse candidates)))))
+
+(defvar ac-source-words-in-buffer
+ '((candidates . ac-candidate-words-in-buffer))
+ "Source for completing words in current buffer.")
+
+(defvar ac-word-index nil
+ "Word index for individual buffer.")
+
+(ac-clear-variable-after-save 'ac-word-index)
+
+(defvar ac-source-words-in-all-buffer
+ '((init
+ . (lambda ()
+ (dolist (buffer (buffer-list))
+ (with-current-buffer buffer
+ (if (not (local-variable-p 'ac-word-index))
+ (make-local-variable 'ac-word-index))
+ (if (eq buffer ac-buffer)
+ (setq ac-word-index (ac-candidate-words-in-buffer))
+ (if (and (null ac-word-index)
+ (< (buffer-size) 102400))
+ (save-excursion
+ (goto-char (point-min))
+ (while (re-search-forward "\\b\\(\\s_\\|\\sw\\)+\\b" nil t)
+ (let ((candidate (match-string-no-properties 0)))
+ (if (not (member candidate ac-word-index))
+ (push candidate ac-word-index))))
+ (setq ac-word-index (nreverse ac-word-index)))))))))
+ (candidates
+ . (lambda ()
+ (let ((candidates)
+ (buffers (buffer-list)))
+ (while (and (< (length candidates) ac-limit)
+ buffers)
+ (setq candidates (append candidates (all-completions ac-prefix (buffer-local-value 'ac-word-index (car buffers)))))
+ (setq buffers (cdr buffers)))
+ candidates))))
+ "Source for completing words in all buffer.")
+
+(defvar ac-source-symbols
+ '((candidates
+ . (lambda ()
+ (all-completions ac-prefix obarray))))
+ "Source for Emacs lisp symbols.")
+
+(defvar ac-source-abbrev
+ `((candidates
+ . (lambda ()
+ (all-completions ac-prefix local-abbrev-table)))
+ (action
+ . expand-abbrev))
+ "Source for abbrev.")
+
+(defvar ac-source-files-in-current-dir
+ '((candidates
+ . (lambda ()
+ (all-completions ac-prefix (directory-files default-directory)))))
+ "Source for listing files in current directory.")
+
+(defun ac-filename-candidate ()
+ (let ((dir (file-name-directory ac-prefix)))
+ (ignore-errors
+ (delq nil
+ (mapcar (lambda (file)
+ (if (not (member file '("./" "../")))
+ (concat dir file)))
+ (file-name-all-completions
+ (file-name-nondirectory ac-prefix) dir))))))
+
+(defvar ac-source-filename
+ '((candidates . ac-filename-candidate))
+ "Source for completing file name.")
+
+(defvar ac-imenu-index nil
+ "Imenu index.")
+
+(defun ac-imenu-candidate ()
+ (require 'imenu)
+ (let ((i 0)
+ (stack ac-imenu-index)
+ candidates
+ node)
+ (while (and stack
+ (< i ac-limit))
+ (setq node (pop stack))
+ (when (consp node)
+ (let ((car (car node))
+ (cdr (cdr node)))
+ (if (consp cdr)
+ (mapc (lambda (child)
+ (push child stack))
+ cdr)
+ (when (and (stringp car)
+ (string-match (concat "^" (regexp-quote ac-prefix)) car))
+ (push car candidates)
+ (setq i (1+ i)))))))
+ (nreverse candidates)))
+
+(defvar ac-source-imenu
+ '((init
+ . (lambda ()
+ (require 'imenu)
+ (setq ac-imenu-index
+ (ignore-errors (imenu--make-index-alist)))))
+ (candidates . ac-imenu-candidate))
+ "Source for imenu.")
+
+(defmacro ac-define-dictionary-source (name list)
+ "Define dictionary source named `NAME'.
+`LIST' is a list of string.
+This is useful if you just want to define a dictionary/keywords source."
+ `(defvar ,name
+ '((candidates . (lambda () (all-completions ac-prefix ,list))))))
+
+
+
+;;;; Popup menu
+
+(defun ac-menu-line (menu)
+ "Line number of `MENU'."
+ (nth 0 menu))
+
+(defun ac-menu-column (menu)
+ "Column of `MENU'."
+ (nth 1 menu))
+
+(defun ac-menu-width (menu)
+ "Popup menu width of `MENU'."
+ (nth 2 menu))
+
+(defun ac-menu-height (menu)
+ "Popup menu height of `MENU'."
+ (nth 3 menu))
+
+(defun ac-menu-overlays (menu)
+ "Overlays that `MENU' contains."
+ (nth 4 menu))
+
+(defun ac-menu-line-overlay (menu line)
+ "Return a overlay of `MENU' at `LINE'."
+ (aref (ac-menu-overlays menu) line))
+
+(defun ac-menu-hide-line (menu line)
+ "Hide `LINE' in `MENU'."
+ (let ((overlay (ac-menu-line-overlay menu line)))
+ (overlay-put overlay 'invisible nil)
+ (overlay-put overlay 'after-string nil)))
+
+(defun ac-menu-show-line (menu line)
+ "Show `LINE' in `MENU'."
+ (let ((overlay (ac-menu-line-overlay menu line)))
+ (overlay-put overlay 'invisible t)))
+
+(defun ac-menu-set-line-string (menu line string &optional face)
+ "Set contents of `LINE' in `MENU'."
+ (let ((overlay (ac-menu-line-overlay menu line)))
+ (overlay-put overlay 'real-string string)
+ (funcall (overlay-get overlay 'set-string-function) menu overlay string face)))
+
+(defun ac-menu-create-line-string (menu string)
+ "Adjust `STRING' into `MENU'."
+ (let ((length 0)
+ (width 0)
+ (menu-width (ac-menu-width menu))
+ (chars (append string nil)))
+ (while (and
+ chars
+ (<= (setq width (+ width (char-width (car chars)))) menu-width))
+ (setq length (1+ length))
+ (setq chars (cdr chars)))
+ (if (< length (length string))
+ (setq string (substring string 0 length)))
+ (let ((string-width (string-width string)))
+ (if (< string-width menu-width)
+ (setq string (concat string
+ (make-string (- menu-width string-width) ? )))))
+ string))
+
+(defun ac-menu-hide (menu)
+ "Hide `MENU'."
+ (dotimes (i (ac-menu-height menu))
+ (ac-menu-hide-line menu i)))
+
+(defun ac-menu-last-line-of-buffer ()
+ (save-excursion
+ (not (eq (forward-line) 0))))
+
+(defun ac-menu-create (line column width height)
+ "Create popup menu."
+ (save-excursion
+ (let ((overlays (make-vector height nil))
+ (window (selected-window)))
+ (goto-line line)
+ (dotimes (i height)
+ (move-to-column column)
+ (let (overlay begin w current-column (prefix "") (postfix ""))
+ (setq current-column (current-column))
+ (cond
+ ((> current-column column)
+ (backward-char)
+ (setq current-column (current-column))
+ (if (< current-column column)
+ (setq prefix (make-string (- column current-column) ? ))))
+ ((< current-column column)
+ (setq prefix (make-string (- column current-column) ? ))))
+
+ (setq begin (point))
+ (setq w (+ width (length prefix)))
+ (while (and (not (eolp))
+ (> w 0))
+ (setq w (- w (char-width (char-after))))
+ (forward-char))
+ (if (< w 0)
+ (setq postfix (make-string (- w) ? )))
+ (if (ac-menu-last-line-of-buffer)
+ (setq postfix (concat postfix "\n")))
+
+ (setq overlay (make-overlay begin (point)))
+ (overlay-put overlay 'window window)
+ (overlay-put overlay 'prefix prefix)
+ (overlay-put overlay 'postfix postfix)
+ (overlay-put overlay 'width width)
+ (overlay-put overlay 'set-string-function
+ (lambda (menu overlay string &optional face)
+ (overlay-put overlay
+ 'after-string
+ (concat (overlay-get overlay 'prefix)
+ (propertize (ac-menu-create-line-string menu string) 'face face)
+ (overlay-get overlay 'postfix)))))
+ (aset overlays i overlay))
+ (forward-line))
+ (let ((i 100))
+ (mapc (lambda (overlay)
+ (overlay-put overlay 'priority i)
+ (setq i (1+ i)))
+ (nreverse (append overlays nil))))
+ (list line column width height overlays))))
+
+(defun ac-menu-delete (menu)
+ "Delete `MENU'."
+ (mapcar 'delete-overlay (ac-menu-overlays menu)))
+
+(provide 'auto-complete)
+;;; auto-complete.el ends here
diff --git a/emacs.d/lisp/cursor-chg.el b/emacs.d/lisp/cursor-chg.el
new file mode 100644
index 0000000..159d4e1
--- /dev/null
+++ b/emacs.d/lisp/cursor-chg.el
@@ -0,0 +1,348 @@
+;;; cursor-chg.el --- Change cursor dynamically, depending on the context.
+;;
+;; Filename: cursor-chg.el
+;; Description: Change cursor dynamically, depending on the context.
+;; Author: Drew Adams
+;; Maintainer: Drew Adams
+;; Copyright (C) 2006-2009, Drew Adams, all rights reserved.
+;; Created: Tue Aug 29 11:23:06 2006
+;; Version: 20.1
+;; Last-Updated: Sat Aug 1 15:14:46 2009 (-0700)
+;; By: dradams
+;; Update #: 191
+;; URL: http://www.emacswiki.org/cgi-bin/wiki/cursor-chg.el
+;; Keywords: cursor, accessibility
+;; Compatibility: GNU Emacs: 20.x, 21.x, 22.x, 23.x
+;;
+;; Features that might be required by this library:
+;;
+;; None
+;;
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;;
+;;; Commentary:
+;;
+;; This library provides three kinds of changes to the text cursor:
+;;
+;; 1. When a buffer is read-only or is in overwrite mode, the cursor
+;; type changes to `curchg-overwrite/read-only-cursor-type'. This
+;; is controlled by command `change-cursor-mode' and user option
+;; `curchg-change-cursor-on-overwrite/read-only-flag'.
+;;
+;; 2. When an input method is in use, the cursor color changes to
+;; `curchg-input-method-cursor-color'. This is controlled by
+;; command `change-cursor-mode' and user option
+;; `curchg-change-cursor-on-input-method-flag'.
+;;
+;; 3. When Emacs is idle, the cursor type changes to
+;; `curchg-idle-cursor-type'. This is controlled by command
+;; `toggle-cursor-type-when-idle'.
+;;
+;; To turn on all three types of cursor change by default, put the
+;; following in your Emacs init file (~/.emacs):
+;;
+;; (require 'cursor-chg) ; Load this library
+;; (change-cursor-mode 1) ; On for overwrite/read-only/input mode
+;; (toggle-cursor-type-when-idle 1) ; On when idle
+;;
+;; Note: Library `oneonone.el' provides the same functionality as
+;; library `cursor-chg.el', and more. If you use library
+;; `oneonone.el', then do NOT also use library `cursor-chg.el'.
+;;
+;; Note for Emacs 20: There is a bug in Emacs 20 which can lead to a
+;; fatal error (Emacs crash) when using `query-replace' with
+;; idle-cursor change enabled. If you use Emacs 20, then consider
+;; using `toggle-cursor-type-when-idle' to disable idle-cursor change
+;; while you use `query-replace'.
+;;
+;; User options defined here:
+;;
+;; `curchg-change-cursor-on-input-method-flag',
+;; `curchg-change-cursor-on-overwrite/read-only-flag',
+;; `curchg-default-cursor-color', `curchg-default-cursor-type',
+;; `curchg-idle-cursor-type', `curchg-input-method-cursor-color',
+;; `curchg-overwrite/read-only-cursor-type'.
+;;
+;; Commands defined here:
+;;
+;; `change-cursor-mode', `curchg-change-cursor-when-idle-interval',
+;; `curchg-set-cursor-type', `curchg-toggle-cursor-type-when-idle',
+;; `set-cursor-type', `toggle-cursor-type-when-idle'.
+;;
+;; Internal variables defined here:
+;;
+;; `curchg-change-cursor-when-idle-p', `curchg-idle-interval',
+;; `curchg-idle-timer', `curchg-last-cursor-type'.
+;;
+;; Non-interactive functions defined here:
+;;
+;; `curchg-change-cursor-on-input-method',
+;; `curchg-change-cursor-on-overwrite/read-only',
+;; `curchg-change-cursor-to-idle-type',
+;; `curchg-change-cursor-to-idle-type-off'.
+;;
+;; Acknowledgements:
+;;
+;; The cursor-changing on input method and read-only was inspired by
+;; Juri Linkov <juri@jurta.org>. Joe Casadonte <joc@netaxs.com>
+;; wrote a similar hook (`joc-cursor-type-set-hook'), which he got
+;; from Steve Kemp...
+;;
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;;
+;;; Change log:
+;;
+;; 2006/10/28 dadams
+;; curchg-default-cursor-color, curchg-input-method-cursor-color:
+;; Changed :type to 'color for Emacs 21+.
+;; 2006/09/04 dadams
+;; curchg-idle-timer: Cancel beforehand, and cancel after defining.
+;; curchg-toggle-cursor-type-when-idle:
+;; Use curchg-change-cursor-to-idle-type-off on pre-command-hook.
+;; Don't read an event; just turn it on.
+;; Added: curchg-change-cursor-to-idle-type-off.
+;; 2006/09/03 dadams
+;; Created.
+;;
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;;
+;; This program is free software; you can redistribute it and/or
+;; modify it under the terms of the GNU General Public License as
+;; published by the Free Software Foundation; either version 2, or
+;; (at your option) any later version.
+;;
+;; This program is distributed in the hope that it will be useful,
+;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+;; General Public License for more details.
+;;
+;; You should have received a copy of the GNU General Public License
+;; along with this program; see the file COPYING. If not, write to
+;; the Free Software Foundation, Inc., 51 Franklin Street, Fifth
+;; Floor, Boston, MA 02110-1301, USA.
+;;
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;;
+;;; Code:
+
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+
+
+;;------- User Options -------------------------------------
+
+;; Emacs 20 only
+(unless (fboundp 'define-minor-mode)
+ (defcustom change-cursor-mode nil
+ "*Toggle changing cursor type and color.
+Setting this variable directly does not take effect;
+use either \\[customize] or command `change-cursor-mode'."
+ :set (lambda (symbol value) (change-cursor-mode (if value 1 -1)))
+ :initialize 'custom-initialize-default
+ :type 'boolean :group 'cursor :require 'cursor-chg))
+
+(defcustom curchg-change-cursor-on-input-method-flag t
+ "*Non-nil means to use a different cursor when using an input method."
+ :type 'boolean :group 'cursor)
+
+(defcustom curchg-change-cursor-on-overwrite/read-only-flag t
+ "*Non-nil means use a different cursor for overwrite mode or read-only."
+ :type 'boolean :group 'cursor)
+
+(defcustom curchg-default-cursor-color (or (cdr (assq 'cursor-color default-frame-alist))
+ "Red")
+ "*Default text cursor color for non-special frames."
+ :type (if (>= emacs-major-version 21) 'color 'string) :group 'cursor)
+
+(defcustom curchg-default-cursor-type 'bar "*Default text cursor type."
+ :type 'symbol :group 'cursor)
+
+(defcustom curchg-idle-cursor-type 'box
+ "*Text cursor type when Emacs is idle."
+ :type 'symbol :group 'cursor)
+
+(defcustom curchg-input-method-cursor-color "Orange"
+ "*Default cursor color if using an input method.
+This has no effect if `curchg-change-cursor-on-input-method-flag' is nil."
+ :type (if (>= emacs-major-version 21) 'color 'string) :group 'cursor)
+
+(defcustom curchg-overwrite/read-only-cursor-type 'box
+ "*Default text cursor type for overwrite mode or read-only buffer.
+This applies only to non-special frames. This has no effect if
+`curchg-change-cursor-on-overwrite/read-only-flag' is nil."
+ :type 'symbol :group 'cursor)
+
+
+;;------- Internal Variables -------------------------------
+
+(defvar curchg-last-cursor-type curchg-default-cursor-type "Saved last cursor type.")
+
+(defvar curchg-idle-interval 2
+ "Number of seconds to wait before changing to alternate cursor type.
+The alternate cursor type is `curchg-idle-cursor-type'.
+Do NOT change this yourself to change the wait period; instead, use
+`\\[curchg-change-cursor-when-idle-interval]'.")
+
+(defvar curchg-idle-timer
+ (progn ; Cancel to prevent duplication.
+ (when (boundp 'curchg-idle-timer) (cancel-timer curchg-idle-timer))
+ (run-with-idle-timer curchg-idle-interval t 'curchg-change-cursor-to-idle-type))
+ "Timer used to change the cursor to alternate type when Emacs is idle.")
+
+;; Turn it off, by default. You must use `toggle-cursor-type-when-idle' to turn it on.
+(cancel-timer curchg-idle-timer)
+
+(defvar curchg-change-cursor-when-idle-p nil
+ "Non-nil means to use an alternate cursor type whenever Emacs is idle.
+Do NOT change this yourself; instead, use `\\[toggle-cursor-type-when-idle]'.")
+
+
+;;------- Commands -----------------------------------------
+
+(unless (fboundp 'set-cursor-type) (defalias 'set-cursor-type 'curchg-set-cursor-type))
+;; This is essentially from Juri Linkov <juri@jurta.org>.
+(defun curchg-set-cursor-type (cursor-type)
+ "Set the cursor type of the selected frame to CURSOR-TYPE.
+When called interactively, prompt for the type to use.
+To get the frame's current cursor type, use `frame-parameters'."
+ (interactive
+ (list (intern (completing-read "Cursor type: "
+ (mapcar 'list '("box" "hollow" "bar" "hbar" nil))))))
+ (modify-frame-parameters (selected-frame) (list (cons 'cursor-type cursor-type))))
+
+(defalias 'toggle-cursor-type-when-idle 'curchg-toggle-cursor-type-when-idle)
+(defun curchg-toggle-cursor-type-when-idle (&optional arg)
+"Turn on or off automatically changing cursor type when Emacs is idle.
+When on, use `curchg-idle-cursor-type' whenever Emacs is idle.
+With prefix argument, turn on if ARG > 0; else turn off."
+ (interactive "P")
+ (setq curchg-change-cursor-when-idle-p
+ (if arg (> (prefix-numeric-value arg) 0) (not curchg-change-cursor-when-idle-p)))
+ (cond (curchg-change-cursor-when-idle-p
+ (timer-activate-when-idle curchg-idle-timer)
+ (add-hook 'pre-command-hook 'curchg-change-cursor-to-idle-type-off)
+ (message "Turned ON changing cursor when Emacs is idle."))
+ (t
+ (cancel-timer curchg-idle-timer)
+ (remove-hook 'pre-command-hook 'curchg-change-cursor-to-idle-type-off)
+ (message "Turned OFF changing cursor when Emacs is idle."))))
+
+(defun curchg-change-cursor-when-idle-interval (secs)
+ "Set wait until automatically change cursor type when Emacs is idle.
+Whenever Emacs is idle for this many seconds, the cursor type will
+change to `curchg-idle-cursor-type'.
+
+To turn on or off automatically changing the cursor type when idle,
+use `\\[toggle-cursor-type-when-idle]."
+ (interactive
+ "nSeconds to idle, before changing cursor type: ")
+ (timer-set-idle-time curchg-idle-timer
+ (setq curchg-idle-interval secs)
+ t))
+
+(if (fboundp 'define-minor-mode)
+ ;; Emacs 21 and later.
+ (define-minor-mode change-cursor-mode
+ "Toggle changing cursor type and color.
+With numeric ARG, turn cursor changing on if and only if ARG is positive.
+
+When this mode is on, `curchg-change-cursor-on-input-method' and
+`curchg-change-cursor-on-overwrite/read-only-flag' control cursor
+changing."
+ :init-value nil :global t :group 'frames
+ :link `(url-link :tag "Send Bug Report"
+ ,(concat "mailto:" "drew.adams" "@" "oracle" ".com?subject=\
+cursor-chg.el bug: \
+&body=Describe bug here, starting with `emacs -q'. \
+Don't forget to mention your Emacs and library versions."))
+ :link '(url-link :tag "Other Libraries by Drew"
+ "http://www.emacswiki.org/cgi-bin/wiki/DrewsElispLibraries")
+ :link '(url-link :tag "Download" "http://www.emacswiki.org/cgi-bin/wiki/cursor-chg.el")
+ :link '(url-link :tag "Description"
+ "http://www.emacswiki.org/cgi-bin/wiki/ChangingCursorDynamically")
+ :link '(emacs-commentary-link :tag "Commentary" "cursor-chg")
+ (cond (change-cursor-mode
+ (if curchg-change-cursor-on-overwrite/read-only-flag
+ (add-hook 'post-command-hook 'curchg-change-cursor-on-overwrite/read-only)
+ (curchg-set-cursor-type curchg-default-cursor-type)
+ (remove-hook 'post-command-hook 'curchg-change-cursor-on-overwrite/read-only))
+ (if curchg-change-cursor-on-input-method-flag
+ (add-hook 'post-command-hook 'curchg-change-cursor-on-input-method)
+ (setq current-input-method nil)
+ (curchg-change-cursor-on-input-method)
+ (remove-hook 'post-command-hook 'curchg-change-cursor-on-input-method)))
+ (t
+ (curchg-set-cursor-type curchg-default-cursor-type)
+ (setq current-input-method nil)
+ (curchg-change-cursor-on-input-method)
+ (remove-hook 'post-command-hook 'curchg-change-cursor-on-overwrite/read-only)
+ (remove-hook 'post-command-hook 'curchg-change-cursor-on-input-method))))
+
+ ;; Emacs 20
+ (defun change-cursor-mode (&optional arg)
+ "Toggle changing cursor type and color.
+With numeric ARG, turn cursor changing on if and only if ARG is positive.
+
+When this mode is on, `curchg-change-cursor-on-input-method' and
+`curchg-change-cursor-on-overwrite/read-only-flag' control cursor
+changing."
+ (interactive "P")
+ (setq change-cursor-mode
+ (if arg (> (prefix-numeric-value arg) 0) (not change-cursor-mode)))
+ (cond (change-cursor-mode
+ (if curchg-change-cursor-on-overwrite/read-only-flag
+ (add-hook 'post-command-hook 'curchg-change-cursor-on-overwrite/read-only)
+ (curchg-set-cursor-type curchg-default-cursor-type)
+ (remove-hook 'post-command-hook 'curchg-change-cursor-on-overwrite/read-only))
+ (if curchg-change-cursor-on-input-method-flag
+ (add-hook 'post-command-hook 'curchg-change-cursor-on-input-method)
+ (setq current-input-method nil)
+ (curchg-change-cursor-on-input-method)
+ (remove-hook 'post-command-hook 'curchg-change-cursor-on-input-method))
+ (message "Change cursor on overwrite/read-only: %s; on input method: %s"
+ (if curchg-change-cursor-on-overwrite/read-only-flag "ON" "OFF")
+ (if curchg-change-cursor-on-input-method-flag "ON" "OFF")))
+ (t
+ (curchg-set-cursor-type curchg-default-cursor-type)
+ (setq current-input-method nil)
+ (curchg-change-cursor-on-input-method)
+ (remove-hook 'post-command-hook 'curchg-change-cursor-on-overwrite/read-only)
+ (remove-hook 'post-command-hook 'curchg-change-cursor-on-input-method)
+ (message "Turned OFF changing cursor on overwrite/read-only and input method")))))
+
+
+;;------- Non-Interactive Functions ------------------------
+
+;; This is inspired by code from Juri Linkov <juri@jurta.org>.
+(defun curchg-change-cursor-on-input-method ()
+ "Set cursor type depending on whether an input method is used or not."
+ (set-cursor-color (if current-input-method
+ curchg-input-method-cursor-color
+ curchg-default-cursor-color)))
+
+;; This is from Juri Linkov <juri@jurta.org>, with read-only added.
+(defun curchg-change-cursor-on-overwrite/read-only ()
+ "Set cursor type differently for overwrite mode and read-only buffer.
+That is, use one cursor type for overwrite mode and read-only buffers,
+and another cursor type otherwise."
+ (curchg-set-cursor-type (if (or buffer-read-only overwrite-mode)
+ curchg-overwrite/read-only-cursor-type
+ curchg-default-cursor-type)))
+
+(defun curchg-change-cursor-to-idle-type ()
+ "Change the cursor to `curchg-idle-cursor-type' when Emacs is idle."
+ (let ((type (cdr (assoc 'cursor-type (frame-parameters)))))
+ (unless (eq type curchg-idle-cursor-type)
+ (setq curchg-last-cursor-type type)
+ (curchg-set-cursor-type curchg-idle-cursor-type))))
+
+(defun curchg-change-cursor-to-idle-type-off ()
+ "Turn off changing the cursor to `curchg-idle-cursor-type' when idle."
+ (when curchg-last-cursor-type (curchg-set-cursor-type curchg-last-cursor-type)))
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+
+(provide 'cursor-chg)
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+;;; cursor-chg.el ends here
diff --git a/emacs.d/lisp/delphi-mode-ench.el b/emacs.d/lisp/delphi-mode-ench.el
index 04e017a..fcbb3ae 100644
--- a/emacs.d/lisp/delphi-mode-ench.el
+++ b/emacs.d/lisp/delphi-mode-ench.el
@@ -1,4 +1,10 @@
;;; delphi-mode-ench.el
+(require 'compile)
+(pushnew '("^\\([-a-zA-Z0-9\\.\\/_~]+\\)(\\([0-9]+\\),\\([0-9]+\\))\s\\([Ff]atal:\\|[Nn]ote:\\|[Ww]arning:\\|[Ee]rror:\\)\s\\(.*$\\)" 1 2 3)
+ compilation-error-regexp-alist)
+
+(setq auto-mode-alist (cons '("\\.pas" . delphi-mode) auto-mode-alist))
+
(setq delphi-unit-sections
'(implementation program library package))
@@ -55,7 +61,7 @@
(if pos (goto-char pos))
(re-search-forward "\\(begin\\|implementation\\)" nil t)
(let ((match (match-string-no-properties 1)))
- (if (or (equal match "implementation") (equal match "end")) 't 'nil)))))
+ (if (equal match "implementation") 't 'nil)))))
(defun delphi-in-class-definition (&optional pos)
(if pos (goto-char pos))
diff --git a/emacs.d/lisp/etags-table.el b/emacs.d/lisp/etags-table.el
new file mode 100644
index 0000000..5c33c8c
--- /dev/null
+++ b/emacs.d/lisp/etags-table.el
@@ -0,0 +1,157 @@
+;;; etags-table.el --- Set tags table(s) based on current file
+
+;; Copyright (C) 2008 Scott Frazer
+
+;; Author: Scott Frazer <frazer.scott@gmail.com>
+;; Maintainer: Scott Frazer <frazer.scott@gmail.com>
+;; Created: 28 Oct 2008
+;; Version: 1.1
+;; Keywords: etags tags tag
+
+;; This file is free software; you can redistribute it and/or modify
+;; it under the terms of the GNU General Public License as published by
+;; the Free Software Foundation; either version 2, or (at your option)
+;; any later version.
+
+;; This file is distributed in the hope that it will be useful,
+;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+;; GNU General Public License for more details.
+
+;; You should have received a copy of the GNU General Public License
+;; along with GNU Emacs; see the file COPYING. If not, write to
+;; the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+;; Boston, MA 02110-1301, USA.
+
+;;; Commentary:
+
+;; This extension sets the tags table(s) based on the current file.
+;; `etags-table-alist' is a list of lists, where the car of each sublist is
+;; compared to the current filename. If it matches, all the rest of the list
+;; elements are put on `tags-table-list'. If `etags-table-search-up-depth' is
+;; an integer, the file path will be searched upwards for a tags file. If one
+;; is found, it will be added to the tags table list; this is actually done
+;; first so the local TAGS file is at the head of the list.
+;;
+;; When you switch files and do something tag-related, the tags table list is
+;; automatically recomputed.
+
+;;; Change log:
+;;
+;; 27 Mar 2009 -- v1.1
+;; Add ability to use backreferences in etags-table-alist
+;; Change files to true names when adding to table
+;; Fix the way parent directories are found
+;;
+;; 28 Oct 2008 -- v1.0
+;; Initial release
+
+;;; Code:
+
+(require 'custom)
+(require 'etags)
+
+;;;###autoload
+(defgroup etags-table nil
+ "*etags table"
+ :group 'etags)
+
+;;;###autoload
+(defcustom etags-table-alist nil
+ "*Map filename to tag file(s)
+
+Example:
+
+(setq etags-table-alist
+ (list
+ \'(\"/home/me/Projects/foo/.*\\\\.[ch]$\" \"/home/me/Projects/lib1/TAGS\" \"/home/me/Projects/lib2/TAGS\")
+ \'(\"/home/me/Projects/bar/.*\\\\.py$\" \"/home/me/Projects/python/common/TAGS\")
+ \'(\".*\\\\.[ch]$\" \"/usr/local/include/TAGS\")
+ ))
+
+A file named, for example, \"/home/me/Projects/foo/main.c\" would set the
+`tags-table-list' to a list of:
+
+\"/home/me/Projects/lib1/TAGS\"
+\"/home/me/Projects/lib2/TAGS\"
+\"/usr/local/include/TAGS\"
+
+and possibly a local tags file at the head of the list if `etags-table-search-up-depth'
+is non-nil. You can use \\&, \\1, etc. in the tag file names to substitute pieces
+captured with \\(\\) in the key.
+"
+ :group 'etags-table
+ :type 'alist)
+
+;;;###autoload
+(defcustom etags-table-search-up-depth nil
+ "*Max depth to search up for a tags file. nil means don't search."
+ :group 'etags-table
+ :type 'integer)
+
+;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
+
+(defvar etags-table-last-table-list nil
+ "Save the last table list so it can be reused if a new one is not found")
+
+(defun etags-table-build-table-list (filename)
+ "Build tags table list based on a filename"
+ (let (tables)
+
+ ;; Search up
+ (when etags-table-search-up-depth
+ (let ((depth etags-table-search-up-depth)
+ (dir (file-name-directory filename)))
+ (while (and (>= depth 0) dir)
+ (when (file-exists-p (concat dir "TAGS"))
+ (setq tables (list (concat dir "TAGS")))
+ (setq depth 0))
+ (setq dir (file-name-directory (directory-file-name dir)))
+ (setq depth (1- depth)))))
+
+ ;; Go through mapping alist
+ (mapc (lambda (mapping)
+ (let ((key (car mapping))
+ (tag-files (cdr mapping)))
+ (when (string-match key filename)
+ (mapc (lambda (tag-file)
+ (add-to-list 'tables (file-truename (replace-match tag-file t nil filename)) t))
+ tag-files))))
+ etags-table-alist)
+
+ ;; Return result or the original list
+ (setq etags-table-last-table-list
+ (or tables tags-table-list etags-table-last-table-list))))
+
+(defun etags-table-recompute ()
+ (when (and (or etags-table-alist etags-table-search-up-depth) (buffer-file-name))
+ (setq tags-table-list (etags-table-build-table-list (buffer-file-name)))))
+
+(defadvice visit-tags-table-buffer (before etags-table-recompute activate)
+ "Recompute `tags-table-list'"
+ (etags-table-recompute))
+
+(defadvice tags-completion-table (before etags-table-clear-completion-table activate)
+ "Clear the completion table (maybe)"
+ (etags-table-recompute)
+ (unless (equal tags-table-computed-list-for (mapcar 'tags-expand-table-name tags-table-list))
+ (etags-table-clear-completion-table)))
+
+(defun etags-table-clear-completion-table ()
+ "Clear the tags completion table"
+ (interactive)
+ (setq tags-completion-table nil))
+
+(eval-after-load "etags-select"
+ '(progn
+ (defadvice etags-select-get-tag-files (before etags-table-recompute activate)
+ "Recompute `tags-table-list'"
+ (etags-table-recompute))
+ (defadvice etags-select-find-tag (before etags-table-clear-completion-table activate)
+ "Clear the completion table (maybe)"
+ (etags-table-recompute)
+ (unless (equal tags-table-computed-list-for (mapcar 'tags-expand-table-name tags-table-list))
+ (setq tags-completion-table nil)))))
+
+(provide 'etags-table)
+;;; etags-table.el ends here