;;; em-unix.el --- UNIX command aliases
-;; Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004,
-;; 2005, 2006, 2007 Free Software Foundation, Inc.
+;; Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007,
+;; 2008, 2009 Free Software Foundation, Inc.
;; Author: John Wiegley <johnw@gnu.org>
;; This file is part of GNU Emacs.
-;; GNU Emacs is free software; you can redistribute it and/or modify
+;; GNU Emacs is free software: you can redistribute it and/or modify
;; it under the terms of the GNU General Public License as published by
-;; the Free Software Foundation; either version 3, or (at your option)
-;; any later version.
+;; the Free Software Foundation, either version 3 of the License, or
+;; (at your option) any later version.
;; GNU Emacs is distributed in the hope that it will be useful,
;; but WITHOUT ANY WARRANTY; without even the implied warranty of
;; GNU General Public License for more details.
;; You should have received a copy of the GNU General Public License
-;; along with GNU Emacs; see the file COPYING. If not, write to the
-;; Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
-;; Boston, MA 02110-1301, USA.
+;; along with GNU Emacs. If not, see <http://www.gnu.org/licenses/>.
-(provide 'em-unix)
+;;; Commentary:
+
+;; This file contains implementations of several UNIX command in Emacs
+;; Lisp, for several reasons:
+;;
+;; 1) it makes them available on all platforms where the Lisp
+;; functions used are available
+;;
+;; 2) it makes their functionality accessible and modified by the
+;; Lisp programmer.
+;;
+;; 3) it allows Eshell to refrain from having to invoke external
+;; processes for common operations.
+
+;;; Code:
-(eval-when-compile (require 'esh-maint))
(require 'eshell)
-(defgroup eshell-unix nil
+;;;###autoload
+(eshell-defgroup eshell-unix nil
"This module defines many of the more common UNIX utilities as
aliases implemented in Lisp. These include mv, ln, cp, rm, etc. If
the user passes arguments which are too complex, or are unrecognized
:tag "UNIX commands in Lisp"
:group 'eshell-module)
-;;; Commentary:
-
-;; This file contains implementations of several UNIX command in Emacs
-;; Lisp, for several reasons:
-;;
-;; 1) it makes them available on all platforms where the Lisp
-;; functions used are available
-;;
-;; 2) it makes their functionality accessible and modified by the
-;; Lisp programmer.
-;;
-;; 3) it allows Eshell to refrain from having to invoke external
-;; processes for common operations.
-
(defcustom eshell-unix-load-hook '(eshell-unix-initialize)
"*A list of functions to run when `eshell-unix' is loaded."
:type 'hook
:type 'boolean
:group 'eshell-unix)
-(defcustom eshell-plain-locate-behavior (eshell-under-xemacs-p)
+(defcustom eshell-plain-locate-behavior (featurep 'xemacs)
"*If non-nil, standalone \"locate\" commands will behave normally.
Standalone in this context means not redirected, and not on the
receiving side of a command pipeline."
:type 'boolean
:group 'eshell-unix)
-(require 'esh-opt)
-
;;; Functions:
(defun eshell-unix-initialize ()
(defalias 'eshell/basename 'file-name-nondirectory)
(defalias 'eshell/dirname 'file-name-directory)
-(eval-when-compile
- (defvar interactive)
- (defvar preview)
- (defvar recursive)
- (defvar verbose))
+(defvar interactive)
+(defvar preview)
+(defvar recursive)
+(defvar verbose)
(defun eshell/man (&rest args)
"Invoke man, flattening the arguments appropriately."
(put 'eshell/man 'eshell-no-numeric-conversions t)
+(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
+ etc."
+ (eval-and-compile (require 'info))
+ (let ((file (cond
+ ((not (stringp (car args)))
+ nil)
+ ((file-exists-p (expand-file-name (car args)))
+ (expand-file-name (car args)))
+ ((file-exists-p (concat (expand-file-name (car args)) ".info"))
+ (concat (expand-file-name (car args)) ".info")))))
+
+ ;; If the first arg is a file, then go to that file's Top node
+ ;; Otherwise, go to the global directory
+ (if file
+ (progn
+ (setq args (cdr args))
+ (Info-find-node file "Top"))
+ (Info-directory))
+
+ ;; Treat all remaining args as menu references
+ (while args
+ (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."
(while files
(put 'eshell/rmdir 'eshell-no-numeric-conversions t)
-(eval-when-compile
- (defvar no-dereference)
- (defvar preview)
- (defvar verbose))
+(defvar no-dereference)
+(defvar preview)
+(defvar verbose)
(defvar eshell-warn-dot-directories t)
(defalias 'pcomplete/ssh 'pcomplete/rsh)
-(eval-when-compile
- (defvar block-size)
- (defvar by-bytes)
- (defvar dereference-links)
- (defvar grand-total)
- (defvar human-readable)
- (defvar max-depth)
- (defvar only-one-filesystem)
- (defvar show-all))
+(defvar block-size)
+(defvar by-bytes)
+(defvar dereference-links)
+(defvar grand-total)
+(defvar human-readable)
+(defvar max-depth)
+(defvar only-one-filesystem)
+(defvar show-all)
(defsubst eshell-du-size-string (size)
(let* ((str (eshell-printable-size size human-readable block-size t))
(if eshell-diff-window-config
(set-window-configuration eshell-diff-window-config)))
+(defun nil-blank-string (string)
+ "Return STRING, or nil if STRING contains only non-blank characters."
+ (cond
+ ((string-match "[^[:blank:]]" string) string)
+ (nil)))
+
(defun eshell/diff (&rest args)
"Alias \"diff\" to call Emacs `diff' function."
(let ((orig-args (eshell-stringify-list (eshell-flatten-list args))))
(setcdr (last args 3) nil))
(with-current-buffer
(condition-case err
- (diff old new (eshell-flatten-and-stringify args))
+ (diff old new
+ (nil-blank-string (eshell-flatten-and-stringify args)))
(error
(throw 'eshell-replace-command
(eshell-parse-command "*diff" orig-args))))
(put 'eshell/occur 'eshell-no-numeric-conversions t)
-;;; Code:
+(provide 'em-unix)
+
+;; Local Variables:
+;; generated-autoload-file: "esh-groups.el"
+;; End:
-;;; arch-tag: 2462edd2-a76a-4cf2-897d-92e9a82ac1c9
+;; arch-tag: 2462edd2-a76a-4cf2-897d-92e9a82ac1c9
;;; em-unix.el ends here