branch: elpa/bash-completion
commit c6df9be78d7d4a53b62291f718edad5bd1ee2f2f
Author: Stephane Zermatten <[email protected]>
Commit: Stephane Zermatten <[email protected]>
Store the alist as process property.
This change prepares the way to store additional per-process
information, such as the version of the bash command and the value of
COMP_WORDBREAKS. Process property provide a convenient way of doing
that.
---
bash-completion.el | 37 ++++++++++++++++++-------------------
test/bash-completion-test.el | 23 +++++++++++++++++++----
2 files changed, 37 insertions(+), 23 deletions(-)
diff --git a/bash-completion.el b/bash-completion.el
index f0d8fbe54f..d48c808444 100644
--- a/bash-completion.el
+++ b/bash-completion.el
@@ -757,8 +757,7 @@ up the completion environment (COMP_LINE, COMP_POINT,
COMP_WORDS,
COMP_CWORD) and calls compgen.
The result is a list of candidates, which might be empty."
- (let* ((entry (bash-completion-require-process))
- (process (car entry))
+ (let* ((process (bash-completion-require-process))
(completion-status)
(options))
(setq completion-status (bash-completion-send
(bash-completion-generate-line comp) process))
@@ -768,7 +767,7 @@ The result is a list of candidates, which might be empty."
;; just setup completion for the current command and is asking
;; us to retry once with the new configuration.
(bash-completion-send "complete -p" process)
- (setcdr entry (bash-completion-build-alist (process-buffer process)))
+ (process-put process 'complete-p (bash-completion-build-alist
(process-buffer process)))
(bash-completion--customize comp 'nodefault)
(setq completion-status (bash-completion-send
(bash-completion-generate-line comp) process)))
(setq options (bash-completion--options comp))
@@ -1074,12 +1073,11 @@ is set to t."
;; spaces. Noticed in bash_completion v1.872.
(bash-completion-send "function quote_readline { echo \"$1\"; }"
process)
(bash-completion-send "complete -p" process)
- (let ((entry (cons process (bash-completion-build-alist
- (process-buffer process)))))
- (push (cons remote entry)
- bash-completion-processes)
- (setq cleanup nil)
- entry))
+ (process-put process 'complete-p
+ (bash-completion-build-alist (process-buffer
process)))
+ (push (cons remote process) bash-completion-processes)
+ (setq cleanup nil)
+ process)
;; finally
(progn
(setenv "EMACS_BASH_COMPLETE" nil)
@@ -1132,12 +1130,13 @@ The returned alist is a sligthly parsed version of the
output of
alist))
(defun bash-completion--customize (comp &optional nodefault)
- (unless (eq 'command (bash-completion--type comp))
- (let ((bash-completion-alist (cdr (bash-completion-require-process))))
- (let ((command-name (file-name-nondirectory (car (bash-completion--words
comp)))))
- (setf (bash-completion--compgen-args comp)
- (or (cdr (assoc command-name bash-completion-alist))
- (and (not nodefault) (cdr (assoc nil
bash-completion-alist)))))))))
+ (let ((compgen-args-alist
+ (process-get (bash-completion-require-process) 'complete-p))
+ (command-name (file-name-nondirectory
+ (car (bash-completion--words comp)))))
+ (setf (bash-completion--compgen-args comp)
+ (or (cdr (assoc command-name compgen-args-alist))
+ (and (not nodefault) (cdr (assoc nil compgen-args-alist)))))))
(defun bash-completion-generate-line (comp)
"Generate a command-line that calls compgen for COMP.
@@ -1209,7 +1208,7 @@ and would like bash completion in Emacs to take these
changes into account."
(interactive)
(let* ((remote (and default-directory (file-remote-p default-directory)))
(entry (assoc remote bash-completion-processes))
- (proc (cadr entry)))
+ (proc (cdr entry)))
(when proc
(bash-completion-kill proc)
(setq bash-completion-processes (delq entry
bash-completion-processes)))))
@@ -1232,13 +1231,13 @@ and would like bash completion in Emacs to take these
changes into account."
(defun bash-completion-buffer ()
"Return the buffer of the BASH process, create the BASH process if
necessary."
- (process-buffer (car (bash-completion-require-process))))
+ (process-buffer (bash-completion-require-process)))
(defun bash-completion-is-running ()
"Check whether the bash completion process is running."
(let* ((entry (assoc (file-remote-p default-directory)
bash-completion-processes))
- (proc (cadr entry))
+ (proc (cdr entry))
(running (and proc (eq 'run (process-status proc)))))
(unless (and entry running)
(setq bash-completion-processes (delq entry bash-completion-processes)))
@@ -1260,7 +1259,7 @@ of the command in the bash completion process buffer.
Return the status code of the command, as a number."
;; (message commandline)
- (let ((process (or process (car (bash-completion-require-process))))
+ (let ((process (or process (bash-completion-require-process)))
(timeout (or timeout bash-completion-process-timeout)))
(with-current-buffer (process-buffer process)
(erase-buffer)
diff --git a/test/bash-completion-test.el b/test/bash-completion-test.el
index 6a741d1b9f..c11cb959a6 100644
--- a/test/bash-completion-test.el
+++ b/test/bash-completion-test.el
@@ -376,9 +376,14 @@ garbage
(ert-deftest bash-completion-customize-test ()
(cl-letf (((symbol-function 'bash-completion-require-process)
- (lambda () '(nil
- (nil "-F" "__default")
- ("zorg" "-F" "__zorg")))))
+ (lambda () 'process))
+ ((symbol-function 'process-get)
+ (lambda (process prop)
+ (if (and (eq 'process process)
+ (eq 'complete-p prop))
+ '((nil "-F" "__default")
+ ("zorg" "-F" "__zorg"))
+ (error "unexpected call")))))
(let ((comp (bash-completion--make :cword 1)))
(setf (bash-completion--words comp) '("zorg" "world"))
(bash-completion--customize comp)
@@ -713,7 +718,17 @@ before calling `bash-completion-dynamic-complete-nocomint'.
(setq --process-buffer (current-buffer))
(with-temp-buffer
(setq --test-buffer (current-buffer))
- (cl-letf (((symbol-function 'bash-completion-require-process)
(lambda () `(process . ,bash-completion-alist)))
+ (cl-letf (((symbol-function 'bash-completion-require-process)
(lambda () 'process))
+ ((symbol-function 'process-put)
+ (lambda (process prop value)
+ (if (and (eq 'process process) (eq 'complete-p prop))
+ (setq bash-completion-alist value)
+ (error))))
+ ((symbol-function 'process-get)
+ (lambda (process prop)
+ (if (and (eq 'process process) (eq 'complete-p prop))
+ bash-completion-alist
+ (error))))
((symbol-function 'bash-completion-buffer) (lambda ()
--process-buffer))
((symbol-function 'process-buffer) (lambda (p)
--process-buffer))
((symbol-function 'file-accessible-directory-p)