X-Git-Url: https://git.hcoop.net/bpt/emacs.git/blobdiff_plain/430d2ee2919b2d4693780f2474ba40148442d206..41ea9e48373c689eae6a72684a4d26d5ccd41af0:/lisp/ehelp.el diff --git a/lisp/ehelp.el b/lisp/ehelp.el index d6193c9cf4..b2bcf1f85c 100644 --- a/lisp/ehelp.el +++ b/lisp/ehelp.el @@ -1,17 +1,18 @@ -;;; ehelp.el --- bindings for electric-help mode +;;; ehelp.el --- bindings for electric-help mode -*- lexical-binding: t -*- -;; Copyright (C) 1986, 1995, 2000, 2001, 2002, 2003, 2004, -;; 2005, 2006, 2007, 2008 Free Software Foundation, Inc. +;; Copyright (C) 1986, 1995, 2000-2011 Free Software Foundation, Inc. +;; Author: Richard Mlynarik +;; (according to ack.texi and authors.el) ;; Maintainer: FSF ;; Keywords: help, extensions ;; 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 @@ -19,9 +20,7 @@ ;; 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 . ;;; Commentary: @@ -40,8 +39,6 @@ ;;; Code: (require 'electric) -(defvar electric-help-map () - "Keymap defining commands available in `electric-help-mode'.") (defvar electric-help-form-to-execute nil) @@ -61,8 +58,8 @@ :group 'electric-help) (put 'electric-help-undefined 'suppress-keymap t) -(if electric-help-map - () + +(defvar electric-help-map (let ((map (make-keymap))) ;; allow all non-self-inserting keys - search, scroll, etc, but ;; let M-x and C-x exit ehelp mode and retain buffer: @@ -93,13 +90,17 @@ (define-key map "r" 'electric-help-retain) (define-key map "\ex" 'electric-help-execute-extended) (define-key map "\C-x" 'electric-help-ctrl-x-prefix) + map) + "Keymap defining commands available in `electric-help-mode'.") - (setq electric-help-map map))) +(defvar electric-help-orig-major-mode nil) +(make-variable-buffer-local 'electric-help-orig-major-mode) (defun electric-help-mode () "`with-electric-help' temporarily places its buffer in this mode. -\(On exit from `with-electric-help', the buffer is put in `default-major-mode'.)" +\(On exit from `with-electric-help', the original `major-mode' is restored.)" (setq buffer-read-only t) + (setq electric-help-orig-major-mode major-mode) (setq mode-name "Help") (setq major-mode 'help) (setq mode-line-buffer-identification '(" Help: %b")) @@ -119,13 +120,13 @@ erased before THUNK is called unless NOERASE is non-nil. THUNK will be called while BUFFER is current and with `standard-output' bound to the buffer specified by BUFFER. -If THUNK returns nil, we display BUFFER starting at the top, and -shrink the window to fit. If THUNK returns non-nil, we don't do those things. +If THUNK returns nil, we display BUFFER starting at the top, and shrink +the window to fit. If THUNK returns non-nil, we don't do those things. -After THUNK has been called, this function \"electrically\" pops up a window -in which BUFFER is displayed and allows the user to scroll through that buffer -in `electric-help-mode'. The window's height will be at least MINHEIGHT if -this value is non-nil. +After THUNK has been called, this function \"electrically\" pops up a +window in which BUFFER is displayed and allows the user to scroll +through that buffer in `electric-help-mode'. The window's height will +be at least MINHEIGHT if this value is non-nil. If THUNK returns nil, we display BUFFER starting at the top, and shrink the window to fit if `electric-help-shrink-window' is non-nil. @@ -133,7 +134,7 @@ If THUNK returns non-nil, we don't do those things. When the user exits (with `electric-help-exit', or otherwise), the help buffer's window disappears (i.e., we use `save-window-excursion'), and -BUFFER is put into `default-major-mode' (or `fundamental-mode')." +BUFFER is put back into its original major mode." (setq buffer (get-buffer-create (or buffer "*Help*"))) (let ((one (one-window-p t)) (config (current-window-configuration)) @@ -145,8 +146,7 @@ BUFFER is put into `default-major-mode' (or `fundamental-mode')." (goto-char (window-start (selected-window)))) (let ((pop-up-windows t)) (pop-to-buffer buffer)) - (save-excursion - (set-buffer buffer) + (with-current-buffer buffer (when (and minheight (< (window-height) minheight)) (enlarge-window (- minheight (window-height)))) (electric-help-mode) @@ -173,13 +173,17 @@ BUFFER is put into `default-major-mode' (or `fundamental-mode')." (set-buffer buffer) (setq buffer-read-only nil) + ;; Restore the original major mode saved by `electric-help-mode'. ;; We should really get a usable *Help* buffer when retaining ;; the electric one with `r'. The problem is that a simple - ;; call to help-mode won't cut it; at least RET is bound wrong - ;; afterwards. It's also not clear that `help-mode' is always - ;; the right thing, maybe we should add an optional parameter. + ;; call to `help-mode' won't cut it; e.g. RET is bound wrong + ;; afterwards (`View-scroll-line-forward' instead of `help-follow'). + ;; That's because Help mode should be set with `with-help-window' + ;; instead of the direct call to `help-mode'. But at least + ;; RET works correctly on links after using `help-mode'. + ;; This is satisfactory enough. (condition-case () - (funcall (or default-major-mode 'fundamental-mode)) + (funcall (or electric-help-orig-major-mode 'fundamental-mode)) (error nil)) (set-window-configuration config) @@ -294,7 +298,7 @@ will select it.)" (let ((name (or name "*Help*"))) (if (save-window-excursion ;; kludge-o-rama - (let* ((p (symbol-function 'print-help-return-message)) + (let* ((p (symbol-function 'help-print-return-message)) (b (get-buffer name)) (m (buffer-modified-p b))) (and b (not (get-buffer-window b)) @@ -324,20 +328,18 @@ will select it.)" ;;>> suspend updating of the tick in order to allow ;;>> things like momentary-string-display) (and b - (save-excursion - (set-buffer b) + (with-current-buffer b (set-buffer-modified-p t))) - (fset 'print-help-return-message 'ignore) + (fset 'help-print-return-message 'ignore) (call-interactively fun) (and (get-buffer name) (get-buffer-window (get-buffer name)) (or (not b) (not (eq b (get-buffer name))) (not (buffer-modified-p b))))) - (fset 'print-help-return-message p) + (fset 'help-print-return-message p) (and b (buffer-name b) - (save-excursion - (set-buffer b) + (with-current-buffer b (set-buffer-modified-p m)))))) (with-electric-help 'ignore name t)))) @@ -345,14 +347,14 @@ will select it.)" ;; This is to be bound to M-x in ehelp mode. Retains ehelp buffer and then ;; continues with execute-extended-command. -(defun electric-help-execute-extended (prefixarg) +(defun electric-help-execute-extended (_prefixarg) (interactive "p") (setq electric-help-form-to-execute '(execute-extended-command nil)) (electric-help-retain)) ;; This is to be buond to C-x in ehelp mode. Retains ehelp buffer and then ;; continues with ctrl-x prefix. -(defun electric-help-ctrl-x-prefix (prefixarg) +(defun electric-help-ctrl-x-prefix (_prefixarg) (interactive "p") (setq electric-help-form-to-execute '(progn (message nil) (setq unread-command-char ?\C-x))) (electric-help-retain)) @@ -404,9 +406,7 @@ will select it.)" ;;;; ehelp-map -(defvar ehelp-map ()) -(if ehelp-map - nil +(defvar ehelp-map (let ((map (copy-keymap help-map))) (substitute-key-definition 'apropos 'electric-apropos map) (substitute-key-definition 'command-apropos 'electric-command-apropos map) @@ -417,8 +417,7 @@ will select it.)" (substitute-key-definition 'describe-variable 'electric-describe-variable map) (substitute-key-definition 'describe-bindings 'electric-describe-bindings map) (substitute-key-definition 'describe-syntax 'electric-describe-syntax map) - - (setq ehelp-map map))) + map)) ;;;###(autoload 'ehelp-command "ehelp" "Prefix command for ehelp." t 'keymap) (defalias 'ehelp-command ehelp-map) @@ -426,5 +425,4 @@ will select it.)" (provide 'ehelp) -;;; arch-tag: e0e3037f-42c0-433e-ba18-322c5d951f46 ;;; ehelp.el ends here