Make '_' the default extra_word_chars, and remove built-in support

Fixes #2599
This commit is contained in:
Maxime Coste 2018-11-27 18:13:29 +11:00
parent 6c54c4740d
commit 1553d91d27
10 changed files with 19 additions and 15 deletions

View File

@ -347,7 +347,7 @@ static void check_matching_pairs(const Vector<Codepoint, MemoryDomain::Options>&
{ {
if ((pairs.size() % 2) != 0) if ((pairs.size() % 2) != 0)
throw runtime_error{"matching pairs should have a pair number of element"}; throw runtime_error{"matching pairs should have a pair number of element"};
if (not all_of(pairs, is_punctuation)) if (not all_of(pairs, [](Codepoint cp) { return is_punctuation(cp); }))
throw runtime_error{"matching pairs can only be punctuation"}; throw runtime_error{"matching pairs can only be punctuation"};
} }
@ -422,7 +422,7 @@ void register_options()
reg.declare_option<Vector<Codepoint, MemoryDomain::Options>, check_extra_word_chars>( reg.declare_option<Vector<Codepoint, MemoryDomain::Options>, check_extra_word_chars>(
"extra_word_chars", "extra_word_chars",
"Additional characters to be considered as words for insert completion", "Additional characters to be considered as words for insert completion",
{}); { '_' });
reg.declare_option<Vector<Codepoint, MemoryDomain::Options>, check_matching_pairs>( reg.declare_option<Vector<Codepoint, MemoryDomain::Options>, check_matching_pairs>(
"matching_pairs", "matching_pairs",
"set of pair of characters to be considered as matching pairs", "set of pair of characters to be considered as matching pairs",

View File

@ -1327,7 +1327,7 @@ void select_object(Context& context, NormalParams params)
return; return;
const Codepoint cp = *key.codepoint(); const Codepoint cp = *key.codepoint();
if (is_punctuation(cp) or cp == '_') if (is_punctuation(cp, {}))
{ {
auto re = Regex{"\\Q" + to_string(cp), RegexCompileFlags::Backward}; auto re = Regex{"\\Q" + to_string(cp), RegexCompileFlags::Backward};
return select_and_set_last<mode>( return select_and_set_last<mode>(

View File

@ -63,6 +63,7 @@ select_to_next_word(const Context& context, const Selection& selection)
Utf8Iterator end = begin+1; Utf8Iterator end = begin+1;
auto is_word = [&](Codepoint c) { return Kakoune::is_word<word_type>(c, extra_word_chars); }; auto is_word = [&](Codepoint c) { return Kakoune::is_word<word_type>(c, extra_word_chars); };
auto is_punctuation = [&](Codepoint c) { return Kakoune::is_punctuation(c, extra_word_chars); };
if (is_word(*begin)) if (is_word(*begin))
skip_while(end, buffer.end(), is_word); skip_while(end, buffer.end(), is_word);
@ -96,6 +97,7 @@ select_to_next_word_end(const Context& context, const Selection& selection)
skip_while(end, buffer.end(), is_horizontal_blank); skip_while(end, buffer.end(), is_horizontal_blank);
auto is_word = [&](Codepoint c) { return Kakoune::is_word<word_type>(c, extra_word_chars); }; auto is_word = [&](Codepoint c) { return Kakoune::is_word<word_type>(c, extra_word_chars); };
auto is_punctuation = [&](Codepoint c) { return Kakoune::is_punctuation(c, extra_word_chars); };
if (is_word(*end)) if (is_word(*end))
skip_while(end, buffer.end(), is_word); skip_while(end, buffer.end(), is_word);
@ -124,6 +126,7 @@ select_to_previous_word(const Context& context, const Selection& selection)
Utf8Iterator end = begin; Utf8Iterator end = begin;
auto is_word = [&](Codepoint c) { return Kakoune::is_word<word_type>(c, extra_word_chars); }; auto is_word = [&](Codepoint c) { return Kakoune::is_word<word_type>(c, extra_word_chars); };
auto is_punctuation = [&](Codepoint c) { return Kakoune::is_punctuation(c, extra_word_chars); };
bool with_end = skip_while_reverse(end, buffer.begin(), is_horizontal_blank); bool with_end = skip_while_reverse(end, buffer.begin(), is_horizontal_blank);
if (is_word(*end)) if (is_word(*end))

View File

@ -233,7 +233,7 @@ Vector<StringView> wrap_lines(StringView text, ColumnCount max_width)
Vector<StringView> lines; Vector<StringView> lines;
while (it != end) while (it != end)
{ {
const CharCategories cat = categorize(*it, {}); const CharCategories cat = categorize(*it, {'_'});
if (cat == CharCategories::EndOfLine) if (cat == CharCategories::EndOfLine)
{ {
lines.emplace_back(line_begin.base(), it.base()); lines.emplace_back(line_begin.base(), it.base());
@ -242,7 +242,7 @@ Vector<StringView> wrap_lines(StringView text, ColumnCount max_width)
} }
Utf8It word_end = it+1; Utf8It word_end = it+1;
while (word_end != end and categorize(*word_end, {}) == cat) while (word_end != end and categorize(*word_end, {'_'}) == cat)
++word_end; ++word_end;
while (word_end > line_begin and while (word_end > line_begin and

View File

@ -32,9 +32,9 @@ inline bool is_blank(Codepoint c) noexcept
enum WordType { Word, WORD }; enum WordType { Word, WORD };
template<WordType word_type = Word> template<WordType word_type = Word>
inline bool is_word(Codepoint c, ConstArrayView<Codepoint> extra_word_chars = {}) noexcept inline bool is_word(Codepoint c, ConstArrayView<Codepoint> extra_word_chars = {'_'}) noexcept
{ {
return c == '_' or iswalnum((wchar_t)c) or contains(extra_word_chars, c); return iswalnum((wchar_t)c) or contains(extra_word_chars, c);
} }
template<> template<>
@ -43,9 +43,9 @@ inline bool is_word<WORD>(Codepoint c, ConstArrayView<Codepoint>) noexcept
return not is_blank(c); return not is_blank(c);
} }
inline bool is_punctuation(Codepoint c) noexcept inline bool is_punctuation(Codepoint c, ConstArrayView<Codepoint> extra_word_chars = {'_'}) noexcept
{ {
return not (is_word(c) or is_blank(c)); return not (is_word(c, extra_word_chars) or is_blank(c));
} }
inline bool is_basic_alpha(Codepoint c) noexcept inline bool is_basic_alpha(Codepoint c) noexcept

View File

@ -31,16 +31,13 @@ struct WordSplitter
Iterator& operator++() Iterator& operator++()
{ {
const auto* end = m_splitter->m_content.end(); const auto* end = m_splitter->m_content.end();
auto is_word = [&](const char* ptr) { auto extra_chars = m_splitter->m_extra_word_chars;
const Codepoint c = utf8::codepoint(ptr, end);
return Kakoune::is_word(c) or contains(m_splitter->m_extra_word_chars, c);
};
m_word_begin = m_word_end; m_word_begin = m_word_end;
while (m_word_begin != end and not is_word(m_word_begin)) while (m_word_begin != end and not is_word(utf8::codepoint(m_word_begin, end), extra_chars))
utf8::to_next(m_word_begin, end); utf8::to_next(m_word_begin, end);
m_word_end = m_word_begin; m_word_end = m_word_begin;
while (m_word_end != end and is_word(m_word_end)) while (m_word_end != end and is_word(utf8::codepoint(m_word_end, end), extra_chars))
utf8::to_next(m_word_end, end); utf8::to_next(m_word_end, end);
return *this; return *this;
} }

View File

@ -0,0 +1 @@
b

View File

@ -0,0 +1 @@
foo_%(b)ar

View File

@ -0,0 +1 @@
set-option global extra_word_chars

View File

@ -0,0 +1 @@
'_'