7

Я читал множество тем о запуске команд оболочки из vim, много документации по командам vim, .vimrc и тому подобное, но я просто не могу понять язык ex или отображения vim достаточно хорошо, чтобы сделать то, что я хочу, поэтому здесь я задаю этот вопрос. Вот оно:

У меня есть открытый буфер в vim (использующий последний стабильный MacVim на Snow Leopard, но не в графическом режиме), содержимое которого я позже передам в инструмент командной строки, который обработает его и выдаст какой-то вывод. Я хочу иметь возможность:

  1. Нажмите клавишу (или комбинацию клавиш, или введите команду vi)
  2. Запустите утилиту командной строки с содержимым моего текущего буфера (который не может быть сохранен в файл)
  3. Захватите его вывод и покажите его в vim, желательно в новом разделенном окне (например:help делает)

Итак, в заключение: я могу запустить

$ cat ~/myinput.txt | myScript > output.txt

Но я хочу сделать что-то подобное внутри vim, поместив вывод в новое разделенное окно, если это возможно.

ОБНОВИТЬ:
Конечно, сразу после публикации я нашел еще немного информации на эту тему. Теперь я знаю, что могу сделать это внутри vim:

:%! myScript

И он поместит вывод myScript (с помещенным в него содержимым буфера) в мой текущий буфер, заменив все, что у меня есть в нем прямо сейчас.

Так есть ли способ поместить это содержимое в новое, разделенное окно, буфер? Спасибо!

4 ответа4

7

Я хотел бы поместить что-то вроде этого в мой ~/.vimrc или файл с расширением .vim в ~/.vim/plugin/:

command! FW call FilterToNewWindow('myscript')

function! FilterToNewWindow(script)
    let TempFile = tempname()
    let SaveModified = &modified
    exe 'w ' . TempFile
    let &modified = SaveModified
    exe 'split ' . TempFile
    exe '%! ' . a:script
endfunction

Тогда вы можете просто сделать " :FW ".

Возможно, было бы неплохо изменить определение команды, чтобы требовать, чтобы аргумент имени сценария фильтра передавался функции вместо ее "жесткого кодирования".

0

Эта команда сделает половину того, что вы хотите.

map <Leader>r :!%:p<cr>

Текущий буфер должен быть исполняемым файлом со строкой shebang, чтобы это работало.

0

Функция из @Heptite, сделанная более общей:

function! FilterToNewWindow()
    let TempFile = tempname()
    let SaveModified = &modified
    exe 'w ' . TempFile
    exe '!chmod +x ' . TempFile
    let &modified = SaveModified
    exe ':e ' . TempFile
    exe '%! ' . @%
   exe 'w!'
endfunction

" bash execute contents of current buffer and filter it to a new window
command! FW call FilterToNewWindow()

`` `

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .