| 1 | /* |
| 2 | SPDX-FileCopyrightText: 2008 Erlend Hamberg <ehamberg@gmail.com> |
| 3 | SPDX-FileCopyrightText: 2011 Svyatoslav Kuzmich <svatoslav1@gmail.com> |
| 4 | |
| 5 | SPDX-License-Identifier: LGPL-2.0-or-later |
| 6 | */ |
| 7 | |
| 8 | #ifndef KATEVI_COMMAND_H |
| 9 | #define KATEVI_COMMAND_H |
| 10 | |
| 11 | #include <QRegularExpression> |
| 12 | #include <QString> |
| 13 | |
| 14 | namespace KateVi |
| 15 | { |
| 16 | class KeyParser; |
| 17 | class NormalViMode; |
| 18 | |
| 19 | enum CommandFlags { |
| 20 | REGEX_PATTERN = 0x1, // the pattern is a regex |
| 21 | NEEDS_MOTION = 0x2, // the command needs a motion before it can be executed |
| 22 | SHOULD_NOT_RESET = 0x4, // the command should not cause the current mode to be left |
| 23 | IS_CHANGE = 0x8, // the command changes the buffer |
| 24 | IS_NOT_LINEWISE = 0x10, // the motion is not line wise |
| 25 | CAN_CHANGE_WHOLE_VISUAL_MODE_SELECTION = 0x20, // the motion is a text object that can set the |
| 26 | // whole Visual Mode selection to the text object |
| 27 | CAN_LAND_INSIDE_FOLDING_RANGE = 0x40 // the motion can end up inside a folding range |
| 28 | }; |
| 29 | |
| 30 | class Command |
| 31 | { |
| 32 | public: |
| 33 | Command(const QString &pattern, bool (NormalViMode::*pt2Func)(), unsigned int flags = 0); |
| 34 | virtual ~Command(); |
| 35 | |
| 36 | bool matches(const QString &pattern) const; |
| 37 | bool matchesExact(const QString &pattern) const; |
| 38 | bool execute(NormalViMode *mode) const; |
| 39 | const QString pattern() const |
| 40 | { |
| 41 | return m_pattern; |
| 42 | } |
| 43 | bool isRegexPattern() const |
| 44 | { |
| 45 | return m_flags & REGEX_PATTERN; |
| 46 | } |
| 47 | bool needsMotion() const |
| 48 | { |
| 49 | return m_flags & NEEDS_MOTION; |
| 50 | } |
| 51 | bool shouldReset() const |
| 52 | { |
| 53 | return !(m_flags & SHOULD_NOT_RESET); |
| 54 | } |
| 55 | bool isChange() const |
| 56 | { |
| 57 | return m_flags & IS_CHANGE; |
| 58 | } |
| 59 | bool isLineWise() const |
| 60 | { |
| 61 | return !(m_flags & IS_NOT_LINEWISE); |
| 62 | } |
| 63 | bool canChangeWholeVisualModeSelection() const |
| 64 | { |
| 65 | return m_flags & CAN_CHANGE_WHOLE_VISUAL_MODE_SELECTION; |
| 66 | } |
| 67 | bool canLandInsideFoldingRange() const |
| 68 | { |
| 69 | return m_flags & CAN_LAND_INSIDE_FOLDING_RANGE; |
| 70 | } |
| 71 | |
| 72 | protected: |
| 73 | // constant stuff, we create each command just once globally |
| 74 | const QString m_pattern; |
| 75 | const unsigned int m_flags; |
| 76 | bool (NormalViMode::*m_ptr2commandMethod)(); |
| 77 | |
| 78 | // we create commands only once globally |
| 79 | // regex compile is costly, we do this at first match of this command |
| 80 | mutable QRegularExpression m_patternRegex; |
| 81 | mutable QRegularExpression m_patternAnchoredRegex; |
| 82 | }; |
| 83 | |
| 84 | } |
| 85 | |
| 86 | #endif /* KATEVI_COMMAND_H */ |
| 87 | |