Могу ли я в Vim "транслировать" выходные данные, например, "w! ruby" в буфер, строка за строкой, когда они выводятся? - PullRequest
4 голосов
/ 16 марта 2011

В настоящее время я делаю что-то вроде этого:

redir => m
  silent w ! ruby
redir END
new
put=m

Он выполняет содержимое текущего буфера в виде кода Ruby и помещает вывод в новый буфер.

Но еслиКод Ruby, который я запускаю, выглядит примерно так:

puts "start"
sleep 10
puts "end"

, тогда я не увижу вывод в течение 10 секунд, а затем одновременно и "начало", и "конец".«поток» вывод в буфер, строка за строкой, как это выглядит?Чтобы я увидел «начало», а через 10 секунд я увидел «конец»?Аналогично тому, что произойдет, если я просто сделаю

w ! ruby

и посмотрю на вывод в командной строке.

Ответы [ 3 ]

2 голосов
/ 13 апреля 2011

Vim на самом деле не предоставляет примитивы для этого типа ввода / вывода, но вы можете сделать это с помощью одного из встроенных языковых интерфейсов.

Вот эскиз с использованием Python и подпроцесса (Ruby будет выглядеть аналогично; см. if_ruby ):

python << EOF
import vim
import subprocess

def output_lines_to_buffer(cmd):
    """
    Append the given shell command's output linewise to the current buffer.
    """
    p = subprocess.Popen(cmd, stdout=subprocess.PIPE, shell=True)
    for line in iter(p.stdout.readline, ''):
        vim.current.buffer.append(line)
        vim.command('redraw')
EOF

Для использования:

:python output_lines_to_buffer('my command')

Это просто добавит каждую строку вывода в конец текущего буфера, так как my command выдает его. Вы можете довольно просто расширить его для поддержки диапазонов ввода и вывода и т. Д., В зависимости от того, что вам нужно.

0 голосов
/ 13 апреля 2011

Как насчет использования tee или :make, который использует тройник.

let fname = tempname()
exec "w ! ruby 2>&1 | tee ".fname
exec "new ".fname

Редактировать: похоже, что вы работаете в Linux или операционной системе, которая создает 4K буфера между конвейерными процессами. Чтобы обойти это, установите expect (sudo apt-get install expect-dev) и используйте команду unbuffer, чтобы разрешить потоковую передачу построчно (см .: https://stackoverflow.com/questions/1000674/turn-off-buffering-in-pipe).

let fname = tempname()
exec "! unbuffer ruby % 2>&1 | tee ".fname
exec "new ".fname
0 голосов
/ 16 марта 2011

Таким образом, одно из возможных решений (надеюсь, не самое лучшее) - записать файл на диск, открыть этот файл в буфере и выполнить :setlocal autoread, чтобы файл автоматически обновлялся при его изменении.

Это автообновлениекажется довольно грубым, хотя Tail Bundle.vim , кажется, немного улучшается.

Надеясь на лучший ответ.

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