diff --git a/doc/pages/keys.asciidoc b/doc/pages/keys.asciidoc index e03eae39d..e61160e79 100644 --- a/doc/pages/keys.asciidoc +++ b/doc/pages/keys.asciidoc @@ -351,6 +351,9 @@ is a sequence of non whitespace characters convert spaces to tabs in current selections, uses the buffer tabstop option or the count parameter for tabstop +*_*:: + trim selections + **:: rotate selections content, if specified, the count groups selections, so the following command diff --git a/src/normal.cc b/src/normal.cc index 1019ef46a..0e00a978b 100644 --- a/src/normal.cc +++ b/src/normal.cc @@ -1618,6 +1618,22 @@ void spaces_to_tabs(Context& context, NormalParams params) SelectionList{ buffer, std::move(spaces) }.insert("\t"_str, InsertMode::Replace); } +void trim_selections(Context& context, NormalParams) +{ + auto& buffer = context.buffer(); + for (auto& sel : context.selections()) + { + auto beg = buffer.iterator_at(sel.min()); + auto end = buffer.iterator_at(sel.max()); + while (beg != end and is_blank(*beg)) + ++beg; + while (beg != end and is_blank(*end)) + --end; + sel.min() = beg.coord(); + sel.max() = end.coord(); + } +} + SelectionList read_selections_from_register(char reg, Context& context) { if (not is_basic_alpha(reg) and reg != '^') @@ -2166,6 +2182,8 @@ static const HashMap key { {'@'}, {"convert tabs to spaces in selections", tabs_to_spaces} }, { {alt('@')}, {"convert spaces to tabs in selections", spaces_to_tabs} }, + { {'_'}, {"trim selections", trim_selections} }, + { {'C'}, {"copy selection on next lines", copy_selections_on_next_lines} }, { {alt('C')}, {"copy selection on previous lines", copy_selections_on_next_lines} }, diff --git a/test/normal/trim/cmd b/test/normal/trim/cmd new file mode 100644 index 000000000..d7c8655d9 --- /dev/null +++ b/test/normal/trim/cmd @@ -0,0 +1 @@ +%_ diff --git a/test/normal/trim/in b/test/normal/trim/in new file mode 100644 index 000000000..1310992b1 --- /dev/null +++ b/test/normal/trim/in @@ -0,0 +1,3 @@ +line 1 + line 2 + line 3 diff --git a/test/normal/trim/out b/test/normal/trim/out new file mode 100644 index 000000000..0be302603 --- /dev/null +++ b/test/normal/trim/out @@ -0,0 +1,3 @@ +line 3 + line 1 + line 2 diff --git a/test/normal/trim/table/cmd b/test/normal/trim/table/cmd new file mode 100644 index 000000000..31354ec13 --- /dev/null +++ b/test/normal/trim/table/cmd @@ -0,0 +1 @@ +_ diff --git a/test/normal/trim/table/in b/test/normal/trim/table/in new file mode 100644 index 000000000..781140485 --- /dev/null +++ b/test/normal/trim/table/in @@ -0,0 +1,4 @@ +| | | | | +|:------|------:|:------:|----------------| +|%(foo )|%( bar)|%( qux )|%( pop )%( hip )| +%( kakoune ) diff --git a/test/normal/trim/table/selections b/test/normal/trim/table/selections new file mode 100644 index 000000000..ed988a11c --- /dev/null +++ b/test/normal/trim/table/selections @@ -0,0 +1 @@ +foo:bar:qux:pop:hip:kakoune