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.20 - (hide annotations) (download)
Tue Feb 10 16:20:15 2004 UTC (20 years, 2 months ago) by shirai
Branch: MAIN
Changes since 1.19: +14 -22 lines
* kogiku.el (kogiku-minibuffer-prompt): シンプ?E吠儿后

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.14 (funcall (car kogiku-original-functions))
143 shirai 1.17 (kogiku-minibuffer-prompt))
144 shirai 1.10
145 shirai 1.17 (defun kogiku-minibuffer-prompt ()
146     (if (fboundp 'field-beginning)
147     ;; Emacs 21
148 shirai 1.20 (let ((indicator (format "[%s]" kogiku-minibuffer-prompt-string))
149 shirai 1.17 (props (text-properties-at (point-min)))
150     (buffer-read-only nil)
151 shirai 1.20 (inhibit-read-only t))
152 shirai 1.17 (save-excursion
153 shirai 1.20 (goto-char (point-min))
154     (cond
155     ((and (not (eq minibuffer-completion-table 'kogiku-read-file-name-internal))
156     (looking-at (concat "^" (regexp-quote indicator) " ")))
157     (delete-region (point-min) (match-end 0)))
158     ((and (eq minibuffer-completion-table 'kogiku-read-file-name-internal)
159     (not (looking-at (concat "^" (regexp-quote indicator) " "))))
160     (setq indicator (concat indicator " "))
161     (insert indicator)
162     (set-text-properties (point-min) (field-beginning) props)
163     (add-text-properties (point-min) (+ -1 (point-min) (length indicator))
164     '(face kogiku-indicator-face))))))
165 shirai 1.17 ;; Others
166 shirai 1.13 (if (eq minibuffer-completion-table 'kogiku-read-file-name-internal)
167     (let ((max (min (point-max) (1+ (point-min)))))
168     (if kogiku-minibuffer-prompt-overlay
169     (move-overlay kogiku-minibuffer-prompt-overlay
170     (point-min) max)
171     (setq kogiku-minibuffer-prompt-overlay
172     (make-overlay (point-min) max)))
173     (overlay-put kogiku-minibuffer-prompt-overlay
174     'before-string
175     (format "%s: " kogiku-minibuffer-prompt-string))
176     (overlay-put kogiku-minibuffer-prompt-overlay 'evaporate t))
177     (when kogiku-minibuffer-prompt-overlay
178     (delete-overlay kogiku-minibuffer-prompt-overlay)))))
179    
180 jet 1.1 (if (fboundp 'compare-strings)
181     (defalias 'kogiku-compare-strings 'compare-strings)
182     (defun kogiku-compare-strings (string1 start1 end1 string2 start2 end2)
183     "Convenience `compare-strings' for XEmacs."
184     (let* ((str1 (substring string1 start1 end1))
185     (str2 (substring string2 start2 end2))
186     (len (min (length str1) (length str2)))
187     (i 0))
188     (if (string= str1 str2)
189     t
190     (setq i (catch 'ignore
191     (while (< i len)
192     (when (not (eq (aref str1 i) (aref str2 i)))
193     (throw 'ignore i))
194     (setq i (1+ i)))
195     i))
196     (1+ i)))))
197    
198     (defun kogiku-try-completion-regexp (regexp all-list)
199 shirai 1.13 (if (= (length regexp) 0)
200 jet 1.1 ""
201     (let (common)
202     (setq common
203     (substring
204 shirai 1.13 (car all-list)
205 jet 1.1 0
206 shirai 1.13 (apply 'min
207 jet 1.1 (mapcar
208     (lambda (a)
209 shirai 1.13 (apply 'min
210     (mapcar
211 jet 1.1 (lambda (b)
212 shirai 1.13 (- (abs
213 jet 1.1 (kogiku-compare-strings a 0 nil
214     b 0 nil))
215     1))
216     (delete a all-list))))
217     all-list))))
218     common)))
219    
220     (defun kogiku-migemo-get-pattern (string)
221 shirai 1.2 (let ((migemo-pattern-alist migemo-pattern-alist)
222     (migemo-white-space-regexp " *"))
223 jet 1.1 (let ((case-fold-search nil))
224     (while (string-match "[^a-zA-Z]\\([a-z]+\\)" string)
225     (setq string
226 shirai 1.7 (replace-match (capitalize (match-string 1 string)) nil nil string 1))))
227 jet 1.1 (migemo-get-pattern string)))
228    
229     (defun kogiku-file-name-completion (string dir &optional all)
230     (let* ((expanded-string (expand-file-name string dir))
231     (files (directory-files dir))
232     (pattern
233     (if (string-match "/$" expanded-string)
234     ""
235     (concat "^\\("
236     (cond
237     ((string-match "\\cj$" string)
238     string)
239 shirai 1.6 ((string-match "^\\(\\(\\Cj*\\)?\\cj+\\)\\(\\Cj+\\)$" string)
240 jet 1.1 (concat (match-string 1 string)
241     "\\("
242 shirai 1.6 (kogiku-migemo-get-pattern (match-string 3 string))
243 jet 1.1 "\\)"))
244     (t
245     (kogiku-migemo-get-pattern (file-name-nondirectory string))))
246     "\\)")))
247 jet 1.3 (candidates (delete nil
248 jet 1.1 (mapcar
249     (lambda (f)
250     (if (string-match pattern f)
251     (if (file-directory-p (expand-file-name f dir))
252     ;; ???c????????? / ?х??????????/span>
253     (file-name-as-directory f)
254     f)))
255     files)))
256 jet 1.3 (count (length candidates))
257 jet 1.1 common)
258     (if all
259 jet 1.3 candidates
260 jet 1.1 (cond
261     ((eq count 0) nil)
262 jet 1.3 ((eq count 1) (let ((candidate (car candidates)))
263 jet 1.1 (if (file-directory-p candidate)
264     (file-name-as-directory candidate)
265     candidate)))
266     (t
267 jet 1.3 (if (null (delete nil (mapcar (lambda (candidate)
268     (string-match "\\cj" candidate))
269     candidates)))
270     ;; ????????茖????ユ??????????с???????翫??????絽檎????
271     ;; `try-completion' ???若???с?障????????
272 shirai 1.4 (try-completion string (mapcar 'list candidates))
273 jet 1.3 (setq common (kogiku-try-completion-regexp pattern candidates))
274     (if (eq (length common) 0) string common)))))))
275 jet 1.1
276     (defun kogiku-file-name-all-completions (string dir)
277     (kogiku-file-name-completion string dir t))
278    
279 jet 1.3 (defun kogiku-double-dollars (input)
280 shirai 1.8 (let ((ret ""))
281     (while (string-match "\\$" input)
282     (setq ret (concat ret
283     (substring input 0 (match-beginning 0))
284     "$$"))
285     (setq input (substring input (match-end 0))))
286     (concat ret input)))
287 jet 1.3
288 jet 1.1 (defun kogiku-read-file-name-internal (string dir action)
289     (block nil
290     (unless (boundp 'read-file-name-predicate)
291     (setq read-file-name-predicate nil))
292     (let ((realdir dir)
293     (name string)
294     (orig-string)
295     (changed 0)
296     (val)
297     (specdir))
298     (if (eq 0 (length string))
299     (if (eq action 'lambda)
300     (return nil))
301     (setq orig-string string)
302     (setq string (substitute-in-file-name string))
303     (setq changed (null (string-equal string orig-string)))
304     (setq name (file-name-nondirectory string))
305     (setq val (file-name-directory string))
306     (if (not (null val))
307     (setq realdir (expand-file-name val realdir))))
308     (cond
309     ((null action)
310     (setq specdir (file-name-directory string))
311     (setq val (kogiku-file-name-completion name realdir))
312     (return (if (not (stringp val))
313 shirai 1.13 (if changed
314 jet 1.3 (kogiku-double-dollars string)
315 jet 1.1 val)
316 shirai 1.13 (if (not (null specdir))
317     (setq val (concat specdir val)))
318     (kogiku-double-dollars val))))
319 jet 1.1 ((eq action t)
320     (let ((all (kogiku-file-name-all-completions name realdir)))
321     (unless (or (null read-file-name-predicate)
322     (eq read-file-name-predicate 'file-exists-p))
323 shirai 1.13 (delete-if (lambda (x)
324 jet 1.1 (not (funcall read-file-name-predicate x))
325     all)))
326     (return all)))
327     ((eq action 'lambda)
328     (return (if read-file-name-predicate
329     (funcall read-file-name-predicate string)
330     (file-exists-p string))))))))
331 jet 1.12
332 shirai 1.15 (defun kogiku-mode-change ()
333     (interactive)
334     (setq kogiku-enable-once (not kogiku-enable-once))
335     (when (and kogiku-enable-once
336     (eq minibuffer-completion-table 'kogiku-read-file-name-internal))
337     (setq minibuffer-completion-table 'read-file-name-internal))
338     (when (and (not kogiku-enable-once)
339     (eq minibuffer-completion-table 'read-file-name-internal))
340     (setq minibuffer-completion-table 'kogiku-read-file-name-internal))
341 shirai 1.17 (kogiku-minibuffer-prompt)
342 shirai 1.15 (let ((msg (format "[%s%s-mode]"
343     (if kogiku-enable-once
344     (concat kogiku-minibuffer-prompt-string " ") "")
345     (if kogiku-enable-once "ONESHOT" "TOGGLE")))
346     (max (point-max))
347     (inhibit-quit t))
348     (put-text-property 0 (length msg) 'face 'kogiku-change-face msg)
349     (save-excursion
350     (goto-char max)
351     (insert " " msg))
352     (sit-for 5)
353     (save-excursion
354     (delete-region max (point-max)))))
355    
356 jet 1.12 (defun kogiku-install-key ()
357 shirai 1.15 (when (memq minibuffer-completion-table kogiku-take-over-targets)
358 jet 1.14 (setq kogiku-original-completion-table minibuffer-completion-table)
359     (push (lookup-key (current-local-map) kogiku-completion-key)
360     kogiku-original-functions)
361 shirai 1.15 (define-key (current-local-map) kogiku-completion-key 'kogiku-complete)
362     (push (lookup-key (current-local-map) kogiku-mode-change-key)
363     kogiku-mode-change-original-functions)
364     (define-key (current-local-map) kogiku-mode-change-key 'kogiku-mode-change)))
365 shirai 1.13
366 jet 1.12 (add-hook 'minibuffer-setup-hook 'kogiku-install-key)
367    
368     (defun kogiku-uninstall-key ()
369 jet 1.14 (when (and (or (eq minibuffer-completion-table 'kogiku-read-file-name-internal)
370     (memq minibuffer-completion-table kogiku-take-over-targets))
371 jet 1.12 (eq (lookup-key (current-local-map) kogiku-completion-key)
372 shirai 1.13 'kogiku-complete))
373 shirai 1.15 (define-key (current-local-map) kogiku-completion-key (pop kogiku-original-functions))
374     (when (eq (lookup-key (current-local-map) kogiku-mode-change-key)
375     'kogiku-mode-change)
376     (define-key (current-local-map) kogiku-mode-change-key
377     (pop kogiku-mode-change-original-functions)))))
378    
379     (add-hook 'minibuffer-exit-hook 'kogiku-uninstall-key)
380 jet 1.1
381     (provide 'kogiku)
382     ;; kogiku.el ends here

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