(makefile-special-targets-list): No need for it to be an alist any more.

(makefile-complete): Use completion-in-region.
This commit is contained in:
Stefan Monnier 2009-12-03 03:02:34 +00:00
parent 69a94a37cd
commit ea52206ba0
2 changed files with 39 additions and 88 deletions

View file

@ -1,5 +1,9 @@
2009-12-03 Stefan Monnier <monnier@iro.umontreal.ca>
* progmodes/make-mode.el (makefile-special-targets-list): No need for
it to be an alist any more.
(makefile-complete): Use completion-in-region.
* progmodes/octave-mod.el (octave-complete-symbol):
Use completion-in-region.

View file

@ -231,15 +231,15 @@ to MODIFY A FILE WITHOUT YOUR CONFIRMATION when \"it seems necessary\"."
;; Special targets for DMake, Sun's make ...
;;
(defcustom makefile-special-targets-list
'(("DEFAULT") ("DONE") ("ERROR") ("EXPORT")
("FAILED") ("GROUPEPILOG") ("GROUPPROLOG") ("IGNORE")
("IMPORT") ("INCLUDE") ("INCLUDEDIRS") ("INIT")
("KEEP_STATE") ("MAKEFILES") ("MAKE_VERSION") ("NO_PARALLEL")
("PARALLEL") ("PHONY") ("PRECIOUS") ("REMOVE")
("SCCS_GET") ("SILENT") ("SOURCE") ("SUFFIXES")
("WAIT") ("c.o") ("C.o") ("m.o")
("el.elc") ("y.c") ("s.o"))
"*List of special targets.
'("DEFAULT" "DONE" "ERROR" "EXPORT"
"FAILED" "GROUPEPILOG" "GROUPPROLOG" "IGNORE"
"IMPORT" "INCLUDE" "INCLUDEDIRS" "INIT"
"KEEP_STATE" "MAKEFILES" "MAKE_VERSION" "NO_PARALLEL"
"PARALLEL" "PHONY" "PRECIOUS" "REMOVE"
"SCCS_GET" "SILENT" "SOURCE" "SUFFIXES"
"WAIT" "c.o" "C.o" "m.o"
"el.elc" "y.c" "s.o")
"List of special targets.
You will be offered to complete on one of those in the minibuffer whenever
you enter a \".\" at the beginning of a line in `makefile-mode'."
:type '(repeat (list string))
@ -1185,87 +1185,34 @@ The context determines which are considered."
(skip-chars-backward "^$(){}:#= \t\n")
(point)))
(try (buffer-substring beg (point)))
(do-macros nil)
(paren nil))
(paren nil)
(do-macros
(save-excursion
(goto-char beg)
(let ((pc (preceding-char)))
(cond
;; Preceding "$" means macros only.
((= pc ?$)
t)
(save-excursion
(goto-char beg)
(let ((pc (preceding-char)))
(cond
;; Beginning of line means anything.
((bolp)
())
;; Preceding "$(" or "${" means macros only.
((and (memq pc '(?\{ ?\())
(progn
(setq paren (if (eq paren ?\{) ?\} ?\)))
(backward-char)
(= (preceding-char) ?$)))
t)))))
;; Preceding "$" means macros only.
((= pc ?$)
(setq do-macros t))
;; Preceding "$(" or "${" means macros only.
((and (or (= pc ?{)
(= pc ?\())
(progn
(setq paren pc)
(backward-char)
(and (not (bolp))
(= (preceding-char) ?$))))
(setq do-macros t)))))
;; Try completion.
(let* ((table (append (if do-macros
'()
makefile-target-table)
makefile-macro-table))
(completion (try-completion try table)))
(cond
;; Exact match, so insert closing paren or colon.
((eq completion t)
(insert (if do-macros
(if (eq paren ?{)
?}
?\))
(if (save-excursion
(goto-char beg)
(bolp))
":"
" "))))
;; No match.
((null completion)
(message "Can't find completion for \"%s\"" try)
(ding))
;; Partial completion.
((not (string= try completion))
;; FIXME it would be nice to supply the closing paren if an
;; exact, unambiguous match were found. That is not possible
;; right now. Ditto closing ":" for targets.
(delete-region beg (point))
;; DO-MACROS means doing macros only. If not that, then check
;; to see if this completion is a macro. Special insertion
;; must be done for macros.
(if (or do-macros
(assoc completion makefile-macro-table))
(let ((makefile-use-curly-braces-for-macros-p
(or (eq paren ?{)
makefile-use-curly-braces-for-macros-p)))
(delete-backward-char 2)
(makefile-do-macro-insertion completion)
(delete-backward-char 1))
;; Just insert targets.
(insert completion)))
;; Can't complete any more, so make completion list. FIXME
;; this doesn't do the right thing when the completion is
;; actually inserted. I don't think there is an easy way to do
;; that.
(t
(message "Making completion list...")
(let ((list (all-completions try table)))
(with-output-to-temp-buffer "*Completions*"
(display-completion-list list try)))
(message "Making completion list...done"))))))
(table (apply-partially 'completion-table-with-terminator
(cond
(do-macros (or paren ""))
((save-excursion (goto-char beg) (bolp)) ":")
(t " "))
(append (if do-macros
'()
makefile-target-table)
makefile-macro-table))))
(completion-in-region beg (point) table)))