Заменить визуальный выбор на вывод команды - PullRequest
0 голосов
/ 24 сентября 2018

Я хотел бы заменить части одной строки результатом выбора, переданным в команду.

Например:

echo "hello $(echo "world" | base64)" | vim -

Это откроет буфер с hello d29ybGQK в этом.Теперь нажмите wvw, чтобы визуально выбрать d29ybGQK.

Затем я попытался :!base64 -d, и я ожидал, что буфер будет содержать hello world, чего не произошло.Действительно, вся строка была передана в команду, и вся строка была заменена.

Можно ли заменить только визуальный выбор, и только этот выбор был передан в команду?

Я также попытался c<c-r>=system('base64 -d'), но это не отправило визуальный выбор на стандартный ввод команды.

Ответы [ 2 ]

0 голосов
/ 24 сентября 2018

Фильтрация с ! всегда линейная.Ваше решение с c и регистр выражений - отличный способ решить эту проблему.Вы только забыли передать ввод в system(), который является вторым необязательным аргументом.

Поскольку вы только что изменили выбранный текст, он автоматически вошел в регистр ".Все, что вам нужно сделать, это захватить его обратно и передать в систему с помощью getreg():

c<C-R>=system('base64 -D', getreg('"'))

Обратите внимание, что base64 может повторить символ новой строки в конце.Если вы хотите удалить его, либо оберните все это в trim(), новую функцию в Vim 8, либо используйте [:-2]:

c<C-R>=trim(system('base64 -D', getreg('"')))
c<C-R>=system('base64 -D', getreg('"'))[:-2]

Это сокращение для [0:-2], что означает захватвсе, начиная с символа 0 и заканчивая вторым последним в полученной строке.

Если вы часто используете ее, рассмотрите возможность создания визуальной карты:

vnoremap <leader>d c<C-R>=system('base64 -D', getreg('"'))[:-2]<CR>
0 голосов
/ 24 сентября 2018

По историческим причинам команды Ex по своей сути основаны на строках;почтенный vi также не имел визуального режима.Это ограничение включает в себя фильтрацию по внешней команде с :range!;он всегда будет фильтровать полные строки.

ручное решение

Для простого ввода, как в вашем примере, вероятно, проще всего временно разделить строку, отфильтровать, а затем снова собрать.Например:

:substitute/ /\r/ | execute '.!base64 -d' | -1join

решение для плагинов

Для универсального решения вам нужно использовать или реализовать плагин, который захватывает выделенный текст, фильтрует его (возможно, через system()) изатем заменяет выбор на результат.

Мой Плагин SubstituteExpression имеет отображение {Visual}g=, которое может фильтровать выражения Vimscript, функции и команды Vim и внешние команды.

express.vim от Tom McDonald предлагает практически идентичную реализацию.Он также позволяет на лету создавать операторы через :MapExpress и :MapSubpress, для чего я бы использовал мой TextTransform плагин , который в любом случае необходимо установить как зависимость.Мой плагин предлагает более продвинутые (кросс-режимные) повторы и вариант выражения :Ex -команды, но имеет две большие зависимости, которые вам также нужно установить.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...