Mercurial > emacs
changeset 12565:c0a5d0d00c18
(shell-command): Use save-match-data.
Put the buffer in shell mode, don't use shell-command-filter.
(shell-command-filter): Deleted.
(shell-command-sentinel): Don't reset the mode line.
Don't test the buffer name--what was that for, anyway?.
(column-number-mode): New variable and new command.
author | Karl Heuer <kwzh@gnu.org> |
---|---|
date | Mon, 17 Jul 1995 23:03:53 +0000 |
parents | 3cd5105aeb2b |
children | 844b502ac6d0 |
files | lisp/simple.el |
diffstat | 1 files changed, 54 insertions(+), 68 deletions(-) [+] |
line wrap: on
line diff
--- a/lisp/simple.el Mon Jul 17 23:00:06 1995 +0000 +++ b/lisp/simple.el Mon Jul 17 23:03:53 1995 +0000 @@ -742,9 +742,10 @@ If COMMAND ends in ampersand, execute it asynchronously. The output appears in the buffer `*Async Shell Command*'. +That buffer is in shell mode. -Otherwise, COMMAND is executed synchronously. The output appears -in the buffer `*Shell Command Output*'. +Otherwise, COMMAND is executed synchronously. The output appears in the +buffer `*Shell Command Output*'. If the output is one line, it is displayed in the echo area *as well*, but it is nonetheless available in buffer `*Shell Command Output*', even though that buffer is not automatically displayed. @@ -771,80 +772,51 @@ ;; aliases for shell commands then they can still have them. (call-process shell-file-name nil t nil shell-command-switch command) - ;; This is like exchange-point-and-mark, but doesn't activate the mark. - ;; It is cleaner to avoid activation, even though the command - ;; loop would deactivate the mark because we inserted text. + ;; This is like exchange-point-and-mark, but doesn't + ;; activate the mark. It is cleaner to avoid activation, + ;; even though the command loop would deactivate the mark + ;; because we inserted text. (goto-char (prog1 (mark t) (set-marker (mark-marker) (point) (current-buffer))))) ;; Preserve the match data in case called from a program. - (let ((data (match-data))) - (unwind-protect - (if (string-match "[ \t]*&[ \t]*$" command) - ;; Command ending with ampersand means asynchronous. - (let ((buffer (get-buffer-create - (or output-buffer "*Asynch Shell Command*"))) - (directory default-directory) - proc) - ;; Remove the ampersand. - (setq command (substring command 0 (match-beginning 0))) - ;; If will kill a process, query first. - (setq proc (get-buffer-process buffer)) - (if proc - (if (yes-or-no-p "A command is running. Kill it? ") - (kill-process proc) - (error "Shell command in progress"))) - (save-excursion - (set-buffer buffer) - (setq buffer-read-only nil) - (erase-buffer) - (display-buffer buffer) - (setq default-directory directory) - (setq proc (start-process "Shell" buffer - shell-file-name - shell-command-switch command)) - (setq mode-line-process '(":%s")) - (set-process-sentinel proc 'shell-command-sentinel) - (set-process-filter proc 'shell-command-filter) - )) - (shell-command-on-region (point) (point) command nil)) - (store-match-data data))))) + (save-match-data + (if (string-match "[ \t]*&[ \t]*$" command) + ;; Command ending with ampersand means asynchronous. + (let ((buffer (get-buffer-create + (or output-buffer "*Asynch Shell Command*"))) + (directory default-directory) + proc) + ;; Remove the ampersand. + (setq command (substring command 0 (match-beginning 0))) + ;; If will kill a process, query first. + (setq proc (get-buffer-process buffer)) + (if proc + (if (yes-or-no-p "A command is running. Kill it? ") + (kill-process proc) + (error "Shell command in progress"))) + (save-excursion + (set-buffer buffer) + (setq buffer-read-only nil) + (erase-buffer) + (display-buffer buffer) + (setq default-directory directory) + (setq proc (start-process "Shell" buffer shell-file-name + shell-command-switch command)) + (setq mode-line-process '(":%s")) + (require 'shell) (shell-mode) + (set-process-sentinel proc 'shell-command-sentinel) + )) + (shell-command-on-region (point) (point) command nil) + )))) ;; We have a sentinel to prevent insertion of a termination message ;; in the buffer itself. (defun shell-command-sentinel (process signal) - (if (and (memq (process-status process) '(exit signal)) - (buffer-name (process-buffer process))) - (progn - (message "%s: %s." - (car (cdr (cdr (process-command process)))) - (substring signal 0 -1)) - (save-excursion - (set-buffer (process-buffer process)) - (setq mode-line-process nil)) - (delete-process process)))) - -(defun shell-command-filter (proc string) - ;; Do save-excursion by hand so that we can leave point numerically unchanged - ;; despite an insertion immediately after it. - (let* ((obuf (current-buffer)) - (buffer (process-buffer proc)) - opoint - (window (get-buffer-window buffer)) - (pos (window-start window))) - (unwind-protect - (progn - (set-buffer buffer) - (or (= (point) (point-max)) - (setq opoint (point))) - (goto-char (point-max)) - (insert-before-markers string)) - ;; insert-before-markers moved this marker: set it back. - (set-window-start window pos) - ;; Finish our save-excursion. - (if opoint - (goto-char opoint)) - (set-buffer obuf)))) + (if (memq (process-status process) '(exit signal)) + (message "%s: %s." + (car (cdr (cdr (process-command process)))) + (substring signal 0 -1)))) (defun shell-command-on-region (start end command &optional output-buffer replace) @@ -2588,6 +2560,20 @@ (> (prefix-numeric-value arg) 0))) (force-mode-line-update)) +(defvar column-number-mode nil + "*Non-nil means display column number in mode line.") + +(defun column-number-mode (arg) + "Toggle Column Number mode. +With arg, turn Column Number mode on iff arg is positive. +When Column Number mode is enabled, the column number appears +in the mode line." + (interactive "P") + (setq column-number-mode + (if (null arg) (not column-number-mode) + (> (prefix-numeric-value arg) 0))) + (force-mode-line-update)) + (defvar blink-matching-paren t "*Non-nil means show matching open-paren when close-paren is inserted.")