Mercurial > emacs
comparison lisp/simple.el @ 14627:670173a3653b
(shell-command): Call file name handler.
author | Karl Heuer <kwzh@gnu.org> |
---|---|
date | Wed, 21 Feb 1996 21:25:30 +0000 |
parents | ec4424facc98 |
children | 2630ac774647 |
comparison
equal
deleted
inserted
replaced
14626:e555a2d12121 | 14627:670173a3653b |
---|---|
770 insert output in current buffer. (This cannot be done asynchronously.) | 770 insert output in current buffer. (This cannot be done asynchronously.) |
771 In either case, the output is inserted after point (leaving mark after it)." | 771 In either case, the output is inserted after point (leaving mark after it)." |
772 (interactive (list (read-from-minibuffer "Shell command: " | 772 (interactive (list (read-from-minibuffer "Shell command: " |
773 nil nil nil 'shell-command-history) | 773 nil nil nil 'shell-command-history) |
774 current-prefix-arg)) | 774 current-prefix-arg)) |
775 (if (and output-buffer | 775 ;; Look for a handler in case default-directory is a remote file name. |
776 (not (or (bufferp output-buffer) (stringp output-buffer)))) | 776 (let ((handler |
777 (progn (barf-if-buffer-read-only) | 777 (find-file-name-handler (directory-file-name default-directory) |
778 (push-mark) | 778 'shell-command))) |
779 ;; We do not use -f for csh; we will not support broken use of | 779 (if handler |
780 ;; .cshrcs. Even the BSD csh manual says to use | 780 (funcall handler 'shell-command command output-buffer) |
781 ;; "if ($?prompt) exit" before things which are not useful | 781 (if (and output-buffer |
782 ;; non-interactively. Besides, if someone wants their other | 782 (not (or (bufferp output-buffer) (stringp output-buffer)))) |
783 ;; aliases for shell commands then they can still have them. | 783 (progn (barf-if-buffer-read-only) |
784 (call-process shell-file-name nil t nil | 784 (push-mark) |
785 shell-command-switch command) | 785 ;; We do not use -f for csh; we will not support broken use of |
786 ;; This is like exchange-point-and-mark, but doesn't | 786 ;; .cshrcs. Even the BSD csh manual says to use |
787 ;; activate the mark. It is cleaner to avoid activation, | 787 ;; "if ($?prompt) exit" before things which are not useful |
788 ;; even though the command loop would deactivate the mark | 788 ;; non-interactively. Besides, if someone wants their other |
789 ;; because we inserted text. | 789 ;; aliases for shell commands then they can still have them. |
790 (goto-char (prog1 (mark t) | 790 (call-process shell-file-name nil t nil |
791 (set-marker (mark-marker) (point) | 791 shell-command-switch command) |
792 (current-buffer))))) | 792 ;; This is like exchange-point-and-mark, but doesn't |
793 ;; Preserve the match data in case called from a program. | 793 ;; activate the mark. It is cleaner to avoid activation, |
794 (save-match-data | 794 ;; even though the command loop would deactivate the mark |
795 (if (string-match "[ \t]*&[ \t]*$" command) | 795 ;; because we inserted text. |
796 ;; Command ending with ampersand means asynchronous. | 796 (goto-char (prog1 (mark t) |
797 (let ((buffer (get-buffer-create | 797 (set-marker (mark-marker) (point) |
798 (or output-buffer "*Async Shell Command*"))) | 798 (current-buffer))))) |
799 (directory default-directory) | 799 ;; Preserve the match data in case called from a program. |
800 proc) | 800 (save-match-data |
801 ;; Remove the ampersand. | 801 (if (string-match "[ \t]*&[ \t]*$" command) |
802 (setq command (substring command 0 (match-beginning 0))) | 802 ;; Command ending with ampersand means asynchronous. |
803 ;; If will kill a process, query first. | 803 (let ((buffer (get-buffer-create |
804 (setq proc (get-buffer-process buffer)) | 804 (or output-buffer "*Async Shell Command*"))) |
805 (if proc | 805 (directory default-directory) |
806 (if (yes-or-no-p "A command is running. Kill it? ") | 806 proc) |
807 (kill-process proc) | 807 ;; Remove the ampersand. |
808 (error "Shell command in progress"))) | 808 (setq command (substring command 0 (match-beginning 0))) |
809 (save-excursion | 809 ;; If will kill a process, query first. |
810 (set-buffer buffer) | 810 (setq proc (get-buffer-process buffer)) |
811 (setq buffer-read-only nil) | 811 (if proc |
812 (erase-buffer) | 812 (if (yes-or-no-p "A command is running. Kill it? ") |
813 (display-buffer buffer) | 813 (kill-process proc) |
814 (setq default-directory directory) | 814 (error "Shell command in progress"))) |
815 (setq proc (start-process "Shell" buffer shell-file-name | 815 (save-excursion |
816 shell-command-switch command)) | 816 (set-buffer buffer) |
817 (setq mode-line-process '(":%s")) | 817 (setq buffer-read-only nil) |
818 (require 'shell) (shell-mode) | 818 (erase-buffer) |
819 (set-process-sentinel proc 'shell-command-sentinel) | 819 (display-buffer buffer) |
820 )) | 820 (setq default-directory directory) |
821 (shell-command-on-region (point) (point) command nil) | 821 (setq proc (start-process "Shell" buffer shell-file-name |
822 )))) | 822 shell-command-switch command)) |
823 (setq mode-line-process '(":%s")) | |
824 (require 'shell) (shell-mode) | |
825 (set-process-sentinel proc 'shell-command-sentinel) | |
826 )) | |
827 (shell-command-on-region (point) (point) command nil) | |
828 )))))) | |
823 | 829 |
824 ;; We have a sentinel to prevent insertion of a termination message | 830 ;; We have a sentinel to prevent insertion of a termination message |
825 ;; in the buffer itself. | 831 ;; in the buffer itself. |
826 (defun shell-command-sentinel (process signal) | 832 (defun shell-command-sentinel (process signal) |
827 (if (memq (process-status process) '(exit signal)) | 833 (if (memq (process-status process) '(exit signal)) |