mirror of
https://github.com/microsoft/terminal.git
synced 2026-07-08 18:16:28 +00:00
Introduce ExpandSelectionToWord action (#13765)
## Summary of the Pull Request Introduces a new action `expandSelectionToWord()` which expands the beginning and end of the selection to encompass the word(s) it's on. This was implemented as a conditional keybinding where the key chord is passed through to the terminal if no selection is active (similar to `copy()`). It is not bound to anything by default. ## PR Checklist * [x] Closes #8274 * [x] Schema updated. ## Validation Steps Performed - Scenario in #8274: - search for some text in the find dialog - ESC to close the dialog - execute `expandSelectionToWord()` - the new selection encompasses the whole word - mark mode - move onto a word - execute `expandSelectionToWord()` - mouse selection (same as above) - select a portion of two words --> new selection fully encompasses both words
This commit is contained in:
@@ -315,6 +315,7 @@
|
||||
"commandPalette",
|
||||
"copy",
|
||||
"duplicateTab",
|
||||
"expandSelectionToWord",
|
||||
"exportBuffer",
|
||||
"find",
|
||||
"findMatch",
|
||||
|
||||
@@ -1156,4 +1156,14 @@ namespace winrt::TerminalApp::implementation
|
||||
args.Handled(handled);
|
||||
}
|
||||
}
|
||||
|
||||
void TerminalPage::_HandleExpandSelectionToWord(const IInspectable& /*sender*/,
|
||||
const ActionEventArgs& args)
|
||||
{
|
||||
if (const auto& control{ _GetActiveControl() })
|
||||
{
|
||||
const auto handled = control.ExpandSelectionToWord();
|
||||
args.Handled(handled);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1147,6 +1147,17 @@ namespace winrt::Microsoft::Terminal::Control::implementation
|
||||
return false;
|
||||
}
|
||||
|
||||
bool ControlCore::ExpandSelectionToWord()
|
||||
{
|
||||
if (_terminal->IsSelectionActive())
|
||||
{
|
||||
_terminal->ExpandSelectionToWord();
|
||||
_updateSelectionUI();
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
// Method Description:
|
||||
// - Pre-process text pasted (presumably from the clipboard)
|
||||
// before sending it over the terminal's connection.
|
||||
|
||||
@@ -87,6 +87,7 @@ namespace winrt::Microsoft::Terminal::Control::implementation
|
||||
void ToggleMarkMode();
|
||||
Control::SelectionInteractionMode SelectionMode() const;
|
||||
bool SwitchSelectionEndpoint();
|
||||
bool ExpandSelectionToWord();
|
||||
bool TryMarkModeKeybinding(const WORD vkey,
|
||||
const ::Microsoft::Terminal::Core::ControlKeyStates modifiers);
|
||||
|
||||
|
||||
@@ -91,6 +91,7 @@ namespace Microsoft.Terminal.Control
|
||||
Boolean ToggleBlockSelection();
|
||||
void ToggleMarkMode();
|
||||
Boolean SwitchSelectionEndpoint();
|
||||
Boolean ExpandSelectionToWord();
|
||||
void ClearBuffer(ClearBufferType clearType);
|
||||
|
||||
void SetHoveredCell(Microsoft.Terminal.Core.Point terminalPosition);
|
||||
|
||||
@@ -1981,6 +1981,11 @@ namespace winrt::Microsoft::Terminal::Control::implementation
|
||||
return _core.SwitchSelectionEndpoint();
|
||||
}
|
||||
|
||||
bool TermControl::ExpandSelectionToWord()
|
||||
{
|
||||
return _core.ExpandSelectionToWord();
|
||||
}
|
||||
|
||||
void TermControl::Close()
|
||||
{
|
||||
if (!_IsClosing())
|
||||
|
||||
@@ -41,6 +41,7 @@ namespace winrt::Microsoft::Terminal::Control::implementation
|
||||
bool ToggleBlockSelection();
|
||||
void ToggleMarkMode();
|
||||
bool SwitchSelectionEndpoint();
|
||||
bool ExpandSelectionToWord();
|
||||
void Close();
|
||||
Windows::Foundation::Size CharacterDimensions() const;
|
||||
Windows::Foundation::Size MinimumSize();
|
||||
|
||||
@@ -55,6 +55,7 @@ namespace Microsoft.Terminal.Control
|
||||
Boolean ToggleBlockSelection();
|
||||
void ToggleMarkMode();
|
||||
Boolean SwitchSelectionEndpoint();
|
||||
Boolean ExpandSelectionToWord();
|
||||
void ClearBuffer(ClearBufferType clearType);
|
||||
void Close();
|
||||
Windows.Foundation.Size CharacterDimensions { get; };
|
||||
|
||||
@@ -281,6 +281,7 @@ public:
|
||||
void SelectAll();
|
||||
SelectionInteractionMode SelectionMode() const noexcept;
|
||||
void SwitchSelectionEndpoint();
|
||||
void ExpandSelectionToWord();
|
||||
void ToggleMarkMode();
|
||||
void SelectHyperlink(const SearchDirection dir);
|
||||
bool SelectionIsTargetingUrl() const noexcept;
|
||||
|
||||
@@ -340,6 +340,16 @@ void Terminal::SwitchSelectionEndpoint()
|
||||
}
|
||||
}
|
||||
|
||||
void Terminal::ExpandSelectionToWord()
|
||||
{
|
||||
if (IsSelectionActive())
|
||||
{
|
||||
const auto& buffer = _activeBuffer();
|
||||
_selection->start = buffer.GetWordStart(_selection->start, _wordDelimiters);
|
||||
_selection->end = buffer.GetWordEnd(_selection->end, _wordDelimiters);
|
||||
}
|
||||
}
|
||||
|
||||
// Method Description:
|
||||
// - selects the next/previous hyperlink, if one is available
|
||||
// Arguments:
|
||||
|
||||
@@ -84,6 +84,7 @@ static constexpr std::string_view SelectAllKey{ "selectAll" };
|
||||
static constexpr std::string_view MarkModeKey{ "markMode" };
|
||||
static constexpr std::string_view ToggleBlockSelectionKey{ "toggleBlockSelection" };
|
||||
static constexpr std::string_view SwitchSelectionEndpointKey{ "switchSelectionEndpoint" };
|
||||
static constexpr std::string_view ExpandSelectionToWordKey{ "expandSelectionToWord" };
|
||||
|
||||
static constexpr std::string_view ActionKey{ "action" };
|
||||
|
||||
@@ -404,6 +405,7 @@ namespace winrt::Microsoft::Terminal::Settings::Model::implementation
|
||||
{ ShortcutAction::MarkMode, RS_(L"MarkModeCommandKey") },
|
||||
{ ShortcutAction::ToggleBlockSelection, RS_(L"ToggleBlockSelectionCommandKey") },
|
||||
{ ShortcutAction::SwitchSelectionEndpoint, RS_(L"SwitchSelectionEndpointCommandKey") },
|
||||
{ ShortcutAction::ExpandSelectionToWord, RS_(L"ExpandSelectionToWordCommandKey") },
|
||||
};
|
||||
}();
|
||||
|
||||
|
||||
@@ -97,6 +97,7 @@
|
||||
ON_ALL_ACTIONS(MarkMode) \
|
||||
ON_ALL_ACTIONS(ToggleBlockSelection) \
|
||||
ON_ALL_ACTIONS(SwitchSelectionEndpoint) \
|
||||
ON_ALL_ACTIONS(ExpandSelectionToWord) \
|
||||
ON_ALL_ACTIONS(CloseOtherPanes)
|
||||
|
||||
#define ALL_SHORTCUT_ACTIONS_WITH_ARGS \
|
||||
|
||||
@@ -567,6 +567,9 @@
|
||||
<data name="SwitchSelectionEndpointCommandKey" xml:space="preserve">
|
||||
<value>Switch selection endpoint</value>
|
||||
</data>
|
||||
<data name="ExpandSelectionToWordCommandKey" xml:space="preserve">
|
||||
<value>Expand selection to word</value>
|
||||
</data>
|
||||
<data name="CloseOtherPanesCommandKey" xml:space="preserve">
|
||||
<value>Close all other panes</value>
|
||||
</data>
|
||||
|
||||
@@ -428,6 +428,7 @@
|
||||
{ "command": "markMode", "keys": "ctrl+shift+m" },
|
||||
{ "command": "toggleBlockSelection" },
|
||||
{ "command": "switchSelectionEndpoint" },
|
||||
{ "command": "expandSelectionToWord" },
|
||||
|
||||
// Scrollback
|
||||
{ "command": "scrollDown", "keys": "ctrl+shift+down" },
|
||||
|
||||
Reference in New Issue
Block a user