summaryrefslogtreecommitdiff
path: root/lisp
diff options
context:
space:
mode:
Diffstat (limited to 'lisp')
-rw-r--r--lisp/ChangeLog43
-rw-r--r--lisp/allout.el202
-rw-r--r--lisp/emacs-lisp/cl-loaddefs.el4
-rw-r--r--lisp/emulation/pc-select.el985
-rw-r--r--lisp/erc/ChangeLog10
-rw-r--r--lisp/erc/erc-track.el15
-rw-r--r--lisp/gnus/ChangeLog18
-rw-r--r--lisp/gnus/message.el1
-rw-r--r--lisp/gnus/nnimap.el12
-rw-r--r--lisp/gnus/nntp.el4
-rw-r--r--lisp/gnus/shr.el3
-rw-r--r--lisp/ibuffer.el2
-rw-r--r--lisp/net/rcirc.el19
-rw-r--r--lisp/obsolete/pc-mode.el (renamed from lisp/emulation/pc-mode.el)1
-rw-r--r--lisp/obsolete/pc-select.el417
-rw-r--r--lisp/progmodes/sh-script.el48
16 files changed, 628 insertions, 1156 deletions
diff --git a/lisp/ChangeLog b/lisp/ChangeLog
index 8826f884560..1a69d98f17e 100644
--- a/lisp/ChangeLog
+++ b/lisp/ChangeLog
@@ -1,3 +1,46 @@
+2011-02-10 Ken Manheimer <ken.manheimer@gmail.com>
+
+ * allout.el: Synopsis: Change allout user configuration so
+ auto-activation is controlled solely by customization
+ `allout-auto-activation'.
+
+ (allout-auto-activation-helper) (allout-setup): New autoloads
+ implement new custom set procedure for allout-auto-activation.
+ Also, explicitly invoke
+ (allout-setup) after allout-auto-activation is custom-defined, to
+ effect the settings in emacs sessions besides the few where
+ allout-auto-activation customization is donea.
+ (allout-auto-activation): Use allout-auto-activation-helper to
+ :set. Revise the docstring.
+ (allout-init): Reduce functionality to just customizing
+ allout-auto-activation, and mark obsolete.
+ (allout-mode): Respect string values for allout-auto-activation.
+ Run allout-after-copy-or-kill-hook without any args.
+ (allout-mode) (allout-layout) (allout-default-layout)
+ (outlineify-sticky): Adjust docstring for new scheme.
+ (allout-after-copy-or-kill-hook): No arguments - hook implementers
+ should concentrate on the kill ring.
+
+2011-02-09 Stefan Monnier <monnier@iro.umontreal.ca>
+
+ * progmodes/sh-script.el (sh-font-lock-open-heredoc): Fix case
+ of here-doc that immediately follows a comment.
+
+2011-02-09 Deniz Dogan <deniz.a.m.dogan@gmail.com>
+
+ * net/rcirc.el (rcirc-ctcp-sender-PING): Simplifying.
+
+ * net/rcirc.el (rcirc-cmd-ctcp): Use dedicated function when
+ available.
+ (rcirc-ctcp-sender-PING): New function.
+
+2011-02-08 Stefan Monnier <monnier@iro.umontreal.ca>
+
+ * obsolete/pc-select.el: Rename from emulation/pc-select.el (bug#7940).
+ Remove the mark/nomark handling, and activate shift-select-mode instead.
+
+ * obsolete/pc-mode.el: Rename from emulation/pc-mode.el.
+
2011-02-07 Jay Belanger <jay.p.belanger@gmail.com>
* calc/calc-units.el (math-logunits-quant): Add support for
diff --git a/lisp/allout.el b/lisp/allout.el
index 49c2dba322a..5d87415a57f 100644
--- a/lisp/allout.el
+++ b/lisp/allout.el
@@ -62,18 +62,15 @@
;; The latest development version and helpful notes are available at
;; http://myriadicity.net/Sundry/EmacsAllout .
;;
-;; The outline menubar additions provide quick reference to many of
-;; the features, and see the docstring of the variable `allout-init'
-;; for instructions on priming your Emacs session for automatic
-;; activation of allout-mode.
-;;
-;; See the docstring of the variables `allout-layout' and
+;; The outline menubar additions provide quick reference to many of the
+;; features. See the docstring of the variables `allout-layout' and
;; `allout-auto-activation' for details on automatic activation of
-;; `allout-mode' as a minor mode. (It has changed since allout
-;; 3.x, for those of you that depend on the old method.)
+;; `allout-mode' as a minor mode. (`allout-init' is deprecated in favor of
+;; a purely customization-based method.)
;;
;; Note -- the lines beginning with `;;;_' are outline topic headers.
-;; Just `ESC-x eval-buffer' to give it a whirl.
+;; Customize `allout-auto-activation' to enable, then revisit this
+;; buffer to give it a whirl.
;; ken manheimer (ken dot manheimer at gmail dot com)
@@ -271,35 +268,56 @@ See the existing keys for examples."
:set 'allout-compose-and-institute-keymap
)
+;;;_ > allout-auto-activation-helper (var value)
+;;;###autoload
+(defun allout-auto-activation-helper (var value)
+ "Institute `allout-auto-activation'.
+
+Intended to be used as the `allout-auto-activation' :set function."
+ (set-default var value)
+ (allout-setup))
+;;;_ > allout-setup ()
+;;;###autoload
+(defun allout-setup ()
+ "Do fundamental emacs session for allout auto-activation.
+
+Establishes allout processing as part of visiting a file if
+`allout-auto-activation' is non-nil, or removes it otherwise.
+
+The proper way to use this is through customizing the setting of
+`allout-auto-activation'."
+ (if (not allout-auto-activation)
+ (remove-hook 'find-file-hook 'allout-find-file-hook)
+ (add-hook 'find-file-hook 'allout-find-file-hook)))
;;;_ = allout-auto-activation
+;;;###autoload
(defcustom allout-auto-activation nil
- "Regulates auto-activation modality of allout outlines -- see `allout-init'.
+ "Configure allout outline mode auto-activation.
-Setq-default by `allout-init' to regulate whether or not allout
-outline mode is automatically activated when the buffer-specific
-variable `allout-layout' is non-nil, and whether or not the layout
-dictated by `allout-layout' should be imposed on mode activation.
+Control whether and how allout outline mode is automatically
+activated when files are visited with non-nil buffer-specific
+file variable `allout-layout'.
-With value t, auto-mode-activation and auto-layout are enabled.
-\(This also depends on `allout-find-file-hook' being installed in
-`find-file-hook', which is also done by `allout-init'.)
+When allout-auto-activation is \"On\" \(t), allout mode is
+activated in buffers with non-nil `allout-layout', and the
+specified layout is applied.
-With value `ask', auto-mode-activation is enabled, and endorsement for
+With value \"ask\", auto-mode-activation is enabled, and endorsement for
performing auto-layout is asked of the user each time.
-With value `activate', only auto-mode-activation is enabled,
-auto-layout is not.
+With value \"activate\", only auto-mode-activation is enabled.
+Auto-layout is not.
With value nil, neither auto-mode-activation nor auto-layout are
-enabled.
-
-See the docstring for `allout-init' for the proper interface to
-this variable."
+enabled, and allout auto-activation processing is removed from
+file visiting activities."
+ :set 'allout-auto-activation-helper
:type '(choice (const :tag "On" t)
(const :tag "Ask about layout" "ask")
(const :tag "Mode only" "activate")
(const :tag "Off" nil))
:group 'allout)
+(allout-setup)
;;;_ = allout-default-layout
(defcustom allout-default-layout '(-2 : 0)
"Default allout outline layout specification.
@@ -311,7 +329,7 @@ layout specifications.
A list value specifies a default layout for the current buffer,
to be applied upon activation of `allout-mode'. Any non-nil
value will automatically trigger `allout-mode', provided
-`allout-init' has been called to enable this behavior.
+`allout-auto-activation' has been customized to enable it.
The types of elements in the layout specification are:
@@ -890,10 +908,10 @@ For details, see `allout-toggle-current-subtree-encryption's docstring."
(defvar allout-layout nil ; LEAVE GLOBAL VALUE NIL -- see docstring.
"Buffer-specific setting for allout layout.
-In buffers where this is non-nil (and if `allout-init' has been run, to
-enable this behavior), `allout-mode' will be automatically activated. The
-layout dictated by the value will be used to set the initial exposure when
-`allout-mode' is activated.
+In buffers where this is non-nil \(and if `allout-auto-activation'
+has been customized to enable this behavior), `allout-mode' will be
+automatically activated. The layout dictated by the value will be used to
+set the initial exposure when `allout-mode' is activated.
\*You should not setq-default this variable non-nil unless you want every
visited file to be treated as an allout file.*
@@ -906,9 +924,9 @@ example, the following lines at the bottom of an Emacs Lisp file:
;;;End:
dictate activation of `allout-mode' mode when the file is visited
-\(presuming allout-init was already run), followed by the
-equivalent of `(allout-expose-topic 0 : -1 -1 0)'. (This is
-the layout used for the allout.el source file.)
+\(presuming proper `allout-auto-activation' customization),
+followed by the equivalent of `(allout-expose-topic 0 : -1 -1 0)'.
+\(This is the layout used for the allout.el source file.)
`allout-default-layout' describes the specification format.
`allout-layout' can additionally have the value `t', in which
@@ -1441,9 +1459,7 @@ This hook might be invoked multiple times by a single command.")
(defvar allout-after-copy-or-kill-hook nil
"*Hook that's run after copying outline text.
-Functions on the hook should take two arguments:
-
- START, END -- integers indicating the span containing the copied text.")
+Functions on the hook should not take any arguments.")
;;;_ = allout-outside-normal-auto-fill-function
(defvar allout-outside-normal-auto-fill-function nil
"Value of normal-auto-fill-function outside of allout mode.
@@ -1621,84 +1637,19 @@ non-nil in a lasting way.")
"If t, `allout-mode's last deactivation was deliberate.
So `allout-post-command-business' should not reactivate it...")
(make-variable-buffer-local 'allout-explicitly-deactivated)
-;;;_ > allout-init (&optional mode)
-(defun allout-init (&optional mode)
- "Prime `allout-mode' to enable/disable auto-activation, wrt `allout-layout'.
-
-MODE is one of the following symbols:
-
- - nil (or no argument) deactivate auto-activation/layout;
- - `activate', enable auto-activation only;
- - `ask', enable auto-activation, and enable auto-layout but with
- confirmation for layout operation solicited from user each time;
- - `report', just report and return the current auto-activation state;
- - anything else (eg, t) for auto-activation and auto-layout, without
- any confirmation check.
-
-Use this function to setup your Emacs session for automatic activation
-of allout outline mode, contingent to the buffer-specific setting of
-the `allout-layout' variable. (See `allout-layout' and
-`allout-expose-topic' docstrings for more details on auto layout).
-
-`allout-init' works by setting up (or removing) the `allout-mode'
-find-file-hook, and giving `allout-auto-activation' a suitable
-setting.
-
-To prime your Emacs session for full auto-outline operation, include
-the following two lines in your Emacs init file:
-
-\(require 'allout)
-\(allout-init t)"
-
- (interactive)
- (if (allout-called-interactively-p)
- (progn
- (setq mode
- (completing-read
- (concat "Select outline auto setup mode "
- "(empty for report, ? for options) ")
- '(("nil")("full")("activate")("deactivate")
- ("ask") ("report") (""))
- nil
- t))
- (if (string= mode "")
- (setq mode 'report)
- (setq mode (intern-soft mode)))))
- (let
- ;; convenience aliases, for consistent ref to respective vars:
- ((hook 'allout-find-file-hook)
- (find-file-hook-var-name (if (boundp 'find-file-hook)
- 'find-file-hook
- 'find-file-hooks))
- (curr-mode 'allout-auto-activation))
-
- (cond ((not mode)
- (set find-file-hook-var-name
- (delq hook (symbol-value find-file-hook-var-name)))
- (if (allout-called-interactively-p)
- (message "Allout outline mode auto-activation inhibited.")))
- ((eq mode 'report)
- (if (not (memq hook (symbol-value find-file-hook-var-name)))
- (allout-init nil)
- ;; Just punt and use the reports from each of the modes:
- (allout-init (symbol-value curr-mode))))
- (t (add-hook find-file-hook-var-name hook)
- (set curr-mode ; `set', not `setq'!
- (cond ((eq mode 'activate)
- (message
- "Outline mode auto-activation enabled.")
- 'activate)
- ((eq mode 'report)
- ;; Return the current mode setting:
- (allout-init mode))
- ((eq mode 'ask)
- (message
- (concat "Outline mode auto-activation and "
- "-layout (upon confirmation) enabled."))
- 'ask)
- ((message
- "Outline mode auto-activation and -layout enabled.")
- 'full)))))))
+;;;_ > allout-init (mode)
+(defun allout-init (mode)
+ "DEPRECATED - configure allout activation by customizing
+`allout-auto-activation'. This function remains around, limited
+from what it did before, for backwards compatability.
+
+MODE is the activation mode - see `allout-auto-activation' for
+valid values."
+
+ (custom-set-variables (list 'allout-auto-activation (format "%s" mode)))
+ (format "%s" mode))
+(make-obsolete 'allout-init
+ "customize 'allout-auto-activation' instead." "23.3")
;;;_ > allout-setup-menubar ()
(defun allout-setup-menubar ()
"Populate the current buffer's menubar with `allout-mode' stuff."
@@ -1764,9 +1715,8 @@ and many other features.
Below is a description of the key bindings, and then description
of special `allout-mode' features and terminology. See also the
outline menubar additions for quick reference to many of the
-features, and see the docstring of the function `allout-init' for
-instructions on priming your emacs session for automatic
-activation of `allout-mode'.
+features. Customize `allout-auto-activation' to prepare your
+emacs session for automatic activation of `allout-mode'.
The bindings are those listed in `allout-prefixed-keybindings'
and `allout-unprefixed-keybindings'. We recommend customizing
@@ -1850,7 +1800,8 @@ M-x outlineify-sticky Activate outline mode for current buffer,
Like above 'copy-exposed', but convert topic
prefixes to section.subsection... numeric
format.
-\\[eval-expression] (allout-init t) Setup Emacs session for outline mode
+\\[customize-variable] allout-auto-activation
+ Prepare Emacs session for allout outline mode
auto-activation.
Topic Encryption
@@ -2092,8 +2043,8 @@ OPEN: A TOPIC that is not CLOSED, though its OFFSPRING or BODY may be."
(when (and allout-layout
allout-auto-activation
use-layout
- (and (not (eq allout-auto-activation 'activate))
- (if (eq allout-auto-activation 'ask)
+ (and (not (string= allout-auto-activation "activate"))
+ (if (string= allout-auto-activation "ask")
(if (y-or-n-p (format "Expose %s with layout '%s'? "
(buffer-name)
use-layout))
@@ -3448,7 +3399,7 @@ Returns the qualifying command, if any, else nil."
(defun allout-find-file-hook ()
"Activate `allout-mode' on non-nil `allout-auto-activation', `allout-layout'.
-See `allout-init' for setup instructions."
+See `allout-auto-activation' for setup instructions."
(if (and allout-auto-activation
(not (allout-mode-p))
allout-layout)
@@ -4394,7 +4345,7 @@ subtopics into siblings of the item."
(if (and (not beg-hidden) (not end-hidden))
(allout-unprotected (kill-line arg))
(kill-line arg))
- (run-hook-with-args 'allout-after-copy-or-kill-hook beg end)
+ (run-hooks 'allout-after-copy-or-kill-hook)
(allout-deannotate-hidden beg end)
(if allout-numbered-bullet
@@ -4446,7 +4397,7 @@ Topic exposure is marked with text-properties, to be used by
(unwind-protect ; for possible barf-if-buffer-read-only.
(allout-unprotected (kill-region beg end))
(allout-deannotate-hidden beg end)
- (run-hook-with-args 'allout-after-copy-or-kill-hook beg end)
+ (run-hooks 'allout-after-copy-or-kill-hook)
(save-excursion
(allout-renumber-to-depth depth))
@@ -4503,7 +4454,8 @@ Topic exposure is marked with text-properties, to be used by
(allout-unprotected
(let ((inhibit-read-only t)
(buffer-undo-list t))
- (remove-text-properties begin end '(allout-was-hidden t)))))
+ (remove-text-properties begin (min end (point-max))
+ '(allout-was-hidden t)))))
;;;_ > allout-hide-by-annotation (begin end)
(defun allout-hide-by-annotation (begin end)
"Translate text properties indicating exposure status into actual exposure."
@@ -6312,8 +6264,8 @@ save. See `allout-encrypt-unencrypted-on-saves' for more info."
(defun outlineify-sticky (&optional arg)
"Activate outline mode and establish file var so it is started subsequently.
-See doc-string for `allout-layout' and `allout-init' for details on
-setup for auto-startup."
+See `allout-layout' and customization of `allout-auto-activation'
+for details on preparing emacs for automatic allout activation."
(interactive "P")
diff --git a/lisp/emacs-lisp/cl-loaddefs.el b/lisp/emacs-lisp/cl-loaddefs.el
index 05bfa0f262e..e10dc10447c 100644
--- a/lisp/emacs-lisp/cl-loaddefs.el
+++ b/lisp/emacs-lisp/cl-loaddefs.el
@@ -282,7 +282,7 @@ Not documented
;;;;;; do-all-symbols do-symbols dotimes dolist do* do loop return-from
;;;;;; return block etypecase typecase ecase case load-time-value
;;;;;; eval-when destructuring-bind function* defmacro* defun* gentemp
-;;;;;; gensym) "cl-macs" "cl-macs.el" "8b2ce9c2ec0e273606bb37c333c4bdde")
+;;;;;; gensym) "cl-macs" "cl-macs.el" "0904b956872432ae7cc5fa9abcefce63")
;;; Generated autoloads from cl-macs.el
(autoload 'gensym "cl-macs" "\
@@ -389,7 +389,7 @@ This is equivalent to `(return-from nil RESULT)'.
(autoload 'return-from "cl-macs" "\
Return from the block named NAME.
-This jump out to the innermost enclosing `(block NAME ...)' form,
+This jumps out to the innermost enclosing `(block NAME ...)' form,
returning RESULT from that form (or nil if RESULT is omitted).
This is compatible with Common Lisp, but note that `defun' and
`defmacro' do not create implicit blocks as they do in Common Lisp.
diff --git a/lisp/emulation/pc-select.el b/lisp/emulation/pc-select.el
deleted file mode 100644
index 76562dd75ca..00000000000
--- a/lisp/emulation/pc-select.el
+++ /dev/null
@@ -1,985 +0,0 @@
-;;; pc-select.el --- emulate mark, cut, copy and paste from Motif
-;;; (or MAC GUI or MS-windoze (bah)) look-and-feel
-;;; including key bindings.
-
-;; Copyright (C) 1995-1997, 2000-2011 Free Software Foundation, Inc.
-
-;; Author: Michael Staats <michael@thp.Uni-Duisburg.DE>
-;; Keywords: convenience emulations
-;; Created: 26 Sep 1995
-
-;; 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 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
-;; 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. If not, see <http://www.gnu.org/licenses/>.
-
-;;; Commentary:
-
-;; This package emulates the mark, copy, cut and paste look-and-feel of motif
-;; programs (which is the same as the MAC gui and (sorry for that) MS-Windows).
-;; It modifies the keybindings of the cursor keys and the next, prior,
-;; home and end keys. They will modify mark-active.
-;; You can still get the old behavior of cursor moving with the
-;; control sequences C-f, C-b, etc.
-;; This package uses transient-mark-mode and
-;; delete-selection-mode.
-;;
-;; In addition to that all key-bindings from the pc-mode are
-;; done here too (as suggested by RMS).
-;;
-;; As I found out after I finished the first version, s-region.el tries
-;; to do the same.... But my code is a little more complete and using
-;; delete-selection-mode is very important for the look-and-feel.
-;; Pete Forman <pete.forman@airgun.wg.waii.com> provided some motif
-;; compliant keybindings which I added. I had to modify them a little
-;; to add the -mark and -nomark functionality of cursor moving.
-;;
-;; Credits:
-;; Many thanks to all who made comments.
-;; Thanks to RMS and Ralf Muschall <prm@rz.uni-jena.de> for criticism.
-;; Kevin Cutts <cutts@ukraine.corp.mot.com> added the beginning-of-buffer
-;; and end-of-buffer functions which I modified a little.
-;; David Biesack <sasdjb@unx.sas.com> suggested some more cleanup.
-;; Thanks to Pete Forman <pete.forman@airgun.wg.waii.com>
-;; for additional motif keybindings.
-;; Thanks to jvromans@squirrel.nl (Johan Vromans) for a bug report
-;; concerning setting of this-command.
-;; Dan Nicolaescu <done@ece.arizona.ro> suggested suppressing the
-;; scroll-up/scroll-down error.
-;; Eli Barzilay (eli@cs.bgu.ac.il) suggested the sexps functions and
-;; keybindings.
-;;
-;; Ok, some details about the idea of PC Selection mode:
-;;
-;; o The standard keys for moving around (right, left, up, down, home, end,
-;; prior, next, called "move-keys" from now on) will always de-activate
-;; the mark.
-;; o If you press "Shift" together with the "move-keys", the region
-;; you pass along is activated
-;; o You have the copy, cut and paste functions (as in many other programs)
-;; which will operate on the active region
-;; It was not possible to bind them to C-v, C-x and C-c for obvious
-;; emacs reasons.
-;; They will be bound according to the "old" behavior to S-delete (cut),
-;; S-insert (paste) and C-insert (copy). These keys do the same in many
-;; other programs.
-;;
-
-;;; Code:
-
-;; Customization:
-(defgroup pc-select nil
- "Emulate pc bindings."
- :prefix "pc-select"
- :group 'emulations)
-
-(defcustom pc-select-override-scroll-error t
- "Non-nil means don't generate error on scrolling past edge of buffer.
-This variable applies in PC Selection mode only.
-The scroll commands normally generate an error if you try to scroll
-past the top or bottom of the buffer. This is annoying when selecting
-text with these commands. If you set this variable to non-nil, these
-errors are suppressed."
- :type 'boolean
- :group 'pc-select)
-(define-obsolete-variable-alias 'pc-select-override-scroll-error
- 'scroll-error-top-bottom
- "24.1")
-
-(defcustom pc-select-selection-keys-only nil
- "Non-nil means only bind the basic selection keys when started.
-Other keys that emulate pc-behavior will be untouched.
-This gives mostly Emacs-like behavior with only the selection keys enabled."
- :type 'boolean
- :group 'pc-select)
-
-(defcustom pc-select-meta-moves-sexps nil
- "Non-nil means move sexp-wise with Meta key, otherwise move word-wise."
- :type 'boolean
- :group 'pc-select)
-
-(defcustom pc-selection-mode-hook nil
- "The hook to run when PC Selection mode is toggled."
- :type 'hook
- :group 'pc-select)
-
-(defvar pc-select-saved-settings-alist nil
- "The values of the variables before PC Selection mode was toggled on.
-When PC Selection mode is toggled on, it sets quite a few variables
-for its own purposes. This alist holds the original values of the
-variables PC Selection mode had set, so that these variables can be
-restored to their original values when PC Selection mode is toggled off.")
-
-(defvar pc-select-map nil
- "The keymap used as the global map when PC Selection mode is on." )
-
-(defvar pc-select-saved-global-map nil
- "The global map that was in effect when PC Selection mode was toggled on.")
-
-(defvar pc-select-key-bindings-alist nil
- "This alist holds all the key bindings PC Selection mode sets.")
-
-(defvar pc-select-default-key-bindings nil
- "These key bindings always get set by PC Selection mode.")
-
-(unless pc-select-default-key-bindings
- (let ((lst
- ;; This is to avoid confusion with the delete-selection-mode.
- ;; On simple displays you can't see that a region is active and
- ;; will be deleted on the next keypress IMHO especially for
- ;; copy-region-as-kill this is confusing.
- ;; The same goes for exchange-point-and-mark
- '(("\M-w" . copy-region-as-kill-nomark)
- ("\C-x\C-x" . exchange-point-and-mark-nomark)
- ([S-right] . forward-char-mark)
- ([right] . forward-char-nomark)
- ([C-S-right] . forward-word-mark)
- ([C-right] . forward-word-nomark)
- ([S-left] . backward-char-mark)
- ([left] . backward-char-nomark)
- ([C-S-left] . backward-word-mark)
- ([C-left] . backward-word-nomark)
- ([S-down] . next-line-mark)
- ([down] . next-line-nomark)
-
- ([S-end] . end-of-line-mark)
- ([end] . end-of-line-nomark)
- ([S-C-end] . end-of-buffer-mark)
- ([C-end] . end-of-buffer-nomark)
- ([S-M-end] . end-of-buffer-mark)
- ([M-end] . end-of-buffer-nomark)
-
- ([S-next] . scroll-up-mark)
- ([next] . scroll-up-nomark)
-
- ([S-up] . previous-line-mark)
- ([up] . previous-line-nomark)
-
- ([S-home] . beginning-of-line-mark)
- ([home] . beginning-of-line-nomark)
- ([S-C-home] . beginning-of-buffer-mark)
- ([C-home] . beginning-of-buffer-nomark)
- ([S-M-home] . beginning-of-buffer-mark)
- ([M-home] . beginning-of-buffer-nomark)
-
- ([M-S-down] . forward-line-mark)
- ([M-down] . forward-line-nomark)
- ([M-S-up] . backward-line-mark)
- ([M-up] . backward-line-nomark)
-
- ([S-prior] . scroll-down-mark)
- ([prior] . scroll-down-nomark)
-
- ;; Next four lines are from Pete Forman.
- ([C-down] . forward-paragraph-nomark) ; KNextPara cDn
- ([C-up] . backward-paragraph-nomark) ; KPrevPara cUp
- ([S-C-down] . forward-paragraph-mark)
- ([S-C-up] . backward-paragraph-mark))))
-
- (setq pc-select-default-key-bindings lst)))
-
-(defvar pc-select-extra-key-bindings nil
- "Key bindings to set only if `pc-select-selection-keys-only' is nil.")
-
-;; The following keybindings are for standard ISO keyboards
-;; as they are used with IBM compatible PCs, IBM RS/6000,
-;; MACs, many X-Stations and probably more
-(unless pc-select-extra-key-bindings
- (let ((lst
- '(([S-insert] . yank)
- ([C-insert] . copy-region-as-kill)
- ([S-delete] . kill-region)
-
- ;; The following bindings are useful on Sun Type 3 keyboards
- ;; They implement the Get-Delete-Put (copy-cut-paste)
- ;; functions from sunview on the L6, L8 and L10 keys
- ;; Sam Steingold <sds@gnu.org> says that f16 is copy and f18 is paste.
- ([f16] . copy-region-as-kill)
- ([f18] . yank)
- ([f20] . kill-region)
-
- ;; The following bindings are from Pete Forman.
- ([f6] . other-window) ; KNextPane F6
- ([C-delete] . kill-line) ; KEraseEndLine cDel
- ("\M-\d" . undo) ; KUndo aBS
-
- ;; The following binding is taken from pc-mode.el
- ;; as suggested by RMS.
- ;; I only used the one that is not covered above.
- ([C-M-delete] . kill-sexp)
- ;; Next line proposed by Eli Barzilay
- ([C-escape] . electric-buffer-list))))
-
- (setq pc-select-extra-key-bindings lst)))
-
-(defvar pc-select-meta-moves-sexps-key-bindings
- '((([M-S-right] . forward-sexp-mark)
- ([M-right] . forward-sexp-nomark)
- ([M-S-left] . backward-sexp-mark)
- ([M-left] . backward-sexp-nomark))
- (([M-S-right] . forward-word-mark)
- ([M-right] . forward-word-nomark)
- ([M-S-left] . backward-word-mark)
- ([M-left] . backward-word-nomark)))
- "The list of key bindings controlled by `pc-select-meta-moves-sexp'.
-The bindings in the car of this list get installed if
-`pc-select-meta-moves-sexp' is t, the bindings in the cadr of this
-list get installed otherwise.")
-
-;; This is for tty. We don't turn on normal-erase-is-backspace,
-;; but bind keys as pc-selection-mode did before
-;; normal-erase-is-backspace was invented, to keep us back
-;; compatible.
-(defvar pc-select-tty-key-bindings
- '(([delete] . delete-char) ; KDelete Del
- ([C-backspace] . backward-kill-word))
- "The list of key bindings controlled by `pc-select-selection-keys-only'.
-These key bindings get installed when running in a tty, but only if
-`pc-select-selection-keys-only' is nil.")
-
-(defvar pc-select-old-M-delete-binding nil
- "Holds the old mapping of [M-delete] in the `function-key-map'.
-This variable holds the value associated with [M-delete] in the
-`function-key-map' before PC Selection mode had changed that
-association.")
-
-;;;;
-;; misc
-;;;;
-
-(provide 'pc-select)
-
-(defun copy-region-as-kill-nomark (beg end)
- "Save the region as if killed, but don't kill it; deactivate mark.
-If `interprogram-cut-function' is non-nil, also save the text for a window
-system cut and paste.
-
-Deactivating mark is to avoid confusion with `delete-selection-mode'
-and `transient-mark-mode'."
- (interactive "r")
- (copy-region-as-kill beg end)
- (setq mark-active nil)
- (message "Region saved"))
-
-(defun exchange-point-and-mark-nomark ()
- "Like `exchange-point-and-mark' but without activating the mark."
- (interactive)
- (exchange-point-and-mark)
- (setq mark-active nil))
-
-;;;;
-;; non-interactive
-;;;;
-(defun pc-select-ensure-mark ()
- ;; make sure mark is active
- ;; test if it is active, if it isn't, set it and activate it
- (or mark-active (set-mark-command nil))
- ;; Remember who activated the mark.
- (setq mark-active 'pc-select))
-
-(defun pc-select-maybe-deactivate-mark ()
- ;; maybe switch off mark (only if *we* switched it on)
- (when (eq mark-active 'pc-select)
- (deactivate-mark)))
-
-;;;;;;;;;;;;;;;;;;;;;;;;;;;
-;;;;; forward and mark
-;;;;;;;;;;;;;;;;;;;;;;;;;;;
-
-(defun forward-char-mark (&optional arg)
- "Ensure mark is active; move point right ARG characters (left if ARG negative).
-On reaching end of buffer, stop and signal error."
- (interactive "p")
- (pc-select-ensure-mark)
- (forward-char arg))
-
-(defun forward-word-mark (&optional arg)
- "Ensure mark is active; move point right ARG words (backward if ARG is negative).
-Normally returns t.
-If an edge of the buffer is reached, point is left there
-and nil is returned."
- (interactive "p")
- (pc-select-ensure-mark)
- (forward-word arg))
-
-(defun forward-line-mark (&optional arg)
- "Ensure mark is active; move cursor vertically down ARG lines."
- (interactive "p")
- (pc-select-ensure-mark)
- (forward-line arg)
- (setq this-command 'forward-line)
-)
-
-(defun forward-sexp-mark (&optional arg)
- "Ensure mark is active; move forward across one balanced expression (sexp).
-With argument, do it that many times. Negative arg -N means
-move backward across N balanced expressions."
- (interactive "p")
- (pc-select-ensure-mark)
- (forward-sexp arg))
-
-(defun forward-paragraph-mark (&optional arg)
- "Ensure mark is active; move forward to end of paragraph.
-With arg N, do it N times; negative arg -N means move backward N paragraphs.
-
-A line which `paragraph-start' matches either separates paragraphs
-\(if `paragraph-separate' matches it also) or is the first line of a paragraph.
-A paragraph end is the beginning of a line which is not part of the paragraph
-to which the end of the previous line belongs, or the end of the buffer."
- (interactive "p")
- (pc-select-ensure-mark)
- (forward-paragraph arg))
-
-(defun next-line-mark (&optional arg)
- "Ensure mark is active; move cursor vertically down ARG lines.
-If there is no character in the target line exactly under the current column,
-the cursor is positioned after the character in that line which spans this
-column, or at the end of the line if it is not long enough.
-If there is no line in the buffer after this one, behavior depends on the
-value of `next-line-add-newlines'. If non-nil, it inserts a newline character
-to create a line, and moves the cursor to that line. Otherwise it moves the
-cursor to the end of the buffer \(if already at the end of the buffer, an error
-is signaled).
-
-The command \\[set-goal-column] can be used to create
-a semipermanent goal column to which this command always moves.
-Then it does not try to move vertically. This goal column is stored
-in `goal-column', which is nil when there is none."
- (interactive "p")
- (pc-select-ensure-mark)
- (with-no-warnings (next-line arg))
- (setq this-command 'next-line))
-
-(defun end-of-line-mark (&optional arg)
- "Ensure mark is active; move point to end of current line.
-With argument ARG not nil or 1, move forward ARG - 1 lines first.
-If scan reaches end of buffer, stop there without error."
- (interactive "p")
- (pc-select-ensure-mark)
- (end-of-line arg)
- (setq this-command 'end-of-line))
-
-(defun backward-line-mark (&optional arg)
- "Ensure mark is active; move cursor vertically up ARG lines."
- (interactive "p")
- (pc-select-ensure-mark)
- (if (null arg)
- (setq arg 1))
- (forward-line (- arg))
- (setq this-command 'forward-line)
-)
-
-(defun scroll-down-mark (&optional arg)
- "Ensure mark is active; scroll down ARG lines; or near full screen if no ARG.
-A near full screen is `next-screen-context-lines' less than a full screen.
-Negative ARG means scroll upward.
-When calling from a program, supply a number as argument or nil.
-Attempting to scroll past the edge of buffer does not raise an
-error, unless `pc-select-override-scroll-error' is nil."
- (interactive "P")
- (pc-select-ensure-mark)
- (cond (pc-select-override-scroll-error
- (condition-case nil (scroll-down arg)
- (beginning-of-buffer (goto-char (point-min)))))
- (t (scroll-down arg))))
-
-(defun end-of-buffer-mark (&optional arg)
- "Ensure mark is active; move point to the end of the buffer.
-With arg N, put point N/10 of the way from the end.
-
-If the buffer is narrowed, this command uses the beginning and size
-of the accessible part of the buffer.
-
-Don't use this command in Lisp programs!
-\(goto-char \(point-max)) is faster and avoids clobbering the mark."
- (interactive "P")
- (pc-select-ensure-mark)
- (let ((size (- (point-max) (point-min))))
- (goto-char (if arg
- (- (point-max)
- (if (> size 10000)
- ;; Avoid overflow for large buffer sizes!
- (* (prefix-numeric-value arg)
- (/ size 10))
- (/ (* size (prefix-numeric-value arg)) 10)))
- (point-max))))
- ;; If we went to a place in the middle of the buffer,
- ;; adjust it to the beginning of a line.
- (if arg (forward-line 1)
- ;; If the end of the buffer is not already on the screen,
- ;; then scroll specially to put it near, but not at, the bottom.
- (if (let ((old-point (point)))
- (save-excursion
- (goto-char (window-start))
- (vertical-motion (window-height))
- (< (point) old-point)))
- (progn
- (overlay-recenter (point))
- (recenter -3)))))
-
-;;;;;;;;;
-;;;;; no mark
-;;;;;;;;;
-
-(defun forward-char-nomark (&optional arg)
- "Deactivate mark; move point right ARG characters \(left if ARG negative).
-On reaching end of buffer, stop and signal error."
- (interactive "p")
- (pc-select-maybe-deactivate-mark)
- (forward-char arg))
-
-(defun forward-word-nomark (&optional arg)
- "Deactivate mark; move point right ARG words \(backward if ARG is negative).
-Normally returns t.
-If an edge of the buffer is reached, point is left there
-and nil is returned."
- (interactive "p")
- (pc-select-maybe-deactivate-mark)
- (forward-word arg))
-
-(defun forward-line-nomark (&optional arg)
- "Deactivate mark; move cursor vertically down ARG lines."
- (interactive "p")
- (pc-select-maybe-deactivate-mark)
- (forward-line arg)
- (setq this-command 'forward-line)
-)
-
-(defun forward-sexp-nomark (&optional arg)
- "Deactivate mark; move forward across one balanced expression (sexp).
-With argument, do it that many times. Negative arg -N means
-move backward across N balanced expressions."
- (interactive "p")
- (pc-select-maybe-deactivate-mark)
- (forward-sexp arg))
-
-(defun forward-paragraph-nomark (&optional arg)
- "Deactivate mark; move forward to end of paragraph.
-With arg N, do it N times; negative arg -N means move backward N paragraphs.
-
-A line which `paragraph-start' matches either separates paragraphs
-\(if `paragraph-separate' matches it also) or is the first line of a paragraph.
-A paragraph end is the beginning of a line which is not part of the paragraph
-to which the end of the previous line belongs, or the end of the buffer."
- (interactive "p")
- (pc-select-maybe-deactivate-mark)
- (forward-paragraph arg))
-
-(defun next-line-nomark (&optional arg)
- "Deactivate mark; move cursor vertically down ARG lines.
-If there is no character in the target line exactly under the current column,
-the cursor is positioned after the character in that line which spans this
-column, or at the end of the line if it is not long enough.
-If there is no line in the buffer after this one, behavior depends on the
-value of `next-line-add-newlines'. If non-nil, it inserts a newline character
-to create a line, and moves the cursor to that line. Otherwise it moves the
-cursor to the end of the buffer (if already at the end of the buffer, an error
-is signaled).
-
-The command \\[set-goal-column] can be used to create
-a semipermanent goal column to which this command always moves.
-Then it does not try to move vertically. This goal column is stored
-in `goal-column', which is nil when there is none."
- (interactive "p")
- (pc-select-maybe-deactivate-mark)
- (with-no-warnings (next-line arg))
- (setq this-command 'next-line))
-
-(defun end-of-line-nomark (&optional arg)
- "Deactivate mark; move point to end of current line.
-With argument ARG not nil or 1, move forward ARG - 1 lines first.
-If scan reaches end of buffer, stop there without error."
- (interactive "p")
- (pc-select-maybe-deactivate-mark)
- (end-of-line arg)
- (setq this-command 'end-of-line))
-
-(defun backward-line-nomark (&optional arg)
- "Deactivate mark; move cursor vertically up ARG lines."
- (interactive "p")
- (pc-select-maybe-deactivate-mark)
- (if (null arg)
- (setq arg 1))
- (forward-line (- arg))
- (setq this-command 'forward-line)
-)
-
-(defun scroll-down-nomark (&optional arg)
- "Deactivate mark; scroll down ARG lines; or near full screen if no ARG.
-A near full screen is `next-screen-context-lines' less than a full screen.
-Negative ARG means scroll upward.
-When calling from a program, supply a number as argument or nil.
-Attempting to scroll past the edge of buffer does not raise an
-error, unless `pc-select-override-scroll-error' is nil."
- (interactive "P")
- (pc-select-maybe-deactivate-mark)
- (cond (pc-select-override-scroll-error
- (condition-case nil (scroll-down arg)
- (beginning-of-buffer (goto-char (point-min)))))
- (t (scroll-down arg))))
-
-(defun end-of-buffer-nomark (&optional arg)
- "Deactivate mark; move point to the end of the buffer.
-With arg N, put point N/10 of the way from the end.
-
-If the buffer is narrowed, this command uses the beginning and size
-of the accessible part of the buffer.
-
-Don't use this command in Lisp programs!
-\(goto-char (point-max)) is faster and avoids clobbering the mark."
- (interactive "P")
- (pc-select-maybe-deactivate-mark)
- (let ((size (- (point-max) (point-min))))
- (goto-char (if arg
- (- (point-max)
- (if (> size 10000)
- ;; Avoid overflow for large buffer sizes!
- (* (prefix-numeric-value arg)
- (/ size 10))
- (/ (* size (prefix-numeric-value arg)) 10)))
- (point-max))))
- ;; If we went to a place in the middle of the buffer,
- ;; adjust it to the beginning of a line.
- (if arg (forward-line 1)
- ;; If the end of the buffer is not already on the screen,
- ;; then scroll specially to put it near, but not at, the bottom.
- (if (let ((old-point (point)))
- (save-excursion
- (goto-char (window-start))
- (vertical-motion (window-height))
- (< (point) old-point)))
- (progn
- (overlay-recenter (point))
- (recenter -3)))))
-
-
-;;;;;;;;;;;;;;;;;;;;
-;;;;;; backwards and mark
-;;;;;;;;;;;;;;;;;;;;
-
-(defun backward-char-mark (&optional arg)
- "Ensure mark is active; move point left ARG characters (right if ARG negative).
-On attempt to pass beginning or end of buffer, stop and signal error."
- (interactive "p")
- (pc-select-ensure-mark)
- (backward-char arg))
-
-(defun backward-word-mark (&optional arg)
- "Ensure mark is active; move backward until encountering the end of a word.
-With argument, do this that many times."
- (interactive "p")
- (pc-select-ensure-mark)
- (backward-word arg))
-
-(defun backward-sexp-mark (&optional arg)
- "Ensure mark is active; move backward across one balanced expression (sexp).
-With argument, do it that many times. Negative arg -N means
-move forward across N balanced expressions."
- (interactive "p")
- (pc-select-ensure-mark)
- (backward-sexp arg))
-
-(defun backward-paragraph-mark (&optional arg)
- "Ensure mark is active; move backward to start of paragraph.
-With arg N, do it N times; negative arg -N means move forward N paragraphs.
-
-A paragraph start is the beginning of a line which is a
-`first-line-of-paragraph' or which is ordinary text and follows a
-paragraph-separating line; except: if the first real line of a
-paragraph is preceded by a blank line, the paragraph starts at that
-blank line.
-
-See `forward-paragraph' for more information."
- (interactive "p")
- (pc-select-ensure-mark)
- (backward-paragraph arg))
-
-(defun previous-line-mark (&optional arg)
- "Ensure mark is active; move cursor vertically up ARG lines.
-If there is no character in the target line exactly over the current column,
-the cursor is positioned after the character in that line which spans this
-column, or at the end of the line if it is not long enough.
-
-The command \\[set-goal-column] can be used to create
-a semipermanent goal column to which this command always moves.
-Then it does not try to move vertically.
-
-If you are thinking of using this in a Lisp program, consider using
-`forward-line' with a negative argument instead. It is usually easier
-to use and more reliable (no dependence on goal column, etc.)."
- (interactive "p")
- (pc-select-ensure-mark)
- (with-no-warnings (previous-line arg))
- (setq this-command 'previous-line))
-
-(defun beginning-of-line-mark (&optional arg)
- "Ensure mark is active; move point to beginning of current line.
-With argument ARG not nil or 1, move forward ARG - 1 lines first.
-If scan reaches end of buffer, stop there without error."
- (interactive "p")
- (pc-select-ensure-mark)
- (beginning-of-line arg))
-
-
-(defun scroll-up-mark (&optional arg)
- "Ensure mark is active; scroll upward ARG lines; or near full screen if no ARG.
-A near full screen is `next-screen-context-lines' less than a full screen.
-Negative ARG means scroll downward.
-When calling from a program, supply a number as argument or nil.
-Attempting to scroll past the edge of buffer does not raise an
-error, unless `pc-select-override-scroll-error' is nil."
- (interactive "P")
- (pc-select-ensure-mark)
- (cond (pc-select-override-scroll-error
- (condition-case nil (scroll-up arg)
- (end-of-buffer (goto-char (point-max)))))
- (t (scroll-up arg))))
-
-(defun beginning-of-buffer-mark (&optional arg)
- "Ensure mark is active; move point to the beginning of the buffer.
-With arg N, put point N/10 of the way from the beginning.
-
-If the buffer is narrowed, this command uses the beginning and size
-of the accessible part of the buffer.
-
-Don't use this command in Lisp programs!
-\(goto-char (point-min)) is faster and avoids clobbering the mark."
- (interactive "P")
- (pc-select-ensure-mark)
- (let ((size (- (point-max) (point-min))))
- (goto-char (if arg
- (+ (point-min)
- (if (> size 10000)
- ;; Avoid overflow for large buffer sizes!
- (* (prefix-numeric-value arg)
- (/ size 10))
- (/ (+ 10 (* size (prefix-numeric-value arg))) 10)))
- (point-min))))
- (if arg (forward-line 1)))
-
-;;;;;;;;
-;;; no mark
-;;;;;;;;
-
-(defun backward-char-nomark (&optional arg)
- "Deactivate mark; move point left ARG characters (right if ARG negative).
-On attempt to pass beginning or end of buffer, stop and signal error."
- (interactive "p")
- (pc-select-maybe-deactivate-mark)
- (backward-char arg))
-
-(defun backward-word-nomark (&optional arg)
- "Deactivate mark; move backward until encountering the end of a word.
-With argument, do this that many times."
- (interactive "p")
- (pc-select-maybe-deactivate-mark)
- (backward-word arg))
-
-(defun backward-sexp-nomark (&optional arg)
- "Deactivate mark; move backward across one balanced expression (sexp).
-With argument, do it that many times. Negative arg -N means
-move forward across N balanced expressions."
- (interactive "p")
- (pc-select-maybe-deactivate-mark)
- (backward-sexp arg))
-
-(defun backward-paragraph-nomark (&optional arg)
- "Deactivate mark; move backward to start of paragraph.
-With arg N, do it N times; negative arg -N means move forward N paragraphs.
-
-A paragraph start is the beginning of a line which is a
-`first-line-of-paragraph' or which is ordinary text and follows a
-paragraph-separating line; except: if the first real line of a
-paragraph is preceded by a blank line, the paragraph starts at that
-blank line.
-
-See `forward-paragraph' for more information."
- (interactive "p")
- (pc-select-maybe-deactivate-mark)
- (backward-paragraph arg))
-
-(defun previous-line-nomark (&optional arg)
- "Deactivate mark; move cursor vertically up ARG lines.
-If there is no character in the target line exactly over the current column,
-the cursor is positioned after the character in that line which spans this
-column, or at the end of the line if it is not long enough.
-
-The command \\[set-goal-column] can be used to create
-a semipermanent goal column to which this command always moves.
-Then it does not try to move vertically."
- (interactive "p")
- (pc-select-maybe-deactivate-mark)
- (with-no-warnings (previous-line arg))
- (setq this-command 'previous-line))
-
-(defun beginning-of-line-nomark (&optional arg)
- "Deactivate mark; move point to beginning of current line.
-With argument ARG not nil or 1, move forward ARG - 1 lines first.
-If scan reaches end of buffer, stop there without error."
- (interactive "p")
- (pc-select-maybe-deactivate-mark)
- (beginning-of-line arg))
-
-(defun scroll-up-nomark (&optional arg)
- "Deactivate mark; scroll upward ARG lines; or near full screen if no ARG.
-A near full screen is `next-screen-context-lines' less than a full screen.
-Negative ARG means scroll downward.
-When calling from a program, supply a number as argument or nil.
-Attempting to scroll past the edge of buffer does not raise an
-error, unless `pc-select-override-scroll-error' is nil."
- (interactive "P")
- (pc-select-maybe-deactivate-mark)
- (cond (pc-select-override-scroll-error
- (condition-case nil (scroll-up arg)
- (end-of-buffer (goto-char (point-max)))))
- (t (scroll-up arg))))
-
-(defun beginning-of-buffer-nomark (&optional arg)
- "Deactivate mark; move point to the beginning of the buffer.
-With arg N, put point N/10 of the way from the beginning.
-
-If the buffer is narrowed, this command uses the beginning and size
-of the accessible part of the buffer.
-
-Don't use this command in Lisp programs!
-\(goto-char (point-min)) is faster and avoids clobbering the mark."
- (interactive "P")
- (pc-select-maybe-deactivate-mark)
- (let ((size (- (point-max) (point-min))))
- (goto-char (if arg
- (+ (point-min)
- (if (> size 10000)
- ;; Avoid overflow for large buffer sizes!
- (* (prefix-numeric-value arg)
- (/ size 10))
- (/ (+ 10 (* size (prefix-numeric-value arg))) 10)))
- (point-min))))
- (if arg (forward-line 1)))
-
-
-(defun pc-select-define-keys (alist keymap)
- "Make KEYMAP have the key bindings specified in ALIST."
- (let ((lst alist))
- (while lst
- (define-key keymap (caar lst) (cdar lst))
- (setq lst (cdr lst)))))
-
-(defun pc-select-restore-keys (alist keymap saved-map)
- "Use ALIST to restore key bindings from SAVED-MAP into KEYMAP.
-Go through all the key bindings in ALIST, and, for each key
-binding, if KEYMAP and ALIST still agree on the key binding,
-restore the previous value of that key binding from SAVED-MAP."
- (let ((lst alist))
- (while lst
- (when (equal (lookup-key keymap (caar lst)) (cdar lst))
- (define-key keymap (caar lst) (lookup-key saved-map (caar lst))))
- (setq lst (cdr lst)))))
-
-(defmacro pc-select-add-to-alist (alist var val)
- "Ensure that ALIST contains the cons cell (VAR . VAL).
-If a cons cell whose car is VAR is already on the ALIST, update the
-cdr of that cell with VAL. Otherwise, make a new cons cell
-\(VAR . VAL), and prepend it onto ALIST."
- (let ((elt (make-symbol "elt")))
- `(let ((,elt (assq ',var ,alist)))
- (if ,elt
- (setcdr ,elt ,val)
- (setq ,alist (cons (cons ',var ,val) ,alist))))))
-
-(defmacro pc-select-save-and-set-var (var newval)
- "Set VAR to NEWVAL; save the old value.
-The old value is saved on the `pc-select-saved-settings-alist'."
- `(when (boundp ',var)
- (pc-select-add-to-alist pc-select-saved-settings-alist ,var ,var)
- (setq ,var ,newval)))
-
-(defmacro pc-select-save-and-set-mode (mode &optional arg mode-var)
- "Call the function MODE; save the old value of the variable MODE.
-MODE is presumed to be a function which turns on a minor mode. First,
-save the value of the variable MODE on `pc-select-saved-settings-alist'.
-Then, if ARG is specified, call MODE with ARG, otherwise call it with
-nil as an argument. If MODE-VAR is specified, save the value of the
-variable MODE-VAR (instead of the value of the variable MODE) on
-`pc-select-saved-settings-alist'."
- (unless mode-var (setq mode-var mode))
- `(when (fboundp ',mode)
- (pc-select-add-to-alist pc-select-saved-settings-alist
- ,mode-var ,mode-var)
- (,mode ,arg)))
-
-(defmacro pc-select-restore-var (var)
- "Restore the previous value of the variable VAR.
-Look up VAR's previous value in `pc-select-saved-settings-alist', and,
-if the value is found, set VAR to that value."
- (let ((elt (make-symbol "elt")))
- `(let ((,elt (assq ',var pc-select-saved-settings-alist)))
- (unless (null ,elt)
- (setq ,var (cdr ,elt))))))
-
-(defmacro pc-select-restore-mode (mode)
- "Restore the previous state (either on or off) of the minor mode MODE.
-Look up the value of the variable MODE on `pc-select-saved-settings-alist'.
-If the value is non-nil, call the function MODE with an argument of
-1, otherwise call it with an argument of -1."
- (let ((elt (make-symbol "elt")))
- `(when (fboundp ',mode)
- (let ((,elt (assq ',mode pc-select-saved-settings-alist)))
- (unless (null ,elt)
- (,mode (if (cdr ,elt) 1 -1)))))))
-
-
-;;;###autoload
-(define-minor-mode pc-selection-mode
- "Change mark behavior to emulate Motif, Mac or MS-Windows cut and paste style.
-
-This mode enables Delete Selection mode and Transient Mark mode.
-
-The arrow keys (and others) are bound to new functions
-which modify the status of the mark.
-
-The ordinary arrow keys disable the mark.
-The shift-arrow keys move, leaving the mark behind.
-
-C-LEFT and C-RIGHT move back or forward one word, disabling the mark.
-S-C-LEFT and S-C-RIGHT move back or forward one word, leaving the mark behind.
-
-M-LEFT and M-RIGHT move back or forward one word or sexp, disabling the mark.
-S-M-LEFT and S-M-RIGHT move back or forward one word or sexp, leaving the mark
-behind. To control whether these keys move word-wise or sexp-wise set the
-variable `pc-select-meta-moves-sexps' after loading pc-select.el but before
-turning PC Selection mode on.
-
-C-DOWN and C-UP move back or forward a paragraph, disabling the mark.
-S-C-DOWN and S-C-UP move back or forward a paragraph, leaving the mark behind.
-
-HOME moves to beginning of line, disabling the mark.
-S-HOME moves to beginning of line, leaving the mark behind.
-With Ctrl or Meta, these keys move to beginning of buffer instead.
-
-END moves to end of line, disabling the mark.
-S-END moves to end of line, leaving the mark behind.
-With Ctrl or Meta, these keys move to end of buffer instead.
-
-PRIOR or PAGE-UP scrolls and disables the mark.
-S-PRIOR or S-PAGE-UP scrolls and leaves the mark behind.
-
-S-DELETE kills the region (`kill-region').
-S-INSERT yanks text from the kill ring (`yank').
-C-INSERT copies the region into the kill ring (`copy-region-as-kill').
-
-In addition, certain other PC bindings are imitated (to avoid this, set
-the variable `pc-select-selection-keys-only' to t after loading pc-select.el
-but before calling PC Selection mode):
-
- F6 other-window
- DELETE delete-char
- C-DELETE kill-line
- M-DELETE kill-word
- C-M-DELETE kill-sexp
- C-BACKSPACE backward-kill-word
- M-BACKSPACE undo"
- ;; FIXME: bring pc-bindings-mode here ?
- nil nil nil
-
- :group 'pc-select
- :global t
-
- (if pc-selection-mode
- (if (null pc-select-key-bindings-alist)
- (progn
- (setq pc-select-saved-global-map (copy-keymap (current-global-map)))
- (setq pc-select-key-bindings-alist
- (append pc-select-default-key-bindings
- (if pc-select-selection-keys-only
- nil
- pc-select-extra-key-bindings)
- (if pc-select-meta-moves-sexps
- (car pc-select-meta-moves-sexps-key-bindings)
- (cadr pc-select-meta-moves-sexps-key-bindings))
- (if (or pc-select-selection-keys-only
- (eq window-system 'x)
- (memq system-name '(ms-dos windows-nt)))
- nil
- pc-select-tty-key-bindings)))
-
- (pc-select-define-keys pc-select-key-bindings-alist
- (current-global-map))
-
- (unless (or pc-select-selection-keys-only
- (eq window-system 'x)
- (memq system-name '(ms-dos windows-nt)))
- ;; it is not clear that we need the following line
- ;; I hope it doesn't do too much harm to leave it in, though...
- (setq pc-select-old-M-delete-binding
- (lookup-key function-key-map [M-delete]))
- (define-key function-key-map [M-delete] [?\M-d]))
-
- (when (and (not pc-select-selection-keys-only)
- (or (eq window-system 'x)
- (memq system-name '(ms-dos windows-nt)))
- (fboundp 'normal-erase-is-backspace-mode))
- (pc-select-save-and-set-mode normal-erase-is-backspace-mode 1
- normal-erase-is-backspace))
- ;; the original author also had this above:
- ;; (setq-default normal-erase-is-backspace t)
- ;; However, the documentation for the variable says that
- ;; "setting it with setq has no effect", so I'm removing it.
-
- (pc-select-save-and-set-var highlight-nonselected-windows nil)
- (pc-select-save-and-set-var transient-mark-mode t)
- (pc-select-save-and-set-var mark-even-if-inactive t)
- (pc-select-save-and-set-mode delete-selection-mode 1))
- ;;else
- ;; If the user turned on pc-selection-mode a second time
- ;; do not clobber the values of the variables that were
- ;; saved from before pc-selection mode was activated --
- ;; just make sure the values are the way we like them.
- (pc-select-define-keys pc-select-key-bindings-alist
- (current-global-map))
- (unless (or pc-select-selection-keys-only
- (eq window-system 'x)
- (memq system-name '(ms-dos windows-nt)))
- ;; it is not clear that we need the following line
- ;; I hope it doesn't do too much harm to leave it in, though...
- (define-key function-key-map [M-delete] [?\M-d]))
- (when (and (not pc-select-selection-keys-only)
- (or (eq window-system 'x)
- (memq system-name '(ms-dos windows-nt)))
- (fboundp 'normal-erase-is-backspace-mode))
- (normal-erase-is-backspace-mode 1))
- (setq highlight-nonselected-windows nil)
- (setq transient-mark-mode t)
- (setq mark-even-if-inactive t)
- (delete-selection-mode 1))
- ;;else
- (when pc-select-key-bindings-alist
- (when (and (not pc-select-selection-keys-only)
- (or (eq window-system 'x)
- (memq system-name '(ms-dos windows-nt))))
- (pc-select-restore-mode normal-erase-is-backspace-mode))
-
- (pc-select-restore-keys
- pc-select-key-bindings-alist (current-global-map)
- pc-select-saved-global-map)
-
- (pc-select-restore-var highlight-nonselected-windows)
- (pc-select-restore-var transient-mark-mode)
- (pc-select-restore-var mark-even-if-inactive)
- (pc-select-restore-mode delete-selection-mode)
- (and pc-select-old-M-delete-binding
- (define-key function-key-map [M-delete]
- pc-select-old-M-delete-binding))
- (setq pc-select-key-bindings-alist nil
- pc-select-saved-settings-alist nil))))
-
-;;; pc-select.el ends here
diff --git a/lisp/erc/ChangeLog b/lisp/erc/ChangeLog
index ee81bc48693..b7cf79cc3cb 100644
--- a/lisp/erc/ChangeLog
+++ b/lisp/erc/ChangeLog
@@ -1,3 +1,13 @@
+2011-02-07 Julien Danjou <julien@danjou.info>
+
+ * erc-track.el (erc-window-configuration-change): New function.
+ This will allow to track buffer visibility when a command is
+ finished to executed. Idea stolen from rcirc.
+ (track): Put erc-window-configuration-change in
+ window-configuration-change-hook.
+ (erc-modified-channels-update): Remove
+ erc-modified-channels-update from post-command-hook after update.
+
2011-01-31 Antoine Levitt <antoine.levitt@gmail.com> (tiny change)
* erc-track.el (track): Don't reset erc-modified-channels-object
diff --git a/lisp/erc/erc-track.el b/lisp/erc/erc-track.el
index de920eb9c33..a89244f695d 100644
--- a/lisp/erc/erc-track.el
+++ b/lisp/erc/erc-track.el
@@ -653,7 +653,7 @@ module, otherwise the keybindings will not do anything useful."
(defadvice switch-to-buffer (after erc-update (&rest args) activate)
(erc-modified-channels-update))
(add-hook 'window-configuration-change-hook
- 'erc-modified-channels-update))
+ 'erc-window-configuration-change))
(add-hook 'erc-insert-post-hook 'erc-track-modified-channels)
(add-hook 'erc-disconnected-hook 'erc-modified-channels-update))
;; enable the tracking keybindings
@@ -675,7 +675,7 @@ module, otherwise the keybindings will not do anything useful."
(if (featurep 'xemacs)
(ad-disable-advice 'switch-to-buffer 'after 'erc-update)
(remove-hook 'window-configuration-change-hook
- 'erc-modified-channels-update))
+ 'erc-window-configuration-change))
(remove-hook 'erc-disconnected-hook 'erc-modified-channels-update)
(remove-hook 'erc-insert-post-hook 'erc-track-modified-channels))
;; disable the tracking keybindings
@@ -730,6 +730,12 @@ only consider active buffers visible.")
;;; Tracking the channel modifications
+(defun erc-window-configuration-change ()
+ (unless (minibuffer-window-active-p (minibuffer-window))
+ ;; delay this until command has finished to make sure window is
+ ;; actually visible before clearing activity
+ (add-hook 'post-command-hook 'erc-modified-channels-update)))
+
(defvar erc-modified-channels-update-inside nil
"Variable to prevent running `erc-modified-channels-update' multiple
times. Without it, you cannot debug `erc-modified-channels-display',
@@ -757,8 +763,9 @@ ARGS are ignored."
(erc-modified-channels-remove-buffer buffer))))
erc-modified-channels-alist)
(when removed-channel
- (erc-modified-channels-display)
- (force-mode-line-update t)))))
+ (erc-modified-channels-display)
+ (force-mode-line-update t)))
+ (remove-hook 'post-command-hook 'erc-modified-channels-update)))
(defvar erc-track-mouse-face (if (featurep 'xemacs)
'modeline-mousable
diff --git a/lisp/gnus/ChangeLog b/lisp/gnus/ChangeLog
index a18f145cb68..ba4d270951b 100644
--- a/lisp/gnus/ChangeLog
+++ b/lisp/gnus/ChangeLog
@@ -1,3 +1,20 @@
+2011-02-09 Lars Ingebrigtsen <larsi@gnus.org>
+
+ * nntp.el (nntp-retrieve-group-data-early-disabled): Disable the async
+ code for now, since it doesn't work for all users.
+
+2011-02-09 Julien Danjou <julien@danjou.info>
+
+ * message.el (message-options): Make message-options really buffer
+ local.
+
+2011-02-08 Julien Danjou <julien@danjou.info>
+
+ * shr.el (shr-tag-body): Add support for text attribute in body
+ markups.
+
+ * message.el (message-options): Make message-options a local variable.
+
2011-02-07 Lars Ingebrigtsen <larsi@gnus.org>
* nnimap.el (nnimap-update-info): Refactor slightly.
@@ -7,6 +24,7 @@
characters.
(nnimap-process-quirk): Renamed function to avoid collision.
(nnimap-update-info): Fix macrology bug-out.
+ (nnimap-update-info): Simplify split history test.
2011-02-06 Lars Ingebrigtsen <larsi@gnus.org>
diff --git a/lisp/gnus/message.el b/lisp/gnus/message.el
index 3ba57caba4f..e30f7f2c973 100644
--- a/lisp/gnus/message.el
+++ b/lisp/gnus/message.el
@@ -1814,6 +1814,7 @@ You must have the \"hashcash\" binary installed, see `hashcash-path'."
(defvar message-options nil
"Some saved answers when sending message.")
+(make-variable-buffer-local 'message-options)
(defvar message-send-mail-real-function nil
"Internal send mail function.")
diff --git a/lisp/gnus/nnimap.el b/lisp/gnus/nnimap.el
index 127082bc28f..a6fe6b1489b 100644
--- a/lisp/gnus/nnimap.el
+++ b/lisp/gnus/nnimap.el
@@ -1342,13 +1342,11 @@ textual parts.")
;; Tell Gnus whether there are any \Recent messages in any of
;; the groups.
(let ((recent (cdr (assoc '%Recent flags))))
- (when (and active recent)
- (while recent
- (when (> (car recent) (cdr active))
- (push (list (cons (gnus-group-real-name group) 0))
- nnmail-split-history)
- (setq recent nil))
- (pop recent))))
+ (when (and active
+ recent
+ (> (car (last recent)) (cdr active)))
+ (push (list (cons (gnus-group-real-name group) 0))
+ nnmail-split-history)))
;; Note the active level for the next run-through.
(gnus-group-set-parameter info 'active (gnus-active group))
(gnus-group-set-parameter info 'uidvalidity uidvalidity)
diff --git a/lisp/gnus/nntp.el b/lisp/gnus/nntp.el
index 0e009b2068b..eb2dd004638 100644
--- a/lisp/gnus/nntp.el
+++ b/lisp/gnus/nntp.el
@@ -774,7 +774,7 @@ command whose response triggered the error."
(nntp-copy-to-buffer nntp-server-buffer (point-min) (point-max))
'headers)))))
-(deffoo nntp-retrieve-group-data-early (server infos)
+(deffoo nntp-retrieve-group-data-early-disabled (server infos)
"Retrieve group info on INFOS."
(nntp-with-open-group nil server
(when (nntp-find-connection-buffer nntp-server-buffer)
@@ -793,7 +793,7 @@ command whose response triggered the error."
nil command (gnus-group-real-name (gnus-info-group info)))))
(length infos)))))
-(deffoo nntp-finish-retrieve-group-infos (server infos count)
+(deffoo nntp-finish-retrieve-group-infos-disabled (server infos count)
(nntp-with-open-group nil server
(let ((buf (nntp-find-connection-buffer nntp-server-buffer))
(method (gnus-find-method-for-group
diff --git a/lisp/gnus/shr.el b/lisp/gnus/shr.el
index 5b4e6c7389d..bb9695ebb72 100644
--- a/lisp/gnus/shr.el
+++ b/lisp/gnus/shr.el
@@ -696,7 +696,8 @@ ones, in case fg and bg are nil."
(defun shr-tag-body (cont)
(let* ((start (point))
- (fgcolor (cdr (assq :fgcolor cont)))
+ (fgcolor (cdr (or (assq :fgcolor cont)
+ (assq :text cont))))
(bgcolor (cdr (assq :bgcolor cont)))
(shr-stylesheet (list (cons 'color fgcolor)
(cons 'background-color bgcolor))))
diff --git a/lisp/ibuffer.el b/lisp/ibuffer.el
index 3e5b301cbfb..04048e0e572 100644
--- a/lisp/ibuffer.el
+++ b/lisp/ibuffer.el
@@ -2638,7 +2638,7 @@ will be inserted before the group at point."
;;;;;; ibuffer-backward-filter-group ibuffer-forward-filter-group
;;;;;; ibuffer-toggle-filter-group ibuffer-mouse-toggle-filter-group
;;;;;; ibuffer-interactive-filter-by-mode ibuffer-mouse-filter-by-mode
-;;;;;; ibuffer-auto-mode) "ibuf-ext" "ibuf-ext.el" "f163e17664a89a6f0aa2b15bfaaa65a4")
+;;;;;; ibuffer-auto-mode) "ibuf-ext" "ibuf-ext.el" "eb3de21aef70e4ca75f611f1c3c56aa1")
;;; Generated autoloads from ibuf-ext.el
(autoload 'ibuffer-auto-mode "ibuf-ext" "\
diff --git a/lisp/net/rcirc.el b/lisp/net/rcirc.el
index 21934ce8b01..62fa7eb0feb 100644
--- a/lisp/net/rcirc.el
+++ b/lisp/net/rcirc.el
@@ -2185,14 +2185,23 @@ With a prefix arg, prompt for new topic."
(defun rcirc-cmd-ctcp (args &optional process target)
(if (string-match "^\\([^ ]+\\)\\s-+\\(.+\\)$" args)
- (let ((target (match-string 1 args))
- (request (match-string 2 args)))
- (rcirc-send-string process
- (format "PRIVMSG %s \C-a%s\C-a"
- target (upcase request))))
+ (let* ((target (match-string 1 args))
+ (request (upcase (match-string 2 args)))
+ (function (intern-soft (concat "rcirc-ctcp-sender-" request))))
+ (if (fboundp function) ;; use special function if available
+ (funcall function process target request)
+ (rcirc-send-string process
+ (format "PRIVMSG %s :\C-a%s\C-a"
+ target request))))
(rcirc-print process (rcirc-nick process) "ERROR" nil
"usage: /ctcp NICK REQUEST")))
+(defun rcirc-ctcp-sender-PING (process target request)
+ "Send a CTCP PING message to TARGET."
+ (let ((timestamp (format "%.0f" (float-time))))
+ (rcirc-send-string process
+ (format "PRIVMSG %s :\C-aPING %s\C-a" target timestamp))))
+
(defun rcirc-cmd-me (args &optional process target)
(rcirc-send-string process (format "PRIVMSG %s :\C-aACTION %s\C-a"
target args)))
diff --git a/lisp/emulation/pc-mode.el b/lisp/obsolete/pc-mode.el
index c0ed1925b49..192392d3821 100644
--- a/lisp/emulation/pc-mode.el
+++ b/lisp/obsolete/pc-mode.el
@@ -4,6 +4,7 @@
;; Maintainer: FSF
;; Keywords: emulations
+;; Obsolete-since: 24.1
;; This file is part of GNU Emacs.
diff --git a/lisp/obsolete/pc-select.el b/lisp/obsolete/pc-select.el
new file mode 100644
index 00000000000..9a5f9e9d9dc
--- /dev/null
+++ b/lisp/obsolete/pc-select.el
@@ -0,0 +1,417 @@
+;;; pc-select.el --- emulate mark, cut, copy and paste from Motif
+;;; (or MAC GUI or MS-windoze (bah)) look-and-feel
+;;; including key bindings.
+
+;; Copyright (C) 1995-1997, 2000-2011 Free Software Foundation, Inc.
+
+;; Author: Michael Staats <michael@thp.Uni-Duisburg.DE>
+;; Keywords: convenience emulations
+;; Created: 26 Sep 1995
+;; Obsolete-since: 24.1
+
+;; 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 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
+;; 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. If not, see <http://www.gnu.org/licenses/>.
+
+;;; Commentary:
+
+;; This package emulates the mark, copy, cut and paste look-and-feel of motif
+;; programs (which is the same as the MAC gui and (sorry for that) MS-Windows).
+;; It modifies the keybindings of the cursor keys and the next, prior,
+;; home and end keys. They will modify mark-active.
+;; You can still get the old behavior of cursor moving with the
+;; control sequences C-f, C-b, etc.
+;; This package uses transient-mark-mode and
+;; delete-selection-mode.
+;;
+;; In addition to that all key-bindings from the pc-mode are
+;; done here too (as suggested by RMS).
+;;
+;; As I found out after I finished the first version, s-region.el tries
+;; to do the same.... But my code is a little more complete and using
+;; delete-selection-mode is very important for the look-and-feel.
+;; Pete Forman <pete.forman@airgun.wg.waii.com> provided some motif
+;; compliant keybindings which I added. I had to modify them a little
+;; to add the -mark and -nomark functionality of cursor moving.
+;;
+;; Credits:
+;; Many thanks to all who made comments.
+;; Thanks to RMS and Ralf Muschall <prm@rz.uni-jena.de> for criticism.
+;; Kevin Cutts <cutts@ukraine.corp.mot.com> added the beginning-of-buffer
+;; and end-of-buffer functions which I modified a little.
+;; David Biesack <sasdjb@unx.sas.com> suggested some more cleanup.
+;; Thanks to Pete Forman <pete.forman@airgun.wg.waii.com>
+;; for additional motif keybindings.
+;; Thanks to jvromans@squirrel.nl (Johan Vromans) for a bug report
+;; concerning setting of this-command.
+;; Dan Nicolaescu <done@ece.arizona.ro> suggested suppressing the
+;; scroll-up/scroll-down error.
+;; Eli Barzilay (eli@cs.bgu.ac.il) suggested the sexps functions and
+;; keybindings.
+;;
+;; Ok, some details about the idea of PC Selection mode:
+;;
+;; o The standard keys for moving around (right, left, up, down, home, end,
+;; prior, next, called "move-keys" from now on) will always de-activate
+;; the mark.
+;; o If you press "Shift" together with the "move-keys", the region
+;; you pass along is activated
+;; o You have the copy, cut and paste functions (as in many other programs)
+;; which will operate on the active region
+;; It was not possible to bind them to C-v, C-x and C-c for obvious
+;; emacs reasons.
+;; They will be bound according to the "old" behavior to S-delete (cut),
+;; S-insert (paste) and C-insert (copy). These keys do the same in many
+;; other programs.
+;;
+
+;;; Code:
+
+;; Customization:
+(defgroup pc-select nil
+ "Emulate pc bindings."
+ :prefix "pc-select"
+ :group 'emulations)
+
+(define-obsolete-variable-alias 'pc-select-override-scroll-error
+ 'scroll-error-top-bottom
+ "24.1")
+(defcustom pc-select-override-scroll-error t
+ "Non-nil means don't generate error on scrolling past edge of buffer.
+This variable applies in PC Selection mode only.
+The scroll commands normally generate an error if you try to scroll
+past the top or bottom of the buffer. This is annoying when selecting
+text with these commands. If you set this variable to non-nil, these
+errors are suppressed."
+ :type 'boolean
+ :group 'pc-select)
+
+(defcustom pc-select-selection-keys-only nil
+ "Non-nil means only bind the basic selection keys when started.
+Other keys that emulate pc-behavior will be untouched.
+This gives mostly Emacs-like behavior with only the selection keys enabled."
+ :type 'boolean
+ :group 'pc-select)
+
+(defcustom pc-select-meta-moves-sexps nil
+ "Non-nil means move sexp-wise with Meta key, otherwise move word-wise."
+ :type 'boolean
+ :group 'pc-select)
+
+(defcustom pc-selection-mode-hook nil
+ "The hook to run when PC Selection mode is toggled."
+ :type 'hook
+ :group 'pc-select)
+
+(defvar pc-select-saved-settings-alist nil
+ "The values of the variables before PC Selection mode was toggled on.
+When PC Selection mode is toggled on, it sets quite a few variables
+for its own purposes. This alist holds the original values of the
+variables PC Selection mode had set, so that these variables can be
+restored to their original values when PC Selection mode is toggled off.")
+
+(defvar pc-select-map nil
+ "The keymap used as the global map when PC Selection mode is on." )
+
+(defvar pc-select-saved-global-map nil
+ "The global map that was in effect when PC Selection mode was toggled on.")
+
+(defvar pc-select-key-bindings-alist nil
+ "This alist holds all the key bindings PC Selection mode sets.")
+
+(defvar pc-select-default-key-bindings nil
+ "These key bindings always get set by PC Selection mode.")
+
+(defvar pc-select-extra-key-bindings
+ ;; The following keybindings are for standard ISO keyboards
+ ;; as they are used with IBM compatible PCs, IBM RS/6000,
+ ;; MACs, many X-Stations and probably more.
+ '(;; Commented out since it's been standard at least since Emacs-21.
+ ;;([S-insert] . yank)
+ ;;([C-insert] . copy-region-as-kill)
+ ;;([S-delete] . kill-region)
+
+ ;; The following bindings are useful on Sun Type 3 keyboards
+ ;; They implement the Get-Delete-Put (copy-cut-paste)
+ ;; functions from sunview on the L6, L8 and L10 keys
+ ;; Sam Steingold <sds@gnu.org> says that f16 is copy and f18 is paste.
+ ([f16] . copy-region-as-kill)
+ ([f18] . yank)
+ ([f20] . kill-region)
+
+ ;; The following bindings are from Pete Forman.
+ ([f6] . other-window) ; KNextPane F6
+ ([C-delete] . kill-line) ; KEraseEndLine cDel
+ ("\M-\d" . undo) ; KUndo aBS
+
+ ;; The following binding is taken from pc-mode.el
+ ;; as suggested by RMS.
+ ;; I only used the one that is not covered above.
+ ([C-M-delete] . kill-sexp)
+ ;; Next line proposed by Eli Barzilay
+ ([C-escape] . electric-buffer-list))
+ "Key bindings to set only if `pc-select-selection-keys-only' is nil.")
+
+(defvar pc-select-meta-moves-sexps-key-bindings
+ '((([M-right] . forward-sexp)
+ ([M-left] . backward-sexp))
+ (([M-right] . forward-word)
+ ([M-left] . backward-word)))
+ "The list of key bindings controlled by `pc-select-meta-moves-sexp'.
+The bindings in the car of this list get installed if
+`pc-select-meta-moves-sexp' is t, the bindings in the cadr of this
+list get installed otherwise.")
+
+;; This is for tty. We don't turn on normal-erase-is-backspace,
+;; but bind keys as pc-selection-mode did before
+;; normal-erase-is-backspace was invented, to keep us back
+;; compatible.
+(defvar pc-select-tty-key-bindings
+ '(([delete] . delete-char) ; KDelete Del
+ ([C-backspace] . backward-kill-word))
+ "The list of key bindings controlled by `pc-select-selection-keys-only'.
+These key bindings get installed when running in a tty, but only if
+`pc-select-selection-keys-only' is nil.")
+
+(defvar pc-select-old-M-delete-binding nil
+ "Holds the old mapping of [M-delete] in the `function-key-map'.
+This variable holds the value associated with [M-delete] in the
+`function-key-map' before PC Selection mode had changed that
+association.")
+
+;;;;
+;; misc
+;;;;
+
+(provide 'pc-select)
+
+(defun pc-select-define-keys (alist keymap)
+ "Make KEYMAP have the key bindings specified in ALIST."
+ (let ((lst alist))
+ (while lst
+ (define-key keymap (caar lst) (cdar lst))
+ (setq lst (cdr lst)))))
+
+(defun pc-select-restore-keys (alist keymap saved-map)
+ "Use ALIST to restore key bindings from SAVED-MAP into KEYMAP.
+Go through all the key bindings in ALIST, and, for each key
+binding, if KEYMAP and ALIST still agree on the key binding,
+restore the previous value of that key binding from SAVED-MAP."
+ (let ((lst alist))
+ (while lst
+ (when (equal (lookup-key keymap (caar lst)) (cdar lst))
+ (define-key keymap (caar lst) (lookup-key saved-map (caar lst))))
+ (setq lst (cdr lst)))))
+
+(defmacro pc-select-add-to-alist (alist var val)
+ "Ensure that ALIST contains the cons cell (VAR . VAL).
+If a cons cell whose car is VAR is already on the ALIST, update the
+cdr of that cell with VAL. Otherwise, make a new cons cell
+\(VAR . VAL), and prepend it onto ALIST."
+ (let ((elt (make-symbol "elt")))
+ `(let ((,elt (assq ',var ,alist)))
+ (if ,elt
+ (setcdr ,elt ,val)
+ (setq ,alist (cons (cons ',var ,val) ,alist))))))
+
+(defmacro pc-select-save-and-set-var (var newval)
+ "Set VAR to NEWVAL; save the old value.
+The old value is saved on the `pc-select-saved-settings-alist'."
+ `(when (boundp ',var)
+ (pc-select-add-to-alist pc-select-saved-settings-alist ,var ,var)
+ (setq ,var ,newval)))
+
+(defmacro pc-select-save-and-set-mode (mode &optional arg mode-var)
+ "Call the function MODE; save the old value of the variable MODE.
+MODE is presumed to be a function which turns on a minor mode. First,
+save the value of the variable MODE on `pc-select-saved-settings-alist'.
+Then, if ARG is specified, call MODE with ARG, otherwise call it with
+nil as an argument. If MODE-VAR is specified, save the value of the
+variable MODE-VAR (instead of the value of the variable MODE) on
+`pc-select-saved-settings-alist'."
+ (unless mode-var (setq mode-var mode))
+ `(when (fboundp ',mode)
+ (pc-select-add-to-alist pc-select-saved-settings-alist
+ ,mode-var ,mode-var)
+ (,mode ,arg)))
+
+(defmacro pc-select-restore-var (var)
+ "Restore the previous value of the variable VAR.
+Look up VAR's previous value in `pc-select-saved-settings-alist', and,
+if the value is found, set VAR to that value."
+ (let ((elt (make-symbol "elt")))
+ `(let ((,elt (assq ',var pc-select-saved-settings-alist)))
+ (unless (null ,elt)
+ (setq ,var (cdr ,elt))))))
+
+(defmacro pc-select-restore-mode (mode)
+ "Restore the previous state (either on or off) of the minor mode MODE.
+Look up the value of the variable MODE on `pc-select-saved-settings-alist'.
+If the value is non-nil, call the function MODE with an argument of
+1, otherwise call it with an argument of -1."
+ (let ((elt (make-symbol "elt")))
+ `(when (fboundp ',mode)
+ (let ((,elt (assq ',mode pc-select-saved-settings-alist)))
+ (unless (null ,elt)
+ (,mode (if (cdr ,elt) 1 -1)))))))
+
+
+;;;###autoload
+(define-minor-mode pc-selection-mode
+ "Change mark behavior to emulate Motif, Mac or MS-Windows cut and paste style.
+
+This mode enables Delete Selection mode and Transient Mark mode.
+
+The arrow keys (and others) are bound to new functions
+which modify the status of the mark.
+
+The ordinary arrow keys disable the mark.
+The shift-arrow keys move, leaving the mark behind.
+
+C-LEFT and C-RIGHT move back or forward one word, disabling the mark.
+S-C-LEFT and S-C-RIGHT move back or forward one word, leaving the mark behind.
+
+M-LEFT and M-RIGHT move back or forward one word or sexp, disabling the mark.
+S-M-LEFT and S-M-RIGHT move back or forward one word or sexp, leaving the mark
+behind. To control whether these keys move word-wise or sexp-wise set the
+variable `pc-select-meta-moves-sexps' after loading pc-select.el but before
+turning PC Selection mode on.
+
+C-DOWN and C-UP move back or forward a paragraph, disabling the mark.
+S-C-DOWN and S-C-UP move back or forward a paragraph, leaving the mark behind.
+
+HOME moves to beginning of line, disabling the mark.
+S-HOME moves to beginning of line, leaving the mark behind.
+With Ctrl or Meta, these keys move to beginning of buffer instead.
+
+END moves to end of line, disabling the mark.
+S-END moves to end of line, leaving the mark behind.
+With Ctrl or Meta, these keys move to end of buffer instead.
+
+PRIOR or PAGE-UP scrolls and disables the mark.
+S-PRIOR or S-PAGE-UP scrolls and leaves the mark behind.
+
+S-DELETE kills the region (`kill-region').
+S-INSERT yanks text from the kill ring (`yank').
+C-INSERT copies the region into the kill ring (`copy-region-as-kill').
+
+In addition, certain other PC bindings are imitated (to avoid this, set
+the variable `pc-select-selection-keys-only' to t after loading pc-select.el
+but before calling PC Selection mode):
+
+ F6 other-window
+ DELETE delete-char
+ C-DELETE kill-line
+ M-DELETE kill-word
+ C-M-DELETE kill-sexp
+ C-BACKSPACE backward-kill-word
+ M-BACKSPACE undo"
+ ;; FIXME: bring pc-bindings-mode here ?
+ nil nil nil
+
+ :group 'pc-select
+ :global t
+
+ (if pc-selection-mode
+ (if (null pc-select-key-bindings-alist)
+ (progn
+ (setq pc-select-saved-global-map (copy-keymap (current-global-map)))
+ (setq pc-select-key-bindings-alist
+ (append pc-select-default-key-bindings
+ (if pc-select-selection-keys-only
+ nil
+ pc-select-extra-key-bindings)
+ (if pc-select-meta-moves-sexps
+ (car pc-select-meta-moves-sexps-key-bindings)
+ (cadr pc-select-meta-moves-sexps-key-bindings))
+ (if (or pc-select-selection-keys-only
+ (eq window-system 'x)
+ (memq system-name '(ms-dos windows-nt)))
+ nil
+ pc-select-tty-key-bindings)))
+
+ (pc-select-define-keys pc-select-key-bindings-alist
+ (current-global-map))
+
+ (unless (or pc-select-selection-keys-only
+ (eq window-system 'x)
+ (memq system-name '(ms-dos windows-nt)))
+ ;; it is not clear that we need the following line
+ ;; I hope it doesn't do too much harm to leave it in, though...
+ (setq pc-select-old-M-delete-binding
+ (lookup-key function-key-map [M-delete]))
+ (define-key function-key-map [M-delete] [?\M-d]))
+
+ (when (and (not pc-select-selection-keys-only)
+ (or (eq window-system 'x)
+ (memq system-name '(ms-dos windows-nt)))
+ (fboundp 'normal-erase-is-backspace-mode))
+ (pc-select-save-and-set-mode normal-erase-is-backspace-mode 1
+ normal-erase-is-backspace))
+ ;; the original author also had this above:
+ ;; (setq-default normal-erase-is-backspace t)
+ ;; However, the documentation for the variable says that
+ ;; "setting it with setq has no effect", so I'm removing it.
+
+ (pc-select-save-and-set-var highlight-nonselected-windows nil)
+ (pc-select-save-and-set-var transient-mark-mode t)
+ (pc-select-save-and-set-var shift-select-mode t)
+ (pc-select-save-and-set-var mark-even-if-inactive t)
+ (pc-select-save-and-set-mode delete-selection-mode 1))
+ ;;else
+ ;; If the user turned on pc-selection-mode a second time
+ ;; do not clobber the values of the variables that were
+ ;; saved from before pc-selection mode was activated --
+ ;; just make sure the values are the way we like them.
+ (pc-select-define-keys pc-select-key-bindings-alist
+ (current-global-map))
+ (unless (or pc-select-selection-keys-only
+ (eq window-system 'x)
+ (memq system-name '(ms-dos windows-nt)))
+ ;; it is not clear that we need the following line
+ ;; I hope it doesn't do too much harm to leave it in, though...
+ (define-key function-key-map [M-delete] [?\M-d]))
+ (when (and (not pc-select-selection-keys-only)
+ (or (eq window-system 'x)
+ (memq system-name '(ms-dos windows-nt)))
+ (fboundp 'normal-erase-is-backspace-mode))
+ (normal-erase-is-backspace-mode 1))
+ (setq highlight-nonselected-windows nil)
+ (setq transient-mark-mode t)
+ (setq mark-even-if-inactive t)
+ (delete-selection-mode 1))
+ ;;else
+ (when pc-select-key-bindings-alist
+ (when (and (not pc-select-selection-keys-only)
+ (or (eq window-system 'x)
+ (memq system-name '(ms-dos windows-nt))))
+ (pc-select-restore-mode normal-erase-is-backspace-mode))
+
+ (pc-select-restore-keys
+ pc-select-key-bindings-alist (current-global-map)
+ pc-select-saved-global-map)
+
+ (pc-select-restore-var highlight-nonselected-windows)
+ (pc-select-restore-var transient-mark-mode)
+ (pc-select-restore-var shift-select-mode)
+ (pc-select-restore-var mark-even-if-inactive)
+ (pc-select-restore-mode delete-selection-mode)
+ (and pc-select-old-M-delete-binding
+ (define-key function-key-map [M-delete]
+ pc-select-old-M-delete-binding))
+ (setq pc-select-key-bindings-alist nil
+ pc-select-saved-settings-alist nil))))
+(make-obsolete 'pc-selection-mode 'delete-selection-mode "24.1")
+
+;;; pc-select.el ends here
diff --git a/lisp/progmodes/sh-script.el b/lisp/progmodes/sh-script.el
index d80d814156e..900072fe356 100644
--- a/lisp/progmodes/sh-script.el
+++ b/lisp/progmodes/sh-script.el
@@ -948,12 +948,12 @@ Point is at the beginning of the next line."
;; We're looking at <<STRING, so we add "^STRING$" to the syntactic
;; font-lock keywords to detect the end of this here document.
(let ((str (replace-regexp-in-string "['\"]" "" string))
- (ppss (save-excursion (syntax-ppss (1- (point))))))
+ (ppss (save-excursion (syntax-ppss eol))))
(if (nth 4 ppss)
;; The \n not only starts the heredoc but also closes a comment.
;; Let's close the comment just before the \n.
- (put-text-property (1- (point)) (point) 'syntax-table '(12))) ;">"
- (if (or (nth 5 ppss) (> (count-lines start (point)) 1))
+ (put-text-property (1- eol) eol 'syntax-table '(12))) ;">"
+ (if (or (nth 5 ppss) (> (count-lines start eol) 1))
;; If the sh-escaped-line-re part of sh-here-doc-open-re has matched
;; several lines, make sure we refontify them together.
;; Furthermore, if (nth 5 ppss) is non-nil (i.e. the \n is
@@ -961,7 +961,7 @@ Point is at the beginning of the next line."
;; Don't bother fixing it now, but place a multiline property so
;; that when jit-lock-context-* refontifies the rest of the
;; buffer, it also refontifies the current line with it.
- (put-text-property start (point) 'syntax-multiline t))
+ (put-text-property start (1+ eol) 'syntax-multiline t))
(put-text-property eol (1+ eol) 'sh-here-doc-marker str)
(prog1 sh-here-doc-syntax
(goto-char (+ 2 start))))))
@@ -1083,33 +1083,33 @@ subshells can nest."
(defun sh-syntax-propertize-function (start end)
(goto-char start)
(sh-syntax-propertize-here-doc end)
- (funcall
- (syntax-propertize-rules
+ (funcall
+ (syntax-propertize-rules
(sh-here-doc-open-re
(2 (sh-font-lock-open-heredoc
(match-beginning 0) (match-string 1) (match-beginning 2))))
("\\s|" (0 (prog1 nil (sh-syntax-propertize-here-doc end))))
- ;; A `#' begins a comment when it is unquoted and at the
- ;; beginning of a word. In the shell, words are separated by
- ;; metacharacters. The list of special chars is taken from
- ;; the single-unix spec of the shell command language (under
- ;; `quoting') but with `$' removed.
- ("[^|&;<>()`\\\"' \t\n]\\(#+\\)" (1 "_"))
- ;; In a '...' the backslash is not escaping.
- ("\\(\\\\\\)'" (1 (sh-font-lock-backslash-quote)))
- ;; Make sure $@ and $? are correctly recognized as sexps.
- ("\\$\\([?@]\\)" (1 "_"))
- ;; Distinguish the special close-paren in `case'.
- (")" (0 (sh-font-lock-paren (match-beginning 0))))
- ;; Highlight (possibly nested) subshells inside "" quoted
- ;; regions correctly.
+ ;; A `#' begins a comment when it is unquoted and at the
+ ;; beginning of a word. In the shell, words are separated by
+ ;; metacharacters. The list of special chars is taken from
+ ;; the single-unix spec of the shell command language (under
+ ;; `quoting') but with `$' removed.
+ ("[^|&;<>()`\\\"' \t\n]\\(#+\\)" (1 "_"))
+ ;; In a '...' the backslash is not escaping.
+ ("\\(\\\\\\)'" (1 (sh-font-lock-backslash-quote)))
+ ;; Make sure $@ and $? are correctly recognized as sexps.
+ ("\\$\\([?@]\\)" (1 "_"))
+ ;; Distinguish the special close-paren in `case'.
+ (")" (0 (sh-font-lock-paren (match-beginning 0))))
+ ;; Highlight (possibly nested) subshells inside "" quoted
+ ;; regions correctly.
("\"\\(?:\\(?:[^\\\"]\\|\\)*?[^\\]\\(?:\\\\\\\\\\)*\\)??\\(\\$(\\|`\\)"
- (1 (ignore
- ;; Save excursion because we want to also apply other
- ;; syntax-propertize rules within the affected region.
+ (1 (ignore
+ ;; Save excursion because we want to also apply other
+ ;; syntax-propertize rules within the affected region.
(if (nth 8 (syntax-ppss))
(goto-char (1+ (match-beginning 0)))
- (save-excursion
+ (save-excursion
(sh-font-lock-quoted-subshell end)))))))
(point) end))