Что-то, что я нашел полезным в других редакторах, - это способность:
- взять выделенный текст
- запустить внешнюю команду и передать выбор ее
stdin
- возьмите внешние команды
stdout
и замените текущий выбор им.
Таким образом, вы можете написать полезные текстовые инструменты, которые работают с выделением, используя любой язык, который может выполнять базовые функции ввода-вывода.
Как это можно сделать с помощью vim, используя выбор? ... один символ, слово, абзац ... и т. д.
(Прямо в командной строке или через привязку клавиш?)
Заметка
Такие команды, как !sort
работа на уровне строки, причина, по которой я задаю этот вопрос, заключается в том, что я хотел бы работать с выбором. (т. е. текст, который будет удален при x
нажатии).
источник
sort
командой.:sort
?Я написал плагин под названием express.vim, который может помочь с этим. Плагин определяет оператор,
g=
который позволяет вам оценивать выражение VimScript по движению (или визуальному выбору). Он запрашивает выражение, в котором вы можете использоватьv:val
в качестве заполнителя текст, охватываемый движением (или, опять же, визуальный выбор).В этом случае полезное выражение будет использовать
system()
функцию, которая запускает внешнюю команду.(Здесь я использовал
tr
в качестве простого примера внешнюю команду.)Способ использования express.vim для этой проблемы состоит в том, чтобы выделить текст в визуальном режиме, затем ввести текст, затем
g=
это выражение, а затем нажатьEnter
:Я признаю, это не легко использовать. (На самом деле, я редко использую этот плагин!) Я подумываю добавить ярлык для вызова внешней команды, такой как запуск выражения с помощью
!
. Я опубликую обновление здесь, если я в конечном итоге сделаю это.РЕДАКТИРОВАТЬ
Я изменил express.vim для обработки выражений, начинающихся с
!
внешних команд. Таким образом, придерживаясьtr
примера, выше становится намного проще. После визуального выбора введите следующее:Объяснение:
g=
!tr a-z A-Z
в качестве выраженияEnter
источник
Вы ищете команды фильтра в Vim. См
:help filter
. Вот соответствующая документация:Таким образом, ввод
5!!sort
будет сортировать следующие 5 строк, начиная с курсора.источник
tr [:lower:] [:upper]
, то vim выделит не только это слово, но и всю строку.Обратите внимание, что это можно сделать с помощью:
s^R=system('tr a-z A-Z', @")[:-2]^M
(с^R
CTRL + R и ^ M с ENTER)Он также может работать с чем угодно, что делает выбор + замена как
ci"^R=...
.источник
v
и перемещения курсора) я получаю сообщение об ошибкеE16: Invalid range\nE16: Invalid range\nE476: Invalid command
(в Linux существуютtr
и другие основные команды).s
что входит в режим вставки или:s
команды?s
из визуального режима или бьете:
первым? Там нет никакого:
участия в последовательности клавиш, которые я написал. Отображение будет:vnoremap µ s<c-r>=system('tr a-z A-Z', @")[:-2]<cr>
.