help-gnu-emacs
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: dired: "!" How to see not just result, but !-cmd too?


From: Matthias
Subject: Re: dired: "!" How to see not just result, but !-cmd too?
Date: 20 Jan 2005 14:23:48 +0100
User-agent: Gnus/5.09 (Gnus v5.9.0) Emacs/21.2

Here is a modified `shell-command': it shows the command in the header
line of the output buffer.

Note that the new code is only four or five lines long (you can use the
`fixme' comments as flags to found it); I've removed the documentation
spec to shorten the code.

(defun shell-command-default-error-buffer
  ;; Look for a handler in case default-directory is a remote file name.
  (let ((handler
         (find-file-name-handler (directory-file-name default-directory)
                                 'shell-command)))
    (if handler
        (funcall handler 'shell-command command output-buffer error-buffer)
      (if (and output-buffer
               (not (or (bufferp output-buffer)  (stringp output-buffer))))
          (let ((error-file
                 (if error-buffer
                     (make-temp-file
                      (expand-file-name "scor"
                                        (or small-temporary-file-directory
                                            temporary-file-directory)))
                   nil)))
            (barf-if-buffer-read-only)
            (push-mark nil t)
            ;; We do not use -f for csh; we will not support broken use of
            ;; .cshrcs.  Even the BSD csh manual says to use
            ;; "if ($?prompt) exit" before things which are not useful
            ;; non-interactively.  Besides, if someone wants their other
            ;; aliases for shell commands then they can still have them.
            (call-process shell-file-name nil
                          (if error-file
                              (list t error-file)
                            t)
                          nil shell-command-switch command)
            (when (and error-file (file-exists-p error-file))
              (if (< 0 (nth 7 (file-attributes error-file)))
                  (with-current-buffer (get-buffer-create error-buffer)
                    (let ((pos-from-end (- (point-max) (point))))
                      (or (bobp)
                          (insert "\f\n"))
                      ;; Do no formatting while reading error file,
                      ;; because that can run a shell command, and we
                      ;; don't want that to cause an infinite recursion.
                      (format-insert-file error-file nil)
                      ;; Put point after the inserted errors.
                      (goto-char (- (point-max) pos-from-end)))
                    (display-buffer (current-buffer))))
              (delete-file error-file))
            ;; 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.
        (save-match-data
          (if (string-match "[ \t]*&[ \t]*$" command)
              ;; Command ending with ampersand means asynchronous.
              (let ((buffer (get-buffer-create
                             (or output-buffer "*Async 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)
                  ;; Fixme: ensure that it is one line only; add the ampersand
                  (setq header-line-format command)
                  (set-process-sentinel proc 'shell-command-sentinel)
                  ))
            (shell-command-on-region (point) (point) command
                                     output-buffer nil error-buffer)
            ;; Fixme: ensure that it is one line only
            (let ((buffer (or output-buffer "*Shell Command Output*")))
              (save-excursion
                (set-buffer buffer)
                (setq header-line-format command)))))))))
-- 
Matthias

reply via email to

[Prev in Thread] Current Thread [Next in Thread]