1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855185618571858185918601861186218631864186518661867186818691870187118721873187418751876187718781879188018811882188318841885188618871888188918901891189218931894189518961897189818991900190119021903190419051906190719081909191019111912191319141915191619171918191919201921192219231924192519261927192819291930193119321933193419351936193719381939194019411942194319441945194619471948194919501951195219531954195519561957195819591960196119621963196419651966196719681969197019711972197319741975197619771978197919801981198219831984198519861987198819891990199119921993199419951996199719981999200020012002200320042005200620072008200920102011201220132014201520162017201820192020202120222023202420252026202720282029203020312032203320342035203620372038203920402041204220432044204520462047204820492050205120522053205420552056205720582059206020612062206320642065206620672068206920702071207220732074207520762077207820792080208120822083208420852086208720882089209020912092209320942095209620972098209921002101210221032104210521062107210821092110211121122113211421152116211721182119212021212122212321242125212621272128212921302131213221332134213521362137213821392140214121422143214421452146214721482149215021512152215321542155215621572158215921602161216221632164216521662167216821692170217121722173217421752176217721782179218021812182218321842185218621872188218921902191219221932194219521962197219821992200220122022203220422052206220722082209221022112212221322142215221622172218221922202221222222232224222522262227222822292230223122322233223422352236223722382239224022412242224322442245224622472248224922502251225222532254225522562257225822592260226122622263226422652266226722682269227022712272227322742275227622772278227922802281228222832284228522862287228822892290229122922293229422952296229722982299230023012302230323042305230623072308230923102311231223132314231523162317231823192320232123222323232423252326232723282329233023312332233323342335233623372338233923402341234223432344234523462347234823492350235123522353235423552356235723582359236023612362236323642365236623672368236923702371237223732374237523762377237823792380238123822383238423852386238723882389239023912392239323942395239623972398239924002401240224032404240524062407240824092410241124122413241424152416241724182419242024212422242324242425242624272428242924302431243224332434243524362437243824392440244124422443244424452446244724482449245024512452245324542455245624572458245924602461246224632464246524662467246824692470247124722473247424752476247724782479248024812482248324842485248624872488248924902491249224932494249524962497249824992500250125022503250425052506250725082509251025112512251325142515251625172518251925202521252225232524252525262527252825292530253125322533253425352536253725382539254025412542254325442545254625472548254925502551255225532554255525562557255825592560256125622563256425652566256725682569257025712572257325742575257625772578257925802581258225832584258525862587258825892590259125922593259425952596259725982599260026012602260326042605260626072608260926102611261226132614261526162617261826192620262126222623262426252626262726282629263026312632263326342635263626372638263926402641264226432644264526462647264826492650265126522653265426552656265726582659266026612662266326642665266626672668266926702671267226732674267526762677267826792680268126822683268426852686268726882689269026912692269326942695269626972698269927002701270227032704270527062707270827092710271127122713271427152716271727182719272027212722272327242725272627272728272927302731273227332734273527362737273827392740274127422743274427452746274727482749275027512752275327542755275627572758275927602761276227632764276527662767276827692770277127722773277427752776277727782779278027812782278327842785278627872788278927902791279227932794279527962797279827992800280128022803280428052806280728082809281028112812281328142815281628172818281928202821282228232824282528262827282828292830283128322833283428352836283728382839284028412842284328442845284628472848284928502851 |
- (eval-when-compile (require 'cl))
- (defun completion-boundaries (string table pred suffix)
- "Return the boundaries of the completions returned by TABLE for STRING.
- STRING is the string on which completion will be performed.
- SUFFIX is the string after point.
- The result is of the form (START . END) where START is the position
- in STRING of the beginning of the completion field and END is the position
- in SUFFIX of the end of the completion field.
- E.g. for simple completion tables, the result is always (0 . (length SUFFIX))
- and for file names the result is the positions delimited by
- the closest directory separators."
- (let ((boundaries (if (functionp table)
- (funcall table string pred
- (cons 'boundaries suffix)))))
- (if (not (eq (car-safe boundaries) 'boundaries))
- (setq boundaries nil))
- (cons (or (cadr boundaries) 0)
- (or (cddr boundaries) (length suffix)))))
- (defun completion-metadata (string table pred)
- "Return the metadata of elements to complete at the end of STRING.
- This metadata is an alist. Currently understood keys are:
- - `category': the kind of objects returned by `all-completions'.
- Used by `completion-category-overrides'.
- - `annotation-function': function to add annotations in *Completions*.
- Takes one argument (STRING), which is a possible completion and
- returns a string to append to STRING.
- - `display-sort-function': function to sort entries in *Completions*.
- Takes one argument (COMPLETIONS) and should return a new list
- of completions. Can operate destructively.
- - `cycle-sort-function': function to sort entries when cycling.
- Works like `display-sort-function'.
- The metadata of a completion table should be constant between two boundaries."
- (let ((metadata (if (functionp table)
- (funcall table string pred 'metadata))))
- (if (eq (car-safe metadata) 'metadata)
- metadata
- '(metadata))))
- (defun completion--field-metadata (field-start)
- (completion-metadata (buffer-substring-no-properties field-start (point))
- minibuffer-completion-table
- minibuffer-completion-predicate))
- (defun completion-metadata-get (metadata prop)
- (cdr (assq prop metadata)))
- (defun completion--some (fun xs)
- "Apply FUN to each element of XS in turn.
- Return the first non-nil returned value.
- Like CL's `some'."
- (let ((firsterror nil)
- res)
- (while (and (not res) xs)
- (condition-case err
- (setq res (funcall fun (pop xs)))
- (error (unless firsterror (setq firsterror err)) nil)))
- (or res
- (if firsterror (signal (car firsterror) (cdr firsterror))))))
- (defun complete-with-action (action table string pred)
- "Perform completion ACTION.
- STRING is the string to complete.
- TABLE is the completion table.
- PRED is a completion predicate.
- ACTION can be one of nil, t or `lambda'."
- (cond
- ((functionp table) (funcall table string pred action))
- ((eq (car-safe action) 'boundaries) nil)
- ((eq action 'metadata) nil)
- (t
- (funcall
- (cond
- ((null action) 'try-completion)
- ((eq action t) 'all-completions)
- (t 'test-completion))
- string table pred))))
- (defun completion-table-dynamic (fun)
- "Use function FUN as a dynamic completion table.
- FUN is called with one argument, the string for which completion is required,
- and it should return an alist containing all the intended possible completions.
- This alist may be a full list of possible completions so that FUN can ignore
- the value of its argument. If completion is performed in the minibuffer,
- FUN will be called in the buffer from which the minibuffer was entered.
- The result of the `completion-table-dynamic' form is a function
- that can be used as the COLLECTION argument to `try-completion' and
- `all-completions'. See Info node `(elisp)Programmed Completion'."
- (lambda (string pred action)
- (if (or (eq (car-safe action) 'boundaries) (eq action 'metadata))
-
-
- nil
- (with-current-buffer (let ((win (minibuffer-selected-window)))
- (if (window-live-p win) (window-buffer win)
- (current-buffer)))
- (complete-with-action action (funcall fun string) string pred)))))
- (defmacro lazy-completion-table (var fun)
- "Initialize variable VAR as a lazy completion table.
- If the completion table VAR is used for the first time (e.g., by passing VAR
- as an argument to `try-completion'), the function FUN is called with no
- arguments. FUN must return the completion table that will be stored in VAR.
- If completion is requested in the minibuffer, FUN will be called in the buffer
- from which the minibuffer was entered. The return value of
- `lazy-completion-table' must be used to initialize the value of VAR.
- You should give VAR a non-nil `risky-local-variable' property."
- (declare (debug (symbolp lambda-expr)))
- (let ((str (make-symbol "string")))
- `(completion-table-dynamic
- (lambda (,str)
- (when (functionp ,var)
- (setq ,var (,fun)))
- ,var))))
- (defun completion-table-case-fold (table &optional dont-fold)
- "Return new completion TABLE that is case insensitive.
- If DONT-FOLD is non-nil, return a completion table that is
- case sensitive instead."
- (lambda (string pred action)
- (let ((completion-ignore-case (not dont-fold)))
- (complete-with-action action table string pred))))
- (defun completion-table-with-context (prefix table string pred action)
-
- (let ((pred
- (if (not (functionp pred))
-
- pred
-
-
- (cond
- ((vectorp table)
- (lambda (sym) (funcall pred (concat prefix (symbol-name sym)))))
- ((hash-table-p table)
- (lambda (s _v) (funcall pred (concat prefix s))))
- ((functionp table)
- (lambda (s) (funcall pred (concat prefix s))))
- (t
- (lambda (s)
- (funcall pred (concat prefix (if (consp s) (car s) s)))))))))
- (if (eq (car-safe action) 'boundaries)
- (let* ((len (length prefix))
- (bound (completion-boundaries string table pred (cdr action))))
- (list* 'boundaries (+ (car bound) len) (cdr bound)))
- (let ((comp (complete-with-action action table string pred)))
- (cond
-
- ((stringp comp) (concat prefix comp))
- (t comp))))))
- (defun completion-table-with-terminator (terminator table string pred action)
- "Construct a completion table like TABLE but with an extra TERMINATOR.
- This is meant to be called in a curried way by first passing TERMINATOR
- and TABLE only (via `apply-partially').
- TABLE is a completion table, and TERMINATOR is a string appended to TABLE's
- completion if it is complete. TERMINATOR is also used to determine the
- completion suffix's boundary.
- TERMINATOR can also be a cons cell (TERMINATOR . TERMINATOR-REGEXP)
- in which case TERMINATOR-REGEXP is a regular expression whose submatch
- number 1 should match TERMINATOR. This is used when there is a need to
- distinguish occurrences of the TERMINATOR strings which are really terminators
- from others (e.g. escaped). In this form, the car of TERMINATOR can also be,
- instead of a string, a function that takes the completion and returns the
- \"terminated\" string."
-
-
-
-
- (cond
- ((eq (car-safe action) 'boundaries)
- (let* ((suffix (cdr action))
- (bounds (completion-boundaries string table pred suffix))
- (terminator-regexp (if (consp terminator)
- (cdr terminator) (regexp-quote terminator)))
- (max (and terminator-regexp
- (string-match terminator-regexp suffix))))
- (list* 'boundaries (car bounds)
- (min (cdr bounds) (or max (length suffix))))))
- ((eq action nil)
- (let ((comp (try-completion string table pred)))
- (if (consp terminator) (setq terminator (car terminator)))
- (if (eq comp t)
- (if (functionp terminator)
- (funcall terminator string)
- (concat string terminator))
- (if (and (stringp comp) (not (zerop (length comp)))
-
-
-
-
- (let ((newbounds (completion-boundaries comp table pred "")))
- (< (car newbounds) (length comp)))
- (eq (try-completion comp table pred) t))
- (if (functionp terminator)
- (funcall terminator comp)
- (concat comp terminator))
- comp))))
-
-
-
- ((eq action 'lambda) nil)
- (t
-
-
-
-
-
-
- (complete-with-action action table string pred))))
- (defun completion-table-with-predicate (table pred1 strict string pred2 action)
- "Make a completion table equivalent to TABLE but filtered through PRED1.
- PRED1 is a function of one argument which returns non-nil if and only if the
- argument is an element of TABLE which should be considered for completion.
- STRING, PRED2, and ACTION are the usual arguments to completion tables,
- as described in `try-completion', `all-completions', and `test-completion'.
- If STRICT is t, the predicate always applies; if nil it only applies if
- it does not reduce the set of possible completions to nothing.
- Note: TABLE needs to be a proper completion table which obeys predicates."
- (cond
- ((and (not strict) (eq action 'lambda))
-
- (test-completion string table pred2))
- (t
- (or (complete-with-action action table string
- (if (not (and pred1 pred2))
- (or pred1 pred2)
- (lambda (x)
-
-
- (and (funcall pred1 x) (funcall pred2 x)))))
-
-
- (and (not strict) pred1 pred2
- (complete-with-action action table string pred2))))))
- (defun completion-table-in-turn (&rest tables)
- "Create a completion table that tries each table in TABLES in turn."
-
-
- (lambda (string pred action)
- (completion--some (lambda (table)
- (complete-with-action action table string pred))
- tables)))
- (define-obsolete-function-alias
- 'complete-in-turn 'completion-table-in-turn "23.1")
- (define-obsolete-function-alias
- 'dynamic-completion-table 'completion-table-dynamic "23.1")
- (defgroup minibuffer nil
- "Controlling the behavior of the minibuffer."
- :link '(custom-manual "(emacs)Minibuffer")
- :group 'environment)
- (defun minibuffer-message (message &rest args)
- "Temporarily display MESSAGE at the end of the minibuffer.
- The text is displayed for `minibuffer-message-timeout' seconds,
- or until the next input event arrives, whichever comes first.
- Enclose MESSAGE in [...] if this is not yet the case.
- If ARGS are provided, then pass MESSAGE through `format'."
- (if (not (minibufferp (current-buffer)))
- (progn
- (if args
- (apply 'message message args)
- (message "%s" message))
- (prog1 (sit-for (or minibuffer-message-timeout 1000000))
- (message nil)))
-
- (message nil)
- (setq message (if (and (null args) (string-match-p "\\` *\\[.+\\]\\'" message))
-
- (copy-sequence message)
- (concat " [" message "]")))
- (when args (setq message (apply 'format message args)))
- (let ((ol (make-overlay (point-max) (point-max) nil t t))
-
-
-
-
-
-
- (inhibit-quit t))
- (unwind-protect
- (progn
- (unless (zerop (length message))
-
-
-
- (put-text-property 0 1 'cursor t message))
- (overlay-put ol 'after-string message)
- (sit-for (or minibuffer-message-timeout 1000000)))
- (delete-overlay ol)))))
- (defun minibuffer-completion-contents ()
- "Return the user input in a minibuffer before point as a string.
- That is what completion commands operate on."
- (buffer-substring (field-beginning) (point)))
- (defun delete-minibuffer-contents ()
- "Delete all user input in a minibuffer.
- If the current buffer is not a minibuffer, erase its entire contents."
-
-
- (delete-region (minibuffer-prompt-end) (point-max)))
- (defvar completion-show-inline-help t
- "If non-nil, print helpful inline messages during completion.")
- (defcustom completion-auto-help t
- "Non-nil means automatically provide help for invalid completion input.
- If the value is t the *Completion* buffer is displayed whenever completion
- is requested but cannot be done.
- If the value is `lazy', the *Completions* buffer is only displayed after
- the second failed attempt to complete."
- :type '(choice (const nil) (const t) (const lazy))
- :group 'minibuffer)
- (defconst completion-styles-alist
- '((emacs21
- completion-emacs21-try-completion completion-emacs21-all-completions
- "Simple prefix-based completion.
- I.e. when completing \"foo_bar\" (where _ is the position of point),
- it will consider all completions candidates matching the glob
- pattern \"foobar*\".")
- (emacs22
- completion-emacs22-try-completion completion-emacs22-all-completions
- "Prefix completion that only operates on the text before point.
- I.e. when completing \"foo_bar\" (where _ is the position of point),
- it will consider all completions candidates matching the glob
- pattern \"foo*\" and will add back \"bar\" to the end of it.")
- (basic
- completion-basic-try-completion completion-basic-all-completions
- "Completion of the prefix before point and the suffix after point.
- I.e. when completing \"foo_bar\" (where _ is the position of point),
- it will consider all completions candidates matching the glob
- pattern \"foo*bar*\".")
- (partial-completion
- completion-pcm-try-completion completion-pcm-all-completions
- "Completion of multiple words, each one taken as a prefix.
- I.e. when completing \"l-co_h\" (where _ is the position of point),
- it will consider all completions candidates matching the glob
- pattern \"l*-co*h*\".
- Furthermore, for completions that are done step by step in subfields,
- the method is applied to all the preceding fields that do not yet match.
- E.g. C-x C-f /u/mo/s TAB could complete to /usr/monnier/src.
- Additionally the user can use the char \"*\" as a glob pattern.")
- (substring
- completion-substring-try-completion completion-substring-all-completions
- "Completion of the string taken as a substring.
- I.e. when completing \"foo_bar\" (where _ is the position of point),
- it will consider all completions candidates matching the glob
- pattern \"*foo*bar*\".")
- (initials
- completion-initials-try-completion completion-initials-all-completions
- "Completion of acronyms and initialisms.
- E.g. can complete M-x lch to list-command-history
- and C-x C-f ~/sew to ~/src/emacs/work."))
- "List of available completion styles.
- Each element has the form (NAME TRY-COMPLETION ALL-COMPLETIONS DOC):
- where NAME is the name that should be used in `completion-styles',
- TRY-COMPLETION is the function that does the completion (it should
- follow the same calling convention as `completion-try-completion'),
- ALL-COMPLETIONS is the function that lists the completions (it should
- follow the calling convention of `completion-all-completions'),
- and DOC describes the way this style of completion works.")
- (defconst completion--styles-type
- `(repeat :tag "insert a new menu to add more styles"
- (choice ,@(mapcar (lambda (x) (list 'const (car x)))
- completion-styles-alist))))
- (defconst completion--cycling-threshold-type
- '(choice (const :tag "No cycling" nil)
- (const :tag "Always cycle" t)
- (integer :tag "Threshold")))
- (defcustom completion-styles
-
-
-
- '(basic
-
-
- partial-completion
-
-
-
-
- emacs22)
- "List of completion styles to use.
- The available styles are listed in `completion-styles-alist'.
- Note that `completion-category-overrides' may override these
- styles for specific categories, such as files, buffers, etc."
- :type completion--styles-type
- :group 'minibuffer
- :version "23.1")
- (defcustom completion-category-overrides
- '((buffer (styles . (basic substring))))
- "List of `completion-styles' overrides for specific categories.
- Each override has the shape (CATEGORY . ALIST) where ALIST is
- an association list that can specify properties such as:
- - `styles': the list of `completion-styles' to use for that category.
- - `cycle': the `completion-cycle-threshold' to use for that category.
- Categories are symbols such as `buffer' and `file', used when
- completing buffer and file names, respectively."
- :version "24.1"
- :type `(alist :key-type (choice :tag "Category"
- (const buffer)
- (const file)
- (const unicode-name)
- symbol)
- :value-type
- (set :tag "Properties to override"
- (cons :tag "Completion Styles"
- (const :tag "Select a style from the menu;" styles)
- ,completion--styles-type)
- (cons :tag "Completion Cycling"
- (const :tag "Select one value from the menu." cycle)
- ,completion--cycling-threshold-type))))
- (defun completion--styles (metadata)
- (let* ((cat (completion-metadata-get metadata 'category))
- (over (assq 'styles (cdr (assq cat completion-category-overrides)))))
- (if over
- (delete-dups (append (cdr over) (copy-sequence completion-styles)))
- completion-styles)))
- (defun completion-try-completion (string table pred point &optional metadata)
- "Try to complete STRING using completion table TABLE.
- Only the elements of table that satisfy predicate PRED are considered.
- POINT is the position of point within STRING.
- The return value can be either nil to indicate that there is no completion,
- t to indicate that STRING is the only possible completion,
- or a pair (STRING . NEWPOINT) of the completed result string together with
- a new position for point."
- (completion--some (lambda (style)
- (funcall (nth 1 (assq style completion-styles-alist))
- string table pred point))
- (completion--styles (or metadata
- (completion-metadata
- (substring string 0 point)
- table pred)))))
- (defun completion-all-completions (string table pred point &optional metadata)
- "List the possible completions of STRING in completion table TABLE.
- Only the elements of table that satisfy predicate PRED are considered.
- POINT is the position of point within STRING.
- The return value is a list of completions and may contain the base-size
- in the last `cdr'."
-
-
- (completion--some (lambda (style)
- (funcall (nth 2 (assq style completion-styles-alist))
- string table pred point))
- (completion--styles (or metadata
- (completion-metadata
- (substring string 0 point)
- table pred)))))
- (defun minibuffer--bitset (modified completions exact)
- (logior (if modified 4 0)
- (if completions 2 0)
- (if exact 1 0)))
- (defun completion--replace (beg end newtext)
- "Replace the buffer text between BEG and END with NEWTEXT.
- Moves point to the end of the new text."
-
-
-
- (set-text-properties 0 (length newtext) nil newtext)
-
-
-
-
- (let ((prefix-len 0))
-
- (while (and (< prefix-len (length newtext))
- (< (+ beg prefix-len) end)
- (eq (char-after (+ beg prefix-len))
- (aref newtext prefix-len)))
- (setq prefix-len (1+ prefix-len)))
- (unless (zerop prefix-len)
- (setq beg (+ beg prefix-len))
- (setq newtext (substring newtext prefix-len))))
- (let ((suffix-len 0))
-
- (while (and (< suffix-len (length newtext))
- (< beg (- end suffix-len))
- (eq (char-before (- end suffix-len))
- (aref newtext (- (length newtext) suffix-len 1))))
- (setq suffix-len (1+ suffix-len)))
- (unless (zerop suffix-len)
- (setq end (- end suffix-len))
- (setq newtext (substring newtext 0 (- suffix-len))))
- (goto-char beg)
- (insert-and-inherit newtext)
- (delete-region (point) (+ (point) (- end beg)))
- (forward-char suffix-len)))
- (defcustom completion-cycle-threshold nil
- "Number of completion candidates below which cycling is used.
- Depending on this setting `minibuffer-complete' may use cycling,
- like `minibuffer-force-complete'.
- If nil, cycling is never used.
- If t, cycling is always used.
- If an integer, cycling is used as soon as there are fewer completion
- candidates than this number."
- :version "24.1"
- :type completion--cycling-threshold-type)
- (defun completion--cycle-threshold (metadata)
- (let* ((cat (completion-metadata-get metadata 'category))
- (over (assq 'cycle (cdr (assq cat completion-category-overrides)))))
- (if over (cdr over) completion-cycle-threshold)))
- (defvar completion-all-sorted-completions nil)
- (make-variable-buffer-local 'completion-all-sorted-completions)
- (defvar completion-cycling nil)
- (defvar completion-fail-discreetly nil
- "If non-nil, stay quiet when there is no match.")
- (defun completion--message (msg)
- (if completion-show-inline-help
- (minibuffer-message msg)))
- (defun completion--do-completion (&optional try-completion-function
- expect-exact)
- "Do the completion and return a summary of what happened.
- M = completion was performed, the text was Modified.
- C = there were available Completions.
- E = after completion we now have an Exact match.
- MCE
- 000 0 no possible completion
- 001 1 was already an exact and unique completion
- 010 2 no completion happened
- 011 3 was already an exact completion
- 100 4 ??? impossible
- 101 5 ??? impossible
- 110 6 some completion happened
- 111 7 completed to an exact completion
- TRY-COMPLETION-FUNCTION is a function to use in place of `try-completion'.
- EXPECT-EXACT, if non-nil, means that there is no need to tell the user
- when the buffer's text is already an exact match."
- (let* ((beg (field-beginning))
- (end (field-end))
- (string (buffer-substring beg end))
- (md (completion--field-metadata beg))
- (comp (funcall (or try-completion-function
- 'completion-try-completion)
- string
- minibuffer-completion-table
- minibuffer-completion-predicate
- (- (point) beg)
- md)))
- (cond
- ((null comp)
- (minibuffer-hide-completions)
- (unless completion-fail-discreetly
- (ding)
- (completion--message "No match"))
- (minibuffer--bitset nil nil nil))
- ((eq t comp)
- (minibuffer-hide-completions)
- (goto-char end)
- (completion--done string 'finished
- (unless expect-exact "Sole completion"))
- (minibuffer--bitset nil nil t))
- (t
-
-
-
- (let* ((comp-pos (cdr comp))
- (completion (car comp))
- (completed (not (eq t (compare-strings completion nil nil
- string nil nil t))))
- (unchanged (eq t (compare-strings completion nil nil
- string nil nil nil))))
- (if unchanged
- (goto-char end)
-
- (completion--replace beg end completion))
-
- (forward-char (- comp-pos (length completion)))
- (if (not (or unchanged completed))
-
-
-
-
- (completion--do-completion try-completion-function expect-exact)
-
- (let* ((exact (test-completion completion
- minibuffer-completion-table
- minibuffer-completion-predicate))
- (threshold (completion--cycle-threshold md))
- (comps
-
-
-
-
-
- (when (and threshold
-
-
- (or (not completed)
- (< (car (completion-boundaries
- (substring completion 0 comp-pos)
- minibuffer-completion-table
- minibuffer-completion-predicate
- ""))
- comp-pos)))
- (completion-all-sorted-completions))))
- (completion--flush-all-sorted-completions)
- (cond
- ((and (consp (cdr comps))
- (not (ignore-errors
-
-
- (consp (nthcdr threshold comps)))))
-
-
- (setq completed t exact t)
- (completion--cache-all-sorted-completions comps)
- (minibuffer-force-complete))
- (completed
-
-
-
- (minibuffer-hide-completions)
- (if exact
-
-
- (completion--done completion
- (if (< comp-pos (length completion))
- 'exact 'unknown))))
-
- ((not exact)
- (if (case completion-auto-help
- (lazy (eq this-command last-command))
- (t completion-auto-help))
- (minibuffer-completion-help)
- (completion--message "Next char not unique")))
-
-
-
- (t
- (if (and (eq this-command last-command) completion-auto-help)
- (minibuffer-completion-help))
- (completion--done completion 'exact
- (unless expect-exact
- "Complete, but not unique"))))
- (minibuffer--bitset completed t exact))))))))
- (defun minibuffer-complete ()
- "Complete the minibuffer contents as far as possible.
- Return nil if there is no valid completion, else t.
- If no characters can be completed, display a list of possible completions.
- If you repeat this command after it displayed such a list,
- scroll the window of possible completions."
- (interactive)
-
-
- (setq this-command 'completion-at-point)
- (unless (eq 'completion-at-point last-command)
- (completion--flush-all-sorted-completions)
- (setq minibuffer-scroll-window nil))
- (cond
-
-
- ((window-live-p minibuffer-scroll-window)
- (let ((window minibuffer-scroll-window))
- (with-current-buffer (window-buffer window)
- (if (pos-visible-in-window-p (point-max) window)
-
- (set-window-start window (point-min) nil)
-
- (scroll-other-window))
- nil)))
-
- ((and completion-cycling completion-all-sorted-completions)
- (minibuffer-force-complete)
- t)
- (t (case (completion--do-completion)
- (#b000 nil)
- (t t)))))
- (defun completion--cache-all-sorted-completions (comps)
- (add-hook 'after-change-functions
- 'completion--flush-all-sorted-completions nil t)
- (setq completion-all-sorted-completions comps))
- (defun completion--flush-all-sorted-completions (&rest _ignore)
- (remove-hook 'after-change-functions
- 'completion--flush-all-sorted-completions t)
- (setq completion-cycling nil)
- (setq completion-all-sorted-completions nil))
- (defun completion--metadata (string base md-at-point table pred)
-
-
-
- (let ((bounds (completion-boundaries string table pred "")))
- (if (eq (car bounds) base) md-at-point
- (completion-metadata (substring string 0 base) table pred))))
- (defun completion-all-sorted-completions ()
- (or completion-all-sorted-completions
- (let* ((start (field-beginning))
- (end (field-end))
- (string (buffer-substring start end))
- (md (completion--field-metadata start))
- (all (completion-all-completions
- string
- minibuffer-completion-table
- minibuffer-completion-predicate
- (- (point) start)
- md))
- (last (last all))
- (base-size (or (cdr last) 0))
- (all-md (completion--metadata (buffer-substring-no-properties
- start (point))
- base-size md
- minibuffer-completion-table
- minibuffer-completion-predicate))
- (sort-fun (completion-metadata-get all-md 'cycle-sort-function)))
- (when last
- (setcdr last nil)
- (setq all (if sort-fun (funcall sort-fun all)
-
- (sort all (lambda (c1 c2) (< (length c1) (length c2))))))
-
- (when (minibufferp)
- (let ((hist (symbol-value minibuffer-history-variable)))
- (setq all (sort all (lambda (c1 c2)
- (> (length (member c1 hist))
- (length (member c2 hist))))))))
-
-
-
- (completion--cache-all-sorted-completions (nconc all base-size))))))
- (defun minibuffer-force-complete ()
- "Complete the minibuffer to an exact match.
- Repeated uses step through the possible completions."
- (interactive)
-
-
-
- (let* ((start (field-beginning))
- (end (field-end))
-
- (all (completion-all-sorted-completions))
- (base (+ start (or (cdr (last all)) 0))))
- (cond
- ((not (consp all))
- (completion--message
- (if all "No more completions" "No completions")))
- ((not (consp (cdr all)))
- (let ((mod (equal (car all) (buffer-substring-no-properties base end))))
- (if mod (completion--replace base end (car all)))
- (completion--done (buffer-substring-no-properties start (point))
- 'finished (unless mod "Sole completion"))))
- (t
- (completion--replace base end (car all))
- (completion--done (buffer-substring-no-properties start (point)) 'sole)
-
- (setq completion-cycling t)
-
-
-
-
-
- (let ((last (last all)))
- (setcdr last (cons (car all) (cdr last)))
- (completion--cache-all-sorted-completions (cdr all)))))))
- (defvar minibuffer-confirm-exit-commands
- '(completion-at-point minibuffer-complete
- minibuffer-complete-word PC-complete PC-complete-word)
- "A list of commands which cause an immediately following
- `minibuffer-complete-and-exit' to ask for extra confirmation.")
- (defun minibuffer-complete-and-exit ()
- "Exit if the minibuffer contains a valid completion.
- Otherwise, try to complete the minibuffer contents. If
- completion leads to a valid completion, a repetition of this
- command will exit.
- If `minibuffer-completion-confirm' is `confirm', do not try to
- complete; instead, ask for confirmation and accept any input if
- confirmed.
- If `minibuffer-completion-confirm' is `confirm-after-completion',
- do not try to complete; instead, ask for confirmation if the
- preceding minibuffer command was a member of
- `minibuffer-confirm-exit-commands', and accept the input
- otherwise."
- (interactive)
- (let ((beg (field-beginning))
- (end (field-end)))
- (cond
-
- ((= beg end) (exit-minibuffer))
- ((test-completion (buffer-substring beg end)
- minibuffer-completion-table
- minibuffer-completion-predicate)
-
-
-
-
-
-
- (when completion-ignore-case
-
- (let* ((string (buffer-substring beg end))
- (compl (try-completion
- string
- minibuffer-completion-table
- minibuffer-completion-predicate)))
- (when (and (stringp compl) (not (equal string compl))
-
-
-
-
-
-
- (= (length string) (length compl)))
- (completion--replace beg end compl))))
- (exit-minibuffer))
- ((memq minibuffer-completion-confirm '(confirm confirm-after-completion))
-
-
- (if (or (eq last-command this-command)
-
-
-
- (and (eq minibuffer-completion-confirm 'confirm-after-completion)
- (not (memq last-command minibuffer-confirm-exit-commands))))
- (exit-minibuffer)
- (minibuffer-message "Confirm")
- nil))
- (t
-
- (case (condition-case nil
- (completion--do-completion nil 'expect-exact)
- (error 1))
- ((#b001 #b011) (exit-minibuffer))
- (#b111 (if (not minibuffer-completion-confirm)
- (exit-minibuffer)
- (minibuffer-message "Confirm")
- nil))
- (t nil))))))
- (defun completion--try-word-completion (string table predicate point md)
- (let ((comp (completion-try-completion string table predicate point md)))
- (if (not (consp comp))
- comp
-
-
- (when (= (length string) (length (car comp)))
-
-
-
-
-
-
-
- (let ((exts (mapcar (lambda (str) (propertize str 'completion-try-word t))
- '(" " "-")))
- (before (substring string 0 point))
- (after (substring string point))
- tem)
- (while (and exts (not (consp tem)))
- (setq tem (completion-try-completion
- (concat before (pop exts) after)
- table predicate (1+ point) md)))
- (if (consp tem) (setq comp tem))))
-
-
-
-
-
-
-
- (let* ((comppoint (cdr comp))
- (completion (car comp))
- (before (substring string 0 point))
- (combined (concat before "\n" completion)))
-
- (when (string-match "\\(.+\\)\n.*?\\1" combined)
- (let* ((prefix (match-string 1 before))
-
- (rem (substring combined (match-end 0)))
-
-
- (after (substring string point))
- (suffix (if (string-match "\\`\\(.+\\).*\n.*\\1"
- (concat after "\n" rem))
- (match-string 1 after))))
-
-
-
-
-
-
-
-
-
-
-
-
-
- (when (and (or suffix (zerop (length after)))
- (string-match (concat
-
-
-
- ".*" (regexp-quote prefix) "\\(.*?\\)"
- (if suffix (regexp-quote suffix) "\\'"))
- completion)
-
-
-
- (eq (match-end 1) comppoint)
-
-
- (string-match "\\W" completion (match-beginning 1))
-
- (> comppoint (match-end 0)))
-
- (let ((cutpos (match-end 0)))
- (setq completion (concat (substring completion 0 cutpos)
- (substring completion comppoint)))
- (setq comppoint cutpos)))))
- (cons completion comppoint)))))
- (defun minibuffer-complete-word ()
- "Complete the minibuffer contents at most a single word.
- After one word is completed as much as possible, a space or hyphen
- is added, provided that matches some possible completion.
- Return nil if there is no valid completion, else t."
- (interactive)
- (case (completion--do-completion 'completion--try-word-completion)
- (#b000 nil)
- (t t)))
- (defface completions-annotations '((t :inherit italic))
- "Face to use for annotations in the *Completions* buffer.")
- (defcustom completions-format 'horizontal
- "Define the appearance and sorting of completions.
- If the value is `vertical', display completions sorted vertically
- in columns in the *Completions* buffer.
- If the value is `horizontal', display completions sorted
- horizontally in alphabetical order, rather than down the screen."
- :type '(choice (const horizontal) (const vertical))
- :group 'minibuffer
- :version "23.2")
- (defun completion--insert-strings (strings)
- "Insert a list of STRINGS into the current buffer.
- Uses columns to keep the listing readable but compact.
- It also eliminates runs of equal strings."
- (when (consp strings)
- (let* ((length (apply 'max
- (mapcar (lambda (s)
- (if (consp s)
- (+ (string-width (car s))
- (string-width (cadr s)))
- (string-width s)))
- strings)))
- (window (get-buffer-window (current-buffer) 0))
- (wwidth (if window (1- (window-width window)) 79))
- (columns (min
-
- (max 2 (/ wwidth (+ 2 length)))
-
-
- (max 1 (/ (length strings) 2))))
- (colwidth (/ wwidth columns))
- (column 0)
- (rows (/ (length strings) columns))
- (row 0)
- (first t)
- (laststring nil))
-
-
- (dolist (str strings)
- (unless (equal laststring str)
- (setq laststring str)
-
-
- (let ((length (if (consp str)
- (+ (string-width (car str))
- (string-width (cadr str)))
- (string-width str))))
- (cond
- ((eq completions-format 'vertical)
-
- (when (> row rows)
- (forward-line (- -1 rows))
- (setq row 0 column (+ column colwidth)))
- (when (> column 0)
- (end-of-line)
- (while (> (current-column) column)
- (if (eobp)
- (insert "\n")
- (forward-line 1)
- (end-of-line)))
- (insert " \t")
- (set-text-properties (1- (point)) (point)
- `(display (space :align-to ,column)))))
- (t
-
- (unless first
- (if (< wwidth (+ (max colwidth length) column))
-
- (progn (insert "\n") (setq column 0))
- (insert " \t")
-
-
-
- (set-text-properties (1- (point)) (point)
-
-
-
- `(display (space :align-to ,column)))
- nil))))
- (setq first nil)
- (if (not (consp str))
- (put-text-property (point) (progn (insert str) (point))
- 'mouse-face 'highlight)
- (put-text-property (point) (progn (insert (car str)) (point))
- 'mouse-face 'highlight)
- (add-text-properties (point) (progn (insert (cadr str)) (point))
- '(mouse-face nil
- face completions-annotations)))
- (cond
- ((eq completions-format 'vertical)
-
- (if (> column 0)
- (forward-line)
- (insert "\n"))
- (setq row (1+ row)))
- (t
-
-
- (setq column (+ column
-
- (* colwidth (ceiling length colwidth))))))))))))
- (defvar completion-common-substring nil)
- (make-obsolete-variable 'completion-common-substring nil "23.1")
- (defvar completion-setup-hook nil
- "Normal hook run at the end of setting up a completion list buffer.
- When this hook is run, the current buffer is the one in which the
- command to display the completion list buffer was run.
- The completion list buffer is available as the value of `standard-output'.
- See also `display-completion-list'.")
- (defface completions-first-difference
- '((t (:inherit bold)))
- "Face put on the first uncommon character in completions in *Completions* buffer."
- :group 'completion)
- (defface completions-common-part
- '((t (:inherit default)))
- "Face put on the common prefix substring in completions in *Completions* buffer.
- The idea of `completions-common-part' is that you can use it to
- make the common parts less visible than normal, so that the rest
- of the differing parts is, by contrast, slightly highlighted."
- :group 'completion)
- (defun completion-hilit-commonality (completions prefix-len base-size)
- (when completions
- (let ((com-str-len (- prefix-len (or base-size 0))))
- (nconc
- (mapcar
- (lambda (elem)
- (let ((str
-
-
-
-
- (if (consp elem)
- (car (setq elem (cons (copy-sequence (car elem))
- (cdr elem))))
- (setq elem (copy-sequence elem)))))
- (put-text-property 0
-
-
-
- (min com-str-len (length str))
- 'font-lock-face 'completions-common-part
- str)
- (if (> (length str) com-str-len)
- (put-text-property com-str-len (1+ com-str-len)
- 'font-lock-face 'completions-first-difference
- str)))
- elem)
- completions)
- base-size))))
- (defun display-completion-list (completions &optional common-substring)
- "Display the list of completions, COMPLETIONS, using `standard-output'.
- Each element may be just a symbol or string
- or may be a list of two strings to be printed as if concatenated.
- If it is a list of two strings, the first is the actual completion
- alternative, the second serves as annotation.
- `standard-output' must be a buffer.
- The actual completion alternatives, as inserted, are given `mouse-face'
- properties of `highlight'.
- At the end, this runs the normal hook `completion-setup-hook'.
- It can find the completion buffer in `standard-output'.
- The obsolete optional arg COMMON-SUBSTRING, if non-nil, should be a string
- specifying a common substring for adding the faces
- `completions-first-difference' and `completions-common-part' to
- the completions buffer."
- (if common-substring
- (setq completions (completion-hilit-commonality
- completions (length common-substring)
-
- nil)))
- (if (not (bufferp standard-output))
-
- (with-temp-buffer
- (let ((standard-output (current-buffer))
- (completion-setup-hook nil))
- (display-completion-list completions common-substring))
- (princ (buffer-string)))
- (with-current-buffer standard-output
- (goto-char (point-max))
- (if (null completions)
- (insert "There are no possible completions of what you have typed.")
- (insert "Possible completions are:\n")
- (completion--insert-strings completions))))
-
-
- (with-no-warnings
- (let ((completion-common-substring common-substring))
- (run-hooks 'completion-setup-hook)))
- nil)
- (defvar completion-extra-properties nil
- "Property list of extra properties of the current completion job.
- These include:
- `:annotation-function': Function to annotate the completions buffer.
- The function must accept one argument, a completion string,
- and return either nil or a string which is to be displayed
- next to the completion (but which is not part of the
- completion). The function can access the completion data via
- `minibuffer-completion-table' and related variables.
- `:exit-function': Function to run after completion is performed.
- The function must accept two arguments, STRING and STATUS.
- STRING is the text to which the field was completed, and
- STATUS indicates what kind of operation happened:
- `finished' - text is now complete
- `sole' - text cannot be further completed but
- completion is not finished
- `exact' - text is a valid completion but may be further
- completed.")
- (defvar completion-annotate-function
- nil
-
-
-
-
-
-
-
-
-
- "Function to add annotations in the *Completions* buffer.
- The function takes a completion and should either return nil, or a string that
- will be displayed next to the completion. The function can access the
- completion table and predicates via `minibuffer-completion-table' and related
- variables.")
- (make-obsolete-variable 'completion-annotate-function
- 'completion-extra-properties "24.1")
- (defun completion--done (string &optional finished message)
- (let* ((exit-fun (plist-get completion-extra-properties :exit-function))
- (pre-msg (and exit-fun (current-message))))
- (assert (memq finished '(exact sole finished unknown)))
-
- (when exit-fun
- (when (eq finished 'unknown)
- (setq finished
- (if (eq (try-completion string
- minibuffer-completion-table
- minibuffer-completion-predicate)
- t)
- 'finished 'exact)))
- (funcall exit-fun string finished))
- (when (and message
-
- (equal pre-msg (and exit-fun (current-message))))
- (completion--message message))))
- (defun minibuffer-completion-help ()
- "Display a list of possible completions of the current minibuffer contents."
- (interactive)
- (message "Making completion list...")
- (let* ((start (field-beginning))
- (end (field-end))
- (string (field-string))
- (md (completion--field-metadata start))
- (completions (completion-all-completions
- string
- minibuffer-completion-table
- minibuffer-completion-predicate
- (- (point) (field-beginning))
- md)))
- (message nil)
- (if (or (null completions)
- (and (not (consp (cdr completions)))
- (equal (car completions) string)))
- (progn
-
-
- (minibuffer-hide-completions)
- (ding)
- (minibuffer-message
- (if completions "Sole completion" "No completions")))
- (let* ((last (last completions))
- (base-size (cdr last))
- (prefix (unless (zerop base-size) (substring string 0 base-size)))
- (all-md (completion--metadata (buffer-substring-no-properties
- start (point))
- base-size md
- minibuffer-completion-table
- minibuffer-completion-predicate))
- (afun (or (completion-metadata-get all-md 'annotation-function)
- (plist-get completion-extra-properties
- :annotation-function)
- completion-annotate-function))
-
-
-
-
- (display-buffer-mark-dedicated 'soft))
- (with-output-to-temp-buffer "*Completions*"
-
-
- (when last (setcdr last nil))
- (setq completions
-
-
-
- (let ((sort-fun (completion-metadata-get
- all-md 'display-sort-function)))
- (if sort-fun
- (funcall sort-fun completions)
- (sort completions 'string-lessp))))
- (when afun
- (setq completions
- (mapcar (lambda (s)
- (let ((ann (funcall afun s)))
- (if ann (list s ann) s)))
- completions)))
- (with-current-buffer standard-output
- (set (make-local-variable 'completion-base-position)
- (list (+ start base-size)
-
-
-
-
- end))
- (set (make-local-variable 'completion-list-insert-choice-function)
- (let ((ctable minibuffer-completion-table)
- (cpred minibuffer-completion-predicate)
- (cprops completion-extra-properties))
- (lambda (start end choice)
- (unless (or (zerop (length prefix))
- (equal prefix
- (buffer-substring-no-properties
- (max (point-min)
- (- start (length prefix)))
- start)))
- (message "*Completions* out of date"))
-
- (completion--replace start end choice)
- (let* ((minibuffer-completion-table ctable)
- (minibuffer-completion-predicate cpred)
- (completion-extra-properties cprops)
- (result (concat prefix choice))
- (bounds (completion-boundaries
- result ctable cpred "")))
-
-
- (completion--done result
- (if (eq (car bounds) (length result))
- 'exact 'finished)))))))
- (display-completion-list completions))))
- nil))
- (defun minibuffer-hide-completions ()
- "Get rid of an out-of-date *Completions* buffer."
-
-
- (let ((win (get-buffer-window "*Completions*" 0)))
- (if win (with-selected-window win (bury-buffer)))))
- (defun exit-minibuffer ()
- "Terminate this minibuffer argument."
- (interactive)
-
-
-
-
-
-
- (setq deactivate-mark nil)
- (throw 'exit nil))
- (defun self-insert-and-exit ()
- "Terminate minibuffer input."
- (interactive)
- (if (characterp last-command-event)
- (call-interactively 'self-insert-command)
- (ding))
- (exit-minibuffer))
- (defvar completion-in-region-functions nil
- "Wrapper hook around `completion-in-region'.
- The functions on this special hook are called with 5 arguments:
- NEXT-FUN START END COLLECTION PREDICATE.
- NEXT-FUN is a function of four arguments (START END COLLECTION PREDICATE)
- that performs the default operation. The other four arguments are like
- the ones passed to `completion-in-region'. The functions on this hook
- are expected to perform completion on START..END using COLLECTION
- and PREDICATE, either by calling NEXT-FUN or by doing it themselves.")
- (defvar completion-in-region--data nil)
- (defvar completion-in-region-mode-predicate nil
- "Predicate to tell `completion-in-region-mode' when to exit.
- It is called with no argument and should return nil when
- `completion-in-region-mode' should exit (and hence pop down
- the *Completions* buffer).")
- (defvar completion-in-region-mode--predicate nil
- "Copy of the value of `completion-in-region-mode-predicate'.
- This holds the value `completion-in-region-mode-predicate' had when
- we entered `completion-in-region-mode'.")
- (defun completion-in-region (start end collection &optional predicate)
- "Complete the text between START and END using COLLECTION.
- Return nil if there is no valid completion, else t.
- Point needs to be somewhere between START and END.
- PREDICATE (a function called with no arguments) says when to
- exit."
- (assert (<= start (point)) (<= (point) end))
- (with-wrapper-hook
-
-
- completion-in-region-functions (start end collection predicate)
- (let ((minibuffer-completion-table collection)
- (minibuffer-completion-predicate predicate)
- (ol (make-overlay start end nil nil t)))
- (overlay-put ol 'field 'completion)
-
-
- (overlay-put ol 'priority 100)
- (when completion-in-region-mode-predicate
- (completion-in-region-mode 1)
- (setq completion-in-region--data
- (list (current-buffer) start end collection)))
- (unwind-protect
- (call-interactively 'minibuffer-complete)
- (delete-overlay ol)))))
- (defvar completion-in-region-mode-map
- (let ((map (make-sparse-keymap)))
-
-
- (define-key map "\M-?" 'completion-help-at-point)
- (define-key map "\t" 'completion-at-point)
- map)
- "Keymap activated during `completion-in-region'.")
- (defun completion-in-region--postch ()
- (or unread-command-events
-
- (and completion-in-region--data
- (and (eq (car completion-in-region--data)
- (current-buffer))
- (>= (point) (nth 1 completion-in-region--data))
- (<= (point)
- (save-excursion
- (goto-char (nth 2 completion-in-region--data))
- (line-end-position)))
- (funcall completion-in-region-mode--predicate)))
- (completion-in-region-mode -1)))
- (define-minor-mode completion-in-region-mode
- "Transient minor mode used during `completion-in-region'.
- With a prefix argument ARG, enable the modemode if ARG is
- positive, and disable it otherwise. If called from Lisp, enable
- the mode if ARG is omitted or nil."
- :global t
- (setq completion-in-region--data nil)
-
- (remove-hook 'post-command-hook #'completion-in-region--postch)
- (setq minor-mode-overriding-map-alist
- (delq (assq 'completion-in-region-mode minor-mode-overriding-map-alist)
- minor-mode-overriding-map-alist))
- (if (null completion-in-region-mode)
- (unless (equal "*Completions*" (buffer-name (window-buffer)))
- (minibuffer-hide-completions))
-
- (assert completion-in-region-mode-predicate)
- (setq completion-in-region-mode--predicate
- completion-in-region-mode-predicate)
- (add-hook 'post-command-hook #'completion-in-region--postch)
- (push `(completion-in-region-mode . ,completion-in-region-mode-map)
- minor-mode-overriding-map-alist)))
- (setq minor-mode-map-alist
- (delq (assq 'completion-in-region-mode minor-mode-map-alist)
- minor-mode-map-alist))
- (defvar completion-at-point-functions '(tags-completion-at-point-function)
- "Special hook to find the completion table for the thing at point.
- Each function on this hook is called in turns without any argument and should
- return either nil to mean that it is not applicable at point,
- or a function of no argument to perform completion (discouraged),
- or a list of the form (START END COLLECTION . PROPS) where
- START and END delimit the entity to complete and should include point,
- COLLECTION is the completion table to use to complete it, and
- PROPS is a property list for additional information.
- Currently supported properties are all the properties that can appear in
- `completion-extra-properties' plus:
- `:predicate' a predicate that completion candidates need to satisfy.
- `:exclusive' If `no', means that if the completion table fails to
- match the text at point, then instead of reporting a completion
- failure, the completion should try the next completion function.")
- (defvar completion--capf-misbehave-funs nil
- "List of functions found on `completion-at-point-functions' that misbehave.
- These are functions that neither return completion data nor a completion
- function but instead perform completion right away.")
- (defvar completion--capf-safe-funs nil
- "List of well-behaved functions found on `completion-at-point-functions'.
- These are functions which return proper completion data rather than
- a completion function or god knows what else.")
- (defun completion--capf-wrapper (fun which)
-
-
-
-
- (if (case which
- (all t)
- (safe (member fun completion--capf-safe-funs))
- (optimist (not (member fun completion--capf-misbehave-funs))))
- (let ((res (funcall fun)))
- (cond
- ((and (consp res) (not (functionp res)))
- (unless (member fun completion--capf-safe-funs)
- (push fun completion--capf-safe-funs))
- (and (eq 'no (plist-get (nthcdr 3 res) :exclusive))
-
-
-
-
-
-
-
-
- (null (try-completion (buffer-substring-no-properties
- (car res) (point))
- (nth 2 res)
- (plist-get (nthcdr 3 res) :predicate)))
- (setq res nil)))
- ((not (or (listp res) (functionp res)))
- (unless (member fun completion--capf-misbehave-funs)
- (message
- "Completion function %S uses a deprecated calling convention" fun)
- (push fun completion--capf-misbehave-funs))))
- (if res (cons fun res)))))
- (defun completion-at-point ()
- "Perform completion on the text around point.
- The completion method is determined by `completion-at-point-functions'."
- (interactive)
- (let ((res (run-hook-wrapped 'completion-at-point-functions
- #'completion--capf-wrapper 'all)))
- (pcase res
- (`(,_ . ,(and (pred functionp) f)) (funcall f))
- (`(,hookfun . (,start ,end ,collection . ,plist))
- (let* ((completion-extra-properties plist)
- (completion-in-region-mode-predicate
- (lambda ()
-
- (eq (car-safe (funcall hookfun)) start))))
- (completion-in-region start end collection
- (plist-get plist :predicate))))
-
- (_ (cdr res)))))
- (defun completion-help-at-point ()
- "Display the completions on the text around point.
- The completion method is determined by `completion-at-point-functions'."
- (interactive)
- (let ((res (run-hook-wrapped 'completion-at-point-functions
-
- #'completion--capf-wrapper 'optimist)))
- (pcase res
- (`(,_ . ,(and (pred functionp) f))
- (message "Don't know how to show completions for %S" f))
- (`(,hookfun . (,start ,end ,collection . ,plist))
- (let* ((minibuffer-completion-table collection)
- (minibuffer-completion-predicate (plist-get plist :predicate))
- (completion-extra-properties plist)
- (completion-in-region-mode-predicate
- (lambda ()
-
- (eq (car-safe (funcall hookfun)) start)))
- (ol (make-overlay start end nil nil t)))
-
-
-
- (overlay-put ol 'field 'completion)
- (overlay-put ol 'priority 100)
- (completion-in-region-mode 1)
- (setq completion-in-region--data
- (list (current-buffer) start end collection))
- (unwind-protect
- (call-interactively 'minibuffer-completion-help)
- (delete-overlay ol))))
- (`(,hookfun . ,_)
-
-
- (message "%s already performed completion!" hookfun)
- nil)
- (_ (message "Nothing to complete at point")))))
- (let ((map minibuffer-local-map))
- (define-key map "\C-g" 'abort-recursive-edit)
- (define-key map "\r" 'exit-minibuffer)
- (define-key map "\n" 'exit-minibuffer))
- (defvar minibuffer-local-completion-map
- (let ((map (make-sparse-keymap)))
- (set-keymap-parent map minibuffer-local-map)
- (define-key map "\t" 'minibuffer-complete)
-
-
-
- (define-key map " " 'minibuffer-complete-word)
- (define-key map "?" 'minibuffer-completion-help)
- map)
- "Local keymap for minibuffer input with completion.")
- (defvar minibuffer-local-must-match-map
- (let ((map (make-sparse-keymap)))
- (set-keymap-parent map minibuffer-local-completion-map)
- (define-key map "\r" 'minibuffer-complete-and-exit)
- (define-key map "\n" 'minibuffer-complete-and-exit)
- map)
- "Local keymap for minibuffer input with completion, for exact match.")
- (defvar minibuffer-local-filename-completion-map
- (let ((map (make-sparse-keymap)))
- (define-key map " " nil)
- map)
- "Local keymap for minibuffer input with completion for filenames.
- Gets combined either with `minibuffer-local-completion-map' or
- with `minibuffer-local-must-match-map'.")
- (defvar minibuffer-local-filename-must-match-map (make-sparse-keymap))
- (make-obsolete-variable 'minibuffer-local-filename-must-match-map nil "24.1")
- (define-obsolete-variable-alias 'minibuffer-local-must-match-filename-map
- 'minibuffer-local-filename-must-match-map "23.1")
- (let ((map minibuffer-local-ns-map))
- (define-key map " " 'exit-minibuffer)
- (define-key map "\t" 'exit-minibuffer)
- (define-key map "?" 'self-insert-and-exit))
- (defvar minibuffer-inactive-mode-map
- (let ((map (make-keymap)))
- (suppress-keymap map)
- (define-key map "e" 'find-file-other-frame)
- (define-key map "f" 'find-file-other-frame)
- (define-key map "b" 'switch-to-buffer-other-frame)
- (define-key map "i" 'info)
- (define-key map "m" 'mail)
- (define-key map "n" 'make-frame)
- (define-key map [mouse-1] (lambda () (interactive)
- (with-current-buffer "*Messages*"
- (goto-char (point-max))
- (display-buffer (current-buffer)))))
-
-
- (define-key map [down-mouse-1] #'ignore)
- map)
- "Keymap for use in the minibuffer when it is not active.
- The non-mouse bindings in this keymap can only be used in minibuffer-only
- frames, since the minibuffer can normally not be selected when it is
- not active.")
- (define-derived-mode minibuffer-inactive-mode nil "InactiveMinibuffer"
- :abbrev-table nil
-
- "Major mode to use in the minibuffer when it is not active.
- This is only used when the minibuffer area has no active minibuffer.")
- (defun minibuffer--double-dollars (str)
- (replace-regexp-in-string "\\$" "$$" str))
- (defun completion--make-envvar-table ()
- (mapcar (lambda (enventry)
- (substring enventry 0 (string-match-p "=" enventry)))
- process-environment))
- (defconst completion--embedded-envvar-re
- (concat "\\(?:^\\|[^$]\\(?:\\$\\$\\)*\\)"
- "$\\([[:alnum:]_]*\\|{\\([^}]*\\)\\)\\'"))
- (defun completion--embedded-envvar-table (string _pred action)
- "Completion table for envvars embedded in a string.
- The envvar syntax (and escaping) rules followed by this table are the
- same as `substitute-in-file-name'."
-
-
-
-
-
- (when (string-match completion--embedded-envvar-re string)
- (let* ((beg (or (match-beginning 2) (match-beginning 1)))
- (table (completion--make-envvar-table))
- (prefix (substring string 0 beg)))
- (cond
- ((eq action 'lambda)
-
-
-
- nil)
- ((or (eq (car-safe action) 'boundaries) (eq action 'metadata))
-
-
-
-
-
-
-
- (when (try-completion (substring string beg) table nil)
-
-
- (if (eq action 'metadata)
- '(metadata (category . environment-variable))
- (let ((suffix (cdr action)))
- (list* 'boundaries
- (or (match-beginning 2) (match-beginning 1))
- (when (string-match "[^[:alnum:]_]" suffix)
- (match-beginning 0)))))))
- (t
- (if (eq (aref string (1- beg)) ?{)
- (setq table (apply-partially 'completion-table-with-terminator
- "}" table)))
-
-
- (let ((completion-ignore-case nil))
- (completion-table-with-context
- prefix table (substring string beg) nil action)))))))
- (defun completion-file-name-table (string pred action)
- "Completion table for file names."
- (condition-case nil
- (cond
- ((eq action 'metadata) '(metadata (category . file)))
- ((eq (car-safe action) 'boundaries)
- (let ((start (length (file-name-directory string)))
- (end (string-match-p "/" (cdr action))))
- (list* 'boundaries
-
-
-
-
-
-
- (min start (length string)) end)))
- ((eq action 'lambda)
- (if (zerop (length string))
- nil
- (funcall (or pred 'file-exists-p) string)))
- (t
- (let* ((name (file-name-nondirectory string))
- (specdir (file-name-directory string))
- (realdir (or specdir default-directory)))
- (cond
- ((null action)
- (let ((comp (file-name-completion name realdir pred)))
- (if (stringp comp)
- (concat specdir comp)
- comp)))
- ((eq action t)
- (let ((all (file-name-all-completions name realdir)))
-
- (unless (memq pred '(nil file-exists-p))
- (let ((comp ())
- (pred
- (if (eq pred 'file-directory-p)
-
-
- (lambda (s)
- (let ((len (length s)))
- (and (> len 0) (eq (aref s (1- len)) ?/))))
-
- pred)))
- (let ((default-directory (expand-file-name realdir)))
- (dolist (tem all)
- (if (funcall pred tem) (push tem comp))))
- (setq all (nreverse comp))))
- all))))))
- (file-error nil)))
- (defvar read-file-name-predicate nil
- "Current predicate used by `read-file-name-internal'.")
- (make-obsolete-variable 'read-file-name-predicate
- "use the regular PRED argument" "23.2")
- (defun completion--file-name-table (string pred action)
- "Internal subroutine for `read-file-name'. Do not call this.
- This is a completion table for file names, like `completion-file-name-table'
- except that it passes the file name through `substitute-in-file-name'."
- (cond
- ((eq (car-safe action) 'boundaries)
-
-
-
-
-
-
-
-
-
-
-
-
- (completion-file-name-table string pred action))
- (t
- (let* ((default-directory
- (if (stringp pred)
-
-
- (prog1 (file-name-as-directory (expand-file-name pred))
- (setq pred nil))
- default-directory))
- (str (condition-case nil
- (substitute-in-file-name string)
- (error string)))
- (comp (completion-file-name-table
- str
- (with-no-warnings (or pred read-file-name-predicate))
- action)))
- (cond
- ((stringp comp)
-
- (minibuffer--double-dollars comp))
- ((and (null action) comp
-
- (setq str (minibuffer--double-dollars str))
- (not (string-equal string str)))
-
-
- str)
- (t comp))))))
- (defalias 'read-file-name-internal
- (completion-table-in-turn 'completion--embedded-envvar-table
- 'completion--file-name-table)
- "Internal subroutine for `read-file-name'. Do not call this.")
- (defvar read-file-name-function 'read-file-name-default
- "The function called by `read-file-name' to do its work.
- It should accept the same arguments as `read-file-name'.")
- (defcustom read-file-name-completion-ignore-case
- (if (memq system-type '(ms-dos windows-nt darwin cygwin))
- t nil)
- "Non-nil means when reading a file name completion ignores case."
- :group 'minibuffer
- :type 'boolean
- :version "22.1")
- (defcustom insert-default-directory t
- "Non-nil means when reading a filename start with default dir in minibuffer.
- When the initial minibuffer contents show a name of a file or a directory,
- typing RETURN without editing the initial contents is equivalent to typing
- the default file name.
- If this variable is non-nil, the minibuffer contents are always
- initially non-empty, and typing RETURN without editing will fetch the
- default name, if one is provided. Note however that this default name
- is not necessarily the same as initial contents inserted in the minibuffer,
- if the initial contents is just the default directory.
- If this variable is nil, the minibuffer often starts out empty. In
- that case you may have to explicitly fetch the next history element to
- request the default name; typing RETURN without editing will leave
- the minibuffer empty.
- For some commands, exiting with an empty minibuffer has a special meaning,
- such as making the current buffer visit no file in the case of
- `set-visited-file-name'."
- :group 'minibuffer
- :type 'boolean)
- (declare-function x-file-dialog "xfns.c"
- (prompt dir &optional default-filename mustmatch only-dir-p))
- (defun read-file-name--defaults (&optional dir initial)
- (let ((default
- (cond
-
-
-
-
-
-
-
-
-
- (initial (abbreviate-file-name dir))
-
- (buffer-file-name
- (abbreviate-file-name buffer-file-name))))
- (file-name-at-point
- (run-hook-with-args-until-success 'file-name-at-point-functions)))
- (when file-name-at-point
- (setq default (delete-dups
- (delete "" (delq nil (list file-name-at-point default))))))
-
- (append
- (if (listp minibuffer-default) minibuffer-default (list minibuffer-default))
- (if (listp default) default (list default)))))
- (defun read-file-name (prompt &optional dir default-filename mustmatch initial predicate)
- "Read file name, prompting with PROMPT and completing in directory DIR.
- Value is not expanded---you must call `expand-file-name' yourself.
- Default name to DEFAULT-FILENAME if user exits the minibuffer with
- the same non-empty string that was inserted by this function.
- (If DEFAULT-FILENAME is omitted, the visited file name is used,
- except that if INITIAL is specified, that combined with DIR is used.
- If DEFAULT-FILENAME is a list of file names, the first file name is used.)
- If the user exits with an empty minibuffer, this function returns
- an empty string. (This can only happen if the user erased the
- pre-inserted contents or if `insert-default-directory' is nil.)
- Fourth arg MUSTMATCH can take the following values:
- - nil means that the user can exit with any input.
- - t means that the user is not allowed to exit unless
- the input is (or completes to) an existing file.
- - `confirm' means that the user can exit with any input, but she needs
- to confirm her choice if the input is not an existing file.
- - `confirm-after-completion' means that the user can exit with any
- input, but she needs to confirm her choice if she called
- `minibuffer-complete' right before `minibuffer-complete-and-exit'
- and the input is not an existing file.
- - anything else behaves like t except that typing RET does not exit if it
- does non-null completion.
- Fifth arg INITIAL specifies text to start with.
- If optional sixth arg PREDICATE is non-nil, possible completions and
- the resulting file name must satisfy (funcall PREDICATE NAME).
- DIR should be an absolute directory name. It defaults to the value of
- `default-directory'.
- If this command was invoked with the mouse, use a graphical file
- dialog if `use-dialog-box' is non-nil, and the window system or X
- toolkit in use provides a file dialog box, and DIR is not a
- remote file. For graphical file dialogs, any of the special values
- of MUSTMATCH `confirm' and `confirm-after-completion' are
- treated as equivalent to nil. Some graphical file dialogs respect
- a MUSTMATCH value of t, and some do not (or it only has a cosmetic
- effect, and does not actually prevent the user from entering a
- non-existent file).
- See also `read-file-name-completion-ignore-case'
- and `read-file-name-function'."
-
-
-
-
- (funcall (or read-file-name-function #'read-file-name-default)
- prompt dir default-filename mustmatch initial predicate))
- (defun read-file-name-default (prompt &optional dir default-filename mustmatch initial predicate)
- "Default method for reading file names.
- See `read-file-name' for the meaning of the arguments."
- (unless dir (setq dir default-directory))
- (unless (file-name-absolute-p dir) (setq dir (expand-file-name dir)))
- (unless default-filename
- (setq default-filename (if initial (expand-file-name initial dir)
- buffer-file-name)))
-
- (setq dir (abbreviate-file-name dir))
-
- (if default-filename
- (setq default-filename
- (if (consp default-filename)
- (mapcar 'abbreviate-file-name default-filename)
- (abbreviate-file-name default-filename))))
- (let ((insdef (cond
- ((and insert-default-directory (stringp dir))
- (if initial
- (cons (minibuffer--double-dollars (concat dir initial))
- (length (minibuffer--double-dollars dir)))
- (minibuffer--double-dollars dir)))
- (initial (cons (minibuffer--double-dollars initial) 0)))))
- (let ((completion-ignore-case read-file-name-completion-ignore-case)
- (minibuffer-completing-file-name t)
- (pred (or predicate 'file-exists-p))
- (add-to-history nil))
- (let* ((val
- (if (or (not (next-read-file-uses-dialog-p))
-
-
- (file-remote-p dir))
-
-
-
-
-
- (let ((dir (file-name-as-directory
- (expand-file-name dir))))
- (minibuffer-with-setup-hook
- (lambda ()
- (setq default-directory dir)
-
-
-
- (when (equal (or (car-safe insdef) insdef)
- (or (car-safe minibuffer-default)
- minibuffer-default))
- (setq minibuffer-default
- (cdr-safe minibuffer-default)))
-
-
-
- (set (make-local-variable 'minibuffer-default-add-function)
- (lambda ()
- (with-current-buffer
- (window-buffer (minibuffer-selected-window))
- (read-file-name--defaults dir initial)))))
- (completing-read prompt 'read-file-name-internal
- pred mustmatch insdef
- 'file-name-history default-filename)))
-
-
- (let ((file (file-name-nondirectory dir))
-
-
-
-
-
- (dialog-mustmatch
- (not (memq mustmatch
- '(nil confirm confirm-after-completion)))))
- (when (and (not default-filename)
- (not (zerop (length file))))
- (setq default-filename file)
- (setq dir (file-name-directory dir)))
- (when default-filename
- (setq default-filename
- (expand-file-name (if (consp default-filename)
- (car default-filename)
- default-filename)
- dir)))
- (setq add-to-history t)
- (x-file-dialog prompt dir default-filename
- dialog-mustmatch
- (eq predicate 'file-directory-p)))))
- (replace-in-history (eq (car-safe file-name-history) val)))
-
-
-
-
-
- (when (consp default-filename)
- (setq default-filename (car default-filename)))
- (when (eq val default-filename)
-
-
- (if (not replace-in-history)
- (setq add-to-history t))
- (setq val ""))
- (unless val (error "No file name specified"))
- (if (and default-filename
- (string-equal val (if (consp insdef) (car insdef) insdef)))
- (setq val default-filename))
- (setq val (substitute-in-file-name val))
- (if replace-in-history
-
-
-
-
- (let ((val1 (minibuffer--double-dollars val)))
- (if history-delete-duplicates
- (setcdr file-name-history
- (delete val1 (cdr file-name-history))))
- (if (string= val1 (cadr file-name-history))
- (pop file-name-history)
- (setcar file-name-history val1)))
- (if add-to-history
-
-
- (let ((val1 (minibuffer--double-dollars val)))
- (unless (and (consp file-name-history)
- (equal (car file-name-history) val1))
- (setq file-name-history
- (cons val1
- (if history-delete-duplicates
- (delete val1 file-name-history)
- file-name-history)))))))
- val))))
- (defun internal-complete-buffer-except (&optional buffer)
- "Perform completion on all buffers excluding BUFFER.
- BUFFER nil or omitted means use the current buffer.
- Like `internal-complete-buffer', but removes BUFFER from the completion list."
- (let ((except (if (stringp buffer) buffer (buffer-name buffer))))
- (apply-partially 'completion-table-with-predicate
- 'internal-complete-buffer
- (lambda (name)
- (not (equal (if (consp name) (car name) name) except)))
- nil)))
- (defun completion-emacs21-try-completion (string table pred _point)
- (let ((completion (try-completion string table pred)))
- (if (stringp completion)
- (cons completion (length completion))
- completion)))
- (defun completion-emacs21-all-completions (string table pred _point)
- (completion-hilit-commonality
- (all-completions string table pred)
- (length string)
- (car (completion-boundaries string table pred ""))))
- (defun completion-emacs22-try-completion (string table pred point)
- (let ((suffix (substring string point))
- (completion (try-completion (substring string 0 point) table pred)))
- (if (not (stringp completion))
- completion
-
-
-
-
-
-
-
- (if (and (not (zerop (length completion)))
- (eq ?/ (aref completion (1- (length completion))))
- (not (zerop (length suffix)))
- (eq ?/ (aref suffix 0)))
-
- (setq suffix (substring suffix 1)))
- (cons (concat completion suffix) (length completion)))))
- (defun completion-emacs22-all-completions (string table pred point)
- (let ((beforepoint (substring string 0 point)))
- (completion-hilit-commonality
- (all-completions beforepoint table pred)
- point
- (car (completion-boundaries beforepoint table pred "")))))
- (defun completion--merge-suffix (completion point suffix)
- "Merge end of COMPLETION with beginning of SUFFIX.
- Simple generalization of the \"merge trailing /\" done in Emacs-22.
- Return the new suffix."
- (if (and (not (zerop (length suffix)))
- (string-match "\\(.+\\)\n\\1" (concat completion "\n" suffix)
-
-
- point)
-
- (eq (match-end 1) (length completion)))
- (substring suffix (- (match-end 1) (match-beginning 1)))
-
- suffix))
- (defun completion-basic--pattern (beforepoint afterpoint bounds)
- (delete
- "" (list (substring beforepoint (car bounds))
- 'point
- (substring afterpoint 0 (cdr bounds)))))
- (defun completion-basic-try-completion (string table pred point)
- (let* ((beforepoint (substring string 0 point))
- (afterpoint (substring string point))
- (bounds (completion-boundaries beforepoint table pred afterpoint)))
- (if (zerop (cdr bounds))
-
-
- (let ((completion (try-completion beforepoint table pred)))
- (if (not (stringp completion))
- completion
- (cons
- (concat completion
- (completion--merge-suffix completion point afterpoint))
- (length completion))))
- (let* ((suffix (substring afterpoint (cdr bounds)))
- (prefix (substring beforepoint 0 (car bounds)))
- (pattern (delete
- "" (list (substring beforepoint (car bounds))
- 'point
- (substring afterpoint 0 (cdr bounds)))))
- (all (completion-pcm--all-completions prefix pattern table pred)))
- (if minibuffer-completing-file-name
- (setq all (completion-pcm--filename-try-filter all)))
- (completion-pcm--merge-try pattern all prefix suffix)))))
- (defun completion-basic-all-completions (string table pred point)
- (let* ((beforepoint (substring string 0 point))
- (afterpoint (substring string point))
- (bounds (completion-boundaries beforepoint table pred afterpoint))
-
- (prefix (substring beforepoint 0 (car bounds)))
- (pattern (delete
- "" (list (substring beforepoint (car bounds))
- 'point
- (substring afterpoint 0 (cdr bounds)))))
- (all (completion-pcm--all-completions prefix pattern table pred)))
- (completion-hilit-commonality all point (car bounds))))
- (defvar completion-pcm--delim-wild-regex nil
- "Regular expression matching delimiters controlling the partial-completion.
- Typically, this regular expression simply matches a delimiter, meaning
- that completion can add something at (match-beginning 0), but if it has
- a submatch 1, then completion can add something at (match-end 1).
- This is used when the delimiter needs to be of size zero (e.g. the transition
- from lowercase to uppercase characters).")
- (defun completion-pcm--prepare-delim-re (delims)
- (setq completion-pcm--delim-wild-regex (concat "[" delims "*]")))
- (defcustom completion-pcm-word-delimiters "-_./:| "
- "A string of characters treated as word delimiters for completion.
- Some arcane rules:
- If `]' is in this string, it must come first.
- If `^' is in this string, it must not come first.
- If `-' is in this string, it must come first or right after `]'.
- In other words, if S is this string, then `[S]' must be a valid Emacs regular
- expression (not containing character ranges like `a-z')."
- :set (lambda (symbol value)
- (set-default symbol value)
-
- (completion-pcm--prepare-delim-re value))
- :initialize 'custom-initialize-reset
- :group 'minibuffer
- :type 'string)
- (defcustom completion-pcm-complete-word-inserts-delimiters nil
- "Treat the SPC or - inserted by `minibuffer-complete-word' as delimiters.
- Those chars are treated as delimiters iff this variable is non-nil.
- I.e. if non-nil, M-x SPC will just insert a \"-\" in the minibuffer, whereas
- if nil, it will list all possible commands in *Completions* because none of
- the commands start with a \"-\" or a SPC."
- :version "24.1"
- :type 'boolean)
- (defun completion-pcm--pattern-trivial-p (pattern)
- (and (stringp (car pattern))
-
- (let ((trivial t))
- (dolist (elem (cdr pattern))
- (unless (member elem '(point ""))
- (setq trivial nil)))
- trivial)))
- (defun completion-pcm--string->pattern (string &optional point)
- "Split STRING into a pattern.
- A pattern is a list where each element is either a string
- or a symbol, see `completion-pcm--merge-completions'."
- (if (and point (< point (length string)))
- (let ((prefix (substring string 0 point))
- (suffix (substring string point)))
- (append (completion-pcm--string->pattern prefix)
- '(point)
- (completion-pcm--string->pattern suffix)))
- (let* ((pattern nil)
- (p 0)
- (p0 p))
- (while (and (setq p (string-match completion-pcm--delim-wild-regex
- string p))
- (or completion-pcm-complete-word-inserts-delimiters
-
-
-
-
- (not (get-text-property p 'completion-try-word string))))
-
-
-
-
-
-
- (if (match-end 1) (setq p (match-end 1)))
- (push (substring string p0 p) pattern)
- (if (eq (aref string p) ?*)
- (progn
- (push 'star pattern)
- (setq p0 (1+ p)))
- (push 'any pattern)
- (setq p0 p))
- (incf p))
-
-
- (delete "" (nreverse (cons (substring string p0) pattern))))))
- (defun completion-pcm--pattern->regex (pattern &optional group)
- (let ((re
- (concat "\\`"
- (mapconcat
- (lambda (x)
- (cond
- ((stringp x) (regexp-quote x))
- ((if (consp group) (memq x group) group) "\\(.*?\\)")
- (t ".*?")))
- pattern
- ""))))
-
- (while (string-match "\\.\\*\\?\\(?:\\\\[()]\\)*\\(\\.\\*\\?\\)" re)
- (setq re (replace-match "" t t re 1)))
- re))
- (defun completion-pcm--all-completions (prefix pattern table pred)
- "Find all completions for PATTERN in TABLE obeying PRED.
- PATTERN is as returned by `completion-pcm--string->pattern'."
-
-
-
- (if (completion-pcm--pattern-trivial-p pattern)
-
- (all-completions (concat prefix (car pattern)) table pred)
-
-
- (let* (
- (regex (completion-pcm--pattern->regex pattern))
- (case-fold-search completion-ignore-case)
- (completion-regexp-list (cons regex completion-regexp-list))
- (compl (all-completions
- (concat prefix
- (if (stringp (car pattern)) (car pattern) ""))
- table pred)))
- (if (not (functionp table))
-
- compl
- (let ((poss ()))
- (dolist (c compl)
- (when (string-match-p regex c) (push c poss)))
- poss)))))
- (defun completion-pcm--hilit-commonality (pattern completions)
- (when completions
- (let* ((re (completion-pcm--pattern->regex pattern '(point)))
- (case-fold-search completion-ignore-case))
- (mapcar
- (lambda (str)
-
- (setq str (copy-sequence str))
- (unless (string-match re str)
- (error "Internal error: %s does not match %s" re str))
- (let ((pos (or (match-beginning 1) (match-end 0))))
- (put-text-property 0 pos
- 'font-lock-face 'completions-common-part
- str)
- (if (> (length str) pos)
- (put-text-property pos (1+ pos)
- 'font-lock-face 'completions-first-difference
- str)))
- str)
- completions))))
- (defun completion-pcm--find-all-completions (string table pred point
- &optional filter)
- "Find all completions for STRING at POINT in TABLE, satisfying PRED.
- POINT is a position inside STRING.
- FILTER is a function applied to the return value, that can be used, e.g. to
- filter out additional entries (because TABLE might not obey PRED)."
- (unless filter (setq filter 'identity))
- (let* ((beforepoint (substring string 0 point))
- (afterpoint (substring string point))
- (bounds (completion-boundaries beforepoint table pred afterpoint))
- (prefix (substring beforepoint 0 (car bounds)))
- (suffix (substring afterpoint (cdr bounds)))
- firsterror)
- (setq string (substring string (car bounds) (+ point (cdr bounds))))
- (let* ((relpoint (- point (car bounds)))
- (pattern (completion-pcm--string->pattern string relpoint))
- (all (condition-case err
- (funcall filter
- (completion-pcm--all-completions
- prefix pattern table pred))
- (error (unless firsterror (setq firsterror err)) nil))))
- (when (and (null all)
- (> (car bounds) 0)
- (null (ignore-errors (try-completion prefix table pred))))
-
-
- (let ((substring (substring prefix 0 -1)))
- (destructuring-bind (subpat suball subprefix _subsuffix)
- (completion-pcm--find-all-completions
- substring table pred (length substring) filter)
- (let ((sep (aref prefix (1- (length prefix))))
-
-
- (between nil))
-
- (dolist (submatch (prog1 suball (setq suball ())))
- (when (eq sep (aref submatch (1- (length submatch))))
- (push submatch suball)))
- (when suball
-
-
-
-
- (let* ((newbeforepoint
- (concat subprefix (car suball)
- (substring string 0 relpoint)))
- (leftbound (+ (length subprefix) (length (car suball))))
- (newbounds (completion-boundaries
- newbeforepoint table pred afterpoint)))
- (unless (or (and (eq (cdr bounds) (cdr newbounds))
- (eq (car newbounds) leftbound))
-
-
- (< (car newbounds) leftbound))
-
-
- (setq suffix (substring afterpoint (cdr newbounds)))
- (setq string
- (concat (substring newbeforepoint (car newbounds))
- (substring afterpoint 0 (cdr newbounds))))
- (setq between (substring newbeforepoint leftbound
- (car newbounds)))
- (setq pattern (completion-pcm--string->pattern
- string
- (- (length newbeforepoint)
- (car newbounds)))))
- (dolist (submatch suball)
- (setq all (nconc
- (mapcar
- (lambda (s) (concat submatch between s))
- (funcall filter
- (completion-pcm--all-completions
- (concat subprefix submatch between)
- pattern table pred)))
- all)))
-
-
-
-
-
-
-
-
-
- ))
- (setq pattern (append subpat (list 'any (string sep))
- (if between (list between)) pattern))
- (setq prefix subprefix)))))
- (if (and (null all) firsterror)
- (signal (car firsterror) (cdr firsterror))
- (list pattern all prefix suffix)))))
- (defun completion-pcm-all-completions (string table pred point)
- (destructuring-bind (pattern all &optional prefix _suffix)
- (completion-pcm--find-all-completions string table pred point)
- (when all
- (nconc (completion-pcm--hilit-commonality pattern all)
- (length prefix)))))
- (defun completion--sreverse (str)
- "Like `reverse' but for a string STR rather than a list."
- (apply 'string (nreverse (mapcar 'identity str))))
- (defun completion--common-suffix (strs)
- "Return the common suffix of the strings STRS."
- (completion--sreverse
- (try-completion
- ""
- (mapcar 'completion--sreverse strs))))
- (defun completion-pcm--merge-completions (strs pattern)
- "Extract the commonality in STRS, with the help of PATTERN.
- PATTERN can contain strings and symbols chosen among `star', `any', `point',
- and `prefix'. They all match anything (aka \".*\") but are merged differently:
- `any' only grows from the left (when matching \"a1b\" and \"a2b\" it gets
- completed to just \"a\").
- `prefix' only grows from the right (when matching \"a1b\" and \"a2b\" it gets
- completed to just \"b\").
- `star' grows from both ends and is reified into a \"*\" (when matching \"a1b\"
- and \"a2b\" it gets completed to \"a*b\").
- `point' is like `star' except that it gets reified as the position of point
- instead of being reified as a \"*\" character.
- The underlying idea is that we should return a string which still matches
- the same set of elements."
-
-
-
-
-
-
-
-
-
- (cond
- ((null (cdr strs)) (list (car strs)))
- (t
- (let ((re (completion-pcm--pattern->regex pattern 'group))
- (ccs ()))
-
-
- (let ((case-fold-search completion-ignore-case))
- (dolist (str strs)
- (unless (string-match re str)
- (error "Internal error: %s doesn't match %s" str re))
- (let ((chopped ())
- (last 0)
- (i 1)
- next)
- (while (setq next (match-end i))
- (push (substring str last next) chopped)
- (setq last next)
- (setq i (1+ i)))
-
- (push (substring str last) chopped)
- (push (nreverse chopped) ccs))))
-
-
- (let ((res ())
- (fixed ""))
-
- (dolist (elem (append pattern '(any)))
- (if (stringp elem)
- (setq fixed (concat fixed elem))
- (let ((comps ()))
- (dolist (cc (prog1 ccs (setq ccs nil)))
- (push (car cc) comps)
- (push (cdr cc) ccs))
-
-
-
- (setq ccs (nreverse ccs))
- (let* ((prefix (try-completion fixed comps))
- (unique (or (and (eq prefix t) (setq prefix fixed))
- (eq t (try-completion prefix comps)))))
- (unless (or (eq elem 'prefix)
- (equal prefix ""))
- (push prefix res))
-
-
-
-
-
-
- (unless unique
- (push elem res)
- (when (memq elem '(star point prefix))
-
-
-
-
- (let ((suffix (completion--common-suffix comps)))
- (assert (stringp suffix))
- (unless (equal suffix "")
- (push suffix res)))))
- (setq fixed "")))))
-
- res)))))
- (defun completion-pcm--pattern->string (pattern)
- (mapconcat (lambda (x) (cond
- ((stringp x) x)
- ((eq x 'star) "*")
- (t "")))
- pattern
- ""))
- (defun completion-pcm--filename-try-filter (all)
- "Filter to adjust `all' file completion to the behavior of `try'."
- (when all
- (let ((try ())
- (re (concat "\\(?:\\`\\.\\.?/\\|"
- (regexp-opt completion-ignored-extensions)
- "\\)\\'")))
- (dolist (f all)
- (unless (string-match-p re f) (push f try)))
- (or try all))))
- (defun completion-pcm--merge-try (pattern all prefix suffix)
- (cond
- ((not (consp all)) all)
- ((and (not (consp (cdr all)))
-
- (equal (completion-pcm--pattern->string pattern) (car all)))
- t)
- (t
- (let* ((mergedpat (completion-pcm--merge-completions all pattern))
-
-
-
-
- (pointpat (or (memq 'point mergedpat)
- (memq 'any mergedpat)
- (memq 'star mergedpat)
-
- mergedpat))
-
- (newpos (length (completion-pcm--pattern->string pointpat)))
-
- (merged (completion-pcm--pattern->string (nreverse mergedpat))))
- (setq suffix (completion--merge-suffix merged newpos suffix))
- (cons (concat prefix merged suffix) (+ newpos (length prefix)))))))
- (defun completion-pcm-try-completion (string table pred point)
- (destructuring-bind (pattern all prefix suffix)
- (completion-pcm--find-all-completions
- string table pred point
- (if minibuffer-completing-file-name
- 'completion-pcm--filename-try-filter))
- (completion-pcm--merge-try pattern all prefix suffix)))
- (defun completion-substring--all-completions (string table pred point)
- (let* ((beforepoint (substring string 0 point))
- (afterpoint (substring string point))
- (bounds (completion-boundaries beforepoint table pred afterpoint))
- (suffix (substring afterpoint (cdr bounds)))
- (prefix (substring beforepoint 0 (car bounds)))
- (basic-pattern (completion-basic--pattern
- beforepoint afterpoint bounds))
- (pattern (if (not (stringp (car basic-pattern)))
- basic-pattern
- (cons 'prefix basic-pattern)))
- (all (completion-pcm--all-completions prefix pattern table pred)))
- (list all pattern prefix suffix (car bounds))))
- (defun completion-substring-try-completion (string table pred point)
- (destructuring-bind (all pattern prefix suffix _carbounds)
- (completion-substring--all-completions string table pred point)
- (if minibuffer-completing-file-name
- (setq all (completion-pcm--filename-try-filter all)))
- (completion-pcm--merge-try pattern all prefix suffix)))
- (defun completion-substring-all-completions (string table pred point)
- (destructuring-bind (all pattern prefix _suffix _carbounds)
- (completion-substring--all-completions string table pred point)
- (when all
- (nconc (completion-pcm--hilit-commonality pattern all)
- (length prefix)))))
- (defun completion-initials-expand (str table pred)
- (let ((bounds (completion-boundaries str table pred "")))
- (unless (or (zerop (length str))
-
-
- (string-match completion-pcm--delim-wild-regex str
- (car bounds)))
- (if (zerop (car bounds))
- (mapconcat 'string str "-")
-
-
-
-
-
-
-
-
-
-
-
-
- (when (< (car bounds) 3)
- (let ((sep (substring str (1- (car bounds)) (car bounds))))
-
-
- (concat (substring str 0 (car bounds))
- (mapconcat 'string (substring str (car bounds)) sep))))))))
- (defun completion-initials-all-completions (string table pred _point)
- (let ((newstr (completion-initials-expand string table pred)))
- (when newstr
- (completion-pcm-all-completions newstr table pred (length newstr)))))
- (defun completion-initials-try-completion (string table pred _point)
- (let ((newstr (completion-initials-expand string table pred)))
- (when newstr
- (completion-pcm-try-completion newstr table pred (length newstr)))))
- (defvar completing-read-function 'completing-read-default
- "The function called by `completing-read' to do its work.
- It should accept the same arguments as `completing-read'.")
- (defun completing-read-default (prompt collection &optional predicate
- require-match initial-input
- hist def inherit-input-method)
- "Default method for reading from the minibuffer with completion.
- See `completing-read' for the meaning of the arguments."
- (when (consp initial-input)
- (setq initial-input
- (cons (car initial-input)
-
-
- (1+ (cdr initial-input)))))
- (let* ((minibuffer-completion-table collection)
- (minibuffer-completion-predicate predicate)
- (minibuffer-completion-confirm (unless (eq require-match t)
- require-match))
- (base-keymap (if require-match
- minibuffer-local-must-match-map
- minibuffer-local-completion-map))
- (keymap (if (memq minibuffer-completing-file-name '(nil lambda))
- base-keymap
-
-
- (make-composed-keymap
- minibuffer-local-filename-completion-map
-
-
-
- base-keymap)))
- (result (read-from-minibuffer prompt initial-input keymap
- nil hist def inherit-input-method)))
- (when (and (equal result "") def)
- (setq result (if (consp def) (car def) def)))
- result))
- (defun minibuffer-insert-file-name-at-point ()
- "Get a file name at point in original buffer and insert it to minibuffer."
- (interactive)
- (let ((file-name-at-point
- (with-current-buffer (window-buffer (minibuffer-selected-window))
- (run-hook-with-args-until-success 'file-name-at-point-functions))))
- (when file-name-at-point
- (insert file-name-at-point))))
- (provide 'minibuffer)
|