Commit | Line | Data |
---|---|---|
c6b99621 | 1 | ;;; erc-hecomplete.el --- Provides Nick name completion for ERC |
597993cf | 2 | |
ba318903 | 3 | ;; Copyright (C) 2001-2002, 2004, 2006-2014 Free Software Foundation, |
ab422c4d | 4 | ;; Inc. |
597993cf MB |
5 | |
6 | ;; Author: Alex Schroeder <alex@gnu.org> | |
7 | ;; URL: http://www.emacswiki.org/cgi-bin/wiki.pl?ErcCompletion | |
bed7f140 | 8 | ;; Obsolete-since: 24.1 |
597993cf MB |
9 | |
10 | ;; This file is part of GNU Emacs. | |
11 | ||
4ee57b2a | 12 | ;; GNU Emacs is free software: you can redistribute it and/or modify |
597993cf | 13 | ;; it under the terms of the GNU General Public License as published by |
4ee57b2a GM |
14 | ;; the Free Software Foundation, either version 3 of the License, or |
15 | ;; (at your option) any later version. | |
597993cf MB |
16 | |
17 | ;; GNU Emacs is distributed in the hope that it will be useful, | |
18 | ;; but WITHOUT ANY WARRANTY; without even the implied warranty of | |
19 | ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
20 | ;; GNU General Public License for more details. | |
21 | ||
22 | ;; You should have received a copy of the GNU General Public License | |
4ee57b2a | 23 | ;; along with GNU Emacs. If not, see <http://www.gnu.org/licenses/>. |
597993cf MB |
24 | |
25 | ;;; Commentary: | |
26 | ||
c6b99621 MB |
27 | ;; This file is considered obsolete. It is recommended to use |
28 | ;; completion from erc-pcomplete instead. | |
597993cf | 29 | |
c6b99621 MB |
30 | ;; This file is based on hippie-expand, while the new file is based on |
31 | ;; pcomplete. | |
597993cf MB |
32 | |
33 | ;;; Code: | |
34 | ||
35 | (require 'erc) | |
36 | (require 'erc-match); for erc-pals | |
37 | (require 'hippie-exp); for the hippie expand stuff | |
38 | ||
c6b99621 MB |
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 () | |
597993cf MB |
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 | ||
c6b99621 MB |
53 | (defgroup erc-hecomplete nil |
54 | "Nick completion. It is recommended to use erc-pcomplete instead." | |
597993cf MB |
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) | |
c6b99621 | 74 | :group 'erc-hecomplete) |
597993cf MB |
75 | |
76 | (defcustom erc-nick-completion-ignore-case t | |
fb7ada5f | 77 | "Non-nil means don't consider case significant in nick completion. |
597993cf MB |
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\"." | |
c6b99621 | 81 | :group 'erc-hecomplete |
597993cf MB |
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'." | |
8508e990 | 91 | (remove |
597993cf | 92 | (erc-current-nick) |
8508e990 | 93 | (erc-get-channel-nickname-list))) |
597993cf MB |
94 | |
95 | (defcustom erc-nick-completion-postfix ": " | |
fb7ada5f | 96 | "When `erc-complete' is used in the first word after the prompt, |
597993cf | 97 | add this string when a unique expansion was found." |
c6b99621 | 98 | :group 'erc-hecomplete |
597993cf MB |
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'." | |
bed7f140 SM |
113 | (try-complete-erc-nick old (cond ((eq erc-nick-completion 'pals) erc-pals) |
114 | ((eq erc-nick-completion 'all) | |
115 | (append | |
8508e990 | 116 | (erc-get-channel-nickname-list) |
bed7f140 SM |
117 | (erc-command-list))) |
118 | ((functionp erc-nick-completion) | |
119 | (funcall erc-nick-completion)) | |
120 | (t erc-nick-completion)))) | |
597993cf MB |
121 | |
122 | (defvar try-complete-erc-nick-window-configuration nil | |
123 | "The window configuration for `try-complete-erc-nick'. | |
124 | When called the first time, a window config is stored here, | |
125 | and when completion is done, the window config is restored | |
126 | from here. See `try-complete-erc-nick-restore' and | |
127 | `try-complete-erc-nick'.") | |
128 | ||
129 | (defun try-complete-erc-nick-restore () | |
130 | "Restore window configuration." | |
131 | (if (not try-complete-erc-nick-window-configuration) | |
132 | (when (get-buffer "*Completions*") | |
133 | (delete-windows-on "*Completions*")) | |
134 | (set-window-configuration | |
135 | try-complete-erc-nick-window-configuration) | |
136 | (setq try-complete-erc-nick-window-configuration nil))) | |
137 | ||
138 | (defun try-complete-erc-nick (old completions) | |
139 | "Try to complete current word depending on `erc-try-complete-nick'. | |
140 | The argument OLD has to be nil the first call of this function, and t | |
141 | for subsequent calls (for further possible completions of the same | |
142 | string). It returns t if a new completion is found, nil otherwise. The | |
143 | second argument COMPLETIONS is a list of completions to use. Actually, | |
144 | it is only used when OLD is nil. It will be copied to `he-expand-list' | |
145 | on the first call. After that, it is no longer used. | |
146 | Window configurations are stored in | |
147 | `try-complete-erc-nick-window-configuration'." | |
148 | (let (expansion | |
149 | final | |
150 | (alist (if (consp (car completions)) | |
151 | completions | |
152 | (mapcar (lambda (s) | |
153 | (if (and (erc-complete-at-prompt) | |
154 | (and (not (= (length s) 0)) | |
155 | (not (eq (elt s 0) ?/)))) | |
156 | (list (concat s erc-nick-completion-postfix)) | |
157 | (list (concat s " ")))) | |
158 | completions))) ; make alist if required | |
159 | (completion-ignore-case erc-nick-completion-ignore-case)) | |
160 | (he-init-string (he-dabbrev-beg) (point)) | |
161 | ;; If there is a string to complete, complete it using alist. | |
162 | ;; expansion is the possible expansion, or t. If expansion is t | |
163 | ;; or if expansion is the "real" thing, we are finished (final is | |
164 | ;; t). Take care -- expansion can also be nil! | |
165 | (unless (string= he-search-string "") | |
166 | (setq expansion (try-completion he-search-string alist) | |
167 | final (or (eq t expansion) | |
168 | (and expansion | |
169 | (eq t (try-completion expansion alist)))))) | |
170 | (cond ((not expansion) | |
171 | ;; There is no expansion at all. | |
172 | (try-complete-erc-nick-restore) | |
173 | (he-reset-string) | |
174 | nil) | |
175 | ((eq t expansion) | |
176 | ;; The user already has the correct expansion. | |
177 | (try-complete-erc-nick-restore) | |
178 | (he-reset-string) | |
179 | t) | |
180 | ((and old (string= expansion he-search-string)) | |
181 | ;; This is the second time around and nothing changed, | |
182 | ;; ie. the user tried to expand something incomplete | |
183 | ;; without making a choice -- hitting TAB twice, for | |
184 | ;; example. | |
185 | (try-complete-erc-nick-restore) | |
186 | (he-reset-string) | |
187 | nil) | |
188 | (final | |
189 | ;; The user has found the correct expansion. | |
190 | (try-complete-erc-nick-restore) | |
191 | (he-substitute-string expansion) | |
192 | t) | |
193 | (t | |
194 | ;; We found something but we are not finished. Show a | |
195 | ;; completions buffer. Substitute what we found and return | |
196 | ;; t. | |
197 | (setq try-complete-erc-nick-window-configuration | |
198 | (current-window-configuration)) | |
199 | (with-output-to-temp-buffer "*Completions*" | |
200 | (display-completion-list (all-completions he-search-string alist))) | |
201 | (he-substitute-string expansion) | |
202 | t)))) | |
203 | ||
204 | (defun erc-at-beginning-of-line-p (point &optional bol-func) | |
205 | (save-excursion | |
206 | (funcall (or bol-func | |
207 | 'erc-bol)) | |
208 | (equal point (point)))) | |
209 | ||
210 | (defun erc-complete-at-prompt () | |
211 | "Returns t if point is directly after `erc-prompt' when doing completion." | |
212 | (erc-at-beginning-of-line-p (he-dabbrev-beg))) | |
213 | ||
c6b99621 | 214 | (provide 'erc-hecomplete) |
597993cf | 215 | |
c6b99621 | 216 | ;;; erc-hecomplete.el ends here |
597993cf MB |
217 | ;; |
218 | ;; Local Variables: | |
219 | ;; indent-tabs-mode: t | |
220 | ;; tab-width: 8 | |
221 | ;; End: | |
222 |