Refactor use selection as search pattern implementation
This commit is contained in:
parent
85a8a0c26d
commit
47df1374fe
|
@ -37,6 +37,15 @@ inline bool is_eol(const Buffer& buffer, ByteCoord coord)
|
|||
return buffer.is_end(coord) or buffer[coord.line].length() == coord.column+1;
|
||||
}
|
||||
|
||||
inline bool is_bow(const Buffer& buffer, ByteCoord coord)
|
||||
{
|
||||
auto it = utf8::iterator<BufferIterator>(buffer.iterator_at(coord), buffer);
|
||||
if (coord == ByteCoord{0,0})
|
||||
return is_word(*it);
|
||||
|
||||
return not is_word(*(it-1)) and is_word(*it);
|
||||
}
|
||||
|
||||
inline bool is_eow(const Buffer& buffer, ByteCoord coord)
|
||||
{
|
||||
if (buffer.is_end(coord) or coord == ByteCoord{0,0})
|
||||
|
|
|
@ -670,22 +670,13 @@ void use_selection_as_search_pattern(Context& context, NormalParams params)
|
|||
Vector<String> patterns;
|
||||
auto& sels = context.selections();
|
||||
const auto& buffer = context.buffer();
|
||||
using Utf8It = utf8::iterator<BufferIterator, utf8::InvalidPolicy::Pass>;
|
||||
for (auto& sel : sels)
|
||||
{
|
||||
Utf8It begin{buffer.iterator_at(sel.min()), buffer};
|
||||
Utf8It end{buffer.iterator_at(sel.max()), buffer};
|
||||
++end;
|
||||
|
||||
auto content = "\\Q" + buffer.string(begin.base().coord(), end.base().coord()) + "\\E";
|
||||
if (smart)
|
||||
{
|
||||
if (is_word(*begin) and (begin == buffer.begin() or not is_word(*(begin-1))))
|
||||
content = "\\b" + content;
|
||||
if (is_word(*(end-1)) and (end == buffer.end() or not is_word(*end)))
|
||||
content = content + "\\b";
|
||||
}
|
||||
patterns.push_back(std::move(content));
|
||||
const auto beg = sel.min(), end = buffer.char_next(sel.max());
|
||||
patterns.push_back(format("{}\\Q{}\\E{}",
|
||||
smart and is_bow(buffer, beg) ? "\\b" : "",
|
||||
buffer.string(beg, end),
|
||||
smart and is_eow(buffer, end) ? "\\b" : ""));
|
||||
}
|
||||
|
||||
const char reg = to_lower(params.reg ? params.reg : '/');
|
||||
|
|
Loading…
Reference in New Issue
Block a user