Как я могу автоматически оценить скрипт и поместить результаты в существующее окно после сохранения в Vim? - PullRequest
4 голосов
/ 22 февраля 2012

Мой идеальный сценарий - разделить Vim на два окна - первое, содержащее скрипт (python), над которым я сейчас работаю, и другое, показывающее результат оценки этого скрипта.Это то, что у меня есть:

:autocmd BufWritePost *.py redir @p | execute 'silent w !python -' | redir END

При сохранении скрипта содержимое скрипта передается в команду python, вывод этой команды сохраняется в регистре p.Каков наилучший способ получить p в новый / пустой буфер, отображаемый в другом окне?

Некоторые вещи, которые я пробовал, это blast | normal! "pp | bfirst (blast: новый / пустой буфер, bfirst: буфер, содержащий скрипт python)но это, кажется, оставляет меня в буфере «вывода», и по какой-то причине я теряю подсветку синтаксиса и мне нужно переключаться между буферами, чтобы получить его обратно.Я действительно хотел бы сделать все это на месте и избежать генерации временного файла дампа, где я передаю выходные данные запуска скрипта, и предпочел бы избегать использования любых других внешних инструментов для «просмотра» файла скрипта python и выполнения каких-либо действий при его изменении.

1 Ответ

3 голосов
/ 22 февраля 2012

Мой подход заключался в использовании окна предварительного просмотра. Это позволяет вам всегда переходить к правильному окну независимо от того, сколько у вас окон. Это также позволяет вам «игнорировать» тот факт, что окно предварительного просмотра открыто, когда вы хотите выйти из vim (вы можете просто сделать :q вместо :qa, например).

autocmd BufWritePost *.py call OutputWindow("python")
autocmd BufWritePost *.rb call OutputWindow("ruby")

function OutputWindow(executable)
    let filename=expand('%:p')

    " move to preview window and create one if it doesn't
    " yet exist
    silent! wincmd P
    if ! &previewwindow
        " use 'new' instead of 'vnew' for a horizontal split
        vnew
        set previewwindow
    endif

    execute "%d|silent 0r!" . a:executable . " " . filename
    wincmd p
endfunction

Возможно, существует менее подробный способ сделать это, но, похоже, он работает довольно хорошо.

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