[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[nongnu] elpa/bash-completion 21eabde7f9 045/313: Reimplemented split
From: |
ELPA Syncer |
Subject: |
[nongnu] elpa/bash-completion 21eabde7f9 045/313: Reimplemented split |
Date: |
Sat, 3 Dec 2022 10:59:14 -0500 (EST) |
branch: elpa/bash-completion
commit 21eabde7f9578a4d69880607a0096b8808044485
Author: Stephane Zermatten <szermatt@gmx.net>
Commit: Stephane Zermatten <szermatt@gmx.net>
Reimplemented split
---
bash-completion.el | 117 ++++++++++++++++++++++++++++++++++++-----------------
1 file changed, 79 insertions(+), 38 deletions(-)
diff --git a/bash-completion.el b/bash-completion.el
index a3c4fc7bdb..371938ee04 100644
--- a/bash-completion.el
+++ b/bash-completion.el
@@ -29,8 +29,8 @@ the following entry is added to `bash-completion-alist':
See `bash-completion-add-to-alist'.
")
-(defvar bash-completion-wordbreaks-str "\"'@><=;|&(:")
-(defvar bash-completion-wordbreaks (append bash-completion-wordbreaks-str nil))
+(defconst bash-completion-wordbreaks-str "\"'@><=;|&(:")
+(defconst bash-completion-wordbreaks (append bash-completion-wordbreaks-str
nil))
(defun bash-completion-setup ()
(add-hook 'shell-dynamic-complete-functions
@@ -104,68 +104,109 @@ Call bash to do the completion."
Return a list containing the words and the number of the word
at POS, the current word: ( (word1 word2 ...) . wordnum )"
+ (bash-completion-split-postprocess
+ (bash-completion-split-raw start end) start pos))
+
+(defun bash-completion-split-postprocess (accum start pos)
+ (if (null pos)
+ (cons nil (mapcar 'bash-completion-split-raw-get-str accum))
+ ;; find position
+ (let ((index 0) (strings nil) (current nil) (accum-rest accum) (cword nil))
+ (while accum-rest
+ (setq current (car accum-rest))
+ (setq accum-rest (cdr accum-rest))
+ (unless cword
+ (let ((range (bash-completion-split-raw-get-range current)))
+ (cond
+ ((and (>= pos (car range))
+ (<= pos (cdr range)))
+ (setq cword index))
+ ((< pos (car range))
+ (setq cword index)
+ (push "" strings)))))
+ (push (bash-completion-split-raw-get-str current) strings)
+ (setq index (1+ index)))
+ (unless cword
+ (setq cword index)
+ (push "" strings))
+ (cons cword (nreverse strings)))))
+
+(defsubst bash-completion-split-raw-get-range (current)
+ (cons (cdr (assq 'start current)) (cdr (assq 'end current))))
+
+(defsubst bash-completion-split-raw-set-start (current)
+ (let ((start-cons (assq 'start current)))
+ (when (null (cdr start-cons))
+ (setcdr start-cons (point)))))
+
+(defsubst bash-completion-split-raw-set-end (current)
+ (setcdr (assq 'end current) (point)))
+
+(defsubst bash-completion-split-raw-append-str (current str)
+ (let* ((str-cons (assq 'str current)) (straccum (cdr str-cons)))
+ (setcdr str-cons (concat straccum str))))
+
+(defsubst bash-completion-split-raw-get-str (current)
+ (cdr (assq 'str current)))
+
+(defun bash-completion-split-raw (start end)
(save-excursion
(goto-char start)
- (let ((accum (cons nil nil)))
- (setq accum (bash-completion-split-0 start end pos accum ""))
- (when (and (not (null pos)) (null (car accum)))
- (setcar accum (length (cdr accum)))
- (setcdr accum (cons "" (cdr accum))))
- (cons (car accum) (nreverse (cdr accum))))))
-
-(defun bash-completion-split-0 (start end pos accum straccum)
- (when (eq "" straccum)
- (let ((local-start (point)))
- (when (and (null (car accum)) (not (null pos)) (<= pos local-start))
- (setcar accum (length (cdr accum)))
- (setcdr accum (cons "" (cdr accum))))))
+ (nreverse (bash-completion-split-raw-new-element end nil))))
+
+(defun bash-completion-split-raw-new-element (end accum)
+ (skip-chars-forward " \t\n\r" end)
+ (if (< (point) end)
+ (bash-completion-split-raw-0 end accum (copy-alist '((str . "") (start .
nil) (end . nil))))
+ accum))
+
+(defun bash-completion-split-raw-0 (end accum current)
+ (bash-completion-split-raw-set-start current)
(let ( (char-start (char-after))
(quote nil) )
(when (and char-start (or (= char-start ?') (= char-start ?\")))
(forward-char)
(setq quote char-start))
- (bash-completion-split-1 start end pos quote accum straccum)))
+ (bash-completion-split-raw-1 end quote accum current)))
-(defun bash-completion-split-1 (start end pos quote accum straccum)
+(defun bash-completion-split-raw-1 (end quote accum current)
(let ((local-start (point)))
(skip-chars-forward (bash-completion-nonsep quote) end)
- (setq straccum (concat straccum (buffer-substring-no-properties
local-start (point)))))
+ (bash-completion-split-raw-append-str
+ current
+ (buffer-substring-no-properties local-start (point))))
(cond
;; an escaped char, skip, whatever it is
((and (char-before) (= ?\\ (char-before)))
(forward-char)
- (bash-completion-split-1
- start end pos quote
- accum
- (concat (substring straccum 0 (- (length straccum) 1)) (char-to-string
(char-before)))))
+ (let ((straccum (bash-completion-split-raw-get-str current)))
+ (aset straccum (1- (length straccum)) (char-before)))
+ (bash-completion-split-raw-1 end quote accum current))
;; opening quote
((and (not quote) (char-after) (or (= ?' (char-after)) (= ?\"
(char-after))))
- (bash-completion-split-0 start end pos accum straccum))
+ (bash-completion-split-raw-0 end accum current))
;; closing quote
((and quote (char-after) (= quote (char-after)))
(forward-char)
- (bash-completion-split-0 start end pos accum straccum))
+ (bash-completion-split-raw-0 end accum current))
;; space inside a quote
((and quote (char-after) (not (= quote (char-after))))
(forward-char)
- (bash-completion-split-1
- start end pos quote accum
- (concat straccum (char-to-string (char-before)))))
+ (bash-completion-split-raw-append-str current (char-to-string
(char-before)))
+ (bash-completion-split-raw-1 end quote accum current))
;; word end
(t
- (when (and (null (car accum)) (not (null pos)) (<= pos (point)))
- (setcar accum (length (cdr accum))))
- (skip-chars-forward " \t\n\r" end)
- (when (> (length straccum) 0)
- (setcdr accum (cons straccum (cdr accum))))
- (if (< (point) end)
- (bash-completion-split-0 (point) end pos accum "")
- accum))))
+ (bash-completion-split-raw-set-end current)
+ (push current accum)
+ (bash-completion-split-raw-new-element end accum))))
+
+(defconst bash-completion-nonsep-alist
+ '((nil . "^ \t\n\r'\"")
+ (?' . "^ \t\n\r'")
+ (?\" . "^ \t\n\r\"")))
(defun bash-completion-nonsep (quote)
- (if quote
- (concat "^ \t\n\r" (char-to-string quote))
- "^ \t\n\r'\""))
+ (cdr (assq quote bash-completion-nonsep-alist)))
(defun bash-completion-comm (line pos words cword)
"Set LINE, POS, WORDS and CWORD, call bash completion, return the result.
- [nongnu] elpa/bash-completion 4b80c75c43 272/313: Take current directory from shell when in single-process mode., (continued)
- [nongnu] elpa/bash-completion 4b80c75c43 272/313: Take current directory from shell when in single-process mode., ELPA Syncer, 2022/12/03
- [nongnu] elpa/bash-completion ea5cc15b99 273/313: Let status code of compgen through when in single-process mode., ELPA Syncer, 2022/12/03
- [nongnu] elpa/bash-completion 12da4f0e91 289/313: Better handle slow completion functions., ELPA Syncer, 2022/12/03
- [nongnu] elpa/bash-completion 7186a18cad 012/313: Integrated into comm, ELPA Syncer, 2022/12/03
- [nongnu] elpa/bash-completion e81c478032 020/313: bash-complete -> bash-completion, ELPA Syncer, 2022/12/03
- [nongnu] elpa/bash-completion 8270e09294 023/313: pass words as command-line arguments to the function, ELPA Syncer, 2022/12/03
- [nongnu] elpa/bash-completion 482383dcd7 021/313: handle slash for directory, usable completion, ELPA Syncer, 2022/12/03
- [nongnu] elpa/bash-completion cd2ec103d1 026/313: Expand directory names with quotes and spaces, but no further, ELPA Syncer, 2022/12/03
- [nongnu] elpa/bash-completion 1d7af7e40d 027/313: Remove debug messages, ELPA Syncer, 2022/12/03
- [nongnu] elpa/bash-completion dda4697cfb 029/313: included bash-completion into google env, ELPA Syncer, 2022/12/03
- [nongnu] elpa/bash-completion 21eabde7f9 045/313: Reimplemented split,
ELPA Syncer <=
- [nongnu] elpa/bash-completion 3c58afdb0d 033/313: expand file names in colon-separated paths, ELPA Syncer, 2022/12/03
- [nongnu] elpa/bash-completion 5501cb63cf 042/313: Turn off mail warning, ELPA Syncer, 2022/12/03
- [nongnu] elpa/bash-completion 0dcf43f91e 041/313: don't run integration tests by default, ELPA Syncer, 2022/12/03
- [nongnu] elpa/bash-completion 5b76fc4a33 032/313: remove wrong a=b variable prefix handling, ELPA Syncer, 2022/12/03
- [nongnu] elpa/bash-completion 7697f1a87c 063/313: comments about tried systems, ELPA Syncer, 2022/12/03
- [nongnu] elpa/bash-completion 3efe7cb03c 067/313: escape #, ELPA Syncer, 2022/12/03
- [nongnu] elpa/bash-completion 42441e36b0 055/313: more documentation, a little refactoring, ELPA Syncer, 2022/12/03
- [nongnu] elpa/bash-completion 5661a34c4a 098/313: updated test case for cd 2>/dev/null, ELPA Syncer, 2022/12/03
- [nongnu] elpa/bash-completion c64ca7a992 071/313: simplified parse-current-command, all tests pass, ELPA Syncer, 2022/12/03
- [nongnu] elpa/bash-completion cc1a462415 050/313: tested complex line, detect escaped separators, ELPA Syncer, 2022/12/03