;; `hippie-expand' is a single function for a lot of different kinds
;; of completions and expansions. Called repeatedly it tries all
;; `hippie-expand' is a single function for a lot of different kinds
;; of completions and expansions. Called repeatedly it tries all
;; Which kinds of completions to try, and in which order, is
;; determined by the contents of `hippie-expand-try-functions-list'.
;; Much customization of `hippie-expand' can be made by changing the
;; Which kinds of completions to try, and in which order, is
;; determined by the contents of `hippie-expand-try-functions-list'.
;; Much customization of `hippie-expand' can be made by changing the
;; characters of syntax '_' is considered part of the words to expand
;; dynamically.
;; See also the macro `make-hippie-expand-function' below.
;; characters of syntax '_' is considered part of the words to expand
;; dynamically.
;; See also the macro `make-hippie-expand-function' below.
;; A short description of the current try-functions in this file:
;; `try-complete-file-name' : very convenient to have in any buffer,
;; and not just in the minibuffer or (some) shell-mode. It goes
;; A short description of the current try-functions in this file:
;; `try-complete-file-name' : very convenient to have in any buffer,
;; and not just in the minibuffer or (some) shell-mode. It goes
;; a file name completed only as many characters as is unique.
;; `try-expand-all-abbrevs' : can be removed if you don't use abbrevs.
;; Otherwise it looks through all abbrev-tables, starting with
;; a file name completed only as many characters as is unique.
;; `try-expand-all-abbrevs' : can be removed if you don't use abbrevs.
;; Otherwise it looks through all abbrev-tables, starting with
-;; the local followed by the global.
-;; `try-expand-line' : Searches the buffer for an entire line that
-;; begins exactly as the current line. Convenient sometimes, for
+;; the local followed by the global.
+;; `try-expand-line' : Searches the buffer for an entire line that
+;; begins exactly as the current line. Convenient sometimes, for
;; example as a substitute for (or complement to) the history
;; list in shell-like buffers. At other times, only confusing.
;; `try-expand-line-all-buffers' : Like `try-expand-line' but searches
;; example as a substitute for (or complement to) the history
;; list in shell-like buffers. At other times, only confusing.
;; `try-expand-line-all-buffers' : Like `try-expand-line' but searches
;; `try-expand-list' : Tries to expand the text back to the nearest
;; open delimiter, to a whole list from the buffer. Convenient for
;; example when writing lisp or TeX.
;; `try-expand-list' : Tries to expand the text back to the nearest
;; open delimiter, to a whole list from the buffer. Convenient for
;; example when writing lisp or TeX.
-;; `try-expand-list-all-buffers' : Like `try-expand-list' but searches
-;; in all buffers (except the current).
+;; `try-expand-list-all-buffers' : Like `try-expand-list' but searches
+;; in all buffers (except the current).
;; `try-expand-dabbrev' : works exactly as dabbrev-expand (but of
;; course in a way compatible with the other try-functions).
;; `try-expand-dabbrev-all-buffers' : perhaps the most useful of them,
;; like `dabbrev-expand' but searches all Emacs buffers (except the
;; current) for matching words. (No, I don't find this one
;; `try-expand-dabbrev' : works exactly as dabbrev-expand (but of
;; course in a way compatible with the other try-functions).
;; `try-expand-dabbrev-all-buffers' : perhaps the most useful of them,
;; like `dabbrev-expand' but searches all Emacs buffers (except the
;; current) for matching words. (No, I don't find this one
;; `try-expand-dabbrev-visible': Searches the currently visible parts of
;; all windows. Can be put before `try-expand-dabbrev-all-buffers' to
;; first try the expansions you can see.
;; `try-expand-dabbrev-visible': Searches the currently visible parts of
;; all windows. Can be put before `try-expand-dabbrev-all-buffers' to
;; first try the expansions you can see.
;; already has a key of its own, you might want to remove this.
;; `try-complete-lisp-symbol-partially' : To insert in the list just
;; before `try-complete-lisp-symbol' for those who first want to get
;; already has a key of its own, you might want to remove this.
;; `try-complete-lisp-symbol-partially' : To insert in the list just
;; before `try-complete-lisp-symbol' for those who first want to get
;;
;; Not all of the above functions are by default in
;; `hippie-expand-try-functions-list'. This variable is better set
;;
;; Not all of the above functions are by default in
;; `hippie-expand-try-functions-list'. This variable is better set
;; `he-reset-string' : Resets the initialized region to its original
;; contents.
;; There is also a variable: `he-tried-table' which is meant to contain
;; `he-reset-string' : Resets the initialized region to its original
;; contents.
;; There is also a variable: `he-tried-table' which is meant to contain
;; variable to see whether an expansion has already been tried
;; (hint: `he-string-member').
;;
;; Known bugs
;;
;; It may happen that some completion suggestion occurs twice, in
;; variable to see whether an expansion has already been tried
;; (hint: `he-string-member').
;;
;; Known bugs
;;
;; It may happen that some completion suggestion occurs twice, in
;; because different try-functions may try to complete different
;; lengths of text, and thus put different amounts of the
;; text in `he-tried-table'. Anyway this seems to occur seldom enough
;; because different try-functions may try to complete different
;; lengths of text, and thus put different amounts of the
;; text in `he-tried-table'. Anyway this seems to occur seldom enough
-(defvar hippie-expand-try-functions-list '(try-complete-file-name-partially
- try-complete-file-name
- try-expand-all-abbrevs
- try-expand-list
- try-expand-line
- try-expand-dabbrev
- try-expand-dabbrev-all-buffers
- try-expand-dabbrev-from-kill
- try-complete-lisp-symbol-partially
- try-complete-lisp-symbol)
+(defcustom hippie-expand-try-functions-list
+ '(try-complete-file-name-partially
+ try-complete-file-name
+ try-expand-all-abbrevs
+ try-expand-list
+ try-expand-line
+ try-expand-dabbrev
+ try-expand-dabbrev-all-buffers
+ try-expand-dabbrev-from-kill
+ try-complete-lisp-symbol-partially
+ try-complete-lisp-symbol)
"The list of expansion functions tried in order by `hippie-expand'.
To change the behavior of `hippie-expand', remove, change the order of,
"The list of expansion functions tried in order by `hippie-expand'.
To change the behavior of `hippie-expand', remove, change the order of,
(defcustom hippie-expand-only-buffers ()
"*A list specifying the only buffers to search (in addition to current).
Can contain both regexps matching buffer names (as strings) and major modes
(defcustom hippie-expand-only-buffers ()
"*A list specifying the only buffers to search (in addition to current).
Can contain both regexps matching buffer names (as strings) and major modes
The expansion functions in `hippie-expand-try-functions-list' are
tried in order, until a possible expansion is found. Repeated
application of `hippie-expand' inserts successively possible
The expansion functions in `hippie-expand-try-functions-list' are
tried in order, until a possible expansion is found. Repeated
application of `hippie-expand' inserts successively possible
(and (integerp arg) (> arg 0)))
(let ((first (or (= he-num -1)
(not (equal this-command last-command)))))
(and (integerp arg) (> arg 0)))
(let ((first (or (= he-num -1)
(not (equal this-command last-command)))))
;; An optional argument TRANS-CASE means that it is ok to transfer case
;; from the abbreviation to the expansion if that is possible, and is
;; enabled in the buffer.
;; An optional argument TRANS-CASE means that it is ok to transfer case
;; from the abbreviation to the expansion if that is possible, and is
;; enabled in the buffer.
;;;###autoload
(defmacro make-hippie-expand-function (try-list &optional verbose)
"Construct a function similar to `hippie-expand'.
Make it use the expansion functions in TRY-LIST. An optional second
argument VERBOSE non-nil makes the function verbose."
`(function (lambda (arg)
;;;###autoload
(defmacro make-hippie-expand-function (try-list &optional verbose)
"Construct a function similar to `hippie-expand'.
Make it use the expansion functions in TRY-LIST. An optional second
argument VERBOSE non-nil makes the function verbose."
`(function (lambda (arg)
"Try to expand text before point, using the following functions: \n"
(mapconcat 'prin1-to-string (eval try-list) ", "))
(interactive "P")
"Try to expand text before point, using the following functions: \n"
(mapconcat 'prin1-to-string (eval try-list) ", "))
(interactive "P")
for subsequent calls (for further possible completions of the same
string). It returns t if a new completion is found, nil otherwise."
(if (not old)
for subsequent calls (for further possible completions of the same
string). It returns t if a new completion is found, nil otherwise."
(if (not old)
(he-init-string (he-file-name-beg) (point))
(let ((name-part (he-file-name-nondirectory he-search-string))
(dir-part (expand-file-name (or (he-file-name-directory
(he-init-string (he-file-name-beg) (point))
(let ((name-part (he-file-name-nondirectory he-search-string))
(dir-part (expand-file-name (or (he-file-name-directory
(setq he-tried-table (cons name-part he-tried-table)))
(if (and (not (equal he-search-string ""))
(he-file-directory-p dir-part))
(setq he-tried-table (cons name-part he-tried-table)))
(if (and (not (equal he-search-string ""))
(he-file-directory-p dir-part))
(defun try-complete-file-name-partially (old)
"Try to complete text as a file name, as many characters as unique.
The argument OLD has to be nil the first call of this function. It
(defun try-complete-file-name-partially (old)
"Try to complete text as a file name, as many characters as unique.
The argument OLD has to be nil the first call of this function. It
-returns t if a unique, possibly partial, completion is found, nil
+returns t if a unique, possibly partial, completion is found, nil
(he-init-string (he-file-name-beg) (point))
(let ((name-part (he-file-name-nondirectory he-search-string))
(dir-part (expand-file-name (or (he-file-name-directory
(he-init-string (he-file-name-beg) (point))
(let ((name-part (he-file-name-nondirectory he-search-string))
(dir-part (expand-file-name (or (he-file-name-directory
(defvar he-file-name-chars
(cond ((memq system-type '(vax-vms axp-vms))
"-a-zA-Z0-9_/.,~^#$+=:\\[\\]")
(defvar he-file-name-chars
(cond ((memq system-type '(vax-vms axp-vms))
"-a-zA-Z0-9_/.,~^#$+=:\\[\\]")
"-a-zA-Z0-9_/.,~^#$+=:\\\\")
(t ;; More strange file formats ?
"-a-zA-Z0-9_/.,~^#$+="))
"-a-zA-Z0-9_/.,~^#$+=:\\\\")
(t ;; More strange file formats ?
"-a-zA-Z0-9_/.,~^#$+="))
;; helped to make it work on PC.
(defun he-file-name-nondirectory (file)
"Fix to make `file-name-nondirectory' work for hippie-expand under VMS."
;; helped to make it work on PC.
(defun he-file-name-nondirectory (file)
"Fix to make `file-name-nondirectory' work for hippie-expand under VMS."
(or (file-directory-p file)
(file-directory-p (concat file "[000000]")))
(file-directory-p file)))
(or (file-directory-p file)
(file-directory-p (concat file "[000000]")))
(file-directory-p file)))
(defun he-concat-directory-file-name (dir-part name-part)
"Try to slam together two parts of a file specification, system dependently."
(cond ((null dir-part) name-part)
(defun he-concat-directory-file-name (dir-part name-part)
"Try to slam together two parts of a file specification, system dependently."
(cond ((null dir-part) name-part)
(= (aref name-part (1- (length name-part))) ?/))
(aset name-part (1- (length name-part)) ?\\))
(concat dir-part name-part))
(= (aref name-part (1- (length name-part))) ?/))
(aset name-part (1- (length name-part)) ?\\))
(concat dir-part name-part))
(defun try-complete-lisp-symbol (old)
"Try to complete word as an Emacs Lisp symbol.
The argument OLD has to be nil the first call of this function, and t
for subsequent calls (for further possible completions of the same
string). It returns t if a new completion is found, nil otherwise."
(if (not old)
(defun try-complete-lisp-symbol (old)
"Try to complete word as an Emacs Lisp symbol.
The argument OLD has to be nil the first call of this function, and t
for subsequent calls (for further possible completions of the same
string). It returns t if a new completion is found, nil otherwise."
(if (not old)
(he-init-string (he-lisp-symbol-beg) (point))
(if (not (he-string-member he-search-string he-tried-table))
(setq he-tried-table (cons he-search-string he-tried-table)))
(he-init-string (he-lisp-symbol-beg) (point))
(if (not (he-string-member he-search-string he-tried-table))
(setq he-tried-table (cons he-search-string he-tried-table)))
(defun try-complete-lisp-symbol-partially (old)
"Try to complete as an Emacs Lisp symbol, as many characters as unique.
The argument OLD has to be nil the first call of this function. It
(defun try-complete-lisp-symbol-partially (old)
"Try to complete as an Emacs Lisp symbol, as many characters as unique.
The argument OLD has to be nil the first call of this function. It
-returns t if a unique, possibly partial, completion is found, nil
+returns t if a unique, possibly partial, completion is found, nil
string). It returns t if a new completion is found, nil otherwise."
(let ((expansion ())
(strip-prompt (and (get-buffer-process (current-buffer))
string). It returns t if a new completion is found, nil otherwise."
(let ((expansion ())
(strip-prompt (and (get-buffer-process (current-buffer))
string). It returns t if a new completion is found, nil otherwise."
(let ((expansion ())
(strip-prompt (and (get-buffer-process (current-buffer))
string). It returns t if a new completion is found, nil otherwise."
(let ((expansion ())
(strip-prompt (and (get-buffer-process (current-buffer))
(goto-char he-search-loc)
(setq expansion (he-list-search he-search-string t))
(set-marker he-search-loc (point))
(goto-char he-search-loc)
(setq expansion (he-list-search he-search-string t))
(set-marker he-search-loc (point))
(goto-char he-search-loc)
(setq expansion (he-list-search he-search-string nil))
(set-marker he-search-loc (point)))))))
(goto-char he-search-loc)
(setq expansion (he-list-search he-search-string nil))
(set-marker he-search-loc (point)))))))
(let ((case-fold-search orig-case-fold-search))
(he-list-search he-search-string nil)))
(set-marker he-search-loc (point))
(let ((case-fold-search orig-case-fold-search))
(he-list-search he-search-string nil)))
(set-marker he-search-loc (point))
(and (not (equal he-search-string ""))
(mapcar (function (lambda (sym)
(if (and (boundp sym) (vectorp (eval sym)))
(abbrev-expansion (downcase he-search-string)
(eval sym)))))
(and (not (equal he-search-string ""))
(mapcar (function (lambda (sym)
(if (and (boundp sym) (vectorp (eval sym)))
(abbrev-expansion (downcase he-search-string)
(eval sym)))))
(goto-char he-search-loc)
(setq expansion (he-dabbrev-search he-search-string t))
(set-marker he-search-loc (point))
(goto-char he-search-loc)
(setq expansion (he-dabbrev-search he-search-string t))
(set-marker he-search-loc (point))
(goto-char he-search-loc)
(setq expansion (he-dabbrev-search he-search-string nil))
(set-marker he-search-loc (point)))))))
(goto-char he-search-loc)
(setq expansion (he-dabbrev-search he-search-string nil))
(set-marker he-search-loc (point)))))))
(setq he-search-window (next-window he-search-window nil flag))
(if (eq he-search-window (selected-window))
(set-marker he-search-loc nil)
(set-marker he-search-loc (window-start he-search-window)
(window-buffer he-search-window))))))
(setq he-search-window (next-window he-search-window nil flag))
(if (eq he-search-window (selected-window))
(set-marker he-search-loc nil)
(set-marker he-search-loc (window-start he-search-window)
(window-buffer he-search-window))))))
'(?_ ?w)))
(he-string-member result he-tried-table t))
(setq result nil))) ; ignore if bad prefix or already in table
'(?_ ?w)))
(he-string-member result he-tried-table t))
(setq result nil))) ; ignore if bad prefix or already in table
(he-init-string (he-kill-beg) (point))
(if (not (he-string-member he-search-string he-tried-table))
(setq he-tried-table (cons he-search-string he-tried-table)))
(he-init-string (he-kill-beg) (point))
(if (not (he-string-member he-search-string he-tried-table))
(setq he-tried-table (cons he-search-string he-tried-table)))