/* Call a Lisp function interactively.
Copyright (C) 1985, 1986, 1993, 1994, 1995, 1997, 2000, 2001, 2002,
- 2003, 2004, 2005, 2006, 2007 Free Software Foundation, Inc.
+ 2003, 2004, 2005, 2006, 2007, 2008
+ Free Software Foundation, Inc.
This file is part of GNU Emacs.
-GNU Emacs is free software; you can redistribute it and/or modify
+GNU Emacs is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
-the Free Software Foundation; either version 3, or (at your option)
-any later version.
+the Free Software Foundation, either version 3 of the License, or
+(at your option) any later version.
GNU Emacs is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
-along with GNU Emacs; see the file COPYING. If not, write to
-the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
-Boston, MA 02110-1301, USA. */
+along with GNU Emacs. If not, see <http://www.gnu.org/licenses/>. */
#include <config.h>
extern Lisp_Object Qcursor_in_echo_area;
extern Lisp_Object Qfile_directory_p;
+extern Lisp_Object Qonly;
Lisp_Object Vcurrent_prefix_arg, Qminus, Qplus;
Lisp_Object Qcall_interactively;
even if mark_active is 0. */
Lisp_Object Vmark_even_if_inactive;
+Lisp_Object Vshift_select_mode, Qhandle_shift_selection;
+
Lisp_Object Vmouse_leave_buffer_hook, Qmouse_leave_buffer_hook;
Lisp_Object Qlist, Qlet, Qletx, Qsave_excursion, Qprogn, Qif, Qwhen;
X -- Lisp expression read and evaluated.
z -- Coding system.
Z -- Coding system, nil if no prefix arg.
-In addition, if the string begins with `*'
- then an error is signaled if the buffer is read-only.
- This happens before reading any arguments.
-If the string begins with `@', then Emacs searches the key sequence
- which invoked the command for its first mouse click (or any other
- event which specifies a window), and selects that window before
- reading any arguments. You may use both `@' and `*'; they are
- processed in the order that they appear.
+
+In addition, if the string begins with `*', an error is signaled if
+ the buffer is read-only.
+If the string begins with `@', Emacs searches the key sequence which
+ invoked the command for its first mouse click (or any other event
+ which specifies a window).
+If the string begins with `^' and `shift-select-mode' is non-nil,
+ Emacs first calls the function `handle-shift-select'.
+You may use `@', `*', and `^' together. They are processed in the
+ order that they appear, before reading any arguments.
usage: (interactive ARGS) */)
(args)
Lisp_Object args;
Lisp_Object function, record_flag, keys;
{
Lisp_Object *args, *visargs;
- Lisp_Object fun;
Lisp_Object specs;
Lisp_Object filter_specs;
Lisp_Object teml;
else
enable = Qnil;
- fun = indirect_function (function);
-
specs = Qnil;
string = 0;
/* The idea of FILTER_SPECS is to provide away to
/* Set next_event to point to the first event with parameters. */
for (next_event = 0; next_event < key_count; next_event++)
- if (EVENT_HAS_PARAMETERS (XVECTOR (keys)->contents[next_event]))
+ if (EVENT_HAS_PARAMETERS (AREF (keys, next_event)))
break;
/* Handle special starting chars `*' and `@'. Also `-'. */
Lisp_Object event, tem;
event = (next_event < key_count
- ? XVECTOR (keys)->contents[next_event]
+ ? AREF (keys, next_event)
: Qnil);
if (EVENT_HAS_PARAMETERS (event)
&& (tem = XCDR (event), CONSP (tem))
}
string++;
}
+ else if (*string == '^')
+ {
+ if (! NILP (Vshift_select_mode))
+ call1 (Qhandle_shift_selection, Qnil);
+ /* Even if shift-select-mode is off, temporarily active
+ regions could be set using the mouse, and should be
+ deactivated. */
+ else if (CONSP (Vtransient_mark_mode)
+ && EQ (XCAR (Vtransient_mark_mode), Qonly))
+ call1 (Qhandle_shift_selection, Qt);
+ string++;
+ }
else break;
}
(SYMBOLP (function)
? (char *) SDATA (SYMBOL_NAME (function))
: "command"));
- args[i] = XVECTOR (keys)->contents[next_event++];
+ args[i] = AREF (keys, next_event);
+ next_event++;
varies[i] = -1;
/* Find the next parameterized event. */
while (next_event < key_count
- && ! (EVENT_HAS_PARAMETERS
- (XVECTOR (keys)->contents[next_event])))
+ && !(EVENT_HAS_PARAMETERS (AREF (keys, next_event))))
next_event++;
break;
Qplus = intern ("+");
staticpro (&Qplus);
+ Qhandle_shift_selection = intern ("handle-shift-selection");
+ staticpro (&Qhandle_shift_selection);
+
Qcall_interactively = intern ("call-interactively");
staticpro (&Qcall_interactively);
DEFVAR_LISP ("command-history", &Vcommand_history,
doc: /* List of recent commands that read arguments from terminal.
-Each command is represented as a form to evaluate. */);
+Each command is represented as a form to evaluate.
+
+Maximum length of the history list is determined by the value
+of `history-length', which see. */);
Vcommand_history = Qnil;
DEFVAR_LISP ("command-debug-status", &Vcommand_debug_status,
When the option is non-nil, deactivation of the mark
turns off region highlighting, but commands that use the mark
behave as if the mark were still active. */);
- Vmark_even_if_inactive = Qnil;
+ Vmark_even_if_inactive = Qt;
+
+ DEFVAR_LISP ("shift-select-mode", &Vshift_select_mode,
+ doc: /* When non-nil, shifted motion keys activate the mark momentarily.
+
+While the mark is activated in this way, any shift-translated point
+motion key extends the region, and if Transient Mark mode was off, it
+is temporarily turned on. Furthermore, the mark will be deactivated
+by any subsequent point motion key that was not shift-translated, or
+by any action that normally deactivates the mark in Transient Mark
+mode.
+
+See `this-command-keys-shift-translated' for the meaning of
+shift-translation. */);
+ Vshift_select_mode = Qt;
DEFVAR_LISP ("mouse-leave-buffer-hook", &Vmouse_leave_buffer_hook,
doc: /* Hook to run when about to switch windows with a mouse command.