-;;; 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 <johnw@gnu.org>
(make-local-variable 'eshell-complex-commands)
(setq eshell-complex-commands
(append '("grep" "egrep" "fgrep" "agrep" "glimpse" "locate"
- "cat" "time" "cp" "mv" "make" "du" "diff" "su" "sudo")
+ "cat" "time" "cp" "mv" "make" "du" "diff")
eshell-complex-commands)))
(defalias 'eshell/date 'current-time-string)
(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
(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))))
(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))
(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
(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)
: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
"don't change anything on disk")
(?p "preserve" nil preserve
"preserve file attributes if possible")
- (?R "recursive" nil em-recursive
+ (?r "recursive" nil em-recursive
"copy directories recursively")
+ (?R nil nil em-recursive
+ "as for -r")
(?v "verbose" nil em-verbose
"explain what is being done")
(nil "help" nil nil "show this usage screen")
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
(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,
(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)))
(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
(put 'eshell/occur 'eshell-no-numeric-conversions t)
-(defun eshell/su (&rest args)
- "Alias \"su\" to call Tramp."
- (require 'tramp)
- (setq args (eshell-stringify-list (eshell-flatten-list args)))
- (let ((orig-args (copy-tree args)))
- (eshell-eval-using-options
- "su" args
- '((?h "help" nil nil "show this usage screen")
- (?l "login" nil login "provide a login environment")
- (? nil nil login "provide a login environment")
- :usage "[- | -l | --login] [USER]
-Become another USER during a login session.")
- (throw 'eshell-replace-command
- (let ((user "root")
- (host (or (file-remote-p default-directory 'host)
- "localhost"))
- (dir (or (file-remote-p default-directory 'localname)
- (expand-file-name default-directory)))
- (prefix (file-remote-p default-directory)))
- (dolist (arg args)
- (if (string-equal arg "-") (setq login t) (setq user arg)))
- ;; `eshell-eval-using-options' does not handle "-".
- (if (member "-" orig-args) (setq login t))
- (if login (setq dir "~/"))
- (if (and prefix
- (or
- (not (string-equal
- "su" (file-remote-p default-directory 'method)))
- (not (string-equal
- user (file-remote-p default-directory 'user)))))
- (eshell-parse-command
- "cd" (list (format "%s|su:%s@%s:%s"
- (substring prefix 0 -1) user host dir)))
- (eshell-parse-command
- "cd" (list (format "/su:%s@%s:%s" user host dir)))))))))
-
-(put 'eshell/su 'eshell-no-numeric-conversions t)
-
-(defun eshell/sudo (&rest args)
- "Alias \"sudo\" to call Tramp."
- (require 'tramp)
- (setq args (eshell-stringify-list (eshell-flatten-list args)))
- (let ((orig-args (copy-tree args)))
- (eshell-eval-using-options
- "sudo" args
- '((?h "help" nil nil "show this usage screen")
- (?u "user" t user "execute a command as another USER")
- :show-usage
- :usage "[(-u | --user) USER] COMMAND
-Execute a COMMAND as the superuser or another USER.")
- (throw 'eshell-external
- (let ((user (or user "root"))
- (host (or (file-remote-p default-directory 'host)
- "localhost"))
- (dir (or (file-remote-p default-directory 'localname)
- (expand-file-name default-directory)))
- (prefix (file-remote-p default-directory)))
- ;; `eshell-eval-using-options' reads options of COMMAND.
- (while (and (stringp (car orig-args))
- (member (car orig-args) '("-u" "--user")))
- (setq orig-args (cddr orig-args)))
- (let ((default-directory
- (if (and prefix
- (or
- (not
- (string-equal
- "sudo"
- (file-remote-p default-directory 'method)))
- (not
- (string-equal
- user
- (file-remote-p default-directory 'user)))))
- (format "%s|sudo:%s@%s:%s"
- (substring prefix 0 -1) user host dir)
- (format "/sudo:%s@%s:%s" user host dir))))
- (eshell-named-command (car orig-args) (cdr orig-args))))))))
-
-(put 'eshell/sudo 'eshell-no-numeric-conversions t)
-
(provide 'em-unix)
;; Local Variables: