comparison lisp/arc-mode.el @ 61414:9918f801db35

(archive-mode-map): Move initialization into the declaration. Override *all* bindings of `undo'. (archive-lemacs): Remove, use (featurep 'xemacs) instead.
author Stefan Monnier <monnier@iro.umontreal.ca>
date Sat, 09 Apr 2005 19:18:17 +0000
parents 9e01303c94ac
children ec0621e2b94f 146c086df160
comparison
equal deleted inserted replaced
61413:3e3591a70d6f 61414:9918f801db35
1 ;;; arc-mode.el --- simple editing of archives 1 ;;; arc-mode.el --- simple editing of archives
2 2
3 ;; Copyright (C) 1995, 1997, 1998, 2003 Free Software Foundation, Inc. 3 ;; Copyright (C) 1995, 1997, 1998, 2003, 2005 Free Software Foundation, Inc.
4 4
5 ;; Author: Morten Welinder <terra@gnu.org> 5 ;; Author: Morten Welinder <terra@gnu.org>
6 ;; Keywords: archives msdog editing major-mode 6 ;; Keywords: archives msdog editing major-mode
7 ;; Favourite-brand-of-beer: None, I hate beer. 7 ;; Favourite-brand-of-beer: None, I hate beer.
8 8
328 (defvar archive-file-list-start nil "Position of first contents line.") 328 (defvar archive-file-list-start nil "Position of first contents line.")
329 (defvar archive-file-list-end nil "Position just after last contents line.") 329 (defvar archive-file-list-end nil "Position just after last contents line.")
330 (defvar archive-proper-file-start nil "Position of real archive's start.") 330 (defvar archive-proper-file-start nil "Position of real archive's start.")
331 (defvar archive-read-only nil "Non-nil if the archive is read-only on disk.") 331 (defvar archive-read-only nil "Non-nil if the archive is read-only on disk.")
332 (defvar archive-local-name nil "Name of local copy of remote archive.") 332 (defvar archive-local-name nil "Name of local copy of remote archive.")
333 (defvar archive-mode-map nil "Local keymap for archive mode listings.") 333 (defvar archive-mode-map
334 (let ((map (make-keymap)))
335 (suppress-keymap map)
336 (define-key map " " 'archive-next-line)
337 (define-key map "a" 'archive-alternate-display)
338 ;;(define-key map "c" 'archive-copy)
339 (define-key map "d" 'archive-flag-deleted)
340 (define-key map "\C-d" 'archive-flag-deleted)
341 (define-key map "e" 'archive-extract)
342 (define-key map "f" 'archive-extract)
343 (define-key map "\C-m" 'archive-extract)
344 (define-key map "g" 'revert-buffer)
345 (define-key map "h" 'describe-mode)
346 (define-key map "m" 'archive-mark)
347 (define-key map "n" 'archive-next-line)
348 (define-key map "\C-n" 'archive-next-line)
349 (define-key map [down] 'archive-next-line)
350 (define-key map "o" 'archive-extract-other-window)
351 (define-key map "p" 'archive-previous-line)
352 (define-key map "q" 'quit-window)
353 (define-key map "\C-p" 'archive-previous-line)
354 (define-key map [up] 'archive-previous-line)
355 (define-key map "r" 'archive-rename-entry)
356 (define-key map "u" 'archive-unflag)
357 (define-key map "\M-\C-?" 'archive-unmark-all-files)
358 (define-key map "v" 'archive-view)
359 (define-key map "x" 'archive-expunge)
360 (define-key map "\177" 'archive-unflag-backwards)
361 (define-key map "E" 'archive-extract-other-window)
362 (define-key map "M" 'archive-chmod-entry)
363 (define-key map "G" 'archive-chgrp-entry)
364 (define-key map "O" 'archive-chown-entry)
365
366 (if (fboundp 'command-remapping)
367 (progn
368 (define-key map [remap advertised-undo] 'archive-undo)
369 (define-key map [remap undo] 'archive-undo))
370 (substitute-key-definition 'advertised-undo 'archive-undo map global-map)
371 (substitute-key-definition 'undo 'archive-undo map global-map))
372
373 (define-key map
374 (if (featurep 'xemacs) 'button2 [mouse-2]) 'archive-mouse-extract)
375
376 (if (featurep 'xemacs)
377 () ; out of luck
378
379 (define-key map [menu-bar immediate]
380 (cons "Immediate" (make-sparse-keymap "Immediate")))
381 (define-key map [menu-bar immediate alternate]
382 '(menu-item "Alternate Display" archive-alternate-display
383 :enable (boundp (archive-name "alternate-display"))
384 :help "Toggle alternate file info display"))
385 (define-key map [menu-bar immediate view]
386 '(menu-item "View This File" archive-view
387 :help "Display file at cursor in View Mode"))
388 (define-key map [menu-bar immediate display]
389 '(menu-item "Display in Other Window" archive-display-other-window
390 :help "Display file at cursor in another window"))
391 (define-key map [menu-bar immediate find-file-other-window]
392 '(menu-item "Find in Other Window" archive-extract-other-window
393 :help "Edit file at cursor in another window"))
394 (define-key map [menu-bar immediate find-file]
395 '(menu-item "Find This File" archive-extract
396 :help "Extract file at cursor and edit it"))
397
398 (define-key map [menu-bar mark]
399 (cons "Mark" (make-sparse-keymap "Mark")))
400 (define-key map [menu-bar mark unmark-all]
401 '(menu-item "Unmark All" archive-unmark-all-files
402 :help "Unmark all marked files"))
403 (define-key map [menu-bar mark deletion]
404 '(menu-item "Flag" archive-flag-deleted
405 :help "Flag file at cursor for deletion"))
406 (define-key map [menu-bar mark unmark]
407 '(menu-item "Unflag" archive-unflag
408 :help "Unmark file at cursor"))
409 (define-key map [menu-bar mark mark]
410 '(menu-item "Mark" archive-mark
411 :help "Mark file at cursor"))
412
413 (define-key map [menu-bar operate]
414 (cons "Operate" (make-sparse-keymap "Operate")))
415 (define-key map [menu-bar operate chown]
416 '(menu-item "Change Owner..." archive-chown-entry
417 :enable (fboundp (archive-name "chown-entry"))
418 :help "Change owner of marked files"))
419 (define-key map [menu-bar operate chgrp]
420 '(menu-item "Change Group..." archive-chgrp-entry
421 :enable (fboundp (archive-name "chgrp-entry"))
422 :help "Change group ownership of marked files"))
423 (define-key map [menu-bar operate chmod]
424 '(menu-item "Change Mode..." archive-chmod-entry
425 :enable (fboundp (archive-name "chmod-entry"))
426 :help "Change mode (permissions) of marked files"))
427 (define-key map [menu-bar operate rename]
428 '(menu-item "Rename to..." archive-rename-entry
429 :enable (fboundp (archive-name "rename-entry"))
430 :help "Rename marked files"))
431 ;;(define-key map [menu-bar operate copy]
432 ;; '(menu-item "Copy to..." archive-copy))
433 (define-key map [menu-bar operate expunge]
434 '(menu-item "Expunge Marked Files" archive-expunge
435 :help "Delete all flagged files from archive"))
436 map))
437 "Local keymap for archive mode listings.")
334 (defvar archive-file-name-indent nil "Column where file names start.") 438 (defvar archive-file-name-indent nil "Column where file names start.")
335 439
336 (defvar archive-remote nil "Non-nil if the archive is outside file system.") 440 (defvar archive-remote nil "Non-nil if the archive is outside file system.")
337 (make-variable-buffer-local 'archive-remote) 441 (make-variable-buffer-local 'archive-remote)
338 (put 'archive-remote 'permanent-local t) 442 (put 'archive-remote 'permanent-local t)
356 "Vector of file descriptors. 460 "Vector of file descriptors.
357 Each descriptor is a vector of the form 461 Each descriptor is a vector of the form
358 [EXT-FILE-NAME INT-FILE-NAME CASE-FIDDLED MODE ...]") 462 [EXT-FILE-NAME INT-FILE-NAME CASE-FIDDLED MODE ...]")
359 (make-variable-buffer-local 'archive-files) 463 (make-variable-buffer-local 'archive-files)
360 464
361 (defvar archive-lemacs
362 (string-match "\\(Lucid\\|Xemacs\\)" emacs-version)
363 "*Non-nil when running under under Lucid Emacs or Xemacs.")
364 ;; ------------------------------------------------------------------------- 465 ;; -------------------------------------------------------------------------
365 ;; Section: Support functions. 466 ;; Section: Support functions.
366 467
367 (defsubst archive-name (suffix) 468 (defsubst archive-name (suffix)
368 (intern (concat "archive-" (symbol-name archive-subtype) "-" suffix))) 469 (intern (concat "archive-" (symbol-name archive-subtype) "-" suffix)))
584 ;; Archive mode is suitable only for specially formatted data. 685 ;; Archive mode is suitable only for specially formatted data.
585 (put 'archive-mode 'mode-class 'special) 686 (put 'archive-mode 'mode-class 'special)
586 ;; ------------------------------------------------------------------------- 687 ;; -------------------------------------------------------------------------
587 ;; Section: Key maps 688 ;; Section: Key maps
588 689
589 (if archive-mode-map nil 690 (let ((item1 '(archive-subfile-mode " Archive")))
590 (setq archive-mode-map (make-keymap))
591 (suppress-keymap archive-mode-map)
592 (define-key archive-mode-map " " 'archive-next-line)
593 (define-key archive-mode-map "a" 'archive-alternate-display)
594 ;;(define-key archive-mode-map "c" 'archive-copy)
595 (define-key archive-mode-map "d" 'archive-flag-deleted)
596 (define-key archive-mode-map "\C-d" 'archive-flag-deleted)
597 (define-key archive-mode-map "e" 'archive-extract)
598 (define-key archive-mode-map "f" 'archive-extract)
599 (define-key archive-mode-map "\C-m" 'archive-extract)
600 (define-key archive-mode-map "g" 'revert-buffer)
601 (define-key archive-mode-map "h" 'describe-mode)
602 (define-key archive-mode-map "m" 'archive-mark)
603 (define-key archive-mode-map "n" 'archive-next-line)
604 (define-key archive-mode-map "\C-n" 'archive-next-line)
605 (define-key archive-mode-map [down] 'archive-next-line)
606 (define-key archive-mode-map "o" 'archive-extract-other-window)
607 (define-key archive-mode-map "p" 'archive-previous-line)
608 (define-key archive-mode-map "q" 'quit-window)
609 (define-key archive-mode-map "\C-p" 'archive-previous-line)
610 (define-key archive-mode-map [up] 'archive-previous-line)
611 (define-key archive-mode-map "r" 'archive-rename-entry)
612 (define-key archive-mode-map "u" 'archive-unflag)
613 (define-key archive-mode-map "\M-\C-?" 'archive-unmark-all-files)
614 (define-key archive-mode-map "v" 'archive-view)
615 (define-key archive-mode-map "x" 'archive-expunge)
616 (define-key archive-mode-map "\177" 'archive-unflag-backwards)
617 (define-key archive-mode-map "E" 'archive-extract-other-window)
618 (define-key archive-mode-map "M" 'archive-chmod-entry)
619 (define-key archive-mode-map "G" 'archive-chgrp-entry)
620 (define-key archive-mode-map "O" 'archive-chown-entry)
621
622 (if archive-lemacs
623 (progn
624 ;; Not a nice "solution" but it'll have to do
625 (define-key archive-mode-map "\C-xu" 'archive-undo)
626 (define-key archive-mode-map "\C-_" 'archive-undo))
627 (define-key archive-mode-map [remap advertised-undo] 'archive-undo)
628 (define-key archive-mode-map [remap undo] 'archive-undo))
629
630 (define-key archive-mode-map
631 (if archive-lemacs 'button2 [mouse-2]) 'archive-mouse-extract)
632
633 (if archive-lemacs
634 () ; out of luck
635
636 (define-key archive-mode-map [menu-bar immediate]
637 (cons "Immediate" (make-sparse-keymap "Immediate")))
638 (define-key archive-mode-map [menu-bar immediate alternate]
639 '(menu-item "Alternate Display" archive-alternate-display
640 :enable (boundp (archive-name "alternate-display"))
641 :help "Toggle alternate file info display"))
642 (define-key archive-mode-map [menu-bar immediate view]
643 '(menu-item "View This File" archive-view
644 :help "Display file at cursor in View Mode"))
645 (define-key archive-mode-map [menu-bar immediate display]
646 '(menu-item "Display in Other Window" archive-display-other-window
647 :help "Display file at cursor in another window"))
648 (define-key archive-mode-map [menu-bar immediate find-file-other-window]
649 '(menu-item "Find in Other Window" archive-extract-other-window
650 :help "Edit file at cursor in another window"))
651 (define-key archive-mode-map [menu-bar immediate find-file]
652 '(menu-item "Find This File" archive-extract
653 :help "Extract file at cursor and edit it"))
654
655 (define-key archive-mode-map [menu-bar mark]
656 (cons "Mark" (make-sparse-keymap "Mark")))
657 (define-key archive-mode-map [menu-bar mark unmark-all]
658 '(menu-item "Unmark All" archive-unmark-all-files
659 :help "Unmark all marked files"))
660 (define-key archive-mode-map [menu-bar mark deletion]
661 '(menu-item "Flag" archive-flag-deleted
662 :help "Flag file at cursor for deletion"))
663 (define-key archive-mode-map [menu-bar mark unmark]
664 '(menu-item "Unflag" archive-unflag
665 :help "Unmark file at cursor"))
666 (define-key archive-mode-map [menu-bar mark mark]
667 '(menu-item "Mark" archive-mark
668 :help "Mark file at cursor"))
669
670 (define-key archive-mode-map [menu-bar operate]
671 (cons "Operate" (make-sparse-keymap "Operate")))
672 (define-key archive-mode-map [menu-bar operate chown]
673 '(menu-item "Change Owner..." archive-chown-entry
674 :enable (fboundp (archive-name "chown-entry"))
675 :help "Change owner of marked files"))
676 (define-key archive-mode-map [menu-bar operate chgrp]
677 '(menu-item "Change Group..." archive-chgrp-entry
678 :enable (fboundp (archive-name "chgrp-entry"))
679 :help "Change group ownership of marked files"))
680 (define-key archive-mode-map [menu-bar operate chmod]
681 '(menu-item "Change Mode..." archive-chmod-entry
682 :enable (fboundp (archive-name "chmod-entry"))
683 :help "Change mode (permissions) of marked files"))
684 (define-key archive-mode-map [menu-bar operate rename]
685 '(menu-item "Rename to..." archive-rename-entry
686 :enable (fboundp (archive-name "rename-entry"))
687 :help "Rename marked files"))
688 ;;(define-key archive-mode-map [menu-bar operate copy]
689 ;; '(menu-item "Copy to..." archive-copy))
690 (define-key archive-mode-map [menu-bar operate expunge]
691 '(menu-item "Expunge Marked Files" archive-expunge
692 :help "Delete all flagged files from archive"))
693 ))
694
695 (let* ((item1 '(archive-subfile-mode " Archive"))
696 (items (list item1)))
697 (or (member item1 minor-mode-alist) 691 (or (member item1 minor-mode-alist)
698 (setq minor-mode-alist (append items minor-mode-alist)))) 692 (setq minor-mode-alist (cons item1 minor-mode-alist))))
699 ;; ------------------------------------------------------------------------- 693 ;; -------------------------------------------------------------------------
700 (defun archive-find-type () 694 (defun archive-find-type ()
701 (widen) 695 (widen)
702 (goto-char (point-min)) 696 (goto-char (point-min))
703 ;; The funny [] here make it unlikely that the .elc file will be treated 697 ;; The funny [] here make it unlikely that the .elc file will be treated
760 (function 754 (function
761 (lambda (fil) 755 (lambda (fil)
762 ;; Using `concat' here copies the text also, so we can add 756 ;; Using `concat' here copies the text also, so we can add
763 ;; properties without problems. 757 ;; properties without problems.
764 (let ((text (concat (aref fil 0) "\n"))) 758 (let ((text (concat (aref fil 0) "\n")))
765 (if archive-lemacs 759 (if (featurep 'xemacs)
766 () ; out of luck 760 () ; out of luck
767 (add-text-properties 761 (add-text-properties
768 (aref fil 1) (aref fil 2) 762 (aref fil 1) (aref fil 2)
769 '(mouse-face highlight 763 '(mouse-face highlight
770 help-echo "mouse-2: extract this file into a buffer") 764 help-echo "mouse-2: extract this file into a buffer")
1807 ;; rms 15 Oct 98 1801 ;; rms 15 Oct 98
1808 (provide 'archive-mode) 1802 (provide 'archive-mode)
1809 1803
1810 (provide 'arc-mode) 1804 (provide 'arc-mode)
1811 1805
1812 ;;; arch-tag: e5966a01-35ec-4f27-8095-a043a79b457b 1806 ;; arch-tag: e5966a01-35ec-4f27-8095-a043a79b457b
1813 ;;; arc-mode.el ends here 1807 ;;; arc-mode.el ends here