diff options
author | Gerd Moellmann <gerd@gnu.org> | 2000-06-23 05:24:10 +0000 |
---|---|---|
committer | Gerd Moellmann <gerd@gnu.org> | 2000-06-23 05:24:10 +0000 |
commit | affbf6477576c38d98111b55fbb1eb5b13d1a735 (patch) | |
tree | e7cccedd38944fc20cf2d20a3949246d8d558bf7 /lisp/eshell/em-prompt.el | |
parent | 022499fab948938bb763c2a33a8c5ba0c5969fcd (diff) | |
download | emacs-affbf6477576c38d98111b55fbb1eb5b13d1a735.tar.gz |
*** empty log message ***
Diffstat (limited to 'lisp/eshell/em-prompt.el')
-rw-r--r-- | lisp/eshell/em-prompt.el | 174 |
1 files changed, 174 insertions, 0 deletions
diff --git a/lisp/eshell/em-prompt.el b/lisp/eshell/em-prompt.el new file mode 100644 index 00000000000..5cc37dbc287 --- /dev/null +++ b/lisp/eshell/em-prompt.el @@ -0,0 +1,174 @@ +;;; em-prompt --- command prompts + +;; Copyright (C) 1999, 2000 Free Sofware Foundation + +;; This file is part of GNU Emacs. + +;; 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 2, 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 +;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +;; 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., 59 Temple Place - Suite 330, +;; Boston, MA 02111-1307, USA. + +(provide 'em-prompt) + +(eval-when-compile (require 'esh-maint)) + +(defgroup eshell-prompt nil + "This module provides command prompts, and navigation between them, +as is common with most shells." + :tag "Command prompts" + :group 'eshell-module) + +;;; Commentary: + +;; Most of the prompt navigation commands of `comint-mode' are +;; supported, such as C-c C-n, C-c C-p, etc. + +;;; User Variables: + +(defcustom eshell-prompt-load-hook '(eshell-prompt-initialize) + "*A list of functions to call when loading `eshell-prompt'." + :type 'hook + :group 'eshell-prompt) + +(defcustom eshell-prompt-function + (function + (lambda () + (concat (eshell/pwd) + (if (= (user-uid) 0) " # " " $ ")))) + "*A function that returns the Eshell prompt string. +Make sure to update `eshell-prompt-regexp' so that it will match your +prompt." + :type 'function + :group 'eshell-prompt) + +(defcustom eshell-prompt-regexp "^[^#$\n]* [#$] " + "*A regexp which fully matches your eshell prompt. +This setting is important, since it affects how eshell will interpret +the lines that are passed to it. +If this variable is changed, all Eshell buffers must be exited and +re-entered for it to take effect." + :type 'regexp + :group 'eshell-prompt) + +(defcustom eshell-highlight-prompt t + "*If non-nil, Eshell should highlight the prompt." + :type 'boolean + :group 'eshell-prompt) + +(defface eshell-prompt-face + '((((class color) (background light)) (:foreground "Red" :bold t)) + (((class color) (background dark)) (:foreground "Pink" :bold t)) + (t (:bold t))) + "*The face used to highlight prompt strings. +For highlighting other kinds of strings -- similar to shell mode's +behavior -- simply use an output filer which changes text properties." + :group 'eshell-prompt) + +(defcustom eshell-before-prompt-hook nil + "*A list of functions to call before outputting the prompt." + :type 'hook + :options '(eshell-begin-on-new-line) + :group 'eshell-prompt) + +(defcustom eshell-after-prompt-hook nil + "*A list of functions to call after outputting the prompt. +Note that if `eshell-scroll-show-maximum-output' is non-nil, then +setting `eshell-show-maximum-output' here won't do much. It depends +on whether the user wants the resizing to happen while output is +arriving, or after." + :type 'hook + :options '(eshell-show-maximum-output) + :group 'eshell-prompt) + +;;; Functions: + +(defun eshell-prompt-initialize () + "Initialize the prompting code." + (unless eshell-non-interactive-p + (make-local-hook 'eshell-post-command-hook) + (add-hook 'eshell-post-command-hook 'eshell-emit-prompt nil t) + + (make-local-variable 'eshell-prompt-regexp) + (if eshell-prompt-regexp + (set (make-local-variable 'paragraph-start) eshell-prompt-regexp)) + + (set (make-local-variable 'eshell-skip-prompt-function) + 'eshell-skip-prompt) + + (define-key eshell-command-map [(control ?n)] 'eshell-next-prompt) + (define-key eshell-command-map [(control ?p)] 'eshell-previous-prompt))) + +(defun eshell-emit-prompt () + "Emit a prompt if eshell is being used interactively." + (run-hooks 'eshell-before-prompt-hook) + (if (not eshell-prompt-function) + (set-marker eshell-last-output-end (point)) + (let ((prompt (funcall eshell-prompt-function))) + (and eshell-highlight-prompt + (add-text-properties 0 (length prompt) + '(read-only t + face eshell-prompt-face + rear-nonsticky (face read-only)) + prompt)) + (eshell-interactive-print prompt))) + (run-hooks 'eshell-after-prompt-hook)) + +(defun eshell-backward-matching-input (regexp arg) + "Search backward through buffer for match for REGEXP. +Matches are searched for on lines that match `eshell-prompt-regexp'. +With prefix argument N, search for Nth previous match. +If N is negative, find the next or Nth next match." + (interactive (eshell-regexp-arg "Backward input matching (regexp): ")) + (let* ((re (concat eshell-prompt-regexp ".*" regexp)) + (pos (save-excursion (end-of-line (if (> arg 0) 0 1)) + (if (re-search-backward re nil t arg) + (point))))) + (if (null pos) + (progn (message "Not found") + (ding)) + (goto-char pos) + (eshell-bol)))) + +(defun eshell-forward-matching-input (regexp arg) + "Search forward through buffer for match for REGEXP. +Matches are searched for on lines that match `eshell-prompt-regexp'. +With prefix argument N, search for Nth following match. +If N is negative, find the previous or Nth previous match." + (interactive (eshell-regexp-arg "Forward input matching (regexp): ")) + (eshell-backward-matching-input regexp (- arg))) + +(defun eshell-next-prompt (n) + "Move to end of Nth next prompt in the buffer. +See `eshell-prompt-regexp'." + (interactive "p") + (forward-paragraph n) + (eshell-skip-prompt)) + +(defun eshell-previous-prompt (n) + "Move to end of Nth previous prompt in the buffer. +See `eshell-prompt-regexp'." + (interactive "p") + (eshell-next-prompt (- (1+ n)))) + +(defun eshell-skip-prompt () + "Skip past the text matching regexp `eshell-prompt-regexp'. +If this takes us past the end of the current line, don't skip at all." + (let ((eol (line-end-position))) + (if (and (looking-at eshell-prompt-regexp) + (<= (match-end 0) eol)) + (goto-char (match-end 0))))) + +;;; Code: + +;;; em-prompt.el ends here |