Mercurial > emacs
comparison lisp/dabbrev.el @ 38138:a7bf2382c0d7
(dabbrev--make-friend-buffer-list): New function,
broken out from dabbrev--find-expansion. Handle minibuffer
specially here.
(dabbrev--find-expansion): Simplify code in various ways.
Don't treat minibuffers specially.
Call dabbrev--make-friend-buffer-list.
(dabbrev--select-buffers): Don't treat minibuffers specially.
Simplify.
(dabbrev--scanning-message): Do nothing when minibuffer is current.
author | Richard M. Stallman <rms@gnu.org> |
---|---|
date | Wed, 20 Jun 2001 11:03:58 +0000 |
parents | 210efced5807 |
children | 121f029b6b4a |
comparison
equal
deleted
inserted
replaced
38137:07a677551b01 | 38138:a7bf2382c0d7 |
---|---|
292 (defvar dabbrev--last-expansion-location nil) | 292 (defvar dabbrev--last-expansion-location nil) |
293 | 293 |
294 ;; The list of remaining buffers with the same mode as current buffer. | 294 ;; The list of remaining buffers with the same mode as current buffer. |
295 (defvar dabbrev--friend-buffer-list nil) | 295 (defvar dabbrev--friend-buffer-list nil) |
296 | 296 |
297 ;; The buffer we looked in last. | 297 ;; The buffer we looked in last, not counting the current buffer. |
298 (defvar dabbrev--last-buffer nil) | 298 (defvar dabbrev--last-buffer nil) |
299 | 299 |
300 ;; The buffer we found the expansion last time. | 300 ;; The buffer we found the expansion last time. |
301 (defvar dabbrev--last-buffer-found nil) | 301 (defvar dabbrev--last-buffer-found nil) |
302 | 302 |
653 dabbrev--abbrev-char-regexp (or dabbrev-abbrev-char-regexp | 653 dabbrev--abbrev-char-regexp (or dabbrev-abbrev-char-regexp |
654 "\\sw\\|\\s_") | 654 "\\sw\\|\\s_") |
655 dabbrev--check-other-buffers dabbrev-check-other-buffers)) | 655 dabbrev--check-other-buffers dabbrev-check-other-buffers)) |
656 | 656 |
657 (defun dabbrev--select-buffers () | 657 (defun dabbrev--select-buffers () |
658 "Return a list of all buffers that should be searched for a possible abbrev. | 658 "Return a list of other buffers to search for a possible abbrev. |
659 | 659 The current buffer is not included in the list. |
660 This function makes a list of all the buffers returned by `buffer-list', and | 660 |
661 then filters out every buffer for which `dabbrev-friend-buffer-function', | 661 This function makes a list of all the buffers returned by `buffer-list', |
662 if it is bound, returns nil. The resulting partial list is returned." | 662 then discards buffers whose names match `dabbrev-ignored-buffer-names' |
663 (save-excursion | 663 or `dabbrev-ignored-buffer-regexps'. It also discards buffers for which |
664 (and (window-minibuffer-p (selected-window)) | 664 `dabbrev-friend-buffer-function', if it is bound, returns nil when called |
665 (set-buffer (dabbrev--minibuffer-origin))) | 665 with the buffer as argument. |
666 (let ((orig-buffer (current-buffer))) | 666 It returns the list of the buffers that are not discarded." |
667 (dabbrev-filter-elements | 667 (dabbrev-filter-elements |
668 buffer (buffer-list) | 668 buffer (buffer-list) |
669 (and (not (eq orig-buffer buffer)) | 669 (and (not (eq (current-buffer) buffer)) |
670 (not (dabbrev--ignore-buffer-p buffer)) | 670 (not (dabbrev--ignore-buffer-p buffer)) |
671 (boundp 'dabbrev-friend-buffer-function) | 671 (boundp 'dabbrev-friend-buffer-function) |
672 (funcall dabbrev-friend-buffer-function buffer)))))) | 672 (funcall dabbrev-friend-buffer-function buffer))))) |
673 | 673 |
674 (defun dabbrev--try-find (abbrev reverse n ignore-case) | 674 (defun dabbrev--try-find (abbrev reverse n ignore-case) |
675 "Search for ABBREV, backwards if REVERSE, N times. | 675 "Search for ABBREV, backwards if REVERSE, N times. |
676 If IGNORE-CASE is non-nil, ignore case while searching. | 676 If IGNORE-CASE is non-nil, ignore case while searching. |
677 Return the expansion found, and save the location of the start | 677 Return the expansion found, and save the location of the start |
703 (while (setq expansion (dabbrev--find-expansion abbrev -1 ignore-case)) | 703 (while (setq expansion (dabbrev--find-expansion abbrev -1 ignore-case)) |
704 (setq all-expansions (cons expansion all-expansions)))) | 704 (setq all-expansions (cons expansion all-expansions)))) |
705 all-expansions)) | 705 all-expansions)) |
706 | 706 |
707 (defun dabbrev--scanning-message () | 707 (defun dabbrev--scanning-message () |
708 (message "Scanning `%s'" (buffer-name (current-buffer)))) | 708 (unless (window-minibuffer-p (selected-window)) |
709 (message "Scanning `%s'" (buffer-name (current-buffer))))) | |
709 | 710 |
710 (defun dabbrev--ignore-buffer-p (buffer) | 711 (defun dabbrev--ignore-buffer-p (buffer) |
711 "Return non-nil if BUFFER should be ignored by dabbrev." | 712 "Return non-nil if BUFFER should be ignored by dabbrev." |
712 (let ((bn (buffer-name buffer))) | 713 (let ((bn (buffer-name buffer))) |
713 (or (member bn dabbrev-ignored-buffer-names) | 714 (or (member bn dabbrev-ignored-buffer-names) |
726 IGNORE-CASE non-nil means ignore case when searching. | 727 IGNORE-CASE non-nil means ignore case when searching. |
727 This sets `dabbrev--last-direction' to 1 or -1 according | 728 This sets `dabbrev--last-direction' to 1 or -1 according |
728 to the direction in which the occurrence was actually found. | 729 to the direction in which the occurrence was actually found. |
729 It sets `dabbrev--last-expansion-location' to the location | 730 It sets `dabbrev--last-expansion-location' to the location |
730 of the start of the occurrence." | 731 of the start of the occurrence." |
731 (let (expansion) | 732 (save-excursion |
732 (save-excursion | 733 ;; If we were scanning something other than the current buffer, |
733 (cond | 734 ;; continue scanning there. |
734 (dabbrev--last-buffer | 735 (when dabbrev--last-buffer |
735 (set-buffer dabbrev--last-buffer) | 736 (set-buffer dabbrev--last-buffer) |
736 (dabbrev--scanning-message)) | 737 (dabbrev--scanning-message)) |
737 ((and (not dabbrev-search-these-buffers-only) | 738 (or |
738 (window-minibuffer-p (selected-window))) | 739 ;; ------------------------------------------ |
739 (set-buffer (dabbrev--minibuffer-origin)) | 740 ;; Look backward in current buffer. |
740 ;; In the minibuffer-origin buffer we will only search from | 741 ;; ------------------------------------------ |
741 ;; the top and down. | 742 (and (not dabbrev-search-these-buffers-only) |
742 (goto-char (point-min)) | 743 (>= direction 0) |
743 (setq direction -1) | 744 (setq dabbrev--last-direction (min 1 direction)) |
744 (dabbrev--scanning-message))) | 745 (dabbrev--try-find abbrev t |
745 (cond | 746 (max 1 direction) |
746 ;; ------------------------------------------ | 747 ignore-case)) |
747 ;; Look backwards | 748 ;; ------------------------------------------ |
748 ;; ------------------------------------------ | 749 ;; Look forward in current buffer |
749 ((and (not dabbrev-search-these-buffers-only) | 750 ;; or whatever buffer we were last scanning. |
750 (>= direction 0) | 751 ;; ------------------------------------------ |
751 (setq dabbrev--last-direction (min 1 direction)) | 752 (and (or (not dabbrev-search-these-buffers-only) |
752 (setq expansion (dabbrev--try-find abbrev t | 753 dabbrev--last-buffer) |
753 (max 1 direction) | 754 (<= direction 0) |
754 ignore-case))) | 755 (setq dabbrev--last-direction -1) |
755 expansion) | 756 (dabbrev--try-find abbrev nil |
756 ;; ------------------------------------------ | 757 (max 1 (- direction)) |
757 ;; Look forward | 758 ignore-case)) |
758 ;; ------------------------------------------ | 759 ;; ------------------------------------------ |
759 ((and (or (not dabbrev-search-these-buffers-only) | 760 ;; Look in other buffers. |
760 dabbrev--last-buffer) | 761 ;; Always start at (point-min) and look forward. |
761 (<= direction 0) | 762 ;; ------------------------------------------ |
762 (setq dabbrev--last-direction -1) | 763 (progn |
763 (setq expansion (dabbrev--try-find abbrev nil | 764 (setq dabbrev--last-direction -1) |
764 (max 1 (- direction)) | 765 (unless dabbrev--last-buffer |
765 ignore-case))) | 766 ;; If we have just now begun to search other buffers, |
766 expansion) | 767 ;; determine which other buffers we should check. |
767 ;; ------------------------------------------ | 768 ;; Put that list in dabbrev--friend-buffer-list. |
768 ;; Look in other buffers. | 769 (or dabbrev--friend-buffer-list |
769 ;; Start at (point-min) and look forward. | 770 (setq dabbrev--friend-buffer-list |
770 ;; ------------------------------------------ | 771 (dabbrev--make-friend-buffer-list)))) |
771 (t | 772 ;; Walk through the buffers till we find a match. |
772 (setq dabbrev--last-direction -1) | 773 (let (expansion) |
773 ;; Make sure that we should check other buffers | 774 (while (and (not expansion) dabbrev--friend-buffer-list) |
774 (or dabbrev--friend-buffer-list | 775 (setq dabbrev--last-buffer |
775 dabbrev--last-buffer | 776 (car dabbrev--friend-buffer-list)) |
776 (setq dabbrev--friend-buffer-list | 777 (setq dabbrev--friend-buffer-list |
777 (mapcar (function get-buffer) | 778 (cdr dabbrev--friend-buffer-list)) |
778 dabbrev-search-these-buffers-only)) | 779 (set-buffer dabbrev--last-buffer) |
779 (not dabbrev--check-other-buffers) | 780 (dabbrev--scanning-message) |
780 (not (or (eq dabbrev--check-other-buffers t) | 781 (setq dabbrev--last-expansion-location (point-min)) |
781 (progn | 782 (setq expansion (dabbrev--try-find abbrev nil 1 ignore-case))) |
782 (setq dabbrev--check-other-buffers | 783 expansion))))) |
783 (y-or-n-p "Scan other buffers also? "))))) | 784 |
784 (let* (friend-buffer-list non-friend-buffer-list) | 785 ;; Compute the list of buffers to scan. |
785 (setq dabbrev--friend-buffer-list | 786 ;; If dabbrev-search-these-buffers-only, then the current buffer |
786 (funcall dabbrev-select-buffers-function)) | 787 ;; is included in this list if it should be searched. |
787 (if dabbrev-check-all-buffers | 788 ;; Otherwise, the current buffer is searched first specially., |
788 (setq non-friend-buffer-list | 789 ;; and it is not included in this list. |
790 (defun dabbrev--make-friend-buffer-list () | |
791 (let ((list (mapcar (function get-buffer) | |
792 dabbrev-search-these-buffers-only))) | |
793 (when (and (null dabbrev-search-these-buffers-only) | |
794 dabbrev--check-other-buffers | |
795 (or (eq dabbrev--check-other-buffers t) | |
796 (setq dabbrev--check-other-buffers | |
797 (y-or-n-p "Scan other buffers also? ")))) | |
798 (setq list (funcall dabbrev-select-buffers-function)) | |
799 ;; If dabbrev-check-all-buffers, tack on all the other | |
800 ;; buffers at the end of the list, except those which are | |
801 ;; specifically to be ignored. | |
802 (if dabbrev-check-all-buffers | |
803 (setq list | |
804 (append list | |
789 (dabbrev-filter-elements | 805 (dabbrev-filter-elements |
790 buffer (buffer-list) | 806 buffer (buffer-list) |
791 (and (not (memq buffer dabbrev--friend-buffer-list)) | 807 (and (not (memq buffer list)) |
792 (not (dabbrev--ignore-buffer-p buffer)))) | 808 (not (dabbrev--ignore-buffer-p buffer))))))) |
793 dabbrev--friend-buffer-list | 809 ;; Remove the current buffer. |
794 (append dabbrev--friend-buffer-list | 810 (setq list (delq (current-buffer) list))) |
795 non-friend-buffer-list))))) | 811 ;; Move buffers in the list that are visible on the screen |
796 ;; Move buffers that are visible on the screen | 812 ;; to the front of the list, but don't add anything to the list. |
797 ;; to the front of the list. Remove the current buffer. | 813 (if list |
798 (when dabbrev--friend-buffer-list | 814 (walk-windows (lambda (w) |
799 (walk-windows (lambda (w) | 815 (unless (eq w (selected-window)) |
800 (unless (eq w (selected-window)) | 816 (if (memq (window-buffer w) list) |
801 (setq dabbrev--friend-buffer-list | 817 (setq list |
802 (cons (window-buffer w) | 818 (cons (window-buffer w) |
803 (delq (window-buffer w) | 819 (delq (window-buffer w) |
804 dabbrev--friend-buffer-list)))))) | 820 list)))))))) |
805 (setq dabbrev--friend-buffer-list | 821 ;; In a minibuffer, search the buffer it was activated from, |
806 (delq (current-buffer) dabbrev--friend-buffer-list))) | 822 ;; first after the minibuffer itself. Unless we aren't supposed |
807 ;; Walk through the buffers | 823 ;; to search the current buffer either. |
808 (while (and (not expansion) dabbrev--friend-buffer-list) | 824 (if (and (window-minibuffer-p (selected-window)) |
809 (setq dabbrev--last-buffer | 825 (not dabbrev-search-these-buffers-only)) |
810 (car dabbrev--friend-buffer-list)) | 826 (setq list |
811 (setq dabbrev--friend-buffer-list | 827 (cons (dabbrev--minibuffer-origin) |
812 (cdr dabbrev--friend-buffer-list)) | 828 (delq (dabbrev--minibuffer-origin) list)))) |
813 (set-buffer dabbrev--last-buffer) | 829 list)) |
814 (dabbrev--scanning-message) | |
815 (setq dabbrev--last-expansion-location (point-min)) | |
816 (setq expansion (dabbrev--try-find abbrev nil 1 ignore-case))) | |
817 expansion))))) | |
818 | 830 |
819 (defun dabbrev--safe-replace-match (string &optional fixedcase literal) | 831 (defun dabbrev--safe-replace-match (string &optional fixedcase literal) |
820 (if (eq major-mode 'picture-mode) | 832 (if (eq major-mode 'picture-mode) |
821 (picture-replace-match string fixedcase literal) | 833 (picture-replace-match string fixedcase literal) |
822 (replace-match string fixedcase literal))) | 834 (replace-match string fixedcase literal))) |