1 // Scintilla source code edit control
3 ** Defines a mapping between keystrokes and commands.
5 // Copyright 1998-2003 by Neil Hodgson <neilh@scintilla.org>
6 // The License.txt file describes the conditions under which this software may be distributed.
11 #include <string_view>
17 #include "ScintillaTypes.h"
18 #include "ScintillaMessages.h"
20 #include "Debugging.h"
26 using namespace Scintilla
;
27 using namespace Scintilla::Internal
;
30 for (int i
= 0; static_cast<int>(MapDefault
[i
].key
); i
++) {
31 AssignCmdKey(MapDefault
[i
].key
,
32 MapDefault
[i
].modifiers
,
37 void KeyMap::Clear() noexcept
{
41 void KeyMap::AssignCmdKey(Keys key
, KeyMod modifiers
, Message msg
) {
42 kmap
[KeyModifiers(key
, modifiers
)] = msg
;
45 Message
KeyMap::Find(Keys key
, KeyMod modifiers
) const {
46 std::map
<KeyModifiers
, Message
>::const_iterator it
= kmap
.find(KeyModifiers(key
, modifiers
));
47 return (it
== kmap
.end()) ? static_cast<Message
>(0) : it
->second
;
50 const std::map
<KeyModifiers
, Message
> &KeyMap::GetKeyMap() const noexcept
{
60 // Define a modifier that is exactly Ctrl key on all platforms
61 // Most uses of Ctrl map to Cmd on macOS but some can't so use SCI_[S]CTRL_META
63 #define SCI_CTRL_META SCI_META
64 #define SCI_SCTRL_META (SCI_META | SCI_SHIFT)
66 #define SCI_CTRL_META SCI_CTRL
67 #define SCI_SCTRL_META (SCI_CTRL | SCI_SHIFT)
72 constexpr Keys
Key(char ch
) noexcept
{
73 return static_cast<Keys
>(ch
);
78 const KeyToCommand
KeyMap::MapDefault
[] = {
81 {Keys::Down
, SCI_CTRL
, Message::DocumentEnd
},
82 {Keys::Down
, SCI_CSHIFT
, Message::DocumentEndExtend
},
83 {Keys::Up
, SCI_CTRL
, Message::DocumentStart
},
84 {Keys::Up
, SCI_CSHIFT
, Message::DocumentStartExtend
},
85 {Keys::Left
, SCI_CTRL
, Message::VCHome
},
86 {Keys::Left
, SCI_CSHIFT
, Message::VCHomeExtend
},
87 {Keys::Right
, SCI_CTRL
, Message::LineEnd
},
88 {Keys::Right
, SCI_CSHIFT
, Message::LineEndExtend
},
91 {Keys::Down
, SCI_NORM
, Message::LineDown
},
92 {Keys::Down
, SCI_SHIFT
, Message::LineDownExtend
},
93 {Keys::Down
, SCI_CTRL_META
, Message::LineScrollDown
},
94 {Keys::Down
, SCI_ASHIFT
, Message::LineDownRectExtend
},
95 {Keys::Up
, SCI_NORM
, Message::LineUp
},
96 {Keys::Up
, SCI_SHIFT
, Message::LineUpExtend
},
97 {Keys::Up
, SCI_CTRL_META
, Message::LineScrollUp
},
98 {Keys::Up
, SCI_ASHIFT
, Message::LineUpRectExtend
},
99 {Key('['), SCI_CTRL
, Message::ParaUp
},
100 {Key('['), SCI_CSHIFT
, Message::ParaUpExtend
},
101 {Key(']'), SCI_CTRL
, Message::ParaDown
},
102 {Key(']'), SCI_CSHIFT
, Message::ParaDownExtend
},
103 {Keys::Left
, SCI_NORM
, Message::CharLeft
},
104 {Keys::Left
, SCI_SHIFT
, Message::CharLeftExtend
},
105 {Keys::Left
, SCI_CTRL_META
, Message::WordLeft
},
106 {Keys::Left
, SCI_SCTRL_META
, Message::WordLeftExtend
},
107 {Keys::Left
, SCI_ASHIFT
, Message::CharLeftRectExtend
},
108 {Keys::Right
, SCI_NORM
, Message::CharRight
},
109 {Keys::Right
, SCI_SHIFT
, Message::CharRightExtend
},
110 {Keys::Right
, SCI_CTRL_META
, Message::WordRight
},
111 {Keys::Right
, SCI_SCTRL_META
, Message::WordRightExtend
},
112 {Keys::Right
, SCI_ASHIFT
, Message::CharRightRectExtend
},
113 {Key('/'), SCI_CTRL
, Message::WordPartLeft
},
114 {Key('/'), SCI_CSHIFT
, Message::WordPartLeftExtend
},
115 {Key('\\'), SCI_CTRL
, Message::WordPartRight
},
116 {Key('\\'), SCI_CSHIFT
, Message::WordPartRightExtend
},
117 {Keys::Home
, SCI_NORM
, Message::VCHome
},
118 {Keys::Home
, SCI_SHIFT
, Message::VCHomeExtend
},
119 {Keys::Home
, SCI_CTRL
, Message::DocumentStart
},
120 {Keys::Home
, SCI_CSHIFT
, Message::DocumentStartExtend
},
121 {Keys::Home
, SCI_ALT
, Message::HomeDisplay
},
122 {Keys::Home
, SCI_ASHIFT
, Message::VCHomeRectExtend
},
123 {Keys::End
, SCI_NORM
, Message::LineEnd
},
124 {Keys::End
, SCI_SHIFT
, Message::LineEndExtend
},
125 {Keys::End
, SCI_CTRL
, Message::DocumentEnd
},
126 {Keys::End
, SCI_CSHIFT
, Message::DocumentEndExtend
},
127 {Keys::End
, SCI_ALT
, Message::LineEndDisplay
},
128 {Keys::End
, SCI_ASHIFT
, Message::LineEndRectExtend
},
129 {Keys::Prior
, SCI_NORM
, Message::PageUp
},
130 {Keys::Prior
, SCI_SHIFT
, Message::PageUpExtend
},
131 {Keys::Prior
, SCI_ASHIFT
, Message::PageUpRectExtend
},
132 {Keys::Next
, SCI_NORM
, Message::PageDown
},
133 {Keys::Next
, SCI_SHIFT
, Message::PageDownExtend
},
134 {Keys::Next
, SCI_ASHIFT
, Message::PageDownRectExtend
},
135 {Keys::Delete
, SCI_NORM
, Message::Clear
},
136 {Keys::Delete
, SCI_SHIFT
, Message::Cut
},
137 {Keys::Delete
, SCI_CTRL
, Message::DelWordRight
},
138 {Keys::Delete
, SCI_CSHIFT
, Message::DelLineRight
},
139 {Keys::Insert
, SCI_NORM
, Message::EditToggleOvertype
},
140 {Keys::Insert
, SCI_SHIFT
, Message::Paste
},
141 {Keys::Insert
, SCI_CTRL
, Message::Copy
},
142 {Keys::Escape
, SCI_NORM
, Message::Cancel
},
143 {Keys::Back
, SCI_NORM
, Message::DeleteBack
},
144 {Keys::Back
, SCI_SHIFT
, Message::DeleteBack
},
145 {Keys::Back
, SCI_CTRL
, Message::DelWordLeft
},
146 {Keys::Back
, SCI_ALT
, Message::Undo
},
147 {Keys::Back
, SCI_CSHIFT
, Message::DelLineLeft
},
148 {Key('Z'), SCI_CTRL
, Message::Undo
},
150 {Key('Z'), SCI_CSHIFT
, Message::Redo
},
152 {Key('Y'), SCI_CTRL
, Message::Redo
},
154 {Key('X'), SCI_CTRL
, Message::Cut
},
155 {Key('C'), SCI_CTRL
, Message::Copy
},
156 {Key('V'), SCI_CTRL
, Message::Paste
},
157 {Key('A'), SCI_CTRL
, Message::SelectAll
},
158 {Keys::Tab
, SCI_NORM
, Message::Tab
},
159 {Keys::Tab
, SCI_SHIFT
, Message::BackTab
},
160 {Keys::Return
, SCI_NORM
, Message::NewLine
},
161 {Keys::Return
, SCI_SHIFT
, Message::NewLine
},
162 {Keys::Add
, SCI_CTRL
, Message::ZoomIn
},
163 {Keys::Subtract
, SCI_CTRL
, Message::ZoomOut
},
164 {Keys::Divide
, SCI_CTRL
, Message::SetZoom
},
165 {Key('L'), SCI_CTRL
, Message::LineCut
},
166 {Key('L'), SCI_CSHIFT
, Message::LineDelete
},
167 {Key('T'), SCI_CSHIFT
, Message::LineCopy
},
168 {Key('T'), SCI_CTRL
, Message::LineTranspose
},
169 {Key('D'), SCI_CTRL
, Message::SelectionDuplicate
},
170 {Key('U'), SCI_CTRL
, Message::LowerCase
},
171 {Key('U'), SCI_CSHIFT
, Message::UpperCase
},
172 {Key(0),SCI_NORM
,static_cast<Message
>(0)},