Make case-changing lfuns operate on full words by default

This is for people who cannot grasp the superior conventions of emacs ;)

A new argument "partial" has been added to word-upcase, word-lowcase
and word-capitalize that restores the old emacs-like behavior.

The (x)emacs bindings are updated to use the "partial" argument, and
also to bind correctly M-u and M-l (M-c is unfortunately not
available).

Fixes bug #2826.
This commit is contained in:
Jean-Marc Lasgouttes 2015-05-28 15:43:12 +02:00
parent be09b33319
commit 0db513c4d6
8 changed files with 121 additions and 73 deletions

View File

@ -22,10 +22,10 @@
printing support was very limited, and most users will want to print after printing support was very limited, and most users will want to print after
reviewing an output document (e.g., a PDF), anyway, which can be done from the reviewing an output document (e.g., a PDF), anyway, which can be done from the
PDF viewer. PDF viewer.
Users who would like to restore this functionality can create a "printer" Users who would like to restore this functionality can create a
format from within LyX and then define, say, a pdf->printer converter that does "printer" format from within LyX and then define, say, a
nothing but call lpd, or a2ps, or whatever. The "printer" will then be available pdf->printer converter that does nothing but call lpd, or a2ps, or
as an export option. whatever. The "printer" will then be available as an export option.
!!!The following pref variables were added in 2.2: !!!The following pref variables were added in 2.2:
@ -79,7 +79,10 @@
!!!The following LyX functions have been changed in 2.2: !!!The following LyX functions have been changed in 2.2:
* word-upcase, word-lowcase and word-capitalize do not select the word
to operate on in the emacs way (that is, starting at cursor
position); this behaviour can be restored by using the argument
"partial".
!!!The following LyX key bindings have been changed in 2.2: !!!The following LyX key bindings have been changed in 2.2:

View File

@ -238,6 +238,10 @@ Format 2
\bind "M-period" "specialchar-insert dots" \bind "M-period" "specialchar-insert dots"
\bind "M-w" "copy" \bind "M-w" "copy"
\bind "Escape" "meta-prefix" \bind "Escape" "meta-prefix"
\bind "M-u" "word-upcase partial"
\bind "M-l" "word-lowcase partial"
# This conflicts with the character menu.
#bind "M-c" "word-capitalize partial"
# Numeric keypad (if Shift+KP_XXX does not switch the NumLock state) # Numeric keypad (if Shift+KP_XXX does not switch the NumLock state)
\bind "S-KP_Right" "char-right-select" \bind "S-KP_Right" "char-right-select"
@ -269,3 +273,9 @@ Format 2
\bind_file latinkeys.bind \bind_file latinkeys.bind
\bind_file cyrkeys.bind \bind_file cyrkeys.bind
\bind_file greekkeys.bind \bind_file greekkeys.bind
# the following bindings have to be adapted w.r.t. menus.bind
\bind "M-c Down" "word-lowcase partial"
\bind "M-c Up" "word-upcase partial"
\bind "M-c Right" "word-capitalize partial"

View File

@ -237,6 +237,10 @@ Format 2
\bind "M-period" "specialchar-insert dots" \bind "M-period" "specialchar-insert dots"
\bind "M-w" "copy" \bind "M-w" "copy"
\bind "Escape" "meta-prefix" \bind "Escape" "meta-prefix"
\bind "M-u" "word-upcase partial"
\bind "M-l" "word-lowcase partial"
# This conflicts with the character menu.
#bind "M-c" "word-capitalize partial"
# Numeric keypad (if Shift+KP_XXX does not switch the NumLock state) # Numeric keypad (if Shift+KP_XXX does not switch the NumLock state)
\bind "S-KP_Right" "char-right-select" \bind "S-KP_Right" "char-right-select"
@ -355,3 +359,8 @@ Format 2
\bind_file latinkeys.bind \bind_file latinkeys.bind
\bind_file cyrkeys.bind \bind_file cyrkeys.bind
\bind_file greekkeys.bind \bind_file greekkeys.bind
# the following bindings have to be adapted w.r.t. menus.bind
\bind "M-c Down" "word-lowcase partial"
\bind "M-c Up" "word-upcase partial"
\bind "M-c Right" "word-capitalize partial"

View File

@ -98,7 +98,7 @@ The LyX Team
\end_layout \end_layout
\begin_layout Date \begin_layout Date
2014-11-14 2015-05-28
\end_layout \end_layout
\begin_layout Section* \begin_layout Section*
@ -1834,7 +1834,7 @@ alpha)
\begin_inset Newline newline \begin_inset Newline newline
\end_inset \end_inset
icon: icon of lfun used in toolbar icon: icon of lfun used in toolbar or direct icon name
\begin_inset Newline newline \begin_inset Newline newline
\end_inset \end_inset
@ -3144,7 +3144,7 @@ Action Inserts various characters into the document.
Syntax specialchar-insert <CHAR> Syntax specialchar-insert <CHAR>
\end_layout \end_layout
\begin_layout Description \begin_layout Description
Params <CHAR>: hyphenation, ligature-break, slash, nobreakdash, dots, end-of-sentence, menu-separator. Params <CHAR>: hyphenation, ligature-break, slash, nobreakdash, dots, end-of-sentence, menu-separator, lyx, tex, latex, latex2e.
\end_layout \end_layout
\begin_layout Description \begin_layout Description
Origin JSpitzm, 6 Dec 2007 Origin JSpitzm, 6 Dec 2007
@ -3154,7 +3154,7 @@ Origin JSpitzm, 6 Dec 2007
spelling-add spelling-add
\end_layout \end_layout
\begin_layout Description \begin_layout Description
Action Add the word under the cursor to the respective spell checker dictionary. Action Add the word under the cursor to the respective spell checker dictionary. The default for the language is retrieved from the cursor position.
\end_layout \end_layout
\begin_layout Description \begin_layout Description
Syntax spelling-add [<STRING>] [<LANG>] Syntax spelling-add [<STRING>] [<LANG>]
@ -3183,7 +3183,7 @@ Origin vfr, 24 March 2013
spelling-ignore spelling-ignore
\end_layout \end_layout
\begin_layout Description \begin_layout Description
Action Let the spell checker ignore the word under the cursor in the current session for the given language. Action Let the spell checker ignore the word under the cursor in the current session for the given language. The default for the language is retrieved from the cursor position.
\end_layout \end_layout
\begin_layout Description \begin_layout Description
Syntax spelling-ignore [<WORD>] [<LANG>] Syntax spelling-ignore [<WORD>] [<LANG>]
@ -3199,7 +3199,7 @@ Origin JSpitzm, 18 Jan 2010
spelling-remove spelling-remove
\end_layout \end_layout
\begin_layout Description \begin_layout Description
Action Remove the word under the cursor from the respective spell checker dictionary. Action Remove the word under the cursor from the respective spell checker dictionary. The default for the language is retrieved from the cursor position.
\end_layout \end_layout
\begin_layout Description \begin_layout Description
Syntax spelling-remove [<STRING>] [<LANG>] Syntax spelling-remove [<STRING>] [<LANG>]
@ -3357,10 +3357,13 @@ Syntax word-backward-select
word-capitalize word-capitalize
\end_layout \end_layout
\begin_layout Description \begin_layout Description
Action Capitalizes the words in the selection (i.e. the first letters) or the letter on the cursor position. Action Capitalizes the words in the selection (i.e. the first letters) or the first letter of word at cursor position.
\end_layout \end_layout
\begin_layout Description \begin_layout Description
Syntax word-capitalize Syntax word-capitalize [<SEL_TYPE>]
\end_layout
\begin_layout Description
Params <SEL_TYPE>: if this is equal to "partial", then the default word starts at cursor position (emacs-style). Otherwise, the whole word is considered.
\end_layout \end_layout
\begin_layout Subsection* \begin_layout Subsection*
@ -3509,10 +3512,13 @@ Origin dov, 28 Oct 2007
word-lowcase word-lowcase
\end_layout \end_layout
\begin_layout Description \begin_layout Description
Action Change the words in the selection or from the cursor position to the end of word to the lower case. Action Change the words in the selection or word at cursor position to lower case.
\end_layout \end_layout
\begin_layout Description \begin_layout Description
Syntax word-lowcase Syntax word-lowcase [<SEL_TYPE>]
\end_layout
\begin_layout Description
Params <SEL_TYPE>: if this is equal to "partial", then the default word starts at cursor position (emacs-style). Otherwise, the whole word is considered.
\end_layout \end_layout
\begin_layout Subsection* \begin_layout Subsection*
@ -3588,10 +3594,13 @@ Origin Andre, 11 Sep 2002
word-upcase word-upcase
\end_layout \end_layout
\begin_layout Description \begin_layout Description
Action Change the words in the selection or from the cursor position to the end of word to the upper case. Action Change the words in the selection or word at cursor position to upper case.
\end_layout \end_layout
\begin_layout Description \begin_layout Description
Syntax word-upcase Syntax word-upcase [<SEL_TYPE>]
\end_layout
\begin_layout Description
Params <SEL_TYPE>: if this is equal to "partial", then the default word starts at cursor position (emacs-style). Otherwise, the whole word is considered.
\end_layout \end_layout
\begin_layout Subsection* \begin_layout Subsection*
@ -4524,7 +4533,7 @@ Export buffers to PDF (pdflatex):
\end_layout \end_layout
\begin_layout Description \begin_layout Description
Origin scottkostyshak, 20 Jul 2012 Origin skostysh, 20 Jul 2012
\end_layout \end_layout
\begin_layout Subsection* \begin_layout Subsection*
@ -4559,6 +4568,32 @@ Params <LANG>: language name. See lib/languages for list.
Origin leeming, 30 Mar 2004 Origin leeming, 30 Mar 2004
\end_layout \end_layout
\begin_layout Subsection*
buffer-move-next
\end_layout
\begin_layout Description
Action Moves the current tab one spot to the right.
\end_layout
\begin_layout Description
Syntax buffer-move-next
\end_layout
\begin_layout Description
Origin skostysh, 7 Apr 2015
\end_layout
\begin_layout Subsection*
buffer-move-previous
\end_layout
\begin_layout Description
Action Moves the current tab one spot to the left.
\end_layout
\begin_layout Description
Syntax buffer-move-previous
\end_layout
\begin_layout Description
Origin skostysh, 7 Apr 2015
\end_layout
\begin_layout Subsection* \begin_layout Subsection*
buffer-new buffer-new
\end_layout \end_layout
@ -4630,36 +4665,6 @@ Action Switch to the previous opened document.
Syntax buffer-previous Syntax buffer-previous
\end_layout \end_layout
\begin_layout Subsection*
buffer-print
\end_layout
\begin_layout Description
Action Prints the current document.
\end_layout
\begin_layout Description
Notion Many settings can be given via the preferences dialog.
\end_layout
\begin_layout Description
Syntax buffer-print <TARGET> <TARGET-NAME> <COMMAND>
\end_layout
\begin_layout Description
Params <TARGET> is either "printer" or "file".
\begin_inset Newline newline
\end_inset
<TARGER-NAME> is either "default" or file name or printer name.
\begin_inset Newline newline
\end_inset
<COMMAND> command ensuring the printing job.
\end_layout
\begin_layout Description
Sample buffer-print file "/trash/newfile1.ps" "dvips"
\end_layout
\begin_layout Description
Origin leeming, 28 Mar 2004
\end_layout
\begin_layout Subsection* \begin_layout Subsection*
buffer-reload buffer-reload
\end_layout \end_layout
@ -4769,6 +4774,19 @@ Syntax buffer-view [<FORMAT>]
Params <FORMAT>: The format to display, where this is one of the formats defined (in the current GUI) in the Tools>Preferences>File Formats dialog. If no format is given, the default format as specified in the same dialog is used. Params <FORMAT>: The format to display, where this is one of the formats defined (in the current GUI) in the Tools>Preferences>File Formats dialog. If no format is given, the default format as specified in the same dialog is used.
\end_layout \end_layout
\begin_layout Subsection*
buffer-view-cache
\end_layout
\begin_layout Description
Action Opens the file that was created from last preview of this buffer.
\end_layout
\begin_layout Description
Notion This LFUN is called by the "Show Output Anyway" button in the LaTeX Errors dialog. It can also be called by the user, which is useful if the document takes a long time to compile, and you just want to see the last previewed version.
\end_layout
\begin_layout Description
Syntax buffer-view-cache
\end_layout
\begin_layout Subsection* \begin_layout Subsection*
buffer-write buffer-write
\end_layout \end_layout

View File

@ -1000,24 +1000,33 @@ void LyXAction::init()
/*! /*!
* \var lyx::FuncCode lyx::LFUN_WORD_CAPITALIZE * \var lyx::FuncCode lyx::LFUN_WORD_CAPITALIZE
* \li Action: Capitalizes the words in the selection (i.e. the first letters) * \li Action: Capitalizes the words in the selection (i.e. the first letters)
or the letter on the cursor position. or the first letter of word at cursor position.
* \li Syntax: word-capitalize * \li Syntax: word-capitalize [<SEL_TYPE>]
* \li Params: <SEL_TYPE>: if this is equal to "partial", then the
* default word starts at cursor position (emacs-style).
* Otherwise, the whole word is considered.
* \endvar * \endvar
*/ */
{ LFUN_WORD_CAPITALIZE, "word-capitalize", Noop, Edit }, { LFUN_WORD_CAPITALIZE, "word-capitalize", Noop, Edit },
/*! /*!
* \var lyx::FuncCode lyx::LFUN_WORD_UPCASE * \var lyx::FuncCode lyx::LFUN_WORD_UPCASE
* \li Action: Change the words in the selection or from the cursor position * \li Action: Change the words in the selection or word at cursor position
to the end of word to the upper case. to upper case.
* \li Syntax: word-upcase * \li Syntax: word-upcase [<SEL_TYPE>]
* \li Params: <SEL_TYPE>: if this is equal to "partial", then the
* default word starts at cursor position (emacs-style).
* Otherwise, the whole word is considered.
* \endvar * \endvar
*/ */
{ LFUN_WORD_UPCASE, "word-upcase", Noop, Edit }, { LFUN_WORD_UPCASE, "word-upcase", Noop, Edit },
/*! /*!
* \var lyx::FuncCode lyx::LFUN_WORD_LOWCASE * \var lyx::FuncCode lyx::LFUN_WORD_LOWCASE
* \li Action: Change the words in the selection or from the cursor position * \li Action: Change the words in the selection or word at cursor position
to the end of word to the lower case. to lower case.
* \li Syntax: word-lowcase * \li Syntax: word-lowcase [<SEL_TYPE>]
* \li Params: <SEL_TYPE>: if this is equal to "partial", then the
* default word starts at cursor position (emacs-style).
* Otherwise, the whole word is considered.
* \endvar * \endvar
*/ */
{ LFUN_WORD_LOWCASE, "word-lowcase", Noop, Edit }, { LFUN_WORD_LOWCASE, "word-lowcase", Noop, Edit },

View File

@ -1489,20 +1489,19 @@ void Text::deleteWordBackward(Cursor & cur)
// Kill to end of line. // Kill to end of line.
void Text::changeCase(Cursor & cur, TextCase action) void Text::changeCase(Cursor & cur, TextCase action, bool partial)
{ {
LBUFERR(this == cur.text()); LBUFERR(this == cur.text());
CursorSlice from; CursorSlice from;
CursorSlice to; CursorSlice to;
bool gotsel = false; bool const gotsel = cur.selection();
if (cur.selection()) { if (gotsel) {
from = cur.selBegin(); from = cur.selBegin();
to = cur.selEnd(); to = cur.selEnd();
gotsel = true;
} else { } else {
from = cur.top(); from = cur.top();
getWord(from, to, PARTIAL_WORD); getWord(from, to, partial ? PARTIAL_WORD : WHOLE_WORD);
cursorForwardOneWord(cur); cursorForwardOneWord(cur);
} }

View File

@ -242,7 +242,7 @@ public:
/// ///
bool selectWordWhenUnderCursor(Cursor & cur, word_location); bool selectWordWhenUnderCursor(Cursor & cur, word_location);
/// Change the case of the word at cursor position. /// Change the case of the word at cursor position.
void changeCase(Cursor & cur, TextCase action); void changeCase(Cursor & cur, TextCase action, bool partial);
/// Transposes the character at the cursor with the one before it /// Transposes the character at the cursor with the one before it
void charsTranspose(Cursor & cur); void charsTranspose(Cursor & cur);

View File

@ -1291,15 +1291,15 @@ void Text::dispatch(Cursor & cur, FuncRequest & cmd)
} }
case LFUN_WORD_UPCASE: case LFUN_WORD_UPCASE:
changeCase(cur, text_uppercase); changeCase(cur, text_uppercase, cmd.getArg(0) == "partial");
break; break;
case LFUN_WORD_LOWCASE: case LFUN_WORD_LOWCASE:
changeCase(cur, text_lowercase); changeCase(cur, text_lowercase, cmd.getArg(0) == "partial");
break; break;
case LFUN_WORD_CAPITALIZE: case LFUN_WORD_CAPITALIZE:
changeCase(cur, text_capitalization); changeCase(cur, text_capitalization, cmd.getArg(0) == "partial");
break; break;
case LFUN_CHARS_TRANSPOSE: case LFUN_CHARS_TRANSPOSE: