1/*
2 SPDX-FileCopyrightText: 2008-2009 Erlend Hamberg <ehamberg@gmail.com>
3 SPDX-FileCopyrightText: 2009 Paul Gideon Dann <pdgiddie@gmail.com>
4 SPDX-FileCopyrightText: 2011 Svyatoslav Kuzmich <svatoslav1@gmail.com>
5 SPDX-FileCopyrightText: 2012-2013 Simon St James <kdedevel@etotheipiplusone.com>
6
7 SPDX-License-Identifier: LGPL-2.0-or-later
8*/
9
10#ifndef KATEVI_MODE_BASE_H
11#define KATEVI_MODE_BASE_H
12
13#include <ktexteditor/range.h>
14
15#include "kateview.h"
16#include <vimode/definitions.h>
17#include <vimode/range.h>
18
19class QKeyEvent;
20class QString;
21class QRegularExpression;
22class KateViewInternal;
23namespace KTextEditor
24{
25class DocumentPrivate;
26class ViewPrivate;
27class Message;
28}
29
30namespace KateVi
31{
32class InputModeManager;
33
34enum Direction { Up, Down, Left, Right, Next, Prev };
35
36class ModeBase : public QObject
37{
38public:
39 ModeBase() = default;
40 ~ModeBase() override = default;
41
42 /**
43 * @return normal mode command accumulated so far
44 */
45 QString getVerbatimKeys() const;
46 virtual bool handleKeypress(const QKeyEvent *e) = 0;
47
48 void setCount(unsigned int count)
49 {
50 m_count = count;
51 }
52 void setRegister(QChar reg)
53 {
54 m_register = reg;
55 }
56
57 void error(const QString &errorMsg);
58 void message(const QString &msg);
59
60 Range motionFindNext();
61 Range motionFindPrev();
62
63 virtual void goToPos(const Range &r);
64 int getCount() const;
65
66protected:
67 // helper methods
68 void yankToClipBoard(QChar chosen_register, const QString &text);
69 bool deleteRange(Range &r, OperationMode mode = LineWise, bool addToRegister = true);
70 const QString getRange(Range &r, OperationMode mode = LineWise) const;
71 const QString getLine(int line = -1) const;
72 const QChar getCharUnderCursor() const;
73 const QString getWordUnderCursor() const;
74 const KTextEditor::Range getWordRangeUnderCursor() const;
75 KTextEditor::Cursor findNextWordStart(int fromLine, int fromColumn, bool onlyCurrentLine = false) const;
76 KTextEditor::Cursor findNextWORDStart(int fromLine, int fromColumn, bool onlyCurrentLine = false) const;
77 KTextEditor::Cursor findPrevWordStart(int fromLine, int fromColumn, bool onlyCurrentLine = false) const;
78 KTextEditor::Cursor findPrevWORDStart(int fromLine, int fromColumn, bool onlyCurrentLine = false) const;
79 KTextEditor::Cursor findPrevWordEnd(int fromLine, int fromColumn, bool onlyCurrentLine = false) const;
80 KTextEditor::Cursor findPrevWORDEnd(int fromLine, int fromColumn, bool onlyCurrentLine = false) const;
81 KTextEditor::Cursor findWordEnd(int fromLine, int fromColumn, bool onlyCurrentLine = false) const;
82 KTextEditor::Cursor findWORDEnd(int fromLine, int fromColumn, bool onlyCurrentLine = false) const;
83
84 Range findSurroundingBrackets(const QChar &c1, const QChar &c2, bool inner, const QChar &nested1, const QChar &nested2) const;
85
86 Range findSurrounding(const QRegularExpression &c1, const QRegularExpression &c2, bool inner = false) const;
87 Range findSurroundingQuotes(const QChar &c, bool inner = false) const;
88
89 int findLineStartingWitchChar(const QChar &c, int count, bool forward = true) const;
90 void updateCursor(const KTextEditor::Cursor c) const;
91 static const QChar getCharAtVirtualColumn(const QString &line, int virtualColumn, int tabWidht);
92
93 void addToNumberUnderCursor(int count);
94
95 Range goLineUp();
96 Range goLineDown();
97 Range goLineUpDown(int lines);
98 Range goVisualLineUpDown(int lines);
99
100 unsigned int linesDisplayed() const;
101 void scrollViewLines(int l);
102
103 bool isCounted() const
104 {
105 return m_iscounted;
106 }
107
108 bool startNormalMode();
109 bool startInsertMode();
110 bool startVisualMode();
111 bool startVisualLineMode();
112 bool startVisualBlockMode();
113 bool startReplaceMode();
114
115 QChar getChosenRegister(const QChar &defaultReg) const;
116 QString getRegisterContent(const QChar &reg);
117 OperationMode getRegisterFlag(const QChar &reg) const;
118 void fillRegister(const QChar &reg, const QString &text, OperationMode flag = CharWise);
119
120 void switchView(Direction direction = Next);
121
122 KTextEditor::Cursor getNextJump(KTextEditor::Cursor) const;
123 KTextEditor::Cursor getPrevJump(KTextEditor::Cursor) const;
124
125 inline KTextEditor::DocumentPrivate *doc() const
126 {
127 return m_view->doc();
128 }
129
130protected:
131 QChar m_register;
132
133 Range m_commandRange;
134 unsigned int m_count = 0;
135 int m_oneTimeCountOverride = -1;
136 bool m_iscounted = false;
137
138 QString m_extraWordCharacters;
139 QString m_keysVerbatim;
140
141 int m_stickyColumn = -1;
142 bool m_lastMotionWasVisualLineUpOrDown;
143 bool m_currentMotionWasVisualLineUpOrDown;
144
145 KTextEditor::ViewPrivate *m_view;
146 KateViewInternal *m_viewInternal;
147 InputModeManager *m_viInputModeManager;
148
149 // info message of vi mode
150 QPointer<KTextEditor::Message> m_infoMessage;
151};
152}
153
154#endif
155

source code of ktexteditor/src/vimode/modes/modebase.h