Develop and Download Open Source Software

Browse CVS Repository

Annotation of /kogiku/kogiku/kogiku.el

Parent Directory Parent Directory | Revision Log Revision Log | View Revision Graph Revision Graph


Revision 1.21 - (hide annotations) (download)
Thu Feb 12 03:30:55 2004 UTC (20 years, 2 months ago) by jet
Branch: MAIN
Changes since 1.20: +3 -2 lines
2004-02-12  Masatake YAMATO  <jet@gyve.org>

	* kogiku.el (kogiku-complete-with-toggle): prog1
	で(funcall (car kogiku-original-functions))の値を返す
	ように変更した。

1 jet 1.1 ;;; kogiku.el - reading file and directory names with migemo service
2    
3     ;; Copyright (C) 2004 Masatake YAMATO
4    
5     ;; Author: Masatake YAMATO <jet@gyve.org>
6    
7     ;; This file is free software; you can redistribute it and/or modify
8     ;; it under the terms of the GNU General Public License as published by
9     ;; the Free Software Foundation; either version 2, or (at your option)
10     ;; any later version.
11    
12     ;; This file is distributed in the hope that it will be useful,
13     ;; but WITHOUT ANY WARRANTY; without even the implied warranty of
14     ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15     ;; GNU General Public License for more details.
16    
17     ;; You should have received a copy of the GNU General Public License
18     ;; along with GNU Emacs; see the file COPYING. If not, write to
19     ;; the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
20     ;; Boston, MA 02111-1307, USA.
21    
22     ;;; Commentary:
23     ;; ?ユ??????<?ゃ???????ュ????migemo??篏帥?c??亜?????????????違?????с????
24    
25     ;; (篁???戎?c???????????с??????)篁ュ??windows??eadow??篏帥?c??????????????
26     ;; ?????鴻????????(絎?????????茹?)?????吟?<?障???????????<?ゃ????find-file??
27     ;; ????????????篁???羲√?紊?????綽?荀???????)???<?ゃ????????絎?????絽吾???√????/span>
28     ;; ???????????障??????"desukutoxtupu"?????泣???????????????鴻???????????後???
29     ;; ????return]?с???c????絎????????????с???障??????
30    
31     ;; ?????鴻??????????????絎??????????違??"desktop"???? "de"[tab]?????ф?????/span>
32     ;; ???違?????????????障??????鐚?migemo??篏帥???違??????絎??障???????????с??????
33     ;; ?с????"desktop"??"de"??migemo?ф?ユ????????????絮???羝??帥?????帥?若?潟??
34     ;; ?上???????c???????????????????????<?ゃ???????????у???????違?????<?ゃ????
35     ;; ????絎?("desktop"???????鴻???????????????????????茖?絎???茖???????
36     ;; ("de"???????鴻????????????????????????????????с???障????
37    
38     ;; kogiku.el??igemo.el????NU Emacs 21???絖????????障????migemo.el??/span>
39     ;; ??篏????障??腆肴????????????kogiku.el?????若?????鴻?????c?????c??????
40     ;; ???c??????????舟??.emacs? (require 'kogiku)???吾????????macs????
41     ;; 莎桁?????障????migemo? http://migemo.namazu.rog ?????ユ???с???障????
42    
43     ;;; Acknowledgments:
44    
45 shirai 1.13 ;; Some code used in `kogiku-file-name-completion'
46     ;; and `kogiku-try-completion-regexp' are copied from
47 jet 1.1 ;; http://www.bookshelf.jp/cgi-bin/goto.cgi?file=meadow&node=kogiku
48     ;; (MeadowMemo maintained by Akihisa Matsushita <akihisa@mail.ne.jp>).
49    
50     ;; `kogiku-read-file-name-internal' are
51 shirai 1.13 ;; translated from emacs/src/fileio.c::read-file-name-internal
52 jet 1.1 ;; in elisp.
53    
54     ;;; Version:
55     ;; 2.0.2.
56    
57     ;;; History:
58     ;; 2.0.2
59     ;; -- inlucde shirai's patch
60     ;; -- introduce custom
61     ;;
62     ;; 2.0.1 -- update `Acknowledgments'.
63     ;;
64     ;; 2.0 -- rewrite.
65    
66     ;;; Code:
67    
68 shirai 1.13 (eval-when-compile
69 jet 1.1 (require 'cl)
70     (require 'migemo))
71    
72     (defgroup kogiku nil
73     "reading file and directory name with migemo service"
74     :group 'convenience)
75    
76 shirai 1.11 (defcustom kogiku-minibuffer-prompt-string "kogiku"
77     "*Kogiku indicator in minibuffer."
78     :group 'kogiku
79     :type 'string)
80    
81 jet 1.12 (defcustom kogiku-enable-once nil
82     "*If non-nil, kogiku effects a one time when call with a prefix argument.
83     If nil, kogiku toggle with a prefix argument."
84     :group 'kogiku
85     :type 'boolean)
86 jet 1.1
87 shirai 1.15 (defcustom kogiku-mode-change-key "\M-k"
88     "*Key of change `kogiku-enable-once'."
89     :group 'kogiku
90     :type 'sexp)
91    
92     (defface kogiku-indicator-face
93     '((((class color) (type tty)) (:foreground "blue" :bold t))
94     (((class color) (background light)) (:foreground "dark blue" :bold t))
95     (((class color) (background dark)) (:foreground "cyan" :bold t))
96     (t (:bold t)))
97     "*Face of kogiku indicator."
98     :group 'kogiku)
99    
100     (defface kogiku-change-face
101     '((((class color) (type tty)) (:foreground "blue"))
102     (((class color) (background light)) (:foreground "dark blue"))
103     (((class color) (background dark)) (:foreground "cyan"))
104     (t (:underline t)))
105     "*Face of kogiku indicator."
106     :group 'kogiku)
107    
108 jet 1.19 (defcustom kogiku-take-over-targets '(read-file-name-internal
109     ffap-read-file-or-url-internal)
110     "絨???????c????`minibuffer-completion-table'??┏蕁???
111     minibuffer???九勝??腱祉?c????????/span>`minibuffer-completion-table'???ゃ??
112     `kogiku-take-over-targets'???膣??с?????違??絨????????茖?絎????????茵???????"
113     :group 'kogiku
114     :type '(repeat symbol))
115 jet 1.14
116     (defvar kogiku-original-functions nil)
117     (defvar kogiku-original-completion-table nil)
118    
119 jet 1.12 (defvar kogiku-completion-key "\t")
120 shirai 1.13 (defvar kogiku-minibuffer-prompt-overlay nil)
121 shirai 1.15 (defvar kogiku-mode-change-original-functions nil)
122 jet 1.1
123 jet 1.12 (defun kogiku-complete (&optional arg)
124 jet 1.5 (interactive "P")
125 jet 1.12 (if kogiku-enable-once
126     (kogiku-oneshot-complete arg)
127     (kogiku-complete-with-toggle arg)))
128    
129     (defun kogiku-oneshot-complete (fire)
130     (let ((minibuffer-completion-table minibuffer-completion-table))
131     (when fire
132     (setq minibuffer-completion-table 'kogiku-read-file-name-internal))
133 jet 1.14 (funcall (car kogiku-original-functions))))
134 jet 1.12
135     (defun kogiku-complete-with-toggle (switch)
136 shirai 1.17 (cond
137     ((and switch
138     (eq minibuffer-completion-table 'kogiku-read-file-name-internal))
139     (setq minibuffer-completion-table kogiku-original-completion-table))
140     (switch
141     (setq minibuffer-completion-table 'kogiku-read-file-name-internal)))
142 jet 1.21 (prog1
143     (funcall (car kogiku-original-functions))
144     (kogiku-minibuffer-prompt)))
145 shirai 1.10
146 shirai 1.17 (defun kogiku-minibuffer-prompt ()
147     (if (fboundp 'field-beginning)
148     ;; Emacs 21
149 shirai 1.20 (let ((indicator (format "[%s]" kogiku-minibuffer-prompt-string))
150 shirai 1.17 (props (text-properties-at (point-min)))
151     (buffer-read-only nil)
152 shirai 1.20 (inhibit-read-only t))
153 shirai 1.17 (save-excursion
154 shirai 1.20 (goto-char (point-min))
155     (cond
156     ((and (not (eq minibuffer-completion-table 'kogiku-read-file-name-internal))
157     (looking-at (concat "^" (regexp-quote indicator) " ")))
158     (delete-region (point-min) (match-end 0)))
159     ((and (eq minibuffer-completion-table 'kogiku-read-file-name-internal)
160     (not (looking-at (concat "^" (regexp-quote indicator) " "))))
161     (setq indicator (concat indicator " "))
162     (insert indicator)
163     (set-text-properties (point-min) (field-beginning) props)
164     (add-text-properties (point-min) (+ -1 (point-min) (length indicator))
165     '(face kogiku-indicator-face))))))
166 shirai 1.17 ;; Others
167 shirai 1.13 (if (eq minibuffer-completion-table 'kogiku-read-file-name-internal)
168     (let ((max (min (point-max) (1+ (point-min)))))
169     (if kogiku-minibuffer-prompt-overlay
170     (move-overlay kogiku-minibuffer-prompt-overlay
171     (point-min) max)
172     (setq kogiku-minibuffer-prompt-overlay
173     (make-overlay (point-min) max)))
174     (overlay-put kogiku-minibuffer-prompt-overlay
175     'before-string
176     (format "%s: " kogiku-minibuffer-prompt-string))
177     (overlay-put kogiku-minibuffer-prompt-overlay 'evaporate t))
178     (when kogiku-minibuffer-prompt-overlay
179     (delete-overlay kogiku-minibuffer-prompt-overlay)))))
180    
181 jet 1.1 (if (fboundp 'compare-strings)
182     (defalias 'kogiku-compare-strings 'compare-strings)
183     (defun kogiku-compare-strings (string1 start1 end1 string2 start2 end2)
184     "Convenience `compare-strings' for XEmacs."
185     (let* ((str1 (substring string1 start1 end1))
186     (str2 (substring string2 start2 end2))
187     (len (min (length str1) (length str2)))
188     (i 0))
189     (if (string= str1 str2)
190     t
191     (setq i (catch 'ignore
192     (while (< i len)
193     (when (not (eq (aref str1 i) (aref str2 i)))
194     (throw 'ignore i))
195     (setq i (1+ i)))
196     i))
197     (1+ i)))))
198    
199     (defun kogiku-try-completion-regexp (regexp all-list)
200 shirai 1.13 (if (= (length regexp) 0)
201 jet 1.1 ""
202     (let (common)
203     (setq common
204     (substring
205 shirai 1.13 (car all-list)
206 jet 1.1 0
207 shirai 1.13 (apply 'min
208 jet 1.1 (mapcar
209     (lambda (a)
210 shirai 1.13 (apply 'min
211     (mapcar
212 jet 1.1 (lambda (b)
213 shirai 1.13 (- (abs
214 jet 1.1 (kogiku-compare-strings a 0 nil
215     b 0 nil))
216     1))
217     (delete a all-list))))
218     all-list))))
219     common)))
220    
221     (defun kogiku-migemo-get-pattern (string)
222 shirai 1.2 (let ((migemo-pattern-alist migemo-pattern-alist)
223     (migemo-white-space-regexp " *"))
224 jet 1.1 (let ((case-fold-search nil))
225     (while (string-match "[^a-zA-Z]\\([a-z]+\\)" string)
226     (setq string
227 shirai 1.7 (replace-match (capitalize (match-string 1 string)) nil nil string 1))))
228 jet 1.1 (migemo-get-pattern string)))
229    
230     (defun kogiku-file-name-completion (string dir &optional all)
231     (let* ((expanded-string (expand-file-name string dir))
232     (files (directory-files dir))
233     (pattern
234     (if (string-match "/$" expanded-string)
235     ""
236     (concat "^\\("
237     (cond
238     ((string-match "\\cj$" string)
239     string)
240 shirai 1.6 ((string-match "^\\(\\(\\Cj*\\)?\\cj+\\)\\(\\Cj+\\)$" string)
241 jet 1.1 (concat (match-string 1 string)
242     "\\("
243 shirai 1.6 (kogiku-migemo-get-pattern (match-string 3 string))
244 jet 1.1 "\\)"))
245     (t
246     (kogiku-migemo-get-pattern (file-name-nondirectory string))))
247     "\\)")))
248 jet 1.3 (candidates (delete nil
249 jet 1.1 (mapcar
250     (lambda (f)
251     (if (string-match pattern f)
252     (if (file-directory-p (expand-file-name f dir))
253     ;; ???c????????? / ?х??????????/span>
254     (file-name-as-directory f)
255     f)))
256     files)))
257 jet 1.3 (count (length candidates))
258 jet 1.1 common)
259     (if all
260 jet 1.3 candidates
261 jet 1.1 (cond
262     ((eq count 0) nil)
263 jet 1.3 ((eq count 1) (let ((candidate (car candidates)))
264 jet 1.1 (if (file-directory-p candidate)
265     (file-name-as-directory candidate)
266     candidate)))
267     (t
268 jet 1.3 (if (null (delete nil (mapcar (lambda (candidate)
269     (string-match "\\cj" candidate))
270     candidates)))
271     ;; ????????茖????ユ??????????с???????翫??????絽檎????
272     ;; `try-completion' ???若???с?障????????
273 shirai 1.4 (try-completion string (mapcar 'list candidates))
274 jet 1.3 (setq common (kogiku-try-completion-regexp pattern candidates))
275     (if (eq (length common) 0) string common)))))))
276 jet 1.1
277     (defun kogiku-file-name-all-completions (string dir)
278     (kogiku-file-name-completion string dir t))
279    
280 jet 1.3 (defun kogiku-double-dollars (input)
281 shirai 1.8 (let ((ret ""))
282     (while (string-match "\\$" input)
283     (setq ret (concat ret
284     (substring input 0 (match-beginning 0))
285     "$$"))
286     (setq input (substring input (match-end 0))))
287     (concat ret input)))
288 jet 1.3
289 jet 1.1 (defun kogiku-read-file-name-internal (string dir action)
290     (block nil
291     (unless (boundp 'read-file-name-predicate)
292     (setq read-file-name-predicate nil))
293     (let ((realdir dir)
294     (name string)
295     (orig-string)
296     (changed 0)
297     (val)
298     (specdir))
299     (if (eq 0 (length string))
300     (if (eq action 'lambda)
301     (return nil))
302     (setq orig-string string)
303     (setq string (substitute-in-file-name string))
304     (setq changed (null (string-equal string orig-string)))
305     (setq name (file-name-nondirectory string))
306     (setq val (file-name-directory string))
307     (if (not (null val))
308     (setq realdir (expand-file-name val realdir))))
309     (cond
310     ((null action)
311     (setq specdir (file-name-directory string))
312     (setq val (kogiku-file-name-completion name realdir))
313     (return (if (not (stringp val))
314 shirai 1.13 (if changed
315 jet 1.3 (kogiku-double-dollars string)
316 jet 1.1 val)
317 shirai 1.13 (if (not (null specdir))
318     (setq val (concat specdir val)))
319     (kogiku-double-dollars val))))
320 jet 1.1 ((eq action t)
321     (let ((all (kogiku-file-name-all-completions name realdir)))
322     (unless (or (null read-file-name-predicate)
323     (eq read-file-name-predicate 'file-exists-p))
324 shirai 1.13 (delete-if (lambda (x)
325 jet 1.1 (not (funcall read-file-name-predicate x))
326     all)))
327     (return all)))
328     ((eq action 'lambda)
329     (return (if read-file-name-predicate
330     (funcall read-file-name-predicate string)
331     (file-exists-p string))))))))
332 jet 1.12
333 shirai 1.15 (defun kogiku-mode-change ()
334     (interactive)
335     (setq kogiku-enable-once (not kogiku-enable-once))
336     (when (and kogiku-enable-once
337     (eq minibuffer-completion-table 'kogiku-read-file-name-internal))
338     (setq minibuffer-completion-table 'read-file-name-internal))
339     (when (and (not kogiku-enable-once)
340     (eq minibuffer-completion-table 'read-file-name-internal))
341     (setq minibuffer-completion-table 'kogiku-read-file-name-internal))
342 shirai 1.17 (kogiku-minibuffer-prompt)
343 shirai 1.15 (let ((msg (format "[%s%s-mode]"
344     (if kogiku-enable-once
345     (concat kogiku-minibuffer-prompt-string " ") "")
346     (if kogiku-enable-once "ONESHOT" "TOGGLE")))
347     (max (point-max))
348     (inhibit-quit t))
349     (put-text-property 0 (length msg) 'face 'kogiku-change-face msg)
350     (save-excursion
351     (goto-char max)
352     (insert " " msg))
353     (sit-for 5)
354     (save-excursion
355     (delete-region max (point-max)))))
356    
357 jet 1.12 (defun kogiku-install-key ()
358 shirai 1.15 (when (memq minibuffer-completion-table kogiku-take-over-targets)
359 jet 1.14 (setq kogiku-original-completion-table minibuffer-completion-table)
360     (push (lookup-key (current-local-map) kogiku-completion-key)
361     kogiku-original-functions)
362 shirai 1.15 (define-key (current-local-map) kogiku-completion-key 'kogiku-complete)
363     (push (lookup-key (current-local-map) kogiku-mode-change-key)
364     kogiku-mode-change-original-functions)
365     (define-key (current-local-map) kogiku-mode-change-key 'kogiku-mode-change)))
366 shirai 1.13
367 jet 1.12 (add-hook 'minibuffer-setup-hook 'kogiku-install-key)
368    
369     (defun kogiku-uninstall-key ()
370 jet 1.14 (when (and (or (eq minibuffer-completion-table 'kogiku-read-file-name-internal)
371     (memq minibuffer-completion-table kogiku-take-over-targets))
372 jet 1.12 (eq (lookup-key (current-local-map) kogiku-completion-key)
373 shirai 1.13 'kogiku-complete))
374 shirai 1.15 (define-key (current-local-map) kogiku-completion-key (pop kogiku-original-functions))
375     (when (eq (lookup-key (current-local-map) kogiku-mode-change-key)
376     'kogiku-mode-change)
377     (define-key (current-local-map) kogiku-mode-change-key
378     (pop kogiku-mode-change-original-functions)))))
379    
380     (add-hook 'minibuffer-exit-hook 'kogiku-uninstall-key)
381 jet 1.1
382     (provide 'kogiku)
383     ;; kogiku.el ends here

Back to OSDN">Back to OSDN
ViewVC Help
Powered by ViewVC 1.1.26