blob: f019d053431b640e8fe0d95195e9397d8ea80ac2 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
|
#ifndef editor_hh_INCLUDED
#define editor_hh_INCLUDED
#include "buffer.hh"
#include "selection.hh"
#include "filter.hh"
#include "idvaluemap.hh"
#include "memoryview.hh"
namespace Kakoune
{
class Register;
// An Editor is a buffer mutator
//
// The Editor class provides methods to manipulate a set of selections
// and to use these selections to mutate it's buffer.
class Editor
{
public:
typedef BufferString String;
typedef std::function<SelectionAndCaptures (const Selection&)> Selector;
typedef std::function<SelectionAndCapturesList (const Selection&)> MultiSelector;
Editor(Buffer& buffer);
virtual ~Editor() {}
Buffer& buffer() const { return m_buffer; }
void erase();
void insert(const String& string);
void insert(const memoryview<String>& strings);
void append(const String& string);
void append(const memoryview<String>& strings);
void replace(const String& string);
void push_selections();
void pop_selections();
void move_selections(const BufferCoord& offset, bool append = false);
void clear_selections();
void keep_selection(int index);
void select(const BufferIterator& iterator);
void select(const Selector& selector, bool append = false);
void multi_select(const MultiSelector& selector);
const SelectionList& selections() const { return m_selections.back(); }
std::vector<String> selections_content() const;
bool undo();
bool redo();
void add_filter(FilterAndId&& filter);
void remove_filter(const std::string& id);
CandidateList complete_filterid(const std::string& prefix,
size_t cursor_pos = std::string::npos);
bool is_editing() const { return m_edition_level!= 0; }
private:
friend class scoped_edition;
void begin_edition();
void end_edition();
int m_edition_level;
void check_invariant() const;
friend class IncrementalInserter;
virtual void on_incremental_insertion_begin() {}
virtual void on_incremental_insertion_end() {}
Buffer& m_buffer;
std::vector<SelectionList> m_selections;
idvaluemap<std::string, FilterFunc> m_filters;
};
struct scoped_edition
{
scoped_edition(Editor& editor)
: m_editor(editor)
{ m_editor.begin_edition(); }
~scoped_edition()
{ m_editor.end_edition(); }
private:
Editor& m_editor;
};
// An IncrementalInserter manage insert mode
class IncrementalInserter
{
public:
enum class Mode
{
Insert,
Append,
Change,
InsertAtLineBegin,
AppendAtLineEnd,
OpenLineBelow,
OpenLineAbove
};
IncrementalInserter(Editor& editor, Mode mode = Mode::Insert);
~IncrementalInserter();
void insert(const Editor::String& string);
void insert(const Register& reg);
void erase();
void move_cursors(const BufferCoord& offset);
Buffer& buffer() const { return m_editor.buffer(); }
private:
void apply(Modification&& modification) const;
Editor& m_editor;
scoped_edition m_edition;
};
}
#endif // editor_hh_INCLUDED
|