;;; hippie-exp.el --- expand text trying various ways to find its expansion
-;; Copyright (C) 1992, 2001, 2002, 2003, 2004, 2005,
-;; 2006, 2007, 2008 Free Software Foundation, Inc.
+;; Copyright (C) 1992, 2001-2014 Free Software Foundation, Inc.
;; Author: Anders Holst <aho@sans.kth.se>
-;; Last change: 3 March 1998
+;; Maintainer: emacs-devel@gnu.org
;; Version: 1.6
;; Keywords: abbrev convenience
;; in all buffers (except the current). (This may be a little
;; slow, don't use it unless you are really fond of `hippie-expand'.)
;; `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.
+;; 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-dabbrev' : works exactly as dabbrev-expand (but of
;; variable with all kinds of try-functions above, it might be an
;; idea to use `make-hippie-expand-function' to construct different
;; `hippie-expand'-like functions, with different try-lists and bound
-;; to different keys. It is also possible to make
+;; to different keys. It is also possible to make
;; `hippie-expand-try-functions-list' a buffer local variable, and
;; let it depend on the mode (by setting it in the mode-hooks).
;;
;; opposite situation to occur, that `hippie-expand' misses some
;; suggestion because it thinks it has already tried it.
;;
-;; Acknowledgement
+;; Acknowledgment
;;
;; I want to thank Mikael Djurfeldt in discussions with whom the idea
;; of this function took form.
(defvar he-search-window ())
+;;; Autoloaded for historical reasons (bug#12982)
;;;###autoload
(defcustom hippie-expand-try-functions-list
'(try-complete-file-name-partially
:type '(repeat function)
:group 'hippie-expand)
-;;;###autoload
(defcustom hippie-expand-verbose t
"Non-nil makes `hippie-expand' output which function it is trying."
:type 'boolean
:group 'hippie-expand)
-;;;###autoload
(defcustom hippie-expand-dabbrev-skip-space nil
"Non-nil means tolerate trailing spaces in the abbreviation to expand."
:group 'hippie-expand
:type 'boolean)
-;;;###autoload
(defcustom hippie-expand-dabbrev-as-symbol t
"Non-nil means expand as symbols, i.e. syntax `_' is considered a letter."
:group 'hippie-expand
:type 'boolean)
-;;;###autoload
(defcustom hippie-expand-no-restriction t
"Non-nil means that narrowed buffers are widened during search."
:group 'hippie-expand
:type 'boolean)
-;;;###autoload
(defcustom hippie-expand-max-buffers ()
"The maximum number of buffers (apart from the current) searched.
If nil, all buffers are searched."
integer)
:group 'hippie-expand)
-;;;###autoload
(defcustom hippie-expand-ignore-buffers '("^ \\*.*\\*$" dired-mode)
"A list specifying which buffers not to search (if not current).
Can contain both regexps matching buffer names (as strings) and major modes
:type '(repeat (choice regexp (symbol :tag "Major Mode")))
:group 'hippie-expand)
-;;;###autoload
(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
(message "No further expansions found"))
(ding))
(if (and hippie-expand-verbose
- (not (window-minibuffer-p (selected-window))))
+ (not (window-minibuffer-p)))
(message "Using %s"
(nth he-num hippie-expand-try-functions-list)))))
(if (and (>= he-num 0)
(setq he-num -1)
(he-reset-string)
(if (and hippie-expand-verbose
- (not (window-minibuffer-p (selected-window))))
+ (not (window-minibuffer-p)))
(message "Undoing expansions"))))))
;; Initializes the region to expand (to between BEG and END).
lst)))
;; Check if current buffer matches any atom or regexp in LST.
-;; Atoms are interpreted as major modes, strings as regexps mathing the name.
+;; Atoms are interpreted as major modes, strings as regexps matching the name.
(defun he-buffer-member (lst)
(or (memq major-mode lst)
(progn
(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)
- ((memq system-type '(ms-dos w32))
+ ((eq system-type 'ms-dos)
(if (and (string-match "\\\\" dir-part)
(not (string-match "/" dir-part))
(= (aref name-part (1- (length name-part))) ?/))
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."
+ (he--all-buffers
+ old
+ (lambda () (he-line-beg (and (get-buffer-process (current-buffer))
+ comint-use-prompt-regexp
+ comint-prompt-regexp)))
+ (lambda (string)
+ (he-line-search string
+ (and (get-buffer-process (current-buffer))
+ comint-use-prompt-regexp
+ comint-prompt-regexp)
+ nil))))
+
+(defun he--all-buffers (old beg-function search-function)
(let ((expansion ())
- (strip-prompt (and (get-buffer-process (current-buffer))
- comint-use-prompt-regexp
- comint-prompt-regexp))
- (buf (current-buffer))
- (orig-case-fold-search case-fold-search))
+ (buf (current-buffer))
+ (only-buffers hippie-expand-only-buffers)
+ (ignore-buffers hippie-expand-ignore-buffers)
+ (orig-case-fold-search case-fold-search))
(if (not old)
- (progn
- (he-init-string (he-line-beg strip-prompt) (point))
+ (progn
+ (he-init-string (funcall beg-function) (point))
(setq he-search-bufs (buffer-list))
(setq he-searched-n-bufs 0)
(set-marker he-search-loc 1 (car he-search-bufs))))
(while (and he-search-bufs
(not expansion)
(or (not hippie-expand-max-buffers)
- (< he-searched-n-bufs hippie-expand-max-buffers)))
- (set-buffer (car he-search-bufs))
- (if (and (not (eq (current-buffer) buf))
- (if hippie-expand-only-buffers
- (he-buffer-member hippie-expand-only-buffers)
- (not (he-buffer-member hippie-expand-ignore-buffers))))
- (save-excursion
- (save-restriction
- (if hippie-expand-no-restriction
+ (< he-searched-n-bufs hippie-expand-max-buffers)))
+ (set-buffer (car he-search-bufs))
+ (if (and (not (eq (current-buffer) buf))
+ (if only-buffers
+ (he-buffer-member only-buffers)
+ (not (he-buffer-member ignore-buffers))))
+ (save-excursion
+ (save-restriction
+ (if hippie-expand-no-restriction
(widen))
(goto-char he-search-loc)
- (setq strip-prompt (and (get-buffer-process (current-buffer))
- comint-use-prompt-regexp
- comint-prompt-regexp))
(setq expansion
(let ((case-fold-search orig-case-fold-search))
- (he-line-search he-search-string
- strip-prompt nil)))
+ (funcall search-function he-search-string)))
(set-marker he-search-loc (point))
(if (not expansion)
(progn
(progn
(if old (he-reset-string))
())
- (progn
- (he-substitute-string expansion t)
- t))))
+ (progn
+ (he-substitute-string expansion t)
+ t))))
(defun he-line-search (str strip-prompt reverse)
(let ((result ()))
(defun he-line-beg (strip-prompt)
(save-excursion
(if (re-search-backward (he-line-search-regexp "" strip-prompt)
- (save-excursion (beginning-of-line)
- (point)) t)
+ (line-beginning-position) t)
(match-beginning 2)
(point))))
(defun he-line-search-regexp (pat strip-prompt)
(if strip-prompt
- (concat "\\(" comint-prompt-regexp "\\|^\\s-*\\)\\("
+ (concat "\\(" comint-prompt-regexp "\\|^\\s-*\\)\\(?2:"
(regexp-quote pat)
"[^\n]*[^ \t\n]\\)")
(concat "^\\(\\s-*\\)\\("
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."
- (let ((expansion ())
- (buf (current-buffer))
- (orig-case-fold-search case-fold-search))
- (if (not old)
- (progn
- (he-init-string (he-list-beg) (point))
- (setq he-search-bufs (buffer-list))
- (setq he-searched-n-bufs 0)
- (set-marker he-search-loc 1 (car he-search-bufs))))
+ (he--all-buffers old #'he-list-beg #'he-list-search))
- (if (not (equal he-search-string ""))
- (while (and he-search-bufs
- (not expansion)
- (or (not hippie-expand-max-buffers)
- (< he-searched-n-bufs hippie-expand-max-buffers)))
- (set-buffer (car he-search-bufs))
- (if (and (not (eq (current-buffer) buf))
- (if hippie-expand-only-buffers
- (he-buffer-member hippie-expand-only-buffers)
- (not (he-buffer-member hippie-expand-ignore-buffers))))
- (save-excursion
- (save-restriction
- (if hippie-expand-no-restriction
- (widen))
- (goto-char he-search-loc)
- (setq expansion
- (let ((case-fold-search orig-case-fold-search))
- (he-list-search he-search-string nil)))
- (set-marker he-search-loc (point))
- (if (not expansion)
- (progn
- (setq he-search-bufs (cdr he-search-bufs))
- (setq he-searched-n-bufs (1+ he-searched-n-bufs))
- (set-marker he-search-loc 1 (car he-search-bufs))))))
- (setq he-search-bufs (cdr he-search-bufs))
- (set-marker he-search-loc 1 (car he-search-bufs)))))
-
- (set-buffer buf)
- (if (not expansion)
- (progn
- (if old (he-reset-string))
- ())
- (progn
- (he-substitute-string expansion t)
- t))))
-
-(defun he-list-search (str reverse)
+(defun he-list-search (str &optional reverse)
(let ((result ())
beg pos err)
(while (and (not result)
t))))
(defun try-expand-dabbrev-all-buffers (old)
- "Tries to expand word \"dynamically\", searching all other buffers.
+ "Try to expand word \"dynamically\", searching all other buffers.
The argument OLD has to be nil the first call of this function, and t
for subsequent calls (for further possible expansions of the same
string). It returns t if a new expansion is found, nil otherwise."
- (let ((expansion ())
- (buf (current-buffer))
- (orig-case-fold-search case-fold-search))
- (if (not old)
- (progn
- (he-init-string (he-dabbrev-beg) (point))
- (setq he-search-bufs (buffer-list))
- (setq he-searched-n-bufs 0)
- (set-marker he-search-loc 1 (car he-search-bufs))))
-
- (if (not (equal he-search-string ""))
- (while (and he-search-bufs
- (not expansion)
- (or (not hippie-expand-max-buffers)
- (< he-searched-n-bufs hippie-expand-max-buffers)))
- (set-buffer (car he-search-bufs))
- (if (and (not (eq (current-buffer) buf))
- (if hippie-expand-only-buffers
- (he-buffer-member hippie-expand-only-buffers)
- (not (he-buffer-member hippie-expand-ignore-buffers))))
- (save-excursion
- (save-restriction
- (if hippie-expand-no-restriction
- (widen))
- (goto-char he-search-loc)
- (setq expansion
- (let ((case-fold-search orig-case-fold-search))
- (he-dabbrev-search he-search-string nil)))
- (set-marker he-search-loc (point))
- (if (not expansion)
- (progn
- (setq he-search-bufs (cdr he-search-bufs))
- (setq he-searched-n-bufs (1+ he-searched-n-bufs))
- (set-marker he-search-loc 1 (car he-search-bufs))))))
- (setq he-search-bufs (cdr he-search-bufs))
- (set-marker he-search-loc 1 (car he-search-bufs)))))
-
- (set-buffer buf)
- (if (not expansion)
- (progn
- (if old (he-reset-string))
- ())
- (progn
- (he-substitute-string expansion t)
- t))))
+ (he--all-buffers old #'he-dabbrev-beg #'he-dabbrev-search))
;; Thanks go to Jeff Dairiki <dairiki@faraday.apl.washington.edu> who
;; suggested this one.
for subsequent calls (for further possible expansions of the same
string). It returns t if a new expansion is found, nil otherwise."
(let ((expansion ())
- (buf (current-buffer))
- (flag (if (frame-visible-p (window-frame (selected-window)))
+ (flag (if (frame-visible-p (window-frame))
'visible t)))
- (if (not old)
- (progn
- (he-init-string (he-dabbrev-beg) (point))
- (setq he-search-window (selected-window))
- (set-marker he-search-loc
- (window-start he-search-window)
- (window-buffer he-search-window))))
+ (unless old
+ (he-init-string (he-dabbrev-beg) (point))
+ (setq he-search-window (selected-window))
+ (set-marker he-search-loc
+ (window-start he-search-window)
+ (window-buffer he-search-window)))
(while (and (not (equal he-search-string ""))
- (marker-position he-search-loc)
- (not expansion))
- (save-excursion
- (set-buffer (marker-buffer he-search-loc))
- (goto-char he-search-loc)
- (setq expansion (he-dabbrev-search he-search-string ()
- (window-end he-search-window)))
- (if (and expansion
- (eq (marker-buffer he-string-beg) (current-buffer))
- (eq (marker-position he-string-beg) (match-beginning 0)))
- (setq expansion (he-dabbrev-search he-search-string ()
- (window-end he-search-window))))
- (set-marker he-search-loc (point) (current-buffer)))
- (if (not expansion)
- (progn
- (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))))))
+ (marker-position he-search-loc)
+ (not expansion))
+ (with-current-buffer (marker-buffer he-search-loc)
+ (save-excursion
+ (goto-char he-search-loc)
+ (setq expansion (he-dabbrev-search he-search-string ()
+ (window-end he-search-window)))
+ (if (and expansion
+ (eq (marker-buffer he-string-beg) (current-buffer))
+ (eq (marker-position he-string-beg) (match-beginning 0)))
+ (setq expansion
+ (he-dabbrev-search he-search-string ()
+ (window-end he-search-window))))
+ (set-marker he-search-loc (point) (current-buffer))))
+ (unless expansion
+ (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)))))
- (set-buffer buf)
(if (not expansion)
(progn
(if old (he-reset-string))
(provide 'hippie-exp)
-;; arch-tag: 5e6e00bf-b061-4a7a-9b46-de0ae105ab99
;;; hippie-exp.el ends here