Mercurial > emacs
comparison lisp/simple.el @ 67621:0d6832f365fb
(choose-completion): Use `buffer-substring-no-properties'
instead of `buffer-substring'.
(completion-common-substring): Doc fix.
(completion-setup-function): Use minibuffer-completion-contents
instead of minibuffer-contents. Don't set common-string-length
initially. Remove special handling of partial-completion-mode.
Move computation of completion-base-size into one cond. Call
completion-base-size-function in mainbuf. In computation of
completion-base-size for file name completion don't move point to
the end of the minibuffer. Move computation of common-string-length
into one cond. Start putting faces only when common-string-length>=0.
Add condition to put completions-common-part when common-string-length>0.
author | Juri Linkov <juri@jurta.org> |
---|---|
date | Fri, 16 Dec 2005 19:08:21 +0000 |
parents | 3fbbf35e6d87 |
children | 8eda669e2619 14a4eb789b45 |
comparison
equal
deleted
inserted
replaced
67620:b0794ecc7df6 | 67621:0d6832f365fb |
---|---|
4785 (setq end (1- (point)) beg (point))) | 4785 (setq end (1- (point)) beg (point))) |
4786 (if (null beg) | 4786 (if (null beg) |
4787 (error "No completion here")) | 4787 (error "No completion here")) |
4788 (setq beg (previous-single-property-change beg 'mouse-face)) | 4788 (setq beg (previous-single-property-change beg 'mouse-face)) |
4789 (setq end (or (next-single-property-change end 'mouse-face) (point-max))) | 4789 (setq end (or (next-single-property-change end 'mouse-face) (point-max))) |
4790 (setq completion (buffer-substring beg end)) | 4790 (setq completion (buffer-substring-no-properties beg end)) |
4791 (let ((owindow (selected-window))) | 4791 (let ((owindow (selected-window))) |
4792 (if (and (one-window-p t 'selected-frame) | 4792 (if (and (one-window-p t 'selected-frame) |
4793 (window-dedicated-p (selected-window))) | 4793 (window-dedicated-p (selected-window))) |
4794 ;; This is a special buffer's frame | 4794 ;; This is a special buffer's frame |
4795 (iconify-frame (selected-frame)) | 4795 (iconify-frame (selected-frame)) |
4942 | 4942 |
4943 (defvar completion-common-substring nil | 4943 (defvar completion-common-substring nil |
4944 "Common prefix substring to use in `completion-setup-function' to put faces. | 4944 "Common prefix substring to use in `completion-setup-function' to put faces. |
4945 The value is set by `display-completion-list' during running `completion-setup-hook'. | 4945 The value is set by `display-completion-list' during running `completion-setup-hook'. |
4946 | 4946 |
4947 To put faces, `completions-first-difference' and `completions-common-part' | 4947 To put faces `completions-first-difference' and `completions-common-part' |
4948 into \"*Completions*\* buffer, the common prefix substring in completions is | 4948 in the `*Completions*' buffer, the common prefix substring in completions |
4949 needed as a hint. (Minibuffer is a special case. The content of minibuffer itself | 4949 is needed as a hint. (The minibuffer is a special case. The content |
4950 is the substring.)") | 4950 of the minibuffer before point is always the common substring.)") |
4951 | 4951 |
4952 ;; This function goes in completion-setup-hook, so that it is called | 4952 ;; This function goes in completion-setup-hook, so that it is called |
4953 ;; after the text of the completion list buffer is written. | 4953 ;; after the text of the completion list buffer is written. |
4954 (defun completion-setup-function () | 4954 (defun completion-setup-function () |
4955 (let* ((mainbuf (current-buffer)) | 4955 (let* ((mainbuf (current-buffer)) |
4956 (mbuf-contents (minibuffer-contents)) | 4956 (mbuf-contents (minibuffer-completion-contents)) |
4957 (common-string-length (length mbuf-contents))) | 4957 common-string-length) |
4958 ;; When reading a file name in the minibuffer, | 4958 ;; When reading a file name in the minibuffer, |
4959 ;; set default-directory in the minibuffer | 4959 ;; set default-directory in the minibuffer |
4960 ;; so it will get copied into the completion list buffer. | 4960 ;; so it will get copied into the completion list buffer. |
4961 (if minibuffer-completing-file-name | 4961 (if minibuffer-completing-file-name |
4962 (with-current-buffer mainbuf | 4962 (with-current-buffer mainbuf |
4963 (setq default-directory (file-name-directory mbuf-contents)))) | 4963 (setq default-directory (file-name-directory mbuf-contents)))) |
4964 ;; If partial-completion-mode is on, point might not be after the | |
4965 ;; last character in the minibuffer. | |
4966 ;; FIXME: This hack should be moved to complete.el where we call | |
4967 ;; display-completion-list. | |
4968 (when partial-completion-mode | |
4969 (setq common-string-length | |
4970 (if (eq (char-after (field-beginning)) ?-) | |
4971 ;; If the text to be completed starts with a `-', there is no | |
4972 ;; common prefix. | |
4973 ;; FIXME: this probably still doesn't do the right thing | |
4974 ;; when completing file names. It's not even clear what | |
4975 ;; is TRT. | |
4976 0 | |
4977 (- common-string-length (- (point-max) (point)))))) | |
4978 (with-current-buffer standard-output | 4964 (with-current-buffer standard-output |
4979 (completion-list-mode) | 4965 (completion-list-mode) |
4980 (set (make-local-variable 'completion-reference-buffer) mainbuf) | 4966 (set (make-local-variable 'completion-reference-buffer) mainbuf) |
4981 (setq completion-base-size | 4967 (setq completion-base-size |
4982 (if minibuffer-completing-file-name | 4968 (cond |
4983 ;; For file name completion, use the number of chars before | 4969 ((and (symbolp minibuffer-completion-table) |
4984 ;; the start of the last file name component. | 4970 (get minibuffer-completion-table 'completion-base-size-function)) |
4985 (with-current-buffer mainbuf | 4971 ;; To compute base size, a function can use the global value of |
4986 (save-excursion | 4972 ;; completion-common-substring or minibuffer-completion-contents. |
4987 (goto-char (point-max)) | 4973 (with-current-buffer mainbuf |
4988 (skip-chars-backward completion-root-regexp) | 4974 (funcall (get minibuffer-completion-table |
4989 (- (point) (minibuffer-prompt-end)))) | 4975 'completion-base-size-function)))) |
4990 ;; Otherwise, in minibuffer, the whole input is being completed. | 4976 (minibuffer-completing-file-name |
4991 (if (minibufferp mainbuf) 0))) | 4977 ;; For file name completion, use the number of chars before |
4992 (if (and (symbolp minibuffer-completion-table) | 4978 ;; the start of the file name component at point. |
4993 (get minibuffer-completion-table 'completion-base-size-function)) | 4979 (with-current-buffer mainbuf |
4994 (setq completion-base-size | 4980 (save-excursion |
4995 ;; FIXME: without any extra arg, how is this function | 4981 (skip-chars-backward completion-root-regexp) |
4996 ;; expected to return anything else than a constant unless | 4982 (- (point) (minibuffer-prompt-end))))) |
4997 ;; it redoes part of the work of all-completions? | 4983 ;; Otherwise, in minibuffer, the base size is 0. |
4998 ;; In most cases this value would better be computed and | 4984 ((minibufferp mainbuf) 0))) |
4999 ;; returned at the same time as the list of all-completions | 4985 (setq common-string-length |
5000 ;; is computed. --Stef | 4986 (cond |
5001 (funcall (get minibuffer-completion-table | 4987 (completion-common-substring |
5002 'completion-base-size-function)))) | 4988 (length completion-common-substring)) |
4989 (completion-base-size | |
4990 (- (length mbuf-contents) completion-base-size)))) | |
5003 ;; Put faces on first uncommon characters and common parts. | 4991 ;; Put faces on first uncommon characters and common parts. |
5004 (when (or completion-common-substring completion-base-size) | 4992 (when (and (integerp common-string-length) (>= common-string-length 0)) |
5005 (setq common-string-length | |
5006 (if completion-common-substring | |
5007 (length completion-common-substring) | |
5008 (- common-string-length completion-base-size))) | |
5009 (let ((element-start (point-min)) | 4993 (let ((element-start (point-min)) |
5010 (maxp (point-max)) | 4994 (maxp (point-max)) |
5011 element-common-end) | 4995 element-common-end) |
5012 (while (and (setq element-start | 4996 (while (and (setq element-start |
5013 (next-single-property-change | 4997 (next-single-property-change |
5014 element-start 'mouse-face)) | 4998 element-start 'mouse-face)) |
5015 (< (setq element-common-end | 4999 (< (setq element-common-end |
5016 (+ element-start common-string-length)) | 5000 (+ element-start common-string-length)) |
5017 maxp)) | 5001 maxp)) |
5018 (when (get-char-property element-start 'mouse-face) | 5002 (when (get-char-property element-start 'mouse-face) |
5019 (if (get-char-property (1- element-common-end) 'mouse-face) | 5003 (if (and (> common-string-length 0) |
5004 (get-char-property (1- element-common-end) 'mouse-face)) | |
5020 (put-text-property element-start element-common-end | 5005 (put-text-property element-start element-common-end |
5021 'font-lock-face 'completions-common-part)) | 5006 'font-lock-face 'completions-common-part)) |
5022 (if (get-char-property element-common-end 'mouse-face) | 5007 (if (get-char-property element-common-end 'mouse-face) |
5023 (put-text-property element-common-end (1+ element-common-end) | 5008 (put-text-property element-common-end (1+ element-common-end) |
5024 'font-lock-face 'completions-first-difference)))))) | 5009 'font-lock-face 'completions-first-difference)))))) |