forked from mdesjardins/Aquamacs
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathauto-install.el
1504 lines (1399 loc) · 57.1 KB
/
auto-install.el
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
;;; auto-install.el --- Auto install elisp file
;; $Id: auto-install.el,v 1.54 2012/01/15 12:10:20 rubikitch Exp $
;; Filename: auto-install.el
;; Description: Auto install elisp file
;; Author: Andy Stewart <[email protected]>
;; rubikitch <[email protected]>
;; Maintainer: rubikitch <[email protected]>
;; Copyright (C) 2008, 2009, Andy Stewart, all rights reserved.
;; Copyright (C) 2009, rubikitch, all rights reserved.
;; Created: 2008-12-11 13:56:50
;; Version: $Revision: 1.54 $
;; URL: http://www.emacswiki.org/emacs/download/auto-install.el
;; Keywords: auto-install
;; Compatibility: GNU Emacs 22 ~ 23
;;
;; Features that might be required by this library:
;;
;; `backquote', `bytecomp', `dired', `find-func', `ietf-drums',
;; `loadhist', `mail-parse', `mail-prsvr', `mailcap', `mm-util',
;; `qp', `rfc2045', `rfc2047', `rfc2231', `thingatpt', `time-date',
;; `timezone', `url', `url-cookie', `url-expand', `url-history',
;; `url-methods', `url-parse', `url-privacy', `url-proxy',
;; `url-util', `url-vars'.
;;
(defvar auto-install-version "$Id: auto-install.el,v 1.54 2012/01/15 12:10:20 rubikitch Exp $")
;;; This file is NOT part of GNU Emacs
;;; License
;;
;; This program is free software; you can redistribute it and/or modify
;; it under the terms of the GNU General Public License as published by
;; the Free Software Foundation; either version 3, or (at your option)
;; any later version.
;; This program is distributed in the hope that it will be useful,
;; but WITHOUT ANY WARRANTY; without even the implied warranty of
;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
;; GNU General Public License for more details.
;; You should have received a copy of the GNU General Public License
;; along with this program; see the file COPYING. If not, write to
;; the Free Software Foundation, Inc., 51 Franklin Street, Fifth
;; Floor, Boston, MA 02110-1301, USA.
;;; Commentary:
;;
;; Automates the installation of Emacs Lisp files and packages.
;;
;; `auto-install' provides an automated way to:
;;
;; (1) Download Emacs Lisp files and packages from common sources
;; (2) View them (diff) and save them to your repository
;; (3) Compile and Load them
;;
;;; Commands:
;;
;; Below are complete command list:
;;
;; `auto-install-minor-mode'
;; Auto Install minor mode.
;; `auto-install-from-buffer'
;; Install the elisp file in the current buffer.
;; `auto-install-from-url'
;; Install an elisp file from a given url.
;; `auto-install-from-emacswiki'
;; Install an elisp file from EmacsWiki.org.
;; `auto-install-from-gist'
;; Install an elisp file from gist.github.com.
;; `auto-install-from-library'
;; Update an elisp LIBRARY.
;; `auto-install-from-directory'
;; Update elisp files under DIRECTORY from EmacsWiki.
;; `auto-install-from-dired'
;; Update dired marked elisp files from EmacsWiki.org.
;; `auto-install-update-emacswiki-package-name'
;; Update the list of elisp package names from `EmacsWiki'.
;; `auto-install-dired-mark-files'
;; Mark dired files that contain at `EmacsWiki.org'.
;; `auto-install-mode'
;; Major mode for auto-installing elisp code.
;; `auto-install-buffer-quit'
;; Quit from `auto-install' temporary buffer.
;; `auto-install-compatibility-setup'
;; Install Compatibility commands for install-elisp.el users.
;; `auto-install-batch'
;; Batch install many files (libraries and non-elisp files) in some extension.
;; `auto-install-batch-edit'
;; Edit auto-install-batch-list.el
;; `auto-install-buffer-diff'
;; View different between old version.
;; `auto-install-buffer-save'
;; Save downloaded content to file FILENAME.
;;
;;; Customizable Options:
;;
;; Below are customizable option list:
;;
;; `auto-install-directory'
;; The directory for saving elisp files.
;; default = "~/.emacs.d/auto-install/"
;; `auto-install-buffer-name'
;; The temporary buffer for storing download content.
;; default = "auto-install"
;; `auto-install-emacswiki-base-url'
;; The base emacswiki.org url from which to download elisp files.
;; default = "http://www.emacswiki.org/cgi-bin/wiki/download/"
;; `auto-install-gist-base-url'
;; The base gist.github.com url from which to download elisp files.
;; default = "http://gist.github.com/"
;; `auto-install-filter-url'
;; Alist mapping filter url for library.
;; default = (quote (("color-grep" "http://www.bookshelf.jp/elc/")))
;; `auto-install-save-confirm'
;; Whether confirmation is needed to save downloaded content.
;; default = t
;; `auto-install-replace-confirm'
;; Whether confirmation is needed to replace an existing elisp file.
;; default = nil
;; `auto-install-install-confirm'
;; Whether confirmation is needed to install a downloaded elisp file.
;; default = nil
;; `auto-install-from-dired-confirm'
;; Whether confirmation is needed to download marked files from Dired.
;; default = t
;; `auto-install-wget-command'
;; *Wget command. Use only if `auto-install-use-wget' is non-nil.
;; default = "wget"
;; `auto-install-use-wget'
;; *Use wget instead of `url-retrieve'.
;; default = (executable-find "wget")
;; `auto-install-batch-list'
;; This list contain packages information for batch install.
;; default = nil
;;; Tips:
;;
;; Downloading is asynchronous: you can do your work and download
;; files at the same time. The download process won't hang
;; Emacs.
;;
;; `auto-install-from-url' remembers previous installations. So if
;; your search is the same as the previous search, you don't need
;; to type it in, just hit RETURN.
;;
;; `auto-install-from-emacswiki' will complete then names of
;; packages from those in the Elisp area in `EmacsWiki'.
;;
;; `auto-install-from-library' will prompt you library name in
;; you load-path, then it try to download from EmacsWiki if it
;; can't find match in `auto-install-filter-url'.
;;
;; `auto-install-from-directory' can install elisp file
;; under specify directory.
;;
;; `auto-install-from-dired' can install marked files using dired.
;; You can mark the files you want in dired and then use
;; `auto-install-from-dired' to download those files
;; asynchronously.
;;
;; `auto-install-from-buffer' can save and install the contents of
;; the current buffer as a file. You need a valid elisp file name.
;; The default name is the buffer name.
;;
;; `auto-install-from-emacswiki' and `auto-install-from-library'
;; will try to pick up file around point, you can move
;; cursor to file name, and just hit RET for install.
;;
;; Some extension (such as icicles) have many libraries to need install,
;; and install one by one is painful, you can use command
;; `auto-install-batch' install all icicles libraries.
;; And `auto-install-batch' handle max connect limit with some website
;; (such as EmacsWiki) to avoid download failed.
;;
;; All of the above functions support a filename filter. You can
;; input any url to download an elisp file, if the file name suffix is
;; `.el', it will download and install the file automatically.
;; Otherwise, it won't install it unless you input a valid elisp
;; file name.
;;
;; By default, if a file that you download does not exist on your
;; system the file is downloaded to `auto-install-directory'. If
;; you already have a file with the same name in your load
;; directory, `auto-install' will try to replace that file.
;;
;; You can use command `auto-install-dired-mark-files' to mark files
;; that contain at `EmacsWiki.org' for fast update.
;;
;; By default, command `auto-install-from-emacswiki' will initialization
;; current symbol as default value, if default value is you want,
;; just hit RET, so lazy!
;;
;;; Installation:
;;
;; (1) Put auto-install.el somewhere in your load-path.
;;
;; For example, put it into ~/elisp/.
;; Then add the following to your ~/.emacs:
;;
;; (add-to-list 'load-path (expand-file-name "~/elisp"))
;;
;; (2) And put the following in your ~/.emacs startup file:
;;
;; (require 'auto-install)
;;
;; (3) Add this to your ~/.emacs to optionally specify a download directory:
;;
;; (setq auto-install-directory "~/.emacs.d/auto-install/")
;;
;; If you don't set this, "~/.emacs.d/auto-install/" will be used as the default,
;; and will be created as needed.
;;
;; (4) Optionally, if your computer is always connected Internet when Emacs start up,
;; I recommend you add below to your ~/.emacs, to update package name when start up:
;;
;; (auto-install-update-emacswiki-package-name t)
;;
;; And above setup is not necessary, because AutoInstall will automatically update
;; package name when you just first call `auto-install-from-emacswiki',
;; above setup just avoid *delay* when you first call `auto-install-from-emacswiki'.
;;
;; (5) I recommend you add below to your ~/.emacs for install-elisp users:
;;
;; (auto-install-compatibility-setup)
;;
;; This command `defalias'es `install-elisp',
;; `install-elisp-from-emacswiki' and `install-elisp-from-gist' to
;; `auto-install' ones.
;;
;; (6) If you want to use proxy server, set `url-proxy-services'. For example:
;;
;; (setq url-proxy-services '(("http" . "localhost:8339")))
;;; Customize:
;;
;; `auto-install-directory'
;; The default directory for keeping auto-downloaded elisp files.
;;
;; `auto-install-buffer-name'
;; The base buffer name for temporarily storing downloaded download content.
;;
;; `auto-install-emacswiki-base-url'
;; The base url for downloading from EmacsWiki.org.
;;
;; `auto-install-gist-base-url'
;; The base url for downloading from gist.github.com
;;
;; `auto-install-filter-url'
;; Filter url for downloading a special library.
;;
;; `auto-install-save-confirm'
;; Whether to require confirmation when saving downloaded content.
;;
;; `auto-install-replace-confirm'
;; Whether to require confirmation when replacing an already-installed
;; file.
;;
;; `auto-install-install-confirm'
;; Whether to require confirmation when installing a file.
;;
;; `auto-install-from-dired-confirm'
;; Whether to require confirmation when downloading files marked in dired.
;;
;; `auto-install-batch-list'
;; This list contain packages information for batch install.
;; Anyone can add packages information in this list for batch install.
;;
;; And all above option can customize easy through:
;; M-x RET customize-group RET auto-install RET
;;
;;; Bug Report:
;;
;; If you have problem, send a bug report via M-x auto-install-send-bug-report.
;; The step is:
;; 0) Setup mail in Emacs, the easiest way is:
;; (setq user-mail-address "[email protected]")
;; (setq user-full-name "Your Full Name")
;; (setq smtpmail-smtp-server "your.smtp.server.jp")
;; (setq mail-user-agent 'message-user-agent)
;; (setq message-send-mail-function 'message-smtpmail-send-it)
;; 1) Be sure to use the LATEST version of auto-install.el.
;; 2) Enable debugger. M-x toggle-debug-on-error or (setq debug-on-error t)
;; 3) Use Lisp version instead of compiled one: (load "auto-install.el")
;; 4) Do it!
;; 5) If you got an error, please do not close *Backtrace* buffer.
;; 6) M-x auto-install-send-bug-report and M-x insert-buffer *Backtrace*
;; 7) Describe the bug using a precise recipe.
;; 8) Type C-c C-c to send.
;; # If you are a Japanese, please write in Japanese:-)
;;; Change log:
;;
;; $Log: auto-install.el,v $
;; Revision 1.54 2012/01/15 12:10:20 rubikitch
;; Default value of `auto-install-use-wget' is whether wget exists or not.
;;
;; Revision 1.53 2011/04/12 06:28:20 rubikitch
;; fix for proxy
;;
;; Revision 1.52 2011/01/29 11:11:47 rubikitch
;; bugfix: auto-install-buffer-save cannot treat auto-install-directory properly if it doesn't end with `/'
;;
;; patched by MaskRay thanks!
;;
;; Revision 1.51 2010/12/10 10:30:58 rubikitch
;; Bugfix when wget is not installed
;;
;; replace auto-install-use-wget with (auto-install-use-wget-p)
;;
;; Revision 1.50 2010/11/29 15:52:57 rubikitch
;; compatibility code for emacs21.1
;;
;; Revision 1.49 2010/11/10 13:32:37 rubikitch
;; Use `wget -q -O- --no-check-certificate' if wget is available.
;; Change default value: `auto-install-use-wget' = t
;;
;; Revision 1.48 2010/05/20 23:29:10 rubikitch
;; `auto-install-update-emacswiki-package-name': Check whether network is reachable
;;
;; Revision 1.47 2010/05/14 00:09:08 rubikitch
;; Fixed a bug of `auto-install-batch' with argument.
;;
;; Pass extension-name argument to `auto-install-batch-real'.
;;
;; Revision 1.46 2010/05/04 08:46:21 rubikitch
;; Added bug report command
;;
;; Revision 1.45 2010/05/01 01:24:25 rubikitch
;; auto-install-batch: Dependency support
;;
;; Revision 1.44 2010/05/01 00:53:48 rubikitch
;; auto-install-batch-real: refactoring
;;
;; Revision 1.43 2010/04/30 23:41:48 rubikitch
;; Changed default value of `auto-install-use-wget' to nil.
;;
;; Revision 1.42 2010/04/25 02:30:27 rubikitch
;; Avoid `auto-async-byte-compile'
;;
;; Revision 1.41 2010/04/25 01:59:20 rubikitch
;; *** empty log message ***
;;
;; Revision 1.40 2010/04/25 01:58:17 rubikitch
;; Do not save/compile up-to-date files from `auto-install-batch'.
;;
;; Revision 1.39 2010/04/25 01:11:33 rubikitch
;; If downloaded file is not updated, kill download buffer.
;; (auto-install-batch support is not yet)
;;
;; Revision 1.38 2010/04/25 00:10:49 rubikitch
;; code cleanup: remove unneeded `format'
;;
;; Revision 1.37 2010/04/24 23:59:11 rubikitch
;; comment change (no code change)
;;
;; Revision 1.36 2010/04/19 07:10:36 rubikitch
;; Avoid updating time-stamp
;;
;; Revision 1.35 2010/04/07 20:16:10 rubikitch
;; Fixed a typo
;;
;; Revision 1.34 2010/04/05 21:34:07 rubikitch
;; `auto-install-from-gist' can accept gist URL.
;;
;; Revision 1.33 2010/04/05 21:27:30 rubikitch
;; `auto-install-use-wget' is enabled by default when wget command (`auto-install-wget-command') is found.
;;
;; Revision 1.32 2010/04/05 21:24:30 rubikitch
;; * `auto-install-batch' can install non-elisp files because some elisp requires external scripts.
;; * New option: `auto-install-add-exec-path-flag'
;;
;; Revision 1.31 2010/04/01 03:43:17 rubikitch
;; added RCS Id: tag
;;
;; Revision 1.30 2010/04/01 03:42:34 rubikitch
;; document typo
;;
;; Revision 1.29 2010/04/01 03:28:39 rubikitch
;; New command: `auto-install-batch-edit'
;;
;; Revision 1.28 2010/04/01 03:10:38 rubikitch
;; The real value of `auto-install-batch-list' is moved to
;; auto-install-batch-list.el to split program and data.
;;
;; Revision 1.27 2010/03/29 07:36:39 rubikitch
;; Stupid bug fix in auto-install-use-wget
;;
;; Revision 1.26 2010/03/29 02:38:46 rubikitch
;; New option: `auto-install-use-wget', `auto-install-wget-command'
;;
;; Revision 1.25 2010/03/26 00:07:27 rubikitch
;; `url-http-end-of-headers' workaround
;;
;; Revision 1.24 2010/01/05 09:40:04 rubikitch
;; fixed error of auto-complete development version in `auto-install-batch-list'
;;
;; Revision 1.23 2009/12/29 09:31:23 rubikitch
;; add Text Translator to auto-install-batch-list
;;
;; Revision 1.22 2009/12/21 12:51:56 rubikitch
;; Update auto-install-batch anything
;;
;; Revision 1.21 2009/12/21 12:26:54 rubikitch
;; New URL for auto-complete development version
;;
;; Revision 1.20 2009/05/22 20:17:24 rubikitch
;; Merged from dradams' change
;;
;; Revision 1.19 2009/05/22 13:04:56 dadams
;; Split icicles-cmd.el into icicles-cmd[12].el.
;;
;; Revision 1.18 2009/05/20 15:42:54 rubikitch
;; Add php-completion / perl-completion to auto-install-batch-list
;;
;; Revision 1.17 2009/05/20 01:19:15 rubikitch
;; Add document for proxy server
;;
;; Revision 1.16 2009/05/15 20:28:18 rubikitch
;; More readable temporary buffer name.
;;
;; Revision 1.15 2009/05/15 20:12:49 rubikitch
;; Added missing require
;;
;; Revision 1.14 2009/05/15 20:11:44 rubikitch
;; How to save
;;
;; Revision 1.13 2009/05/15 20:09:07 rubikitch
;; Code cleanup
;;
;; Revision 1.12 2009/05/15 19:59:30 rubikitch
;; Fixed a bug of single file installation
;;
;; Revision 1.11 2009/05/15 19:44:32 rubikitch
;; Ordering `auto-install-batch'
;;
;; Revision 1.10 2009/05/15 17:48:09 rubikitch
;; Replace `message' with `error' for error messages.
;;
;; Revision 1.9 2009/05/15 17:40:37 rubikitch
;; refactoring
;;
;; Revision 1.8 2009/05/15 17:19:47 rubikitch
;; refactoring
;;
;; Revision 1.7 2009/05/15 17:17:03 rubikitch
;; Use `view-mode' if `view-read-only'.
;;
;; Revision 1.6 2009/05/15 17:10:22 rubikitch
;; Adjust docstrings of commands to auto-document.
;; Delete `It provides the following commands:' section because of duplication.
;;
;; Revision 1.5 2009/05/15 17:03:13 rubikitch
;; Show downloaded URL in header-line.
;;
;; Revision 1.4 2009/05/15 16:59:32 rubikitch
;; New internal variable: `auto-install-add-load-path-flag'
;;
;; Revision 1.3 2009/05/09 02:41:32 rubikitch
;; Add `auto-install-directory' automatically.
;;
;; Revision 1.2 2009/05/09 02:37:14 rubikitch
;; Changed `auto-install-get-buffer' format (including URL)
;;
;; Revision 1.1 2009/05/09 02:33:09 rubikitch
;; Initial revision
;;
;; 2009/05/01
;; * Andy Stewart:
;; * Take over by rubikitch.
;;
;; 2009/04/15
;; * rubikitch:
;; * Encoding detection support.
;;
;; 2009/04/07
;; * Andy Stewart:
;; * Fix bug of `auto-install-batch'.
;; * Add more sources to `auto-install-batch-list'.
;;
;; 2009/03/30
;; * Andy Stewart:
;; * Add new command: `auto-install-batch'.
;; * Add new option: `auto-install-batch-list'.
;;
;; 2009/03/29
;; * Andy Stewart:
;; * Add new function: `auto-install-from-url-list'.
;;
;; 2009/03/11
;; * Andy Stewart:
;; * Fix bug of `auto-install-download'.
;;
;; 2009/03/03
;; * rubikitch
;; * Add new command `auto-install-compatibility-setup'
;; for install-elisp users.
;; * Andy Stewart:
;; * `auto-install-region-or-thing' return region string
;; just when `transient-mark-mode' is on.
;; * Fix doc.
;;
;; 2009/02/17
;; * Andy Stewart:
;; * Modified keybindings, make it more easy to remember.
;; * Make `auto-install-save-confirm' default with `t'
;; for security problem.
;; * Pick up current symbol when use `auto-install-from-library'.
;; * Remove unnecessary completion name from `auto-install-from-library'.
;; * Refactory code.
;; * Fix doc.
;;
;; 2009/02/12
;; * Andy Stewart:
;; * Remove option `auto-install-update-emacswiki-package-name-when-startup'.
;; * Make current symbol as initialization of `auto-install-from-emacswiki'.
;; * Add option `unforced' to function `auto-install-update-emacswiki-package-name'.
;; * Fix doc.
;; * Fix bug of `auto-install-from-library'.
;;
;; 2009/02/10
;; * Andy Stewart:
;; * Automatically download package name list when
;; variable `auto-install-package-name-list' is nil.
;; * Reverse `auto-install-package-name-list' for `anything' interface.
;; * New command `auto-install-dired-mark-files',
;; mark files that contain at `EmacsWiki.org'.
;; * New command `auto-install-buffer-diff',
;; view different between current version and old version.
;;
;; 2009/02/06
;; * Andy Stewart:
;; * Add new command `auto-install-from-directory'.
;; * Remove option `auto-install-create-directory', not necessary.
;; * Documentation improvements (thanks Scot Becker)
;;
;; 2009/02/01
;; * Andy Stewart:
;; * Make command `auto-install-from-emacswiki' can
;; completing package name for input.
;; * Add new command `auto-install-update-emacswiki-package-name'.
;; * Add new option `auto-install-update-emacswiki-package-name-when-startup'
;;
;; 2009/01/30
;; * Andy Stewart:
;; * Compatibility with GNU Emacs 22.
;;
;; 2009/01/26
;; * Andy Stewart:
;; * Add new command `auto-install-from-gist'.
;;
;; 2009/01/21
;; * Andy Stewart:
;; * Add emacs-lisp syntax highlight for download buffer.
;; * Make notify message display at mode-line instead echo-area.
;;
;; 2009/01/10
;; * Andy Stewart:
;; * Add new option `auto-install-filter-url' and new function
;; `auto-install-from-library', try to use it. ;)
;;
;; 2009/01/08
;; * Andy Stewart:
;; * Fix coding bug.
;;
;; 2009/01/07
;; * Andy Stewart:
;; * Move `w3m' code to file `auto-install-extension.el' to make all
;; user can use this package with standard emacs.
;;
;; 2009/01/06
;; * Andy Stewart:
;; * Clean code.
;;
;; 2009/01/02
;; * Andy Stewart:
;; * Add new option `auto-install-create-directory' for create install directory
;; automatically if it doesn't exist.
;; * Improve many document make it more clear.
;; * Thanks document improve and create directory advice of 'Drew Adams'!
;;
;; 2008/12/24
;; * Andy Stewart:
;; * Remove `auto-install-window-configuration-before-download', `auto-install-init-window-layout'
;; and `auto-install-revert-window-layout'.
;; It's not necessary to revert window layout, `winner-mode' can revert window layout more better,
;; just type `winner-undo'.
;;
;; 2008/12/15
;; * Andy Stewart:
;; * Fix a little bug of `auto-install-window-configuration-before-download'.
;;
;; 2008/12/11
;; * Andy Stewart:
;; * Add new function `auto-install-from-buffer', to install elisp file from current buffer.
;; Modified `auto-install-buffer-save' to use `auto-install-from-buffer'.
;;
;; * First released.
;;
;;; Acknowledgements:
;;
;; rubikitch <[email protected]>
;; For install-elisp.el
;; Drew Adams <[email protected]>
;; Scot Becker <[email protected]>
;; Richard Riley <[email protected]>
;; For documentation improvements and advices.
;;
;;; TODO
;;
;; Fix the problem parallel install process with recursive prompt.
;; Redesign and give more friendly user interface.
;; Scan RSS track package update and notify.
;;
;;; Require
(require 'url)
(require 'dired)
(require 'find-func)
(require 'bytecomp)
(require 'thingatpt)
(require 'ffap)
(eval-when-compile (require 'cl))
(when (<= emacs-major-version 22) ;Compatibility with 22.
(autoload 'ignore-errors "cl-macs")
(unless (fboundp 'url-file-nondirectory)
(defun url-file-nondirectory (file)
"Return the nondirectory part of FILE, for a URL."
(cond
((null file) "")
((string-match (eval-when-compile (regexp-quote "?")) file)
(file-name-nondirectory (substring file 0 (match-beginning 0))))
(t (file-name-nondirectory file))))))
;;; Code:
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Customize ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(defgroup auto-install nil
"Auto install elisp files."
:group 'external)
(defcustom auto-install-directory "~/.emacs.d/auto-install/"
"The directory for saving elisp files.
This directory is used when a downloaded
elisp file does not already exist in other directory.
Otherwise, the existing file of the same name is replaced."
:type 'string
:group 'auto-install)
(defcustom auto-install-buffer-name "auto-install"
"The temporary buffer for storing download content."
:type 'string
:group 'auto-install)
(defcustom auto-install-emacswiki-base-url "http://www.emacswiki.org/cgi-bin/wiki/download/"
"The base emacswiki.org url from which to download elisp files."
:type 'string
:group 'auto-install)
(defcustom auto-install-gist-base-url "http://gist.github.com/"
"The base gist.github.com url from which to download elisp files."
:type 'string
:group 'auto-install)
(defcustom auto-install-filter-url
'(("color-grep" "http://www.bookshelf.jp/elc/"))
"Alist mapping filter url for library.
Default command `auto-install-from-library' will install from EmacsWiki,
if it can't find match in this alist."
:type '(repeat (list (string :tag "Library")
(string :tag "Download URL")))
:group 'auto-install)
(defcustom auto-install-save-confirm t
"Whether confirmation is needed to save downloaded content.
Nil means no confirmation is needed.
If non-nil, the downloaded content is shown in a buffer and you are
prompted to confirm saving it to a file."
:type 'boolean
:group 'auto-install)
(defcustom auto-install-replace-confirm nil
"Whether confirmation is needed to replace an existing elisp file.
Nil means no confirmation is needed."
:type 'boolean
:group 'auto-install)
(defcustom auto-install-install-confirm nil
"Whether confirmation is needed to install a downloaded elisp file.
Nil means no confirmation is needed."
:type 'boolean
:group 'auto-install)
(defcustom auto-install-from-dired-confirm t
"Whether confirmation is needed to download marked files from Dired.
Nil means no confirmation is needed."
:type 'boolean
:group 'auto-install)
(defcustom auto-install-wget-command "wget"
"*Wget command. Use only if `auto-install-use-wget' is non-nil."
:type 'string
:group 'auto-install)
(defcustom auto-install-use-wget (executable-find "wget")
"*Use wget instead of `url-retrieve'.
It is enabled by default when wget is found."
:type 'boolean
:group 'auto-install)
(defcustom auto-install-batch-list
nil
"This list contain packages information for batch install.
Have four arguments per list:
First argument is extension name.
Second argument is delay time for batch install.
Third argument is libraries number limit in delay time.
Fourth argument is list of libraries url or extension name.
If you want to add files, please edit auto-install-batch-list.el in EmacsWiki.
Use M-x `auto-install-batch-edit'. "
:group 'auto-install)
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Variable ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(defvar auto-install-batch-list-internal nil
"The real value of `auto-install-batch-list'. ")
(defvar auto-install-batch-list-el-url
"http://www.rubyist.net/~rubikitch/archive/auto-install-batch-list.el"
"The url of auto-install-batch-list.el.
It is downloaded and evaluated just after M-x `auto-install-batch'. ")
(defvar auto-install-download-buffer nil
"The download buffer used by `url-retrieve'.
This variable is always buffer-local.")
(make-variable-buffer-local 'auto-install-download-buffer)
(defvar auto-install-download-url nil
"The url from which to download files.
This variable is always buffer-local.")
(make-variable-buffer-local 'auto-install-download-url)
(defvar auto-install-last-url nil
"The last url used in `auto-install-from-url'.")
(defvar auto-install-last-gist-id nil
"The last gist id you visit in `auto-install-from-gist'.")
(defvar auto-install-package-name-list nil
"The package name list for completion input.")
(defvar auto-install-minor-mode-map
(let ((map (make-sparse-keymap)))
(define-key map (kbd "C-c C-d") 'auto-install-buffer-diff) ;diff
(define-key map (kbd "C-c C-c") 'auto-install-buffer-save) ;save
(define-key map (kbd "C-c C-q") 'auto-install-buffer-quit) ;quit
map)
"Keymap used by variable `auto-install-minor-mode'.")
(defvar auto-install-add-load-path-flag t
"If non-nil, add `auto-install-directory' to `load-path'.
This variable is intended to be used in test.")
(defvar auto-install-add-exec-path-flag t
"If non-nil, add `auto-install-directory' to `exec-path'.
This variable is intended to be used in test.
It is needed because `auto-install-batch' can install non-elisp files.")
(defvar auto-install-waiting-url-list nil
"URLs in downloading.")
(defvar auto-install-url-queue nil
"Installation order.")
(defvar auto-install-download-buffer-alist nil
"Pairs of URL and downloaded buffer.")
(defvar auto-install-batch-using nil)
(define-minor-mode auto-install-minor-mode
"Auto Install minor mode."
:init-value nil
:lighter " Auto-Install"
:keymap auto-install-minor-mode-map
:group 'auto-install)
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Interactive Functions ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(defun auto-install-from-buffer ()
"Install the elisp file in the current buffer."
(interactive)
(let (filename)
(setq filename (read-string (format "Filename (%s): " (buffer-name)) nil nil (buffer-name)))
(auto-install-mode)
(auto-install-buffer-save filename)))
(defun auto-install-from-url (&optional url)
"Install an elisp file from a given url."
(interactive)
(or url (setq url (read-string (format "URL (%s): " (or auto-install-last-url "")) nil nil auto-install-last-url)))
(setq auto-install-last-url url)
(auto-install-download url))
(defun auto-install-from-emacswiki (&optional file)
"Install an elisp file from EmacsWiki.org."
(interactive)
(cond (auto-install-package-name-list
;; Install package if `auto-install-package-name-list' is non-nil.
(or file (setq file (auto-install-get-candidate "Package" auto-install-package-name-list)))
(auto-install-download (concat auto-install-emacswiki-base-url file)))
(t
;; Otherwise update package name and install.
(auto-install-download "http://www.emacswiki.org/cgi-bin/emacs?action=index;raw=1"
'auto-install-handle-emacswiki-package-install))))
(defun auto-install-from-gist (&optional gistid-or-url)
"Install an elisp file from gist.github.com.
Optional argument GISTID-OR-URL is gist ID or URL for download
elisp file from gist.github.com."
(interactive)
(or gistid-or-url
(setq gistid-or-url (read-string (format "Gist ID or URL (%s): " (or auto-install-last-gist-id ""))
nil nil
auto-install-last-gist-id)))
(let ((gistid (file-name-sans-extension (file-name-nondirectory gistid-or-url))))
(setq auto-install-last-gist-id gistid)
(auto-install-download (format "%s%s.txt" auto-install-gist-base-url gistid))))
(defun auto-install-from-library (&optional library)
"Update an elisp LIBRARY.
Default this function will found 'download url' from `auto-install-filter-url',
if not found, try to download from EmacsWiki."
(interactive
(let* ((dirs load-path)
(suffixes (find-library-suffixes)))
(list (auto-install-get-candidate "Library name" (auto-install-get-library-list)))))
(let ((filename (file-name-nondirectory (find-library-name library)))
(base-url auto-install-emacswiki-base-url)
(library-name (replace-regexp-in-string "\\(\\.el.*$\\)" "" library)))
(if (assoc library-name auto-install-filter-url)
(setq base-url (cadr (assoc library-name auto-install-filter-url))))
(auto-install-download (concat base-url filename))))
(defun auto-install-from-directory (directory)
"Update elisp files under DIRECTORY from EmacsWiki.
You can use this command to update elisp file under DIRECTORY."
(interactive "DDirectory: ")
(let (filename)
(dolist (file (directory-files directory t))
(if (file-directory-p file)
;; Don't match . or .. directory.
(unless (string-match "^\\.\\.?$" (file-name-nondirectory file))
;; Find files in sub-directory.
(auto-install-from-directory file))
;; Get file name.
(setq filename (file-name-nondirectory file))
;; Not backup file.
(unless (string-match "^\\.?#" filename)
;; Match elisp file.
(if (string-match "^.*\\.el" filename)
(auto-install-download (concat auto-install-emacswiki-base-url filename))))))))
(defun auto-install-from-dired ()
"Update dired marked elisp files from EmacsWiki.org.
You can use this to download marked files in Dired asynchronously."
(interactive)
(if (eq major-mode 'dired-mode)
(if (or (not auto-install-from-dired-confirm)
(yes-or-no-p "Do you want install marked files from EmacsWiki.org?"))
(dolist (file (dired-get-marked-files))
(auto-install-download (concat auto-install-emacswiki-base-url (file-name-nondirectory file)))))
(error "This command is only for `dired-mode'.")))
(defun auto-install-network-available-p (host)
(if auto-install-use-wget
(eq (call-process auto-install-wget-command nil nil nil "-q" "--spider" host) 0)
(with-current-buffer (url-retrieve-synchronously (concat "http://" host))
(prog1 (not (zerop (buffer-size)))
(kill-buffer (current-buffer))))))
;; (auto-install-network-available-p "www.emacswiki.org")
(defun auto-install-update-emacswiki-package-name (&optional unforced)
"Update the list of elisp package names from `EmacsWiki'.
By default, this function will update package name forcibly.
If UNFORCED is non-nil, just update package name when `auto-install-package-name-list' is nil."
(interactive)
(unless (and unforced
auto-install-package-name-list)
(if (auto-install-network-available-p "www.emacswiki.org")
(auto-install-download "http://www.emacswiki.org/cgi-bin/emacs?action=index;raw=1"
'auto-install-handle-emacswiki-package-name)
(message
(concat "Network unreachable!\n"
"Try M-x auto-install-handle-emacswiki-package-name afterward."))
(sit-for 2))))
(defun auto-install-dired-mark-files ()
"Mark dired files that contain at `EmacsWiki.org'."
(interactive)
(if (eq major-mode 'dired-mode)
(if auto-install-package-name-list
;; Mark files that exist at `EmacsWiki'.
(auto-install-dired-mark-files-internal)
;; Or get package name list and match files.
(auto-install-download "http://www.emacswiki.org/cgi-bin/emacs?action=index;raw=1"
'auto-install-handle-dired-mark-files))
(error "This command just use in `dired-mode'.")))
(defun auto-install-mode ()
"Major mode for auto-installing elisp code."
(interactive)
;; Load emacs-lisp syntax highlight.
(set-syntax-table emacs-lisp-mode-syntax-table)
(lisp-mode-variables)
(setq font-lock-mode t)
(font-lock-fontify-buffer)
;; Read only.
(setq buffer-read-only t)
(and view-read-only (view-mode 1))
;; Load `auto-install' mode.
(auto-install-minor-mode t)
(setq major-mode 'auto-install-minor-mode))
(defun auto-install-buffer-quit ()
"Quit from `auto-install' temporary buffer."
(interactive)
;; Quit buffer.
(if (eq major-mode 'auto-install-minor-mode)
(auto-install-quit)
(error "This command just use in `auto-install-minor-mode'.")))
(defun auto-install-compatibility-setup ()
"Install Compatibility commands for install-elisp.el users."
(interactive)
(defalias 'install-elisp 'auto-install-from-url)
(if (require 'anything-auto-install nil t)
(defalias 'install-elisp-from-emacswiki 'anything-auto-install-from-emacswiki)
(defalias 'install-elisp-from-emacswiki 'auto-install-from-emacswiki))
(defalias 'install-elisp-from-gist 'auto-install-from-gist)
(message "Install-elisp compatibility installed.
install-elisp = %s
install-elisp-from-emacswiki = %s
install-elisp-from-gist = %s"
(symbol-function 'install-elisp)
(symbol-function 'install-elisp-from-emacswiki)
(symbol-function 'install-elisp-from-gist)))
(defun auto-install-batch (&optional extension-name)
"Batch install many files (libraries and non-elisp files) in some extension.
EXTENSION-NAME is extension name for batch install.
Note that non-elisp can be installed only via `auto-install-batch'"
(interactive)
(if (and auto-install-batch-list-internal extension-name)
(auto-install-batch-real extension-name)
(auto-install-download
auto-install-batch-list-el-url
(lexical-let ((extension-name extension-name))
(lambda (buf)
(with-current-buffer buf
(eval-buffer)
(run-at-time 0 nil 'auto-install-batch-real extension-name)))))))
(defun auto-install-batch-edit ()
"Edit auto-install-batch-list.el"
(interactive)
(cond ((fboundp 'yaoddmuse-edit)
(yaoddmuse-edit "EmacsWiki" "auto-install-batch-list.el"))
((fboundp 'oddmuse-edit)
(oddmuse-edit "EmacsWiki" "auto-install-batch-list.el"))
(t
(browse-url "http://www.emacswiki.org/emacs/?action=edit;id=auto-install-batch-list.el"))))
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Utilities Functions ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
(defun auto-install-batch-real (&optional extension-name)
(setq auto-install-batch-using t)
(when auto-install-add-exec-path-flag
(add-to-list 'exec-path auto-install-directory))
(destructuring-bind (name delay-time limit-number (&rest urls))
(auto-install-batch-get-info
(or
;; Get information list from give extension name.
extension-name
;; Otherwise completion from user select.
(completing-read "Extension name: " (mapcar 'car auto-install-batch-list-internal)))
auto-install-batch-list-internal)
(or name (error "Haven't install information for `%s'." extension-name))
(setq auto-install-waiting-url-list urls
auto-install-url-queue urls)
(if (not (and
;; Delay time is above 0.
delay-time
(> delay-time 0)
;; Limit number is above 0.