diff options
| author | Dave Love | 2000-05-22 17:53:15 +0000 |
|---|---|---|
| committer | Dave Love | 2000-05-22 17:53:15 +0000 |
| commit | d2c49fd8d7e2525fcc67687d49fcf77f137c6419 (patch) | |
| tree | bf974e624a78990d06d3b9f59e3d7af29a81859c | |
| parent | f1ed9461a981f02ee73359e16e102d59b148a89b (diff) | |
| download | emacs-d2c49fd8d7e2525fcc67687d49fcf77f137c6419.tar.gz emacs-d2c49fd8d7e2525fcc67687d49fcf77f137c6419.zip | |
Doc fixes. Add to debug-ignored-errors. Don't quote keywords.
(cmpl-string-case-type): Use character classes.
| -rw-r--r-- | lisp/completion.el | 467 |
1 files changed, 166 insertions, 301 deletions
diff --git a/lisp/completion.el b/lisp/completion.el index 0b6d9626877..4dfb611f6b3 100644 --- a/lisp/completion.el +++ b/lisp/completion.el | |||
| @@ -286,7 +286,7 @@ | |||
| 286 | 286 | ||
| 287 | (defcustom enable-completion t | 287 | (defcustom enable-completion t |
| 288 | "*Non-nil means enable recording and saving of completions. | 288 | "*Non-nil means enable recording and saving of completions. |
| 289 | If nil, no new words added to the database or saved to the init file." | 289 | If nil, no new words are added to the database or saved to the init file." |
| 290 | :type 'boolean | 290 | :type 'boolean |
| 291 | :group 'completion) | 291 | :group 'completion) |
| 292 | 292 | ||
| @@ -413,21 +413,20 @@ Used to decide whether to save completions.") | |||
| 413 | ;;----------------------------------------------- | 413 | ;;----------------------------------------------- |
| 414 | 414 | ||
| 415 | (defun cmpl-string-case-type (string) | 415 | (defun cmpl-string-case-type (string) |
| 416 | "Returns :capitalized, :up, :down, :mixed, or :neither." | 416 | "Return :capitalized, :up, :down, :mixed, or :neither for case of STRING." |
| 417 | (let ((case-fold-search nil)) | 417 | (let ((case-fold-search nil)) |
| 418 | (cond ((string-match "[a-z]" string) | 418 | (cond ((string-match "[[:lower:]]" string) |
| 419 | (cond ((string-match "[A-Z]" string) | 419 | (cond ((string-match "[[:upper:]]" string) |
| 420 | (cond ((and (> (length string) 1) | 420 | (cond ((and (> (length string) 1) |
| 421 | (null (string-match "[A-Z]" string 1))) | 421 | (null (string-match "[[:upper:]]" string 1))) |
| 422 | ':capitalized) | 422 | :capitalized) |
| 423 | (t | 423 | (t |
| 424 | ':mixed))) | 424 | :mixed))) |
| 425 | (t ':down))) | 425 | (t :down))) |
| 426 | (t | 426 | (t |
| 427 | (cond ((string-match "[A-Z]" string) | 427 | (cond ((string-match "[[:upper:]]" string) |
| 428 | ':up) | 428 | :up) |
| 429 | (t ':neither)))) | 429 | (t :neither)))))) |
| 430 | )) | ||
| 431 | 430 | ||
| 432 | ;; Tests - | 431 | ;; Tests - |
| 433 | ;; (cmpl-string-case-type "123ABCDEF456") --> :up | 432 | ;; (cmpl-string-case-type "123ABCDEF456") --> :up |
| @@ -437,29 +436,25 @@ Used to decide whether to save completions.") | |||
| 437 | ;; (cmpl-string-case-type "Abcde123") --> :capitalized | 436 | ;; (cmpl-string-case-type "Abcde123") --> :capitalized |
| 438 | 437 | ||
| 439 | (defun cmpl-coerce-string-case (string case-type) | 438 | (defun cmpl-coerce-string-case (string case-type) |
| 440 | (cond ((eq case-type ':down) (downcase string)) | 439 | (cond ((eq case-type :down) (downcase string)) |
| 441 | ((eq case-type ':up) (upcase string)) | 440 | ((eq case-type :up) (upcase string)) |
| 442 | ((eq case-type ':capitalized) | 441 | ((eq case-type :capitalized) |
| 443 | (setq string (downcase string)) | 442 | (setq string (downcase string)) |
| 444 | (aset string 0 (logand ?\337 (aref string 0))) | 443 | (aset string 0 (logand ?\337 (aref string 0))) |
| 445 | string) | 444 | string) |
| 446 | (t string) | 445 | (t string))) |
| 447 | )) | ||
| 448 | 446 | ||
| 449 | (defun cmpl-merge-string-cases (string-to-coerce given-string) | 447 | (defun cmpl-merge-string-cases (string-to-coerce given-string) |
| 450 | (let ((string-case-type (cmpl-string-case-type string-to-coerce)) | 448 | (let ((string-case-type (cmpl-string-case-type string-to-coerce))) |
| 451 | ) | ||
| 452 | (cond ((memq string-case-type '(:down :up :capitalized)) | 449 | (cond ((memq string-case-type '(:down :up :capitalized)) |
| 453 | ;; Found string is in a standard case. Coerce to a type based on | 450 | ;; Found string is in a standard case. Coerce to a type based on |
| 454 | ;; the given string | 451 | ;; the given string |
| 455 | (cmpl-coerce-string-case string-to-coerce | 452 | (cmpl-coerce-string-case string-to-coerce |
| 456 | (cmpl-string-case-type given-string)) | 453 | (cmpl-string-case-type given-string))) |
| 457 | ) | ||
| 458 | (t | 454 | (t |
| 459 | ;; If the found string is in some unusual case, just insert it | 455 | ;; If the found string is in some unusual case, just insert it |
| 460 | ;; as is | 456 | ;; as is |
| 461 | string-to-coerce) | 457 | string-to-coerce)))) |
| 462 | ))) | ||
| 463 | 458 | ||
| 464 | ;; Tests - | 459 | ;; Tests - |
| 465 | ;; (cmpl-merge-string-cases "AbCdEf456" "abc") --> AbCdEf456 | 460 | ;; (cmpl-merge-string-cases "AbCdEf456" "abc") --> AbCdEf456 |
| @@ -546,38 +541,32 @@ Used to decide whether to save completions.") | |||
| 546 | (setq i (1+ i))) | 541 | (setq i (1+ i))) |
| 547 | ;; Other ones | 542 | ;; Other ones |
| 548 | (let ((symbol-chars '(?@ ?/ ?\\ ?* ?+ ?~ ?$ ?< ?> ?%)) | 543 | (let ((symbol-chars '(?@ ?/ ?\\ ?* ?+ ?~ ?$ ?< ?> ?%)) |
| 549 | (symbol-chars-ignore '(?_ ?- ?: ?.)) | 544 | (symbol-chars-ignore '(?_ ?- ?: ?.))) |
| 550 | ) | ||
| 551 | (dolist (char symbol-chars) | 545 | (dolist (char symbol-chars) |
| 552 | (modify-syntax-entry char "_" table)) | 546 | (modify-syntax-entry char "_" table)) |
| 553 | (dolist (char symbol-chars-ignore) | 547 | (dolist (char symbol-chars-ignore) |
| 554 | (modify-syntax-entry char "w" table) | 548 | (modify-syntax-entry char "w" table))) |
| 555 | ) | ||
| 556 | ) | ||
| 557 | table)) | 549 | table)) |
| 558 | 550 | ||
| 559 | (defconst cmpl-standard-syntax-table (cmpl-make-standard-completion-syntax-table)) | 551 | (defconst cmpl-standard-syntax-table (cmpl-make-standard-completion-syntax-table)) |
| 560 | 552 | ||
| 561 | (defun cmpl-make-lisp-completion-syntax-table () | 553 | (defun cmpl-make-lisp-completion-syntax-table () |
| 562 | (let ((table (copy-syntax-table cmpl-standard-syntax-table)) | 554 | (let ((table (copy-syntax-table cmpl-standard-syntax-table)) |
| 563 | (symbol-chars '(?! ?& ?? ?= ?^)) | 555 | (symbol-chars '(?! ?& ?? ?= ?^))) |
| 564 | ) | ||
| 565 | (dolist (char symbol-chars) | 556 | (dolist (char symbol-chars) |
| 566 | (modify-syntax-entry char "_" table)) | 557 | (modify-syntax-entry char "_" table)) |
| 567 | table)) | 558 | table)) |
| 568 | 559 | ||
| 569 | (defun cmpl-make-c-completion-syntax-table () | 560 | (defun cmpl-make-c-completion-syntax-table () |
| 570 | (let ((table (copy-syntax-table cmpl-standard-syntax-table)) | 561 | (let ((table (copy-syntax-table cmpl-standard-syntax-table)) |
| 571 | (separator-chars '(?+ ?* ?/ ?: ?%)) | 562 | (separator-chars '(?+ ?* ?/ ?: ?%))) |
| 572 | ) | ||
| 573 | (dolist (char separator-chars) | 563 | (dolist (char separator-chars) |
| 574 | (modify-syntax-entry char " " table)) | 564 | (modify-syntax-entry char " " table)) |
| 575 | table)) | 565 | table)) |
| 576 | 566 | ||
| 577 | (defun cmpl-make-fortran-completion-syntax-table () | 567 | (defun cmpl-make-fortran-completion-syntax-table () |
| 578 | (let ((table (copy-syntax-table cmpl-standard-syntax-table)) | 568 | (let ((table (copy-syntax-table cmpl-standard-syntax-table)) |
| 579 | (separator-chars '(?+ ?- ?* ?/ ?:)) | 569 | (separator-chars '(?+ ?- ?* ?/ ?:))) |
| 580 | ) | ||
| 581 | (dolist (char separator-chars) | 570 | (dolist (char separator-chars) |
| 582 | (modify-syntax-entry char " " table)) | 571 | (modify-syntax-entry char " " table)) |
| 583 | table)) | 572 | table)) |
| @@ -620,15 +609,13 @@ But only if it is longer than `completion-min-length'." | |||
| 620 | (goto-char cmpl-symbol-start) | 609 | (goto-char cmpl-symbol-start) |
| 621 | (forward-word 1) | 610 | (forward-word 1) |
| 622 | (setq cmpl-symbol-start (point)) | 611 | (setq cmpl-symbol-start (point)) |
| 623 | (goto-char cmpl-saved-point) | 612 | (goto-char cmpl-saved-point))) |
| 624 | )) | ||
| 625 | ;; Remove chars to ignore at the end. | 613 | ;; Remove chars to ignore at the end. |
| 626 | (cond ((= (char-syntax (char-after (1- cmpl-symbol-end))) ?w) | 614 | (cond ((= (char-syntax (char-after (1- cmpl-symbol-end))) ?w) |
| 627 | (goto-char cmpl-symbol-end) | 615 | (goto-char cmpl-symbol-end) |
| 628 | (forward-word -1) | 616 | (forward-word -1) |
| 629 | (setq cmpl-symbol-end (point)) | 617 | (setq cmpl-symbol-end (point)) |
| 630 | (goto-char cmpl-saved-point) | 618 | (goto-char cmpl-saved-point))) |
| 631 | )) | ||
| 632 | ;; Return completion if the length is reasonable. | 619 | ;; Return completion if the length is reasonable. |
| 633 | (if (and (<= (cmpl-read-time-eval completion-min-length) | 620 | (if (and (<= (cmpl-read-time-eval completion-min-length) |
| 634 | (- cmpl-symbol-end cmpl-symbol-start)) | 621 | (- cmpl-symbol-end cmpl-symbol-start)) |
| @@ -661,21 +648,18 @@ Returns nil if there isn't one longer than `completion-min-length'." | |||
| 661 | (cond ((= (setq cmpl-preceding-syntax (char-syntax (preceding-char))) ?_) | 648 | (cond ((= (setq cmpl-preceding-syntax (char-syntax (preceding-char))) ?_) |
| 662 | ;; Number of chars to ignore at end. | 649 | ;; Number of chars to ignore at end. |
| 663 | (setq cmpl-symbol-end (point) | 650 | (setq cmpl-symbol-end (point) |
| 664 | cmpl-symbol-start (scan-sexps cmpl-symbol-end -1) | 651 | cmpl-symbol-start (scan-sexps cmpl-symbol-end -1)) |
| 665 | ) | ||
| 666 | ;; Remove chars to ignore at the start. | 652 | ;; Remove chars to ignore at the start. |
| 667 | (cond ((= (char-syntax (char-after cmpl-symbol-start)) ?w) | 653 | (cond ((= (char-syntax (char-after cmpl-symbol-start)) ?w) |
| 668 | (goto-char cmpl-symbol-start) | 654 | (goto-char cmpl-symbol-start) |
| 669 | (forward-word 1) | 655 | (forward-word 1) |
| 670 | (setq cmpl-symbol-start (point)) | 656 | (setq cmpl-symbol-start (point)) |
| 671 | (goto-char cmpl-symbol-end) | 657 | (goto-char cmpl-symbol-end))) |
| 672 | )) | ||
| 673 | ;; Return value if long enough. | 658 | ;; Return value if long enough. |
| 674 | (if (>= cmpl-symbol-end | 659 | (if (>= cmpl-symbol-end |
| 675 | (+ cmpl-symbol-start | 660 | (+ cmpl-symbol-start |
| 676 | (cmpl-read-time-eval completion-min-length))) | 661 | (cmpl-read-time-eval completion-min-length))) |
| 677 | (buffer-substring cmpl-symbol-start cmpl-symbol-end)) | 662 | (buffer-substring cmpl-symbol-start cmpl-symbol-end))) |
| 678 | ) | ||
| 679 | ((= cmpl-preceding-syntax ?w) | 663 | ((= cmpl-preceding-syntax ?w) |
| 680 | ;; chars to ignore at end | 664 | ;; chars to ignore at end |
| 681 | (setq cmpl-saved-point (point) | 665 | (setq cmpl-saved-point (point) |
| @@ -687,8 +671,7 @@ Returns nil if there isn't one longer than `completion-min-length'." | |||
| 687 | (cond ((= (char-syntax (char-after cmpl-symbol-start)) ?w) | 671 | (cond ((= (char-syntax (char-after cmpl-symbol-start)) ?w) |
| 688 | (goto-char cmpl-symbol-start) | 672 | (goto-char cmpl-symbol-start) |
| 689 | (forward-word 1) | 673 | (forward-word 1) |
| 690 | (setq cmpl-symbol-start (point)) | 674 | (setq cmpl-symbol-start (point)))) |
| 691 | )) | ||
| 692 | ;; Restore state. | 675 | ;; Restore state. |
| 693 | (goto-char cmpl-saved-point) | 676 | (goto-char cmpl-saved-point) |
| 694 | ;; Return completion if the length is reasonable | 677 | ;; Return completion if the length is reasonable |
| @@ -743,15 +726,13 @@ Returns nil if there isn't one longer than `completion-min-length'." | |||
| 743 | (cond ((memq (setq cmpl-preceding-syntax (char-syntax (preceding-char))) | 726 | (cond ((memq (setq cmpl-preceding-syntax (char-syntax (preceding-char))) |
| 744 | '(?_ ?w)) | 727 | '(?_ ?w)) |
| 745 | (setq cmpl-symbol-end (point) | 728 | (setq cmpl-symbol-end (point) |
| 746 | cmpl-symbol-start (scan-sexps cmpl-symbol-end -1) | 729 | cmpl-symbol-start (scan-sexps cmpl-symbol-end -1)) |
| 747 | ) | ||
| 748 | ;; Remove chars to ignore at the start. | 730 | ;; Remove chars to ignore at the start. |
| 749 | (cond ((= (char-syntax (char-after cmpl-symbol-start)) ?w) | 731 | (cond ((= (char-syntax (char-after cmpl-symbol-start)) ?w) |
| 750 | (goto-char cmpl-symbol-start) | 732 | (goto-char cmpl-symbol-start) |
| 751 | (forward-word 1) | 733 | (forward-word 1) |
| 752 | (setq cmpl-symbol-start (point)) | 734 | (setq cmpl-symbol-start (point)) |
| 753 | (goto-char cmpl-symbol-end) | 735 | (goto-char cmpl-symbol-end))) |
| 754 | )) | ||
| 755 | ;; Return completion if the length is reasonable. | 736 | ;; Return completion if the length is reasonable. |
| 756 | (if (and (<= (cmpl-read-time-eval | 737 | (if (and (<= (cmpl-read-time-eval |
| 757 | completion-prefix-min-length) | 738 | completion-prefix-min-length) |
| @@ -857,25 +838,21 @@ INITIAL-COMPLETIONS-TRIED is a list of downcased strings to ignore | |||
| 857 | during the search." | 838 | during the search." |
| 858 | (setq cdabbrev-abbrev-string abbrev-string | 839 | (setq cdabbrev-abbrev-string abbrev-string |
| 859 | cdabbrev-completions-tried | 840 | cdabbrev-completions-tried |
| 860 | (cons (downcase abbrev-string) initial-completions-tried) | 841 | (cons (downcase abbrev-string) initial-completions-tried)) |
| 861 | ) | 842 | (reset-cdabbrev-window t)) |
| 862 | (reset-cdabbrev-window t) | ||
| 863 | ) | ||
| 864 | 843 | ||
| 865 | (defun set-cdabbrev-buffer () | 844 | (defun set-cdabbrev-buffer () |
| 866 | ;; cdabbrev-current-window must not be NIL | 845 | ;; cdabbrev-current-window must not be NIL |
| 867 | (set-buffer (if (eq cdabbrev-current-window t) | 846 | (set-buffer (if (eq cdabbrev-current-window t) |
| 868 | (other-buffer) | 847 | (other-buffer) |
| 869 | (window-buffer cdabbrev-current-window))) | 848 | (window-buffer cdabbrev-current-window)))) |
| 870 | ) | ||
| 871 | 849 | ||
| 872 | 850 | ||
| 873 | (defun reset-cdabbrev-window (&optional initializep) | 851 | (defun reset-cdabbrev-window (&optional initializep) |
| 874 | "Resets the cdabbrev search to search for abbrev-string." | 852 | "Resets the cdabbrev search to search for abbrev-string." |
| 875 | ;; Set the window | 853 | ;; Set the window |
| 876 | (cond (initializep | 854 | (cond (initializep |
| 877 | (setq cdabbrev-current-window (selected-window)) | 855 | (setq cdabbrev-current-window (selected-window))) |
| 878 | ) | ||
| 879 | ((eq cdabbrev-current-window t) | 856 | ((eq cdabbrev-current-window t) |
| 880 | ;; Everything has failed | 857 | ;; Everything has failed |
| 881 | (setq cdabbrev-current-window nil)) | 858 | (setq cdabbrev-current-window nil)) |
| @@ -883,8 +860,7 @@ during the search." | |||
| 883 | (setq cdabbrev-current-window (next-window cdabbrev-current-window)) | 860 | (setq cdabbrev-current-window (next-window cdabbrev-current-window)) |
| 884 | (if (eq cdabbrev-current-window (selected-window)) | 861 | (if (eq cdabbrev-current-window (selected-window)) |
| 885 | ;; No more windows, try other buffer. | 862 | ;; No more windows, try other buffer. |
| 886 | (setq cdabbrev-current-window t))) | 863 | (setq cdabbrev-current-window t)))) |
| 887 | ) | ||
| 888 | (if cdabbrev-current-window | 864 | (if cdabbrev-current-window |
| 889 | (save-excursion | 865 | (save-excursion |
| 890 | (set-cdabbrev-buffer) | 866 | (set-cdabbrev-buffer) |
| @@ -895,8 +871,7 @@ during the search." | |||
| 895 | (max (point-min) | 871 | (max (point-min) |
| 896 | (- cdabbrev-start-point completion-search-distance)) | 872 | (- cdabbrev-start-point completion-search-distance)) |
| 897 | (point-min)) | 873 | (point-min)) |
| 898 | cdabbrev-wrapped-p nil) | 874 | cdabbrev-wrapped-p nil)))) |
| 899 | ))) | ||
| 900 | 875 | ||
| 901 | (defun next-cdabbrev () | 876 | (defun next-cdabbrev () |
| 902 | "Return the next possible cdabbrev expansion or nil if there isn't one. | 877 | "Return the next possible cdabbrev expansion or nil if there isn't one. |
| @@ -938,8 +913,7 @@ This is sensitive to `case-fold-search'." | |||
| 938 | (forward-word -1) | 913 | (forward-word -1) |
| 939 | (prog1 | 914 | (prog1 |
| 940 | (= (char-syntax (preceding-char)) ? ) | 915 | (= (char-syntax (preceding-char)) ? ) |
| 941 | (goto-char saved-point-2) | 916 | (goto-char saved-point-2))))) |
| 942 | )))) | ||
| 943 | ;; is the symbol long enough ? | 917 | ;; is the symbol long enough ? |
| 944 | (setq expansion (symbol-under-point)) | 918 | (setq expansion (symbol-under-point)) |
| 945 | ;; have we not tried this one before | 919 | ;; have we not tried this one before |
| @@ -951,14 +925,12 @@ This is sensitive to `case-fold-search'." | |||
| 951 | (not (string-equal downcase-expansion | 925 | (not (string-equal downcase-expansion |
| 952 | (car tried-list)))) | 926 | (car tried-list)))) |
| 953 | ;; Already tried, don't choose this one | 927 | ;; Already tried, don't choose this one |
| 954 | (setq tried-list (cdr tried-list)) | 928 | (setq tried-list (cdr tried-list))) |
| 955 | ) | ||
| 956 | ;; at this point tried-list will be nil if this | 929 | ;; at this point tried-list will be nil if this |
| 957 | ;; expansion has not yet been tried | 930 | ;; expansion has not yet been tried |
| 958 | (if tried-list | 931 | (if tried-list |
| 959 | (setq expansion nil) | 932 | (setq expansion nil) |
| 960 | t) | 933 | t))))) |
| 961 | )))) | ||
| 962 | ;; search failed | 934 | ;; search failed |
| 963 | (cdabbrev-wrapped-p | 935 | (cdabbrev-wrapped-p |
| 964 | ;; If already wrapped, then we've failed completely | 936 | ;; If already wrapped, then we've failed completely |
| @@ -970,18 +942,15 @@ This is sensitive to `case-fold-search'." | |||
| 970 | (min (point-max) (+ cdabbrev-start-point completion-search-distance)) | 942 | (min (point-max) (+ cdabbrev-start-point completion-search-distance)) |
| 971 | (point-max)))) | 943 | (point-max)))) |
| 972 | 944 | ||
| 973 | (setq cdabbrev-wrapped-p t)) | 945 | (setq cdabbrev-wrapped-p t)))) |
| 974 | )) | ||
| 975 | ;; end of while loop | 946 | ;; end of while loop |
| 976 | (cond (expansion | 947 | (cond (expansion |
| 977 | ;; successful | 948 | ;; successful |
| 978 | (setq cdabbrev-completions-tried | 949 | (setq cdabbrev-completions-tried |
| 979 | (cons downcase-expansion cdabbrev-completions-tried) | 950 | (cons downcase-expansion cdabbrev-completions-tried) |
| 980 | cdabbrev-current-point (point)))) | 951 | cdabbrev-current-point (point))))) |
| 981 | ) | ||
| 982 | (set-syntax-table saved-syntax) | 952 | (set-syntax-table saved-syntax) |
| 983 | (goto-char saved-point) | 953 | (goto-char saved-point))) |
| 984 | )) | ||
| 985 | ;; If no expansion, go to next window | 954 | ;; If no expansion, go to next window |
| 986 | (cond (expansion) | 955 | (cond (expansion) |
| 987 | (t (reset-cdabbrev-window) | 956 | (t (reset-cdabbrev-window) |
| @@ -1109,18 +1078,17 @@ Each symbol is bound to a single completion entry.") | |||
| 1109 | ;;----------------------------------------------- | 1078 | ;;----------------------------------------------- |
| 1110 | 1079 | ||
| 1111 | (defun clear-all-completions () | 1080 | (defun clear-all-completions () |
| 1112 | "Initializes the completion storage. All existing completions are lost." | 1081 | "Initialize the completion storage. All existing completions are lost." |
| 1113 | (interactive) | 1082 | (interactive) |
| 1114 | (setq cmpl-prefix-obarray (make-vector cmpl-obarray-length 0)) | 1083 | (setq cmpl-prefix-obarray (make-vector cmpl-obarray-length 0)) |
| 1115 | (setq cmpl-obarray (make-vector cmpl-obarray-length 0)) | 1084 | (setq cmpl-obarray (make-vector cmpl-obarray-length 0)) |
| 1116 | (cmpl-statistics-block | 1085 | (cmpl-statistics-block |
| 1117 | (record-clear-all-completions)) | 1086 | (record-clear-all-completions))) |
| 1118 | ) | ||
| 1119 | 1087 | ||
| 1120 | (defvar completions-list-return-value) | 1088 | (defvar completions-list-return-value) |
| 1121 | 1089 | ||
| 1122 | (defun list-all-completions () | 1090 | (defun list-all-completions () |
| 1123 | "Returns a list of all the known completion entries." | 1091 | "Return a list of all the known completion entries." |
| 1124 | (let ((completions-list-return-value nil)) | 1092 | (let ((completions-list-return-value nil)) |
| 1125 | (mapatoms 'list-all-completions-1 cmpl-prefix-obarray) | 1093 | (mapatoms 'list-all-completions-1 cmpl-prefix-obarray) |
| 1126 | completions-list-return-value)) | 1094 | completions-list-return-value)) |
| @@ -1168,16 +1136,15 @@ Each symbol is bound to a single completion entry.") | |||
| 1168 | 1136 | ||
| 1169 | ;; READS | 1137 | ;; READS |
| 1170 | (defun find-exact-completion (string) | 1138 | (defun find-exact-completion (string) |
| 1171 | "Returns the completion entry for string or nil. | 1139 | "Return the completion entry for STRING or nil. |
| 1172 | Sets up `cmpl-db-downcase-string' and `cmpl-db-symbol'." | 1140 | Sets up `cmpl-db-downcase-string' and `cmpl-db-symbol'." |
| 1173 | (and (boundp (setq cmpl-db-symbol | 1141 | (and (boundp (setq cmpl-db-symbol |
| 1174 | (intern (setq cmpl-db-downcase-string (downcase string)) | 1142 | (intern (setq cmpl-db-downcase-string (downcase string)) |
| 1175 | cmpl-obarray))) | 1143 | cmpl-obarray))) |
| 1176 | (symbol-value cmpl-db-symbol) | 1144 | (symbol-value cmpl-db-symbol))) |
| 1177 | )) | ||
| 1178 | 1145 | ||
| 1179 | (defun find-cmpl-prefix-entry (prefix-string) | 1146 | (defun find-cmpl-prefix-entry (prefix-string) |
| 1180 | "Returns the prefix entry for string. | 1147 | "Return the prefix entry for string. |
| 1181 | Sets `cmpl-db-prefix-symbol'. | 1148 | Sets `cmpl-db-prefix-symbol'. |
| 1182 | Prefix-string must be exactly `completion-prefix-min-length' long | 1149 | Prefix-string must be exactly `completion-prefix-min-length' long |
| 1183 | and downcased. Sets up `cmpl-db-prefix-symbol'." | 1150 | and downcased. Sets up `cmpl-db-prefix-symbol'." |
| @@ -1189,20 +1156,18 @@ and downcased. Sets up `cmpl-db-prefix-symbol'." | |||
| 1189 | ;; used to trap lossage in silent error correction | 1156 | ;; used to trap lossage in silent error correction |
| 1190 | 1157 | ||
| 1191 | (defun locate-completion-entry (completion-entry prefix-entry) | 1158 | (defun locate-completion-entry (completion-entry prefix-entry) |
| 1192 | "Locates the completion entry. | 1159 | "Locate the completion entry. |
| 1193 | Returns a pointer to the element before the completion entry or nil if | 1160 | Returns a pointer to the element before the completion entry or nil if |
| 1194 | the completion entry is at the head. | 1161 | the completion entry is at the head. |
| 1195 | Must be called after `find-exact-completion'." | 1162 | Must be called after `find-exact-completion'." |
| 1196 | (let ((prefix-list (cmpl-prefix-entry-head prefix-entry)) | 1163 | (let ((prefix-list (cmpl-prefix-entry-head prefix-entry)) |
| 1197 | next-prefix-list | 1164 | next-prefix-list) |
| 1198 | ) | ||
| 1199 | (cond | 1165 | (cond |
| 1200 | ((not (eq (car prefix-list) completion-entry)) | 1166 | ((not (eq (car prefix-list) completion-entry)) |
| 1201 | ;; not already at head | 1167 | ;; not already at head |
| 1202 | (while (and prefix-list | 1168 | (while (and prefix-list |
| 1203 | (not (eq completion-entry | 1169 | (not (eq completion-entry |
| 1204 | (car (setq next-prefix-list (cdr prefix-list))) | 1170 | (car (setq next-prefix-list (cdr prefix-list)))))) |
| 1205 | ))) | ||
| 1206 | (setq prefix-list next-prefix-list)) | 1171 | (setq prefix-list next-prefix-list)) |
| 1207 | (cond (;; found | 1172 | (cond (;; found |
| 1208 | prefix-list) | 1173 | prefix-list) |
| @@ -1218,8 +1183,7 @@ Must be called after `find-exact-completion'." | |||
| 1218 | ;; Patch out | 1183 | ;; Patch out |
| 1219 | (set cmpl-db-symbol nil) | 1184 | (set cmpl-db-symbol nil) |
| 1220 | ;; Retry | 1185 | ;; Retry |
| 1221 | (locate-completion-entry-retry completion-entry) | 1186 | (locate-completion-entry-retry completion-entry))))))) |
| 1222 | )))))) | ||
| 1223 | 1187 | ||
| 1224 | (defun locate-completion-entry-retry (old-entry) | 1188 | (defun locate-completion-entry-retry (old-entry) |
| 1225 | (let ((inside-locate-completion-entry t)) | 1189 | (let ((inside-locate-completion-entry t)) |
| @@ -1231,19 +1195,16 @@ Must be called after `find-exact-completion'." | |||
| 1231 | (if cmpl-entry | 1195 | (if cmpl-entry |
| 1232 | (find-cmpl-prefix-entry | 1196 | (find-cmpl-prefix-entry |
| 1233 | (substring cmpl-db-downcase-string | 1197 | (substring cmpl-db-downcase-string |
| 1234 | 0 completion-prefix-min-length)))) | 1198 | 0 completion-prefix-min-length))))) |
| 1235 | ) | ||
| 1236 | (if (and cmpl-entry pref-entry) | 1199 | (if (and cmpl-entry pref-entry) |
| 1237 | ;; try again | 1200 | ;; try again |
| 1238 | (locate-completion-entry cmpl-entry pref-entry) | 1201 | (locate-completion-entry cmpl-entry pref-entry) |
| 1239 | ;; still losing | 1202 | ;; still losing |
| 1240 | (locate-completion-db-error)) | 1203 | (locate-completion-db-error))))) |
| 1241 | ))) | ||
| 1242 | 1204 | ||
| 1243 | (defun locate-completion-db-error () | 1205 | (defun locate-completion-db-error () |
| 1244 | ;; recursive error: really scrod | 1206 | ;; recursive error: really scrod |
| 1245 | (error "Completion database corrupted. Try M-x clear-all-completions. Send bug report.") | 1207 | (error "Completion database corrupted. Try M-x clear-all-completions. Send bug report.")) |
| 1246 | ) | ||
| 1247 | 1208 | ||
| 1248 | ;; WRITES | 1209 | ;; WRITES |
| 1249 | (defun add-completion-to-tail-if-new (string) | 1210 | (defun add-completion-to-tail-if-new (string) |
| @@ -1261,8 +1222,7 @@ Returns the completion entry." | |||
| 1261 | (prefix-entry (find-cmpl-prefix-entry | 1222 | (prefix-entry (find-cmpl-prefix-entry |
| 1262 | (substring cmpl-db-downcase-string 0 | 1223 | (substring cmpl-db-downcase-string 0 |
| 1263 | (cmpl-read-time-eval | 1224 | (cmpl-read-time-eval |
| 1264 | completion-prefix-min-length)))) | 1225 | completion-prefix-min-length))))) |
| 1265 | ) | ||
| 1266 | ;; The next two forms should happen as a unit (atomically) but | 1226 | ;; The next two forms should happen as a unit (atomically) but |
| 1267 | ;; no fatal errors should result if that is not the case. | 1227 | ;; no fatal errors should result if that is not the case. |
| 1268 | (cond (prefix-entry | 1228 | (cond (prefix-entry |
| @@ -1271,14 +1231,12 @@ Returns the completion entry." | |||
| 1271 | (setcdr (cmpl-prefix-entry-tail prefix-entry) entry) | 1231 | (setcdr (cmpl-prefix-entry-tail prefix-entry) entry) |
| 1272 | (set-cmpl-prefix-entry-tail prefix-entry entry)) | 1232 | (set-cmpl-prefix-entry-tail prefix-entry entry)) |
| 1273 | (t | 1233 | (t |
| 1274 | (set cmpl-db-prefix-symbol (make-cmpl-prefix-entry entry)) | 1234 | (set cmpl-db-prefix-symbol (make-cmpl-prefix-entry entry)))) |
| 1275 | )) | ||
| 1276 | ;; statistics | 1235 | ;; statistics |
| 1277 | (cmpl-statistics-block | 1236 | (cmpl-statistics-block |
| 1278 | (note-added-completion)) | 1237 | (note-added-completion)) |
| 1279 | ;; set symbol | 1238 | ;; set symbol |
| 1280 | (set cmpl-db-symbol (car entry)) | 1239 | (set cmpl-db-symbol (car entry))))) |
| 1281 | ))) | ||
| 1282 | 1240 | ||
| 1283 | (defun add-completion-to-head (completion-string) | 1241 | (defun add-completion-to-head (completion-string) |
| 1284 | "If COMPLETION-STRING is not in the database, add it to prefix list. | 1242 | "If COMPLETION-STRING is not in the database, add it to prefix list. |
| @@ -1298,8 +1256,7 @@ Returns the completion entry." | |||
| 1298 | (cmpl-read-time-eval | 1256 | (cmpl-read-time-eval |
| 1299 | completion-prefix-min-length)))) | 1257 | completion-prefix-min-length)))) |
| 1300 | (splice-ptr (locate-completion-entry cmpl-db-entry prefix-entry)) | 1258 | (splice-ptr (locate-completion-entry cmpl-db-entry prefix-entry)) |
| 1301 | (cmpl-ptr (cdr splice-ptr)) | 1259 | (cmpl-ptr (cdr splice-ptr))) |
| 1302 | ) | ||
| 1303 | ;; update entry | 1260 | ;; update entry |
| 1304 | (set-completion-string cmpl-db-entry completion-string) | 1261 | (set-completion-string cmpl-db-entry completion-string) |
| 1305 | ;; move to head (if necessary) | 1262 | ;; move to head (if necessary) |
| @@ -1312,8 +1269,7 @@ Returns the completion entry." | |||
| 1312 | (set-cmpl-prefix-entry-tail prefix-entry splice-ptr)) | 1269 | (set-cmpl-prefix-entry-tail prefix-entry splice-ptr)) |
| 1313 | ;; splice in at head | 1270 | ;; splice in at head |
| 1314 | (setcdr cmpl-ptr (cmpl-prefix-entry-head prefix-entry)) | 1271 | (setcdr cmpl-ptr (cmpl-prefix-entry-head prefix-entry)) |
| 1315 | (set-cmpl-prefix-entry-head prefix-entry cmpl-ptr) | 1272 | (set-cmpl-prefix-entry-head prefix-entry cmpl-ptr))) |
| 1316 | )) | ||
| 1317 | cmpl-db-entry) | 1273 | cmpl-db-entry) |
| 1318 | ;; not there | 1274 | ;; not there |
| 1319 | (let (;; create an entry | 1275 | (let (;; create an entry |
| @@ -1322,25 +1278,22 @@ Returns the completion entry." | |||
| 1322 | (prefix-entry (find-cmpl-prefix-entry | 1278 | (prefix-entry (find-cmpl-prefix-entry |
| 1323 | (substring cmpl-db-downcase-string 0 | 1279 | (substring cmpl-db-downcase-string 0 |
| 1324 | (cmpl-read-time-eval | 1280 | (cmpl-read-time-eval |
| 1325 | completion-prefix-min-length)))) | 1281 | completion-prefix-min-length))))) |
| 1326 | ) | ||
| 1327 | (cond (prefix-entry | 1282 | (cond (prefix-entry |
| 1328 | ;; Splice in at head | 1283 | ;; Splice in at head |
| 1329 | (setcdr entry (cmpl-prefix-entry-head prefix-entry)) | 1284 | (setcdr entry (cmpl-prefix-entry-head prefix-entry)) |
| 1330 | (set-cmpl-prefix-entry-head prefix-entry entry)) | 1285 | (set-cmpl-prefix-entry-head prefix-entry entry)) |
| 1331 | (t | 1286 | (t |
| 1332 | ;; Start new prefix entry | 1287 | ;; Start new prefix entry |
| 1333 | (set cmpl-db-prefix-symbol (make-cmpl-prefix-entry entry)) | 1288 | (set cmpl-db-prefix-symbol (make-cmpl-prefix-entry entry)))) |
| 1334 | )) | ||
| 1335 | ;; statistics | 1289 | ;; statistics |
| 1336 | (cmpl-statistics-block | 1290 | (cmpl-statistics-block |
| 1337 | (note-added-completion)) | 1291 | (note-added-completion)) |
| 1338 | ;; Add it to the symbol | 1292 | ;; Add it to the symbol |
| 1339 | (set cmpl-db-symbol (car entry)) | 1293 | (set cmpl-db-symbol (car entry))))) |
| 1340 | ))) | ||
| 1341 | 1294 | ||
| 1342 | (defun delete-completion (completion-string) | 1295 | (defun delete-completion (completion-string) |
| 1343 | "Deletes the completion from the database. | 1296 | "Delete the completion from the database. |
| 1344 | String must be longer than `completion-prefix-min-length'." | 1297 | String must be longer than `completion-prefix-min-length'." |
| 1345 | ;; Handle pending acceptance | 1298 | ;; Handle pending acceptance |
| 1346 | (if completion-to-accept (accept-completion)) | 1299 | (if completion-to-accept (accept-completion)) |
| @@ -1350,8 +1303,7 @@ String must be longer than `completion-prefix-min-length'." | |||
| 1350 | (substring cmpl-db-downcase-string 0 | 1303 | (substring cmpl-db-downcase-string 0 |
| 1351 | (cmpl-read-time-eval | 1304 | (cmpl-read-time-eval |
| 1352 | completion-prefix-min-length)))) | 1305 | completion-prefix-min-length)))) |
| 1353 | (splice-ptr (locate-completion-entry cmpl-db-entry prefix-entry)) | 1306 | (splice-ptr (locate-completion-entry cmpl-db-entry prefix-entry))) |
| 1354 | ) | ||
| 1355 | ;; delete symbol reference | 1307 | ;; delete symbol reference |
| 1356 | (set cmpl-db-symbol nil) | 1308 | (set cmpl-db-symbol nil) |
| 1357 | ;; remove from prefix list | 1309 | ;; remove from prefix list |
| @@ -1359,20 +1311,16 @@ String must be longer than `completion-prefix-min-length'." | |||
| 1359 | ;; not at head | 1311 | ;; not at head |
| 1360 | (or (setcdr splice-ptr (cdr (cdr splice-ptr))) | 1312 | (or (setcdr splice-ptr (cdr (cdr splice-ptr))) |
| 1361 | ;; fix up tail if necessary | 1313 | ;; fix up tail if necessary |
| 1362 | (set-cmpl-prefix-entry-tail prefix-entry splice-ptr)) | 1314 | (set-cmpl-prefix-entry-tail prefix-entry splice-ptr))) |
| 1363 | ) | ||
| 1364 | (t | 1315 | (t |
| 1365 | ;; at head | 1316 | ;; at head |
| 1366 | (or (set-cmpl-prefix-entry-head | 1317 | (or (set-cmpl-prefix-entry-head |
| 1367 | prefix-entry (cdr (cmpl-prefix-entry-head prefix-entry))) | 1318 | prefix-entry (cdr (cmpl-prefix-entry-head prefix-entry))) |
| 1368 | ;; List is now empty | 1319 | ;; List is now empty |
| 1369 | (set cmpl-db-prefix-symbol nil)) | 1320 | (set cmpl-db-prefix-symbol nil)))) |
| 1370 | )) | ||
| 1371 | (cmpl-statistics-block | 1321 | (cmpl-statistics-block |
| 1372 | (note-completion-deleted)) | 1322 | (note-completion-deleted))) |
| 1373 | ) | 1323 | (error "Unknown completion `%s'" completion-string))) |
| 1374 | (error "Unknown completion `%s'" completion-string) | ||
| 1375 | )) | ||
| 1376 | 1324 | ||
| 1377 | ;; Tests -- | 1325 | ;; Tests -- |
| 1378 | ;; - Add and Find - | 1326 | ;; - Add and Find - |
| @@ -1427,13 +1375,10 @@ String must be longer than `completion-prefix-min-length'." | |||
| 1427 | (new-prompt | 1375 | (new-prompt |
| 1428 | (if default | 1376 | (if default |
| 1429 | (format "%s: (default: %s) " prompt default) | 1377 | (format "%s: (default: %s) " prompt default) |
| 1430 | (format "%s: " prompt)) | 1378 | (format "%s: " prompt))) |
| 1431 | ) | 1379 | (read (completing-read new-prompt cmpl-obarray))) |
| 1432 | (read (completing-read new-prompt cmpl-obarray)) | ||
| 1433 | ) | ||
| 1434 | (if (zerop (length read)) (setq read (or default ""))) | 1380 | (if (zerop (length read)) (setq read (or default ""))) |
| 1435 | (list read) | 1381 | (list read))) |
| 1436 | )) | ||
| 1437 | 1382 | ||
| 1438 | (defun check-completion-length (string) | 1383 | (defun check-completion-length (string) |
| 1439 | (if (< (length string) completion-min-length) | 1384 | (if (< (length string) completion-min-length) |
| @@ -1454,8 +1399,7 @@ specified." | |||
| 1454 | 1399 | ||
| 1455 | (if num-uses (set-completion-num-uses entry num-uses)) | 1400 | (if num-uses (set-completion-num-uses entry num-uses)) |
| 1456 | (if last-use-time | 1401 | (if last-use-time |
| 1457 | (set-completion-last-use-time entry last-use-time)) | 1402 | (set-completion-last-use-time entry last-use-time)))) |
| 1458 | )) | ||
| 1459 | 1403 | ||
| 1460 | (defun add-permanent-completion (string) | 1404 | (defun add-permanent-completion (string) |
| 1461 | "Add STRING if it isn't already listed, and mark it permanent." | 1405 | "Add STRING if it isn't already listed, and mark it permanent." |
| @@ -1463,16 +1407,13 @@ specified." | |||
| 1463 | (interactive-completion-string-reader "Completion to add permanently")) | 1407 | (interactive-completion-string-reader "Completion to add permanently")) |
| 1464 | (let ((current-completion-source (if (interactive-p) | 1408 | (let ((current-completion-source (if (interactive-p) |
| 1465 | cmpl-source-interactive | 1409 | cmpl-source-interactive |
| 1466 | current-completion-source)) | 1410 | current-completion-source))) |
| 1467 | ) | 1411 | (add-completion string nil t))) |
| 1468 | (add-completion string nil t) | ||
| 1469 | )) | ||
| 1470 | 1412 | ||
| 1471 | (defun kill-completion (string) | 1413 | (defun kill-completion (string) |
| 1472 | (interactive (interactive-completion-string-reader "Completion to kill")) | 1414 | (interactive (interactive-completion-string-reader "Completion to kill")) |
| 1473 | (check-completion-length string) | 1415 | (check-completion-length string) |
| 1474 | (delete-completion string) | 1416 | (delete-completion string)) |
| 1475 | ) | ||
| 1476 | 1417 | ||
| 1477 | (defun accept-completion () | 1418 | (defun accept-completion () |
| 1478 | "Accepts the pending completion in `completion-to-accept'. | 1419 | "Accepts the pending completion in `completion-to-accept'. |
| @@ -1481,13 +1422,11 @@ This bumps num-uses. Called by `add-completion-to-head' and | |||
| 1481 | (let ((string completion-to-accept) | 1422 | (let ((string completion-to-accept) |
| 1482 | ;; if this is added afresh here, then it must be a cdabbrev | 1423 | ;; if this is added afresh here, then it must be a cdabbrev |
| 1483 | (current-completion-source cmpl-source-cdabbrev) | 1424 | (current-completion-source cmpl-source-cdabbrev) |
| 1484 | entry | 1425 | entry) |
| 1485 | ) | ||
| 1486 | (setq completion-to-accept nil) | 1426 | (setq completion-to-accept nil) |
| 1487 | (setq entry (add-completion-to-head string)) | 1427 | (setq entry (add-completion-to-head string)) |
| 1488 | (set-completion-num-uses entry (1+ (completion-num-uses entry))) | 1428 | (set-completion-num-uses entry (1+ (completion-num-uses entry))) |
| 1489 | (setq cmpl-completions-accepted-p t) | 1429 | (setq cmpl-completions-accepted-p t))) |
| 1490 | )) | ||
| 1491 | 1430 | ||
| 1492 | (defun use-completion-under-point () | 1431 | (defun use-completion-under-point () |
| 1493 | "Add the completion symbol underneath the point into the completion buffer." | 1432 | "Add the completion symbol underneath the point into the completion buffer." |
| @@ -1515,16 +1454,14 @@ Completions added this way will automatically be saved if | |||
| 1515 | (current-completion-source cmpl-source-separator) | 1454 | (current-completion-source cmpl-source-separator) |
| 1516 | entry) | 1455 | entry) |
| 1517 | (cmpl-statistics-block | 1456 | (cmpl-statistics-block |
| 1518 | (note-separator-character string) | 1457 | (note-separator-character string)) |
| 1519 | ) | ||
| 1520 | (cond (string | 1458 | (cond (string |
| 1521 | (setq entry (add-completion-to-head string)) | 1459 | (setq entry (add-completion-to-head string)) |
| 1522 | (if (and completion-on-separator-character | 1460 | (if (and completion-on-separator-character |
| 1523 | (zerop (completion-num-uses entry))) | 1461 | (zerop (completion-num-uses entry))) |
| 1524 | (progn | 1462 | (progn |
| 1525 | (set-completion-num-uses entry 1) | 1463 | (set-completion-num-uses entry 1) |
| 1526 | (setq cmpl-completions-accepted-p t))))) | 1464 | (setq cmpl-completions-accepted-p t))))))) |
| 1527 | )) | ||
| 1528 | 1465 | ||
| 1529 | ;; Tests -- | 1466 | ;; Tests -- |
| 1530 | ;; - Add and Find - | 1467 | ;; - Add and Find - |
| @@ -1589,16 +1526,14 @@ STRING must be longer than `completion-prefix-min-length'." | |||
| 1589 | (downcase (substring string 0 completion-prefix-min-length)))) | 1526 | (downcase (substring string 0 completion-prefix-min-length)))) |
| 1590 | cmpl-test-string string | 1527 | cmpl-test-string string |
| 1591 | cmpl-test-regexp (concat (regexp-quote string) ".")) | 1528 | cmpl-test-regexp (concat (regexp-quote string) ".")) |
| 1592 | (completion-search-reset-1) | 1529 | (completion-search-reset-1)) |
| 1593 | ) | ||
| 1594 | 1530 | ||
| 1595 | (defun completion-search-reset-1 () | 1531 | (defun completion-search-reset-1 () |
| 1596 | (setq cmpl-next-possibilities cmpl-starting-possibilities | 1532 | (setq cmpl-next-possibilities cmpl-starting-possibilities |
| 1597 | cmpl-next-possibility nil | 1533 | cmpl-next-possibility nil |
| 1598 | cmpl-cdabbrev-reset-p nil | 1534 | cmpl-cdabbrev-reset-p nil |
| 1599 | cmpl-last-index -1 | 1535 | cmpl-last-index -1 |
| 1600 | cmpl-tried-list nil | 1536 | cmpl-tried-list nil)) |
| 1601 | )) | ||
| 1602 | 1537 | ||
| 1603 | (defun completion-search-next (index) | 1538 | (defun completion-search-next (index) |
| 1604 | "Return the next completion entry. | 1539 | "Return the next completion entry. |
| @@ -1615,8 +1550,7 @@ If there are no more entries, try cdabbrev and returns only a string." | |||
| 1615 | ;; do a "normal" search | 1550 | ;; do a "normal" search |
| 1616 | (while (and (completion-search-peek nil) | 1551 | (while (and (completion-search-peek nil) |
| 1617 | (< (setq index (1+ index)) 0)) | 1552 | (< (setq index (1+ index)) 0)) |
| 1618 | (setq cmpl-next-possibility nil) | 1553 | (setq cmpl-next-possibility nil)) |
| 1619 | ) | ||
| 1620 | (cond ((not cmpl-next-possibilities)) | 1554 | (cond ((not cmpl-next-possibilities)) |
| 1621 | ;; If no more possibilities, leave it that way | 1555 | ;; If no more possibilities, leave it that way |
| 1622 | ((= -1 cmpl-last-index) | 1556 | ((= -1 cmpl-last-index) |
| @@ -1628,8 +1562,7 @@ If there are no more entries, try cdabbrev and returns only a string." | |||
| 1628 | (setq cmpl-next-possibilities | 1562 | (setq cmpl-next-possibilities |
| 1629 | (nthcdr (- (length cmpl-starting-possibilities) | 1563 | (nthcdr (- (length cmpl-starting-possibilities) |
| 1630 | (length cmpl-next-possibilities)) | 1564 | (length cmpl-next-possibilities)) |
| 1631 | cmpl-starting-possibilities)) | 1565 | cmpl-starting-possibilities))))) |
| 1632 | ))) | ||
| 1633 | (t | 1566 | (t |
| 1634 | ;; non-negative index, reset and search | 1567 | ;; non-negative index, reset and search |
| 1635 | ;;(prin1 'reset) | 1568 | ;;(prin1 'reset) |
| @@ -1637,13 +1570,10 @@ If there are no more entries, try cdabbrev and returns only a string." | |||
| 1637 | (setq cmpl-last-index index) | 1570 | (setq cmpl-last-index index) |
| 1638 | (while (and (completion-search-peek t) | 1571 | (while (and (completion-search-peek t) |
| 1639 | (not (< (setq index (1- index)) 0))) | 1572 | (not (< (setq index (1- index)) 0))) |
| 1640 | (setq cmpl-next-possibility nil) | 1573 | (setq cmpl-next-possibility nil)))) |
| 1641 | )) | ||
| 1642 | ) | ||
| 1643 | (prog1 | 1574 | (prog1 |
| 1644 | cmpl-next-possibility | 1575 | cmpl-next-possibility |
| 1645 | (setq cmpl-next-possibility nil) | 1576 | (setq cmpl-next-possibility nil))) |
| 1646 | )) | ||
| 1647 | 1577 | ||
| 1648 | 1578 | ||
| 1649 | (defun completion-search-peek (use-cdabbrev) | 1579 | (defun completion-search-peek (use-cdabbrev) |
| @@ -1660,25 +1590,20 @@ If there are no more entries, try cdabbrev and then return only a string." | |||
| 1660 | (while | 1590 | (while |
| 1661 | (and (not (eq 0 (string-match cmpl-test-regexp | 1591 | (and (not (eq 0 (string-match cmpl-test-regexp |
| 1662 | (completion-string (car cmpl-next-possibilities))))) | 1592 | (completion-string (car cmpl-next-possibilities))))) |
| 1663 | (setq cmpl-next-possibilities (cdr cmpl-next-possibilities)) | 1593 | (setq cmpl-next-possibilities (cdr cmpl-next-possibilities)))) |
| 1664 | )) | 1594 | cmpl-next-possibilities)) |
| 1665 | cmpl-next-possibilities | ||
| 1666 | )) | ||
| 1667 | ;; successful match | 1595 | ;; successful match |
| 1668 | (setq cmpl-next-possibility (car cmpl-next-possibilities) | 1596 | (setq cmpl-next-possibility (car cmpl-next-possibilities) |
| 1669 | cmpl-tried-list (cons (downcase (completion-string cmpl-next-possibility)) | 1597 | cmpl-tried-list (cons (downcase (completion-string cmpl-next-possibility)) |
| 1670 | cmpl-tried-list) | 1598 | cmpl-tried-list) |
| 1671 | cmpl-next-possibilities (cdr cmpl-next-possibilities) | 1599 | cmpl-next-possibilities (cdr cmpl-next-possibilities)) |
| 1672 | ) | ||
| 1673 | cmpl-next-possibility) | 1600 | cmpl-next-possibility) |
| 1674 | (use-cdabbrev | 1601 | (use-cdabbrev |
| 1675 | ;; unsuccessful, use cdabbrev | 1602 | ;; unsuccessful, use cdabbrev |
| 1676 | (cond ((not cmpl-cdabbrev-reset-p) | 1603 | (cond ((not cmpl-cdabbrev-reset-p) |
| 1677 | (reset-cdabbrev cmpl-test-string cmpl-tried-list) | 1604 | (reset-cdabbrev cmpl-test-string cmpl-tried-list) |
| 1678 | (setq cmpl-cdabbrev-reset-p t) | 1605 | (setq cmpl-cdabbrev-reset-p t))) |
| 1679 | )) | 1606 | (setq cmpl-next-possibility (next-cdabbrev))) |
| 1680 | (setq cmpl-next-possibility (next-cdabbrev)) | ||
| 1681 | ) | ||
| 1682 | ;; Completely unsuccessful, return nil | 1607 | ;; Completely unsuccessful, return nil |
| 1683 | )) | 1608 | )) |
| 1684 | 1609 | ||
| @@ -1728,11 +1653,10 @@ If there are no more entries, try cdabbrev and then return only a string." | |||
| 1728 | ;;----------------------------------------------- | 1653 | ;;----------------------------------------------- |
| 1729 | 1654 | ||
| 1730 | (defun completion-mode () | 1655 | (defun completion-mode () |
| 1731 | "Toggles whether or not to add new words to the completion database." | 1656 | "Toggle whether or not to add new words to the completion database." |
| 1732 | (interactive) | 1657 | (interactive) |
| 1733 | (setq enable-completion (not enable-completion)) | 1658 | (setq enable-completion (not enable-completion)) |
| 1734 | (message "Completion mode is now %s." (if enable-completion "ON" "OFF")) | 1659 | (message "Completion mode is now %s." (if enable-completion "ON" "OFF"))) |
| 1735 | ) | ||
| 1736 | 1660 | ||
| 1737 | (defvar cmpl-current-index 0) | 1661 | (defvar cmpl-current-index 0) |
| 1738 | (defvar cmpl-original-string nil) | 1662 | (defvar cmpl-original-string nil) |
| @@ -1754,18 +1678,15 @@ Prefix args :: | |||
| 1754 | ;; Undo last one | 1678 | ;; Undo last one |
| 1755 | (delete-region cmpl-last-insert-location (point)) | 1679 | (delete-region cmpl-last-insert-location (point)) |
| 1756 | ;; get next completion | 1680 | ;; get next completion |
| 1757 | (setq cmpl-current-index (+ cmpl-current-index (or arg 1))) | 1681 | (setq cmpl-current-index (+ cmpl-current-index (or arg 1)))) |
| 1758 | ) | ||
| 1759 | (t | 1682 | (t |
| 1760 | (if (not cmpl-initialized-p) | 1683 | (if (not cmpl-initialized-p) |
| 1761 | (initialize-completions)) ;; make sure everything's loaded | 1684 | (initialize-completions)) ;; make sure everything's loaded |
| 1762 | (cond ((consp current-prefix-arg) ;; control-u | 1685 | (cond ((consp current-prefix-arg) ;; control-u |
| 1763 | (setq arg 0) | 1686 | (setq arg 0) |
| 1764 | (setq cmpl-leave-point-at-start t) | 1687 | (setq cmpl-leave-point-at-start t)) |
| 1765 | ) | ||
| 1766 | (t | 1688 | (t |
| 1767 | (setq cmpl-leave-point-at-start nil) | 1689 | (setq cmpl-leave-point-at-start nil))) |
| 1768 | )) | ||
| 1769 | ;; get string | 1690 | ;; get string |
| 1770 | (setq cmpl-original-string (symbol-before-point-for-complete)) | 1691 | (setq cmpl-original-string (symbol-before-point-for-complete)) |
| 1771 | (cond ((not cmpl-original-string) | 1692 | (cond ((not cmpl-original-string) |
| @@ -1780,8 +1701,7 @@ Prefix args :: | |||
| 1780 | ;; reset database | 1701 | ;; reset database |
| 1781 | (completion-search-reset cmpl-original-string) | 1702 | (completion-search-reset cmpl-original-string) |
| 1782 | ;; erase what we've got | 1703 | ;; erase what we've got |
| 1783 | (delete-region cmpl-symbol-start cmpl-symbol-end) | 1704 | (delete-region cmpl-symbol-start cmpl-symbol-end))) |
| 1784 | )) | ||
| 1785 | 1705 | ||
| 1786 | ;; point is at the point to insert the new symbol | 1706 | ;; point is at the point to insert the new symbol |
| 1787 | ;; Get the next completion | 1707 | ;; Get the next completion |
| @@ -1790,8 +1710,7 @@ Prefix args :: | |||
| 1790 | (not (minibuffer-window-selected-p)))) | 1710 | (not (minibuffer-window-selected-p)))) |
| 1791 | (insert-point (point)) | 1711 | (insert-point (point)) |
| 1792 | (entry (completion-search-next cmpl-current-index)) | 1712 | (entry (completion-search-next cmpl-current-index)) |
| 1793 | string | 1713 | string) |
| 1794 | ) | ||
| 1795 | ;; entry is either a completion entry or a string (if cdabbrev) | 1714 | ;; entry is either a completion entry or a string (if cdabbrev) |
| 1796 | 1715 | ||
| 1797 | ;; If found, insert | 1716 | ;; If found, insert |
| @@ -1810,8 +1729,7 @@ Prefix args :: | |||
| 1810 | (setq cmpl-last-insert-location (point)) | 1729 | (setq cmpl-last-insert-location (point)) |
| 1811 | (goto-char insert-point)) | 1730 | (goto-char insert-point)) |
| 1812 | (t;; point at end, | 1731 | (t;; point at end, |
| 1813 | (setq cmpl-last-insert-location insert-point)) | 1732 | (setq cmpl-last-insert-location insert-point))) |
| 1814 | ) | ||
| 1815 | ;; statistics | 1733 | ;; statistics |
| 1816 | (cmpl-statistics-block | 1734 | (cmpl-statistics-block |
| 1817 | (note-complete-inserted entry cmpl-current-index)) | 1735 | (note-complete-inserted entry cmpl-current-index)) |
| @@ -1829,9 +1747,7 @@ Prefix args :: | |||
| 1829 | entry (completion-string entry))) | 1747 | entry (completion-string entry))) |
| 1830 | (setq string (cmpl-merge-string-cases | 1748 | (setq string (cmpl-merge-string-cases |
| 1831 | string cmpl-original-string)) | 1749 | string cmpl-original-string)) |
| 1832 | (message "Next completion: %s" string) | 1750 | (message "Next completion: %s" string)))) |
| 1833 | )) | ||
| 1834 | ) | ||
| 1835 | (t;; none found, insert old | 1751 | (t;; none found, insert old |
| 1836 | (insert cmpl-original-string) | 1752 | (insert cmpl-original-string) |
| 1837 | ;; Don't accept completions | 1753 | ;; Don't accept completions |
| @@ -1846,8 +1762,7 @@ Prefix args :: | |||
| 1846 | (cmpl-statistics-block | 1762 | (cmpl-statistics-block |
| 1847 | (record-complete-failed cmpl-current-index)) | 1763 | (record-complete-failed cmpl-current-index)) |
| 1848 | ;; Pretend that we were never here | 1764 | ;; Pretend that we were never here |
| 1849 | (setq this-command 'failed-complete) | 1765 | (setq this-command 'failed-complete))))) |
| 1850 | )))) | ||
| 1851 | 1766 | ||
| 1852 | ;;--------------------------------------------------------------------------- | 1767 | ;;--------------------------------------------------------------------------- |
| 1853 | ;; Parsing definitions from files into the database | 1768 | ;; Parsing definitions from files into the database |
| @@ -1859,20 +1774,18 @@ Prefix args :: | |||
| 1859 | 1774 | ||
| 1860 | ;; User interface | 1775 | ;; User interface |
| 1861 | (defun add-completions-from-file (file) | 1776 | (defun add-completions-from-file (file) |
| 1862 | "Parse possible completions from a file and add them to data base." | 1777 | "Parse possible completions from a FILE and add them to data base." |
| 1863 | (interactive "fFile: ") | 1778 | (interactive "fFile: ") |
| 1864 | (setq file (expand-file-name file)) | 1779 | (setq file (expand-file-name file)) |
| 1865 | (let* ((buffer (get-file-buffer file)) | 1780 | (let* ((buffer (get-file-buffer file)) |
| 1866 | (buffer-already-there-p buffer) | 1781 | (buffer-already-there-p buffer)) |
| 1867 | ) | ||
| 1868 | (if (not buffer-already-there-p) | 1782 | (if (not buffer-already-there-p) |
| 1869 | (let ((completions-merging-modes nil)) | 1783 | (let ((completions-merging-modes nil)) |
| 1870 | (setq buffer (find-file-noselect file)))) | 1784 | (setq buffer (find-file-noselect file)))) |
| 1871 | (unwind-protect | 1785 | (unwind-protect |
| 1872 | (save-excursion | 1786 | (save-excursion |
| 1873 | (set-buffer buffer) | 1787 | (set-buffer buffer) |
| 1874 | (add-completions-from-buffer) | 1788 | (add-completions-from-buffer)) |
| 1875 | ) | ||
| 1876 | (if (not buffer-already-there-p) | 1789 | (if (not buffer-already-there-p) |
| 1877 | (kill-buffer buffer))))) | 1790 | (kill-buffer buffer))))) |
| 1878 | 1791 | ||
| @@ -1882,40 +1795,31 @@ Prefix args :: | |||
| 1882 | (start-num | 1795 | (start-num |
| 1883 | (cmpl-statistics-block | 1796 | (cmpl-statistics-block |
| 1884 | (aref completion-add-count-vector cmpl-source-file-parsing))) | 1797 | (aref completion-add-count-vector cmpl-source-file-parsing))) |
| 1885 | mode | 1798 | mode) |
| 1886 | ) | ||
| 1887 | (cond ((memq major-mode '(emacs-lisp-mode lisp-mode)) | 1799 | (cond ((memq major-mode '(emacs-lisp-mode lisp-mode)) |
| 1888 | (add-completions-from-lisp-buffer) | 1800 | (add-completions-from-lisp-buffer) |
| 1889 | (setq mode 'lisp) | 1801 | (setq mode 'lisp)) |
| 1890 | ) | ||
| 1891 | ((memq major-mode '(c-mode)) | 1802 | ((memq major-mode '(c-mode)) |
| 1892 | (add-completions-from-c-buffer) | 1803 | (add-completions-from-c-buffer) |
| 1893 | (setq mode 'c) | 1804 | (setq mode 'c)) |
| 1894 | ) | ||
| 1895 | (t | 1805 | (t |
| 1896 | (error "Cannot parse completions in %s buffers" | 1806 | (error "Cannot parse completions in %s buffers" |
| 1897 | major-mode) | 1807 | major-mode))) |
| 1898 | )) | ||
| 1899 | (cmpl-statistics-block | 1808 | (cmpl-statistics-block |
| 1900 | (record-cmpl-parse-file | 1809 | (record-cmpl-parse-file |
| 1901 | mode (point-max) | 1810 | mode (point-max) |
| 1902 | (- (aref completion-add-count-vector cmpl-source-file-parsing) | 1811 | (- (aref completion-add-count-vector cmpl-source-file-parsing) |
| 1903 | start-num))) | 1812 | start-num))))) |
| 1904 | )) | ||
| 1905 | 1813 | ||
| 1906 | ;; Find file hook | 1814 | ;; Find file hook |
| 1907 | (defun cmpl-find-file-hook () | 1815 | (defun cmpl-find-file-hook () |
| 1908 | (cond (enable-completion | 1816 | (cond (enable-completion |
| 1909 | (cond ((and (memq major-mode '(emacs-lisp-mode lisp-mode)) | 1817 | (cond ((and (memq major-mode '(emacs-lisp-mode lisp-mode)) |
| 1910 | (memq 'lisp completions-merging-modes) | 1818 | (memq 'lisp completions-merging-modes)) |
| 1911 | ) | ||
| 1912 | (add-completions-from-buffer)) | 1819 | (add-completions-from-buffer)) |
| 1913 | ((and (memq major-mode '(c-mode)) | 1820 | ((and (memq major-mode '(c-mode)) |
| 1914 | (memq 'c completions-merging-modes) | 1821 | (memq 'c completions-merging-modes)) |
| 1915 | ) | 1822 | (add-completions-from-buffer)))))) |
| 1916 | (add-completions-from-buffer) | ||
| 1917 | ))) | ||
| 1918 | )) | ||
| 1919 | 1823 | ||
| 1920 | ;;----------------------------------------------- | 1824 | ;;----------------------------------------------- |
| 1921 | ;; Tags Table Completions | 1825 | ;; Tags Table Completions |
| @@ -1935,10 +1839,8 @@ Prefix args :: | |||
| 1935 | (backward-char 3) | 1839 | (backward-char 3) |
| 1936 | (and (setq string (symbol-under-point)) | 1840 | (and (setq string (symbol-under-point)) |
| 1937 | (add-completion-to-tail-if-new string)) | 1841 | (add-completion-to-tail-if-new string)) |
| 1938 | (forward-char 3) | 1842 | (forward-char 3)) |
| 1939 | ) | 1843 | (search-failed))))) |
| 1940 | (search-failed) | ||
| 1941 | )))) | ||
| 1942 | 1844 | ||
| 1943 | 1845 | ||
| 1944 | ;;----------------------------------------------- | 1846 | ;;----------------------------------------------- |
| @@ -1952,8 +1854,7 @@ Prefix args :: | |||
| 1952 | ;; | 1854 | ;; |
| 1953 | (defconst *lisp-def-regexp* | 1855 | (defconst *lisp-def-regexp* |
| 1954 | "\n(\\(\\w*:\\)?def\\(\\w\\|\\s_\\)*\\s +(*" | 1856 | "\n(\\(\\w*:\\)?def\\(\\w\\|\\s_\\)*\\s +(*" |
| 1955 | "A regexp that searches for lisp definition form." | 1857 | "A regexp that searches for Lisp definition form.") |
| 1956 | ) | ||
| 1957 | 1858 | ||
| 1958 | ;; Tests - | 1859 | ;; Tests - |
| 1959 | ;; (and (string-match *lisp-def-regexp* "\n(defun foo") (match-end 0)) -> 8 | 1860 | ;; (and (string-match *lisp-def-regexp* "\n(defun foo") (match-end 0)) -> 8 |
| @@ -1973,10 +1874,8 @@ Prefix args :: | |||
| 1973 | (while t | 1874 | (while t |
| 1974 | (re-search-forward *lisp-def-regexp*) | 1875 | (re-search-forward *lisp-def-regexp*) |
| 1975 | (and (setq string (symbol-under-point)) | 1876 | (and (setq string (symbol-under-point)) |
| 1976 | (add-completion-to-tail-if-new string)) | 1877 | (add-completion-to-tail-if-new string))) |
| 1977 | ) | 1878 | (search-failed))))) |
| 1978 | (search-failed) | ||
| 1979 | )))) | ||
| 1980 | 1879 | ||
| 1981 | 1880 | ||
| 1982 | ;;----------------------------------------------- | 1881 | ;;----------------------------------------------- |
| @@ -2000,8 +1899,7 @@ Prefix args :: | |||
| 2000 | (let ((table (make-syntax-table)) | 1899 | (let ((table (make-syntax-table)) |
| 2001 | (whitespace-chars '(? ?\n ?\t ?\f ?\v ?\r)) | 1900 | (whitespace-chars '(? ?\n ?\t ?\f ?\v ?\r)) |
| 2002 | ;; unfortunately the ?( causes the parens to appear unbalanced | 1901 | ;; unfortunately the ?( causes the parens to appear unbalanced |
| 2003 | (separator-chars '(?, ?* ?= ?\( ?\; | 1902 | (separator-chars '(?, ?* ?= ?\( ?\;)) |
| 2004 | )) | ||
| 2005 | i) | 1903 | i) |
| 2006 | ;; default syntax is whitespace | 1904 | ;; default syntax is whitespace |
| 2007 | (setq i 0) | 1905 | (setq i 0) |
| @@ -2030,8 +1928,7 @@ Prefix args :: | |||
| 2030 | ;;"\n\\(\\(\\w\\|\\s_\\)+\\s *(\\|\\(\\(#define\\|auto\\|extern\\|register\\|static\\|int\\|long\\|short\\|unsigned\\|char\\|void\\|float\\|double\\|enum\\|struct\\|union\\|typedef\\)\\s +\\)+\\)" | 1928 | ;;"\n\\(\\(\\w\\|\\s_\\)+\\s *(\\|\\(\\(#define\\|auto\\|extern\\|register\\|static\\|int\\|long\\|short\\|unsigned\\|char\\|void\\|float\\|double\\|enum\\|struct\\|union\\|typedef\\)\\s +\\)+\\)" |
| 2031 | ;; this simple version picks up too much extraneous stuff | 1929 | ;; this simple version picks up too much extraneous stuff |
| 2032 | ;; "\n\\(\\w\\|\\s_\\|#\\)\\B" | 1930 | ;; "\n\\(\\w\\|\\s_\\|#\\)\\B" |
| 2033 | "A regexp that searches for a definition form." | 1931 | "A regexp that searches for a definition form.") |
| 2034 | ) | ||
| 2035 | ; | 1932 | ; |
| 2036 | ;(defconst *c-cont-regexp* | 1933 | ;(defconst *c-cont-regexp* |
| 2037 | ; "\\(\\w\\|\\s_\\)+\\b\\s *\\({\\|\\(\\[[0-9\t ]*\\]\\s *\\)*,\\(*\\|\\s \\)*\\b\\)" | 1934 | ; "\\(\\w\\|\\s_\\)+\\b\\s *\\({\\|\\(\\[[0-9\t ]*\\]\\s *\\)*,\\(*\\|\\s \\)*\\b\\)" |
| @@ -2065,8 +1962,7 @@ Prefix args :: | |||
| 2065 | ;; Sun 3/280-- 1250 lines/sec. | 1962 | ;; Sun 3/280-- 1250 lines/sec. |
| 2066 | 1963 | ||
| 2067 | (let (string next-point char | 1964 | (let (string next-point char |
| 2068 | (saved-syntax (syntax-table)) | 1965 | (saved-syntax (syntax-table))) |
| 2069 | ) | ||
| 2070 | (save-excursion | 1966 | (save-excursion |
| 2071 | (goto-char (point-min)) | 1967 | (goto-char (point-min)) |
| 2072 | (catch 'finish-add-completions | 1968 | (catch 'finish-add-completions |
| @@ -2083,31 +1979,27 @@ Prefix args :: | |||
| 2083 | ;; preprocessor macro, see if it's one we handle | 1979 | ;; preprocessor macro, see if it's one we handle |
| 2084 | (setq string (buffer-substring (point) (+ (point) 6))) | 1980 | (setq string (buffer-substring (point) (+ (point) 6))) |
| 2085 | (cond ((or (string-equal string "define") | 1981 | (cond ((or (string-equal string "define") |
| 2086 | (string-equal string "ifdef ") | 1982 | (string-equal string "ifdef ")) |
| 2087 | ) | ||
| 2088 | ;; skip forward over definition symbol | 1983 | ;; skip forward over definition symbol |
| 2089 | ;; and add it to database | 1984 | ;; and add it to database |
| 2090 | (and (forward-word 2) | 1985 | (and (forward-word 2) |
| 2091 | (setq string (symbol-before-point)) | 1986 | (setq string (symbol-before-point)) |
| 2092 | ;;(push string foo) | 1987 | ;;(push string foo) |
| 2093 | (add-completion-to-tail-if-new string) | 1988 | (add-completion-to-tail-if-new string))))) |
| 2094 | )))) | ||
| 2095 | (t | 1989 | (t |
| 2096 | ;; C definition | 1990 | ;; C definition |
| 2097 | (setq next-point (point)) | 1991 | (setq next-point (point)) |
| 2098 | (while (and | 1992 | (while (and |
| 2099 | next-point | 1993 | next-point |
| 2100 | ;; scan to next separator char. | 1994 | ;; scan to next separator char. |
| 2101 | (setq next-point (scan-sexps next-point 1)) | 1995 | (setq next-point (scan-sexps next-point 1))) |
| 2102 | ) | ||
| 2103 | ;; position the point on the word we want to add | 1996 | ;; position the point on the word we want to add |
| 2104 | (goto-char next-point) | 1997 | (goto-char next-point) |
| 2105 | (while (= (setq char (following-char)) ?*) | 1998 | (while (= (setq char (following-char)) ?*) |
| 2106 | ;; handle pointer ref | 1999 | ;; handle pointer ref |
| 2107 | ;; move to next separator char. | 2000 | ;; move to next separator char. |
| 2108 | (goto-char | 2001 | (goto-char |
| 2109 | (setq next-point (scan-sexps (point) 1))) | 2002 | (setq next-point (scan-sexps (point) 1)))) |
| 2110 | ) | ||
| 2111 | (forward-word -1) | 2003 | (forward-word -1) |
| 2112 | ;; add to database | 2004 | ;; add to database |
| 2113 | (if (setq string (symbol-under-point)) | 2005 | (if (setq string (symbol-under-point)) |
| @@ -2118,11 +2010,8 @@ Prefix args :: | |||
| 2118 | (progn | 2010 | (progn |
| 2119 | (forward-word -1) | 2011 | (forward-word -1) |
| 2120 | (setq string | 2012 | (setq string |
| 2121 | (symbol-under-point)) | 2013 | (symbol-under-point)))) |
| 2122 | )) | 2014 | (add-completion-to-tail-if-new string))) |
| 2123 | (add-completion-to-tail-if-new string) | ||
| 2124 | ) | ||
| 2125 | ) | ||
| 2126 | ;; go to next | 2015 | ;; go to next |
| 2127 | (goto-char next-point) | 2016 | (goto-char next-point) |
| 2128 | ;; (push (format "%c" (following-char)) foo) | 2017 | ;; (push (format "%c" (following-char)) foo) |
| @@ -2130,16 +2019,12 @@ Prefix args :: | |||
| 2130 | ;; if on an opening delimiter, go to end | 2019 | ;; if on an opening delimiter, go to end |
| 2131 | (while (= (char-syntax char) ?\() | 2020 | (while (= (char-syntax char) ?\() |
| 2132 | (setq next-point (scan-sexps next-point 1) | 2021 | (setq next-point (scan-sexps next-point 1) |
| 2133 | char (char-after next-point)) | 2022 | char (char-after next-point))) |
| 2134 | ) | ||
| 2135 | (or (= char ?,) | 2023 | (or (= char ?,) |
| 2136 | ;; Current char is an end char. | 2024 | ;; Current char is an end char. |
| 2137 | (setq next-point nil) | 2025 | (setq next-point nil))))))) |
| 2138 | )) | ||
| 2139 | )))) | ||
| 2140 | (search-failed ;;done | 2026 | (search-failed ;;done |
| 2141 | (throw 'finish-add-completions t) | 2027 | (throw 'finish-add-completions t)) |
| 2142 | ) | ||
| 2143 | (error | 2028 | (error |
| 2144 | ;; Check for failure in scan-sexps | 2029 | ;; Check for failure in scan-sexps |
| 2145 | (if (or (string-equal (nth 1 e) | 2030 | (if (or (string-equal (nth 1 e) |
| @@ -2149,11 +2034,8 @@ Prefix args :: | |||
| 2149 | ;;(ding) | 2034 | ;;(ding) |
| 2150 | (forward-line 1) | 2035 | (forward-line 1) |
| 2151 | (message "Error parsing C buffer for completions--please send bug report") | 2036 | (message "Error parsing C buffer for completions--please send bug report") |
| 2152 | (throw 'finish-add-completions t) | 2037 | (throw 'finish-add-completions t))))) |
| 2153 | )) | 2038 | (set-syntax-table saved-syntax)))))) |
| 2154 | )) | ||
| 2155 | (set-syntax-table saved-syntax) | ||
| 2156 | ))))) | ||
| 2157 | 2039 | ||
| 2158 | 2040 | ||
| 2159 | ;;--------------------------------------------------------------------------- | 2041 | ;;--------------------------------------------------------------------------- |
| @@ -2206,8 +2088,7 @@ If file name is not specified, use `save-completions-file-name'." | |||
| 2206 | (total-in-db 0) | 2088 | (total-in-db 0) |
| 2207 | (total-perm 0) | 2089 | (total-perm 0) |
| 2208 | (total-saved 0) | 2090 | (total-saved 0) |
| 2209 | (backup-filename (completion-backup-filename filename)) | 2091 | (backup-filename (completion-backup-filename filename))) |
| 2210 | ) | ||
| 2211 | 2092 | ||
| 2212 | (save-excursion | 2093 | (save-excursion |
| 2213 | (get-buffer-create " *completion-save-buffer*") | 2094 | (get-buffer-create " *completion-save-buffer*") |
| @@ -2244,13 +2125,11 @@ If file name is not specified, use `save-completions-file-name'." | |||
| 2244 | (or (not save-completions-retention-time) | 2125 | (or (not save-completions-retention-time) |
| 2245 | ;; or time since last use is < ...retention-time* | 2126 | ;; or time since last use is < ...retention-time* |
| 2246 | (< (- current-time last-use-time) | 2127 | (< (- current-time last-use-time) |
| 2247 | save-completions-retention-time)) | 2128 | save-completions-retention-time))))) |
| 2248 | ))) | ||
| 2249 | ;; write to file | 2129 | ;; write to file |
| 2250 | (setq total-saved (1+ total-saved)) | 2130 | (setq total-saved (1+ total-saved)) |
| 2251 | (insert (prin1-to-string (cons (completion-string completion) | 2131 | (insert (prin1-to-string (cons (completion-string completion) |
| 2252 | last-use-time)) "\n") | 2132 | last-use-time)) "\n")))) |
| 2253 | ))) | ||
| 2254 | 2133 | ||
| 2255 | ;; write the buffer | 2134 | ;; write the buffer |
| 2256 | (condition-case e | 2135 | (condition-case e |
| @@ -2275,14 +2154,11 @@ If file name is not specified, use `save-completions-file-name'." | |||
| 2275 | (delete-file backup-filename))) | 2154 | (delete-file backup-filename))) |
| 2276 | (error | 2155 | (error |
| 2277 | (set-buffer-modified-p nil) | 2156 | (set-buffer-modified-p nil) |
| 2278 | (message "Couldn't save completion file `%s'" filename) | 2157 | (message "Couldn't save completion file `%s'" filename))) |
| 2279 | )) | ||
| 2280 | ;; Reset accepted-p flag | 2158 | ;; Reset accepted-p flag |
| 2281 | (setq cmpl-completions-accepted-p nil) | 2159 | (setq cmpl-completions-accepted-p nil) ) |
| 2282 | ) | ||
| 2283 | (cmpl-statistics-block | 2160 | (cmpl-statistics-block |
| 2284 | (record-save-completions total-in-db total-perm total-saved)) | 2161 | (record-save-completions total-in-db total-perm total-saved)))))) |
| 2285 | )))) | ||
| 2286 | 2162 | ||
| 2287 | ;;(defun auto-save-completions () | 2163 | ;;(defun auto-save-completions () |
| 2288 | ;; (if (and save-completions-flag enable-completion cmpl-initialized-p | 2164 | ;; (if (and save-completions-flag enable-completion cmpl-initialized-p |
| @@ -2294,13 +2170,12 @@ If file name is not specified, use `save-completions-file-name'." | |||
| 2294 | ;;(add-hook 'cmpl-emacs-idle-time-hooks 'auto-save-completions) | 2170 | ;;(add-hook 'cmpl-emacs-idle-time-hooks 'auto-save-completions) |
| 2295 | 2171 | ||
| 2296 | (defun load-completions-from-file (&optional filename no-message-p) | 2172 | (defun load-completions-from-file (&optional filename no-message-p) |
| 2297 | "Loads a completion init file FILENAME. | 2173 | "Load a completion init file FILENAME. |
| 2298 | If file is not specified, then use `save-completions-file-name'." | 2174 | If file is not specified, then use `save-completions-file-name'." |
| 2299 | (interactive) | 2175 | (interactive) |
| 2300 | (setq filename (expand-file-name (or filename save-completions-file-name))) | 2176 | (setq filename (expand-file-name (or filename save-completions-file-name))) |
| 2301 | (let* ((backup-filename (completion-backup-filename filename)) | 2177 | (let* ((backup-filename (completion-backup-filename filename)) |
| 2302 | (backup-readable-p (file-readable-p backup-filename)) | 2178 | (backup-readable-p (file-readable-p backup-filename))) |
| 2303 | ) | ||
| 2304 | (if backup-readable-p (setq filename backup-filename)) | 2179 | (if backup-readable-p (setq filename backup-filename)) |
| 2305 | (if (file-readable-p filename) | 2180 | (if (file-readable-p filename) |
| 2306 | (progn | 2181 | (progn |
| @@ -2324,8 +2199,7 @@ If file is not specified, then use `save-completions-file-name'." | |||
| 2324 | (start-num | 2199 | (start-num |
| 2325 | (cmpl-statistics-block | 2200 | (cmpl-statistics-block |
| 2326 | (aref completion-add-count-vector cmpl-source-file-parsing))) | 2201 | (aref completion-add-count-vector cmpl-source-file-parsing))) |
| 2327 | (total-in-file 0) (total-perm 0) | 2202 | (total-in-file 0) (total-perm 0)) |
| 2328 | ) | ||
| 2329 | ;; insert the file into a buffer | 2203 | ;; insert the file into a buffer |
| 2330 | (condition-case e | 2204 | (condition-case e |
| 2331 | (progn (insert-file-contents filename t) | 2205 | (progn (insert-file-contents filename t) |
| @@ -2353,61 +2227,50 @@ If file is not specified, then use `save-completions-file-name'." | |||
| 2353 | (setq last-use-time t)) | 2227 | (setq last-use-time t)) |
| 2354 | ((eq last-use-time t) | 2228 | ((eq last-use-time t) |
| 2355 | (setq total-perm (1+ total-perm))) | 2229 | (setq total-perm (1+ total-perm))) |
| 2356 | ((integerp last-use-time)) | 2230 | ((integerp last-use-time)))) |
| 2357 | )) | ||
| 2358 | ;; Valid entry | 2231 | ;; Valid entry |
| 2359 | ;; add it in | 2232 | ;; add it in |
| 2360 | (setq cmpl-last-use-time | 2233 | (setq cmpl-last-use-time |
| 2361 | (completion-last-use-time | 2234 | (completion-last-use-time |
| 2362 | (setq cmpl-entry | 2235 | (setq cmpl-entry |
| 2363 | (add-completion-to-tail-if-new string)) | 2236 | (add-completion-to-tail-if-new string)))) |
| 2364 | )) | ||
| 2365 | (if (or (eq last-use-time t) | 2237 | (if (or (eq last-use-time t) |
| 2366 | (and (> last-use-time 1000);;backcompatibility | 2238 | (and (> last-use-time 1000);;backcompatibility |
| 2367 | (not (eq cmpl-last-use-time t)) | 2239 | (not (eq cmpl-last-use-time t)) |
| 2368 | (or (not cmpl-last-use-time) | 2240 | (or (not cmpl-last-use-time) |
| 2369 | ;; more recent | 2241 | ;; more recent |
| 2370 | (> last-use-time cmpl-last-use-time)) | 2242 | (> last-use-time cmpl-last-use-time)))) |
| 2371 | )) | ||
| 2372 | ;; update last-use-time | 2243 | ;; update last-use-time |
| 2373 | (set-completion-last-use-time cmpl-entry last-use-time) | 2244 | (set-completion-last-use-time cmpl-entry last-use-time))) |
| 2374 | )) | ||
| 2375 | (t | 2245 | (t |
| 2376 | ;; Bad format | 2246 | ;; Bad format |
| 2377 | (message "Error: invalid saved completion - %s" | 2247 | (message "Error: invalid saved completion - %s" |
| 2378 | (prin1-to-string entry)) | 2248 | (prin1-to-string entry)) |
| 2379 | ;; try to get back in sync | 2249 | ;; try to get back in sync |
| 2380 | (search-forward "\n(") | 2250 | (search-forward "\n(")))) |
| 2381 | ))) | ||
| 2382 | (search-failed | 2251 | (search-failed |
| 2383 | (message "End of file while reading completions.") | 2252 | (message "End of file while reading completions.")) |
| 2384 | ) | ||
| 2385 | (end-of-file | 2253 | (end-of-file |
| 2386 | (if (= (point) (point-max)) | 2254 | (if (= (point) (point-max)) |
| 2387 | (if (not no-message-p) | 2255 | (if (not no-message-p) |
| 2388 | (message "Loading completions from file %s . . . Done." | 2256 | (message "Loading completions from file %s . . . Done." |
| 2389 | filename)) | 2257 | filename)) |
| 2390 | (message "End of file while reading completions.") | 2258 | (message "End of file while reading completions.")))))) |
| 2391 | )) | ||
| 2392 | ))) | ||
| 2393 | 2259 | ||
| 2394 | (cmpl-statistics-block | 2260 | (cmpl-statistics-block |
| 2395 | (record-load-completions | 2261 | (record-load-completions |
| 2396 | total-in-file total-perm | 2262 | total-in-file total-perm |
| 2397 | (- (aref completion-add-count-vector cmpl-source-init-file) | 2263 | (- (aref completion-add-count-vector cmpl-source-init-file) |
| 2398 | start-num))) | 2264 | start-num))) |
| 2399 | 2265 | )))))) | |
| 2400 | )))))) | ||
| 2401 | 2266 | ||
| 2402 | (defun initialize-completions () | 2267 | (defun initialize-completions () |
| 2403 | "Load the default completions file. | 2268 | "Load the default completions file. |
| 2404 | Also sets up so that exiting emacs will automatically save the file." | 2269 | Also sets up so that exiting emacs will automatically save the file." |
| 2405 | (interactive) | 2270 | (interactive) |
| 2406 | (cond ((not cmpl-initialized-p) | 2271 | (cond ((not cmpl-initialized-p) |
| 2407 | (load-completions-from-file) | 2272 | (load-completions-from-file))) |
| 2408 | )) | 2273 | (setq cmpl-initialized-p t)) |
| 2409 | (setq cmpl-initialized-p t) | ||
| 2410 | ) | ||
| 2411 | 2274 | ||
| 2412 | ;;----------------------------------------------- | 2275 | ;;----------------------------------------------- |
| 2413 | ;; Kill region patch | 2276 | ;; Kill region patch |
| @@ -2454,16 +2317,14 @@ Patched to remove the most recent completion." | |||
| 2454 | (defun completion-separator-self-insert-command (arg) | 2317 | (defun completion-separator-self-insert-command (arg) |
| 2455 | (interactive "p") | 2318 | (interactive "p") |
| 2456 | (use-completion-before-separator) | 2319 | (use-completion-before-separator) |
| 2457 | (self-insert-command arg) | 2320 | (self-insert-command arg)) |
| 2458 | ) | ||
| 2459 | 2321 | ||
| 2460 | (defun completion-separator-self-insert-autofilling (arg) | 2322 | (defun completion-separator-self-insert-autofilling (arg) |
| 2461 | (interactive "p") | 2323 | (interactive "p") |
| 2462 | (use-completion-before-separator) | 2324 | (use-completion-before-separator) |
| 2463 | (self-insert-command arg) | 2325 | (self-insert-command arg) |
| 2464 | (and auto-fill-function | 2326 | (and auto-fill-function |
| 2465 | (funcall auto-fill-function)) | 2327 | (funcall auto-fill-function))) |
| 2466 | ) | ||
| 2467 | 2328 | ||
| 2468 | ;;----------------------------------------------- | 2329 | ;;----------------------------------------------- |
| 2469 | ;; Wrapping Macro | 2330 | ;; Wrapping Macro |
| @@ -2475,25 +2336,25 @@ Patched to remove the most recent completion." | |||
| 2475 | (defmacro def-completion-wrapper (function-name type &optional new-name) | 2336 | (defmacro def-completion-wrapper (function-name type &optional new-name) |
| 2476 | "Add a call to update the completion database before function execution. | 2337 | "Add a call to update the completion database before function execution. |
| 2477 | TYPE is the type of the wrapper to be added. Can be :before or :under." | 2338 | TYPE is the type of the wrapper to be added. Can be :before or :under." |
| 2478 | (cond ((eq type ':separator) | 2339 | (cond ((eq type :separator) |
| 2479 | (list 'put (list 'quote function-name) ''completion-function | 2340 | (list 'put (list 'quote function-name) ''completion-function |
| 2480 | ''use-completion-before-separator)) | 2341 | ''use-completion-before-separator)) |
| 2481 | ((eq type ':before) | 2342 | ((eq type :before) |
| 2482 | (list 'put (list 'quote function-name) ''completion-function | 2343 | (list 'put (list 'quote function-name) ''completion-function |
| 2483 | ''use-completion-before-point)) | 2344 | ''use-completion-before-point)) |
| 2484 | ((eq type ':backward-under) | 2345 | ((eq type :backward-under) |
| 2485 | (list 'put (list 'quote function-name) ''completion-function | 2346 | (list 'put (list 'quote function-name) ''completion-function |
| 2486 | ''use-completion-backward-under)) | 2347 | ''use-completion-backward-under)) |
| 2487 | ((eq type ':backward) | 2348 | ((eq type :backward) |
| 2488 | (list 'put (list 'quote function-name) ''completion-function | 2349 | (list 'put (list 'quote function-name) ''completion-function |
| 2489 | ''use-completion-backward)) | 2350 | ''use-completion-backward)) |
| 2490 | ((eq type ':under) | 2351 | ((eq type :under) |
| 2491 | (list 'put (list 'quote function-name) ''completion-function | 2352 | (list 'put (list 'quote function-name) ''completion-function |
| 2492 | ''use-completion-under-point)) | 2353 | ''use-completion-under-point)) |
| 2493 | ((eq type ':under-or-before) | 2354 | ((eq type :under-or-before) |
| 2494 | (list 'put (list 'quote function-name) ''completion-function | 2355 | (list 'put (list 'quote function-name) ''completion-function |
| 2495 | ''use-completion-under-or-before-point)) | 2356 | ''use-completion-under-or-before-point)) |
| 2496 | ((eq type ':minibuffer-separator) | 2357 | ((eq type :minibuffer-separator) |
| 2497 | (list 'put (list 'quote function-name) ''completion-function | 2358 | (list 'put (list 'quote function-name) ''completion-function |
| 2498 | ''use-completion-minibuffer-separator)))) | 2359 | ''use-completion-minibuffer-separator)))) |
| 2499 | 2360 | ||
| @@ -2533,8 +2394,7 @@ TYPE is the type of the wrapper to be added. Can be :before or :under." | |||
| 2533 | (define-key fortran-mode-map "+" 'completion-separator-self-insert-command) | 2394 | (define-key fortran-mode-map "+" 'completion-separator-self-insert-command) |
| 2534 | (define-key fortran-mode-map "-" 'completion-separator-self-insert-command) | 2395 | (define-key fortran-mode-map "-" 'completion-separator-self-insert-command) |
| 2535 | (define-key fortran-mode-map "*" 'completion-separator-self-insert-command) | 2396 | (define-key fortran-mode-map "*" 'completion-separator-self-insert-command) |
| 2536 | (define-key fortran-mode-map "/" 'completion-separator-self-insert-command) | 2397 | (define-key fortran-mode-map "/" 'completion-separator-self-insert-command)) |
| 2537 | ) | ||
| 2538 | 2398 | ||
| 2539 | ;;; Enable completion mode. | 2399 | ;;; Enable completion mode. |
| 2540 | 2400 | ||
| @@ -2671,6 +2531,11 @@ TYPE is the type of the wrapper to be added. Can be :before or :under." | |||
| 2671 | 2531 | ||
| 2672 | (initialize-completions)) | 2532 | (initialize-completions)) |
| 2673 | 2533 | ||
| 2534 | (mapc (lambda (x) | ||
| 2535 | (add-to-list 'debug-ignored-errors x)) | ||
| 2536 | '("^To complete, the point must be after a symbol at least [0-9]* character long\\.$" | ||
| 2537 | "^The string \".*\" is too short to be saved as a completion\\.$")) | ||
| 2538 | |||
| 2674 | (provide 'completion) | 2539 | (provide 'completion) |
| 2675 | 2540 | ||
| 2676 | ;;; completion.el ends here | 2541 | ;;; completion.el ends here |