Convert consecutive FSF copyright years to ranges.
[bpt/emacs.git] / lisp / erc / erc-hecomplete.el
CommitLineData
c6b99621 1;;; erc-hecomplete.el --- Provides Nick name completion for ERC
597993cf 2
73b0cd50 3;; Copyright (C) 2001-2002, 2004, 2006-2011 Free Software Foundation, Inc.
597993cf
MB
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
4ee57b2a 10;; GNU Emacs is free software: you can redistribute it and/or modify
597993cf 11;; it under the terms of the GNU General Public License as published by
4ee57b2a
GM
12;; the Free Software Foundation, either version 3 of the License, or
13;; (at your option) any later version.
597993cf
MB
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
4ee57b2a 21;; along with GNU Emacs. If not, see <http://www.gnu.org/licenses/>.
597993cf
MB
22
23;;; Commentary:
24
c6b99621
MB
25;; This file is considered obsolete. It is recommended to use
26;; completion from erc-pcomplete instead.
597993cf 27
c6b99621
MB
28;; This file is based on hippie-expand, while the new file is based on
29;; pcomplete.
597993cf
MB
30
31;;; Code:
32
33(require 'erc)
34(require 'erc-match); for erc-pals
35(require 'hippie-exp); for the hippie expand stuff
36
c6b99621
MB
37;;;###autoload (autoload 'erc-hecomplete-mode "erc-hecomplete" nil t)
38(define-erc-module hecomplete nil
39 "Complete nick at point."
40 ((add-hook 'erc-complete-functions 'erc-hecomplete))
41 ((remove-hook 'erc-complete-functions 'erc-hecomplete)))
42
43(defun erc-hecomplete ()
597993cf
MB
44 "Complete nick at point.
45See `erc-try-complete-nick' for more technical info.
46This function is obsolete, use `erc-pcomplete' instead."
47 (interactive)
48 (let ((hippie-expand-try-functions-list '(erc-try-complete-nick)))
49 (hippie-expand nil)))
50
c6b99621
MB
51(defgroup erc-hecomplete nil
52 "Nick completion. It is recommended to use erc-pcomplete instead."
597993cf
MB
53 :group 'erc)
54
55(defcustom erc-nick-completion 'all
56 "Determine how the list of nicks is determined during nick completion.
57See `erc-complete-nick' for information on how to activate this.
58
59pals: Use `erc-pals'.
60all: All channel members.
61
62You may also provide your own function that returns a list of completions.
63One example is `erc-nick-completion-exclude-myself',
64or you may use an arbitrary lisp expression."
65 :type '(choice (const :tag "List of pals" pals)
66 (const :tag "All channel members" all)
67 (const :tag "All channel members except yourself"
68 erc-nick-completion-exclude-myself)
69 (repeat :tag "List" (string :tag "Nick"))
70 function
71 sexp)
c6b99621 72 :group 'erc-hecomplete)
597993cf
MB
73
74(defcustom erc-nick-completion-ignore-case t
75 "*Non-nil means don't consider case significant in nick completion.
76Case will be automatically corrected when non-nil.
77For instance if you type \"dely TAB\" the word completes and changes to
78\"delYsid\"."
c6b99621 79 :group 'erc-hecomplete
597993cf
MB
80 :type 'boolean)
81
82(defun erc-nick-completion-exclude-myself ()
83 "Get a list of all the channel members except you.
84
85This function returns a list of all the members in the channel, except
86your own nick. This way if you're named foo and someone is called foobar,
87typing \"f o TAB\" will directly give you foobar. Use this with
88`erc-nick-completion'."
8508e990 89 (remove
597993cf 90 (erc-current-nick)
8508e990 91 (erc-get-channel-nickname-list)))
597993cf
MB
92
93(defcustom erc-nick-completion-postfix ": "
94 "*When `erc-complete' is used in the first word after the prompt,
95add this string when a unique expansion was found."
c6b99621 96 :group 'erc-hecomplete
597993cf
MB
97 :type 'string)
98
99(defun erc-command-list ()
100 "Returns a list of strings of the defined user commands."
101 (let ((case-fold-search nil))
102 (mapcar (lambda (x)
103 (concat "/" (downcase (substring (symbol-name x) 8))))
104 (apropos-internal "erc-cmd-[A-Z]+"))))
105
106(defun erc-try-complete-nick (old)
107 "Complete nick at point.
108This is a function to put on `hippie-expand-try-functions-list'.
109Then use \\[hippie-expand] to expand nicks.
110The type of completion depends on `erc-nick-completion'."
111 (cond ((eq erc-nick-completion 'pals)
112 (try-complete-erc-nick old erc-pals))
113 ((eq erc-nick-completion 'all)
114 (try-complete-erc-nick old (append
8508e990 115 (erc-get-channel-nickname-list)
597993cf
MB
116 (erc-command-list))))
117 ((functionp erc-nick-completion)
118 (try-complete-erc-nick old (funcall erc-nick-completion)))
119 (t
120 (try-complete-erc-nick old erc-nick-completion))))
121
122(defvar try-complete-erc-nick-window-configuration nil
123 "The window configuration for `try-complete-erc-nick'.
124When called the first time, a window config is stored here,
125and when completion is done, the window config is restored
126from 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'.
140The argument OLD has to be nil the first call of this function, and t
141for subsequent calls (for further possible completions of the same
142string). It returns t if a new completion is found, nil otherwise. The
143second argument COMPLETIONS is a list of completions to use. Actually,
144it is only used when OLD is nil. It will be copied to `he-expand-list'
145on the first call. After that, it is no longer used.
146Window 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