X-Git-Url: https://code.delx.au/gnu-emacs/blobdiff_plain/bd358779861f265a7acff31ead40172735af693e..5deebc3c914c86e84d11661a7877c00b2d7fddd1:/lisp/eshell/em-unix.el diff --git a/lisp/eshell/em-unix.el b/lisp/eshell/em-unix.el index af54d875cb..e40dbded60 100644 --- a/lisp/eshell/em-unix.el +++ b/lisp/eshell/em-unix.el @@ -1,6 +1,6 @@ -;;; em-unix.el --- UNIX command aliases +;;; em-unix.el --- UNIX command aliases -*- lexical-binding:t -*- -;; Copyright (C) 1999-2013 Free Software Foundation, Inc. +;; Copyright (C) 1999-2016 Free Software Foundation, Inc. ;; Author: John Wiegley @@ -168,10 +168,10 @@ Otherwise, Emacs will attempt to use rsh to invoke du on the remote machine." (defun eshell/info (&rest args) "Run the info command in-frame with the same behavior as command-line `info', ie: - 'info' => goes to top info window - 'info arg1' => IF arg1 is a file, then visits arg1 - 'info arg1' => OTHERWISE goes to top info window and then menu item arg1 - 'info arg1 arg2' => does action for arg1 (either visit-file or menu-item) and then menu item arg2 + `info' => goes to top info window + `info arg1' => IF arg1 is a file, then visits arg1 + `info arg1' => OTHERWISE goes to top info window and then menu item arg1 + `info arg1 arg2' => does action for arg1 (either visit-file or menu-item) and then menu item arg2 etc." (eval-and-compile (require 'info)) (let ((file (cond @@ -195,34 +195,34 @@ Otherwise, Emacs will attempt to use rsh to invoke du on the remote machine." (Info-menu (car args)) (setq args (cdr args))))) -(defun eshell-remove-entries (path files &optional top-level) - "From PATH, remove all of the given FILES, perhaps interactively." +(defun eshell-remove-entries (files &optional toplevel) + "Remove all of the given FILES, perhaps interactively." (while files (if (string-match "\\`\\.\\.?\\'" (file-name-nondirectory (car files))) - (if top-level + (if toplevel (eshell-error "rm: cannot remove `.' or `..'\n")) (if (and (file-directory-p (car files)) (not (file-symlink-p (car files)))) (progn (if em-verbose - (eshell-printn (format "rm: removing directory `%s'" - (car files)))) + (eshell-printn (format-message "rm: removing directory `%s'" + (car files)))) (unless (or em-preview (and em-interactive (not (y-or-n-p - (format "rm: remove directory `%s'? " - (car files)))))) + (format-message "rm: remove directory `%s'? " + (car files)))))) (eshell-funcalln 'delete-directory (car files) t t))) (if em-verbose - (eshell-printn (format "rm: removing file `%s'" - (car files)))) + (eshell-printn (format-message "rm: removing file `%s'" + (car files)))) (unless (or em-preview (and em-interactive (not (y-or-n-p - (format "rm: remove `%s'? " - (car files)))))) + (format-message "rm: remove `%s'? " + (car files)))))) (eshell-funcalln 'delete-file (car files) t)))) (setq files (cdr files)))) @@ -260,42 +260,49 @@ Remove (unlink) the FILE(s).") (cond ((bufferp entry) (if em-verbose - (eshell-printn (format "rm: removing buffer `%s'" entry))) + (eshell-printn (format-message "rm: removing buffer `%s'" entry))) (unless (or em-preview (and em-interactive - (not (y-or-n-p (format "rm: delete buffer `%s'? " - entry))))) + (not (y-or-n-p (format-message + "rm: delete buffer `%s'? " + entry))))) (eshell-funcalln 'kill-buffer entry))) ((eshell-processp entry) (if em-verbose - (eshell-printn (format "rm: killing process `%s'" entry))) + (eshell-printn (format-message "rm: killing process `%s'" entry))) (unless (or em-preview (and em-interactive - (not (y-or-n-p (format "rm: kill process `%s'? " - entry))))) + (not (y-or-n-p (format-message + "rm: kill process `%s'? " + entry))))) (eshell-funcalln 'kill-process entry))) ((symbolp entry) (if em-verbose - (eshell-printn (format "rm: uninterning symbol `%s'" entry))) + (eshell-printn (format-message + "rm: uninterning symbol `%s'" entry))) (unless (or em-preview (and em-interactive - (not (y-or-n-p (format "rm: unintern symbol `%s'? " - entry))))) + (not (y-or-n-p (format-message + "rm: unintern symbol `%s'? " + entry))))) (eshell-funcalln 'unintern entry))) ((stringp entry) - (if (and (file-directory-p entry) - (not (file-symlink-p entry))) - (if (or em-recursive - eshell-rm-removes-directories) - (if (or em-preview - (not em-interactive) - (y-or-n-p - (format "rm: descend into directory `%s'? " - entry))) - (eshell-remove-entries nil (list entry) t)) - (eshell-error (format "rm: %s: is a directory\n" entry))) - (eshell-remove-entries nil (list entry) t))))) + ;; -f should silently ignore missing files (bug#15373). + (unless (and force-removal + (not (file-exists-p entry))) + (if (and (file-directory-p entry) + (not (file-symlink-p entry))) + (if (or em-recursive + eshell-rm-removes-directories) + (if (or em-preview + (not em-interactive) + (y-or-n-p + (format-message "rm: descend into directory `%s'? " + entry))) + (eshell-remove-entries (list entry) t)) + (eshell-error (format "rm: %s: is a directory\n" entry))) + (eshell-remove-entries (list entry) t)))))) (setq args (cdr args))) nil)) @@ -366,8 +373,8 @@ Remove the DIRECTORY(ies), if they are empty.") (equal (nth 10 attr-target) (nth 10 attr)) (nth 11 attr-target) (nth 11 attr) (equal (nth 11 attr-target) (nth 11 attr))) - (eshell-error (format "%s: `%s' and `%s' are the same file\n" - command (car files) target))) + (eshell-error (format-message "%s: `%s' and `%s' are the same file\n" + command (car files) target))) (t (let ((source (car files)) (target (if is-dir @@ -458,6 +465,8 @@ Remove the DIRECTORY(ies), if they are empty.") (eshell-parse-command (format "tar %s %s" tar-args archive) args)))) +(defvar ange-cache) ; XEmacs? See esh-util + ;; this is to avoid duplicating code... (defmacro eshell-mvcpln-template (command action func query-var force-var &optional preserve) @@ -508,7 +517,7 @@ Remove the DIRECTORY(ies), if they are empty.") :usage "[OPTION]... SOURCE DEST or: mv [OPTION]... SOURCE... DIRECTORY Rename SOURCE to DEST, or move SOURCE(s) to DIRECTORY. -\[OPTION] DIRECTORY...") +[OPTION] DIRECTORY...") (let ((no-dereference t)) (eshell-mvcpln-template "mv" "moving" 'rename-file eshell-mv-interactive-query @@ -574,7 +583,7 @@ Copy SOURCE to DEST, or multiple SOURCE(s) to DIRECTORY.") Create a link to the specified TARGET with optional LINK_NAME. If there is more than one TARGET, the last argument must be a directory; create links in DIRECTORY to each TARGET. Create hard links by default, symbolic links -with '--symbolic'. When creating hard links, each TARGET must exist.") +with `--symbolic'. When creating hard links, each TARGET must exist.") (let ((no-dereference t)) (eshell-mvcpln-template "ln" "linking" (if symbolic @@ -714,6 +723,8 @@ available..." (goto-char (point-min)) (resize-temp-buffer-window)))))) +(defvar compilation-scroll-output) + (defun eshell-grep (command args &optional maybe-use-occur) "Generic service function for the various grep aliases. It calls Emacs's grep utility if the command is not redirecting output, @@ -737,7 +748,12 @@ external command." (cmd (progn (set-text-properties 0 (length args) '(invisible t) args) - (format "%s -n %s" command args))) + (format "%s -n %s" + (pcase command + ("egrep" "grep -E") + ("fgrep" "grep -F") + (x x)) + args))) compilation-scroll-output) (grep cmd))))) @@ -746,11 +762,11 @@ external command." (eshell-grep "grep" args t)) (defun eshell/egrep (&rest args) - "Use Emacs grep facility instead of calling external egrep." + "Use Emacs grep facility instead of calling external grep -E." (eshell-grep "egrep" args t)) (defun eshell/fgrep (&rest args) - "Use Emacs grep facility instead of calling external fgrep." + "Use Emacs grep facility instead of calling external grep -F." (eshell-grep "fgrep" args t)) (defun eshell/agrep (&rest args) @@ -989,7 +1005,7 @@ Show wall-clock time elapsed during execution of COMMAND.") (setq args nil) (setcdr (last args 3) nil)) (with-current-buffer - (condition-case err + (condition-case nil (diff-no-select old new (nil-blank-string (eshell-flatten-and-stringify args))) @@ -1014,6 +1030,8 @@ Show wall-clock time elapsed during execution of COMMAND.") (put 'eshell/diff 'eshell-no-numeric-conversions t) +(defvar locate-history-list) + (defun eshell/locate (&rest args) "Alias \"locate\" to call Emacs `locate' function." (if (or eshell-plain-locate-behavior