vim: выполнить команду оболочки без фильтрации - PullRequest
33 голосов
/ 06 августа 2009

Я хочу выделить блок текста (например, V%) и использовать текст в качестве ввода для команды оболочки (например, wc или pbcopy) - но я НЕ хочу изменять текущий буфер - я просто хочу увидеть выходные данные команды (если есть) и продолжить редактирование без изменений.

Ввод V%!wc переводит в :'<,'>!wc и переключает блок текста для вывода команды wc.

Как передать поток текста в произвольную команду оболочки, не затрагивая текущий буфер?

Ответы [ 4 ]

83 голосов
/ 05 июня 2010

Выберите свой блок текста, затем введите следующие клавиши: w! Sh

Все это должно выглядеть так:

:'<,'>w !sh

Вот и все. Мне понадобилось 8 лет, чтобы выучить это:)

примечание: ввод: после выделения текста выдает: <, '> диапазон, указывающий начало и конец выделения.

Обновление 2016: Это на самом деле только одно использование универсального:

'<,'>w !cli_command

Что в основном позволяет вам "отправлять" произвольные части вашего файла внешним командам и просматривать результаты во временном окне vi без изменения буфера. Другими полезными примерами будут:

'<,'>w !wc
'<,'>w !to_file my_file

Честно говоря, я считаю более полезным изменить текущий буфер. Это разнообразие просто:

'<,'>!wc
'<,'>!to_file my_file
4 голосов
/ 06 августа 2009

Одной из возможностей было бы использование system() в пользовательской команде, что-то вроде этого:

command! -range -nargs=1 SendToCommand <line1>,<line2>call SendToCommand(<q-args>) 

function! SendToCommand(UserCommand) range
    " Get a list of lines containing the selected range
    let SelectedLines = getline(a:firstline,a:lastline)
    " Convert to a single string suitable for passing to the command
    let ScriptInput = join(SelectedLines, "\n") . "\n"
    " Run the command
    let result = system(a:UserCommand, ScriptInput)
    " Echo the result (could just do "echo system(....)")
    echo result
endfunction

Назовите это с помощью (например):

:'<,'>SendToCommand wc -w

Обратите внимание, что если вы нажмете V%:, для вас будет введен :'<,'>.

:help command
:help command-range
:help command-nargs
:help q-args
:help function
:help system()
:help function-range
1 голос
/ 19 марта 2012

Обновление: мой ответ ерунда.

@ pixelearth ответ хороший, но у меня возникли небольшие проблемы с пониманием того, что он сделал, поэтому я написал следующее. Эта последовательность команд позволяет вам выполнить wc -l для вашего визуального выбора. wc -l просто считает количество переданных ей строк.

  1. В Vim перейдите в визуальный режим, используя v
  2. Выберите несколько строк, спускаясь вниз: jjjj
  3. Введите :, который Vim переведет в :'<,'>
  4. Введите w !wc -l, теперь ваша полная командная строка должна быть :'<,'>w !wc -l
  5. Нажмите Enter, чтобы получить результат вашей команды (в данном примере это будет 4)
  6. Нажмите Enter, чтобы продолжить редактирование

Я не понимаю, что именно происходит на шагах 3 и 4, но я знаю, что это работает.

0 голосов
/ 06 августа 2009

Я знаю, что это не идеальное решение, но если ничего не помогает, вы всегда можете просто нажать u после выполнения команды, чтобы отменить изменение буфера.

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