Mercurial > emacs
comparison lisp/erc/erc-hecomplete.el @ 68719:2de3fcf69715
Revision: emacs@sv.gnu.org/emacs--devo--0--patch-55
Creator: Michael Olson <mwolson@gnu.org>
Merge from erc--emacs--0
author | Miles Bader <miles@gnu.org> |
---|---|
date | Wed, 08 Feb 2006 02:41:23 +0000 |
parents | |
children | 7010bb070445 |
comparison
equal
deleted
inserted
replaced
68718:c6e88dc95401 | 68719:2de3fcf69715 |
---|---|
1 ;;; erc-hecomplete.el --- Provides Nick name completion for ERC | |
2 | |
3 ;; Copyright (C) 2001, 2002, 2004 Free Software Foundation, Inc. | |
4 | |
5 ;; Author: Alex Schroeder <alex@gnu.org> | |
6 ;; URL: http://www.emacswiki.org/cgi-bin/wiki.pl?ErcCompletion | |
7 | |
8 ;; This file is part of GNU Emacs. | |
9 | |
10 ;; GNU Emacs is free software; you can redistribute it and/or modify | |
11 ;; it under the terms of the GNU General Public License as published by | |
12 ;; the Free Software Foundation; either version 2, or (at your option) | |
13 ;; any later version. | |
14 | |
15 ;; GNU Emacs is distributed in the hope that it will be useful, | |
16 ;; but WITHOUT ANY WARRANTY; without even the implied warranty of | |
17 ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
18 ;; GNU General Public License for more details. | |
19 | |
20 ;; You should have received a copy of the GNU General Public License | |
21 ;; along with GNU Emacs; see the file COPYING. If not, write to the | |
22 ;; Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, | |
23 ;; Boston, MA 02110-1301, USA. | |
24 | |
25 ;;; Commentary: | |
26 | |
27 ;; This file is considered obsolete. It is recommended to use | |
28 ;; completion from erc-pcomplete instead. | |
29 | |
30 ;; This file is based on hippie-expand, while the new file is based on | |
31 ;; pcomplete. | |
32 | |
33 ;;; Code: | |
34 | |
35 (require 'erc) | |
36 (require 'erc-match); for erc-pals | |
37 (require 'hippie-exp); for the hippie expand stuff | |
38 | |
39 ;;;###autoload (autoload 'erc-hecomplete-mode "erc-hecomplete" nil t) | |
40 (define-erc-module hecomplete nil | |
41 "Complete nick at point." | |
42 ((add-hook 'erc-complete-functions 'erc-hecomplete)) | |
43 ((remove-hook 'erc-complete-functions 'erc-hecomplete))) | |
44 | |
45 (defun erc-hecomplete () | |
46 "Complete nick at point. | |
47 See `erc-try-complete-nick' for more technical info. | |
48 This function is obsolete, use `erc-pcomplete' instead." | |
49 (interactive) | |
50 (let ((hippie-expand-try-functions-list '(erc-try-complete-nick))) | |
51 (hippie-expand nil))) | |
52 | |
53 (defgroup erc-hecomplete nil | |
54 "Nick completion. It is recommended to use erc-pcomplete instead." | |
55 :group 'erc) | |
56 | |
57 (defcustom erc-nick-completion 'all | |
58 "Determine how the list of nicks is determined during nick completion. | |
59 See `erc-complete-nick' for information on how to activate this. | |
60 | |
61 pals: Use `erc-pals'. | |
62 all: All channel members. | |
63 | |
64 You may also provide your own function that returns a list of completions. | |
65 One example is `erc-nick-completion-exclude-myself', | |
66 or you may use an arbitrary lisp expression." | |
67 :type '(choice (const :tag "List of pals" pals) | |
68 (const :tag "All channel members" all) | |
69 (const :tag "All channel members except yourself" | |
70 erc-nick-completion-exclude-myself) | |
71 (repeat :tag "List" (string :tag "Nick")) | |
72 function | |
73 sexp) | |
74 :group 'erc-hecomplete) | |
75 | |
76 (defcustom erc-nick-completion-ignore-case t | |
77 "*Non-nil means don't consider case significant in nick completion. | |
78 Case will be automatically corrected when non-nil. | |
79 For instance if you type \"dely TAB\" the word completes and changes to | |
80 \"delYsid\"." | |
81 :group 'erc-hecomplete | |
82 :type 'boolean) | |
83 | |
84 (defun erc-nick-completion-exclude-myself () | |
85 "Get a list of all the channel members except you. | |
86 | |
87 This function returns a list of all the members in the channel, except | |
88 your own nick. This way if you're named foo and someone is called foobar, | |
89 typing \"f o TAB\" will directly give you foobar. Use this with | |
90 `erc-nick-completion'." | |
91 (remove | |
92 (erc-current-nick) | |
93 (erc-get-channel-nickname-list))) | |
94 | |
95 (defcustom erc-nick-completion-postfix ": " | |
96 "*When `erc-complete' is used in the first word after the prompt, | |
97 add this string when a unique expansion was found." | |
98 :group 'erc-hecomplete | |
99 :type 'string) | |
100 | |
101 (defun erc-command-list () | |
102 "Returns a list of strings of the defined user commands." | |
103 (let ((case-fold-search nil)) | |
104 (mapcar (lambda (x) | |
105 (concat "/" (downcase (substring (symbol-name x) 8)))) | |
106 (apropos-internal "erc-cmd-[A-Z]+")))) | |
107 | |
108 (defun erc-try-complete-nick (old) | |
109 "Complete nick at point. | |
110 This is a function to put on `hippie-expand-try-functions-list'. | |
111 Then use \\[hippie-expand] to expand nicks. | |
112 The type of completion depends on `erc-nick-completion'." | |
113 (cond ((eq erc-nick-completion 'pals) | |
114 (try-complete-erc-nick old erc-pals)) | |
115 ((eq erc-nick-completion 'all) | |
116 (try-complete-erc-nick old (append | |
117 (erc-get-channel-nickname-list) | |
118 (erc-command-list)))) | |
119 ((functionp erc-nick-completion) | |
120 (try-complete-erc-nick old (funcall erc-nick-completion))) | |
121 (t | |
122 (try-complete-erc-nick old erc-nick-completion)))) | |
123 | |
124 (defvar try-complete-erc-nick-window-configuration nil | |
125 "The window configuration for `try-complete-erc-nick'. | |
126 When called the first time, a window config is stored here, | |
127 and when completion is done, the window config is restored | |
128 from here. See `try-complete-erc-nick-restore' and | |
129 `try-complete-erc-nick'.") | |
130 | |
131 (defun try-complete-erc-nick-restore () | |
132 "Restore window configuration." | |
133 (if (not try-complete-erc-nick-window-configuration) | |
134 (when (get-buffer "*Completions*") | |
135 (delete-windows-on "*Completions*")) | |
136 (set-window-configuration | |
137 try-complete-erc-nick-window-configuration) | |
138 (setq try-complete-erc-nick-window-configuration nil))) | |
139 | |
140 (defun try-complete-erc-nick (old completions) | |
141 "Try to complete current word depending on `erc-try-complete-nick'. | |
142 The argument OLD has to be nil the first call of this function, and t | |
143 for subsequent calls (for further possible completions of the same | |
144 string). It returns t if a new completion is found, nil otherwise. The | |
145 second argument COMPLETIONS is a list of completions to use. Actually, | |
146 it is only used when OLD is nil. It will be copied to `he-expand-list' | |
147 on the first call. After that, it is no longer used. | |
148 Window configurations are stored in | |
149 `try-complete-erc-nick-window-configuration'." | |
150 (let (expansion | |
151 final | |
152 (alist (if (consp (car completions)) | |
153 completions | |
154 (mapcar (lambda (s) | |
155 (if (and (erc-complete-at-prompt) | |
156 (and (not (= (length s) 0)) | |
157 (not (eq (elt s 0) ?/)))) | |
158 (list (concat s erc-nick-completion-postfix)) | |
159 (list (concat s " ")))) | |
160 completions))) ; make alist if required | |
161 (completion-ignore-case erc-nick-completion-ignore-case)) | |
162 (he-init-string (he-dabbrev-beg) (point)) | |
163 ;; If there is a string to complete, complete it using alist. | |
164 ;; expansion is the possible expansion, or t. If expansion is t | |
165 ;; or if expansion is the "real" thing, we are finished (final is | |
166 ;; t). Take care -- expansion can also be nil! | |
167 (unless (string= he-search-string "") | |
168 (setq expansion (try-completion he-search-string alist) | |
169 final (or (eq t expansion) | |
170 (and expansion | |
171 (eq t (try-completion expansion alist)))))) | |
172 (cond ((not expansion) | |
173 ;; There is no expansion at all. | |
174 (try-complete-erc-nick-restore) | |
175 (he-reset-string) | |
176 nil) | |
177 ((eq t expansion) | |
178 ;; The user already has the correct expansion. | |
179 (try-complete-erc-nick-restore) | |
180 (he-reset-string) | |
181 t) | |
182 ((and old (string= expansion he-search-string)) | |
183 ;; This is the second time around and nothing changed, | |
184 ;; ie. the user tried to expand something incomplete | |
185 ;; without making a choice -- hitting TAB twice, for | |
186 ;; example. | |
187 (try-complete-erc-nick-restore) | |
188 (he-reset-string) | |
189 nil) | |
190 (final | |
191 ;; The user has found the correct expansion. | |
192 (try-complete-erc-nick-restore) | |
193 (he-substitute-string expansion) | |
194 t) | |
195 (t | |
196 ;; We found something but we are not finished. Show a | |
197 ;; completions buffer. Substitute what we found and return | |
198 ;; t. | |
199 (setq try-complete-erc-nick-window-configuration | |
200 (current-window-configuration)) | |
201 (with-output-to-temp-buffer "*Completions*" | |
202 (display-completion-list (all-completions he-search-string alist))) | |
203 (he-substitute-string expansion) | |
204 t)))) | |
205 | |
206 (defun erc-at-beginning-of-line-p (point &optional bol-func) | |
207 (save-excursion | |
208 (funcall (or bol-func | |
209 'erc-bol)) | |
210 (equal point (point)))) | |
211 | |
212 (defun erc-complete-at-prompt () | |
213 "Returns t if point is directly after `erc-prompt' when doing completion." | |
214 (erc-at-beginning-of-line-p (he-dabbrev-beg))) | |
215 | |
216 (provide 'erc-hecomplete) | |
217 | |
218 ;;; erc-hecomplete.el ends here | |
219 ;; | |
220 ;; Local Variables: | |
221 ;; indent-tabs-mode: t | |
222 ;; tab-width: 8 | |
223 ;; End: | |
224 | |
225 ;; arch-tag: 3be13ee8-8fdb-41ab-83c2-6582c757b91e |