1/*
2 SPDX-FileCopyrightText: 2008 Erlend Hamberg <ehamberg@gmail.com>
3 SPDX-FileCopyrightText: 2011 Svyatoslav Kuzmich <svatoslav1@gmail.com>
4 SPDX-FileCopyrightText: 2012-2013 Simon St James <kdedevel@etotheipiplusone.com>
5
6 SPDX-License-Identifier: LGPL-2.0-or-later
7*/
8
9#ifndef KATEVI_INPUT_MODE_MANAGER_H
10#define KATEVI_INPUT_MODE_MANAGER_H
11
12#include <QKeyEvent>
13#include <QStack>
14#include <ktexteditor/cursor.h>
15#include <ktexteditor/view.h>
16#include <ktexteditor_export.h>
17
18#include <vimode/completion.h>
19#include <vimode/definitions.h>
20
21class KConfigGroup;
22class KateViewInternal;
23class KateViInputMode;
24class QString;
25
26namespace KTextEditor
27{
28class ViewPrivate;
29class DocumentPrivate;
30class MovingCursor;
31class Mark;
32class MarkInterface;
33}
34
35namespace KateVi
36{
37class GlobalState;
38class Searcher;
39class CompletionRecorder;
40class CompletionReplayer;
41class Marks;
42class Jumps;
43class MacroRecorder;
44class LastChangeRecorder;
45class ModeBase;
46class NormalViMode;
47class InsertViMode;
48class VisualViMode;
49class ReplaceViMode;
50class KeyParser;
51class KeyMapper;
52
53class InputModeManager
54{
55 friend KateViInputMode;
56
57public:
58 InputModeManager(KateViInputMode *inputAdapter, KTextEditor::ViewPrivate *view, KateViewInternal *viewInternal);
59 ~InputModeManager();
60 InputModeManager(const InputModeManager &) = delete;
61 InputModeManager &operator=(const InputModeManager &) = delete;
62
63 /**
64 * feed key the given key press to the command parser
65 * @return true if keypress was is [part of a] command, false otherwise
66 */
67 bool handleKeypress(const QKeyEvent *e);
68
69 /**
70 * feed key the given list of key presses to the key handling code, one by one
71 */
72 void feedKeyPresses(const QString &keyPresses) const;
73
74 /**
75 * Determines whether we are currently processing a Vi keypress
76 * @return true if we are still in a call to handleKeypress, false otherwise
77 */
78 bool isHandlingKeypress() const;
79
80 /**
81 * @return The current vi mode
82 */
83 KTEXTEDITOR_EXPORT ViMode getCurrentViMode() const;
84
85 /**
86 * @return The current vi mode string representation
87 */
88 KTextEditor::View::ViewMode getCurrentViewMode() const;
89
90 /**
91 * @return the previous vi mode
92 */
93 ViMode getPreviousViMode() const;
94
95 /**
96 * @return true if and only if the current mode is one of VisualMode, VisualBlockMode or VisualLineMode.
97 */
98 bool isAnyVisualMode() const;
99
100 /**
101 * @return one of getViNormalMode(), getViVisualMode(), etc, depending on getCurrentViMode().
102 */
103 ModeBase *getCurrentViModeHandler() const;
104
105 const QString getVerbatimKeys() const;
106
107 /**
108 * changes the current vi mode to the given mode
109 */
110 void changeViMode(ViMode newMode);
111
112 /**
113 * set normal mode to be the active vi mode and perform the needed setup work
114 */
115 KTEXTEDITOR_EXPORT void viEnterNormalMode();
116
117 /**
118 * set insert mode to be the active vi mode and perform the needed setup work
119 */
120 void viEnterInsertMode();
121
122 /**
123 * set visual mode to be the active vi mode and make the needed setup work
124 */
125 void viEnterVisualMode(ViMode visualMode = ViMode::VisualMode);
126
127 /**
128 * set replace mode to be the active vi mode and make the needed setup work
129 */
130 void viEnterReplaceMode();
131
132 /**
133 * @return the NormalMode instance
134 */
135 NormalViMode *getViNormalMode();
136
137 /**
138 * @return the InsertMode instance
139 */
140 InsertViMode *getViInsertMode();
141
142 /**
143 * @return the VisualMode instance
144 */
145 VisualViMode *getViVisualMode();
146
147 /**
148 * @return the ReplaceMode instance
149 */
150 ReplaceViMode *getViReplaceMode();
151
152 /**
153 * clear the key event log
154 */
155 void clearCurrentChangeLog();
156
157 /**
158 * copy the contents of the key events log to m_lastChange so that it can be repeated
159 */
160 void storeLastChangeCommand();
161
162 /**
163 * repeat last change by feeding the contents of m_lastChange to feedKeys()
164 */
165 void repeatLastChange();
166
167 void doNotLogCurrentKeypress();
168
169 bool getTemporaryNormalMode()
170 {
171 return m_temporaryNormalMode;
172 }
173
174 void setTemporaryNormalMode(bool b)
175 {
176 m_temporaryNormalMode = b;
177 }
178
179 void reset();
180
181 inline Marks *marks()
182 {
183 return m_marks;
184 }
185 inline Jumps *jumps()
186 {
187 return m_jumps;
188 }
189
190 inline Searcher *searcher()
191 {
192 return m_searcher;
193 }
194
195 CompletionRecorder *completionRecorder()
196 {
197 return m_completionRecorder;
198 }
199 CompletionReplayer *completionReplayer()
200 {
201 return m_completionReplayer;
202 }
203
204 MacroRecorder *macroRecorder()
205 {
206 return m_macroRecorder;
207 }
208
209 LastChangeRecorder *lastChangeRecorder()
210 {
211 return m_lastChangeRecorder;
212 }
213
214 // session stuff
215 void readSessionConfig(const KConfigGroup &config);
216 void writeSessionConfig(KConfigGroup &config);
217
218 KTEXTEDITOR_EXPORT KeyMapper *keyMapper();
219 GlobalState *globalState() const;
220 KTextEditor::ViewPrivate *view() const;
221
222 KateViInputMode *inputAdapter()
223 {
224 return m_inputAdapter;
225 }
226
227 void updateCursor(const KTextEditor::Cursor c);
228
229 void pushKeyMapper(std::shared_ptr<KeyMapper> mapper);
230 void popKeyMapper();
231
232private:
233 NormalViMode *m_viNormalMode;
234 InsertViMode *m_viInsertMode;
235 VisualViMode *m_viVisualMode;
236 ReplaceViMode *m_viReplaceMode;
237
238 ViMode m_currentViMode;
239 ViMode m_previousViMode;
240
241 KateViInputMode *m_inputAdapter;
242 KTextEditor::ViewPrivate *m_view;
243 KateViewInternal *m_viewInternal;
244 KeyParser *m_keyParser;
245
246 // Create a new keymapper for each macro event, to simplify expansion of mappings in macros
247 // where the macro itself was triggered by expanding a mapping!
248 QStack<std::shared_ptr<KeyMapper>> m_keyMapperStack;
249
250 int m_insideHandlingKeyPressCount;
251
252 /**
253 * a list of the (encoded) key events that was part of the last change.
254 */
255 QString m_lastChange;
256
257 CompletionList m_lastChangeCompletionsLog;
258
259 /**
260 * true when normal mode was started by Ctrl-O command in insert mode.
261 */
262 bool m_temporaryNormalMode;
263
264 Marks *m_marks;
265 Jumps *m_jumps;
266
267 Searcher *m_searcher;
268 CompletionRecorder *m_completionRecorder;
269 CompletionReplayer *m_completionReplayer;
270
271 MacroRecorder *m_macroRecorder;
272
273 LastChangeRecorder *m_lastChangeRecorder;
274};
275
276}
277
278#endif
279

source code of ktexteditor/src/vimode/inputmodemanager.h