Changeset View
Changeset View
Standalone View
Standalone View
src/vimode/marks.cpp
Show First 20 Lines • Show All 73 Lines • ▼ Show 20 Line(s) | 73 | { | |||
---|---|---|---|---|---|
74 | QStringList l; | 74 | QStringList l; | ||
75 | Q_FOREACH (QChar key, m_marks.keys()) { | 75 | Q_FOREACH (QChar key, m_marks.keys()) { | ||
76 | l << key << QString::number(m_marks.value(key)->line()) | 76 | l << key << QString::number(m_marks.value(key)->line()) | ||
77 | << QString::number(m_marks.value(key)->column()); | 77 | << QString::number(m_marks.value(key)->column()); | ||
78 | } | 78 | } | ||
79 | config.writeEntry("ViMarks", l); | 79 | config.writeEntry("ViMarks", l); | ||
80 | } | 80 | } | ||
81 | 81 | | |||
82 | void Marks::setMark(const QChar &_mark, const KTextEditor::Cursor &pos, const bool moveoninsert) | 82 | void Marks::setMark(const QChar &_mark, const KTextEditor::Cursor &pos) | ||
83 | { | 83 | { | ||
84 | // move on insert is type based, this allows to reuse cursors! | ||||
85 | // reuse is important for editing intensive things like replace-all | ||||
86 | const bool moveoninsert = _mark != BeginEditYanked; | ||||
87 | | ||||
84 | m_settingMark = true; | 88 | m_settingMark = true; | ||
85 | uint marktype = m_doc->mark(pos.line()); | | |||
86 | 89 | | |||
87 | // ` and ' is the same register (position before jump) | 90 | // ` and ' is the same register (position before jump) | ||
88 | const QChar mark = (_mark == BeforeJumpAlter) ? BeforeJump : _mark; | 91 | const QChar mark = (_mark == BeforeJumpAlter) ? BeforeJump : _mark; | ||
89 | 92 | | |||
90 | // delete old cursor if any | 93 | // if we have already a cursor for this type: adjust it | ||
94 | bool needToAdjustVisibleMark = true; | ||||
91 | if (KTextEditor::MovingCursor *oldCursor = m_marks.value(mark)) { | 95 | if (KTextEditor::MovingCursor *oldCursor = m_marks.value(mark)) { | ||
92 | 96 | // cleanup mark display only if line changes | |||
97 | needToAdjustVisibleMark = oldCursor->line() != pos.line(); | ||||
98 | if (needToAdjustVisibleMark) { | ||||
93 | int number_of_marks = 0; | 99 | int number_of_marks = 0; | ||
94 | | ||||
95 | foreach (QChar c, m_marks.keys()) { | 100 | foreach (QChar c, m_marks.keys()) { | ||
96 | if (m_marks.value(c)->line() == oldCursor->line()) { | 101 | if (m_marks.value(c)->line() == oldCursor->line()) { | ||
97 | number_of_marks++; | 102 | number_of_marks++; | ||
98 | } | 103 | } | ||
99 | } | 104 | } | ||
100 | 105 | if (number_of_marks == 1) { | |||
101 | if (number_of_marks == 1 && pos.line() != oldCursor->line()) { | | |||
102 | m_doc->removeMark(oldCursor->line(), KTextEditor::MarkInterface::markType01); | 106 | m_doc->removeMark(oldCursor->line(), KTextEditor::MarkInterface::markType01); | ||
103 | } | 107 | } | ||
104 | | ||||
105 | delete oldCursor; | | |||
106 | } | 108 | } | ||
107 | 109 | | |||
108 | KTextEditor::MovingCursor::InsertBehavior behavior = moveoninsert ? KTextEditor::MovingCursor::MoveOnInsert : KTextEditor::MovingCursor::StayOnInsert; | 110 | // adjust position | ||
109 | // create and remember new one | 111 | oldCursor->setPosition(pos); | ||
112 | } else { | ||||
113 | // if no old mark of that type, create new one | ||||
114 | const KTextEditor::MovingCursor::InsertBehavior behavior = moveoninsert ? KTextEditor::MovingCursor::MoveOnInsert : KTextEditor::MovingCursor::StayOnInsert; | ||||
110 | m_marks.insert(mark, m_doc->newMovingCursor(pos, behavior)); | 115 | m_marks.insert(mark, m_doc->newMovingCursor(pos, behavior)); | ||
116 | } | ||||
111 | 117 | | |||
112 | // Showing what mark we set: | 118 | // Showing what mark we set, can be skipped if we did not change the line | ||
113 | if (isShowable(mark)) { | 119 | if (isShowable(mark)) { | ||
114 | if (!(marktype & KTextEditor::MarkInterface::markType01)) { | 120 | if (needToAdjustVisibleMark && !(m_doc->mark(pos.line()) & KTextEditor::MarkInterface::markType01)) { | ||
115 | m_doc->addMark(pos.line(), KTextEditor::MarkInterface::markType01); | 121 | m_doc->addMark(pos.line(), KTextEditor::MarkInterface::markType01); | ||
116 | } | 122 | } | ||
117 | 123 | | |||
118 | // only show message for active view | 124 | // only show message for active view | ||
119 | if ( m_inputModeManager->view()->viewInputMode() == KTextEditor::View::ViInputMode ) { | 125 | if (m_inputModeManager->view()->viewInputMode() == KTextEditor::View::ViInputMode) { | ||
120 | if (m_doc->activeView() == m_inputModeManager->view()) { | 126 | if (m_doc->activeView() == m_inputModeManager->view()) { | ||
121 | m_inputModeManager->getViNormalMode()->message(i18n("Mark set: %1", mark)); | 127 | m_inputModeManager->getViNormalMode()->message(i18n("Mark set: %1", mark)); | ||
122 | } | 128 | } | ||
123 | } | 129 | } | ||
124 | } | 130 | } | ||
125 | 131 | | |||
126 | m_settingMark = false; | 132 | m_settingMark = false; | ||
127 | } | 133 | } | ||
▲ Show 20 Lines • Show All 111 Lines • ▼ Show 20 Line(s) | |||||
239 | 245 | | |||
240 | bool Marks::isShowable(const QChar &mark) | 246 | bool Marks::isShowable(const QChar &mark) | ||
241 | { | 247 | { | ||
242 | return FirstUserMark <= mark && mark <= LastUserMark; | 248 | return FirstUserMark <= mark && mark <= LastUserMark; | ||
243 | } | 249 | } | ||
244 | 250 | | |||
245 | void Marks::setStartEditYanked(const KTextEditor::Cursor &pos) | 251 | void Marks::setStartEditYanked(const KTextEditor::Cursor &pos) | ||
246 | { | 252 | { | ||
247 | setMark(BeginEditYanked, pos, false); | 253 | setMark(BeginEditYanked, pos); | ||
248 | } | 254 | } | ||
249 | 255 | | |||
250 | void Marks::setFinishEditYanked(const KTextEditor::Cursor &pos) | 256 | void Marks::setFinishEditYanked(const KTextEditor::Cursor &pos) | ||
251 | { | 257 | { | ||
252 | setMark(EndEditYanked, pos); | 258 | setMark(EndEditYanked, pos); | ||
253 | } | 259 | } | ||
254 | 260 | | |||
255 | void Marks::setLastChange(const KTextEditor::Cursor &pos) | 261 | void Marks::setLastChange(const KTextEditor::Cursor &pos) | ||
▲ Show 20 Lines • Show All 54 Lines • Show Last 20 Lines |