Как вывести результат команд vim в оболочку

11

Допустим, я нахожусь в shell ( bash) и хочу посмотреть, что :scriptnamesполучится, но не хочу запускать vim или, может быть, я хочу перенести это в другой файл.

Итак, я выполняю

vim +scriptnames

Который показывает мне все сценарии, но как мне вставить это в стандартный вывод оболочки?

hgiesel
источник

Ответы:

10

Это происходит потому, что обычно Vim переключается на альтернативный экран и работает там. После выхода Vim переключится обратно, и поэтому от сеанса Vim вы не увидите ничего, кроме результата команды, выполненной еще до запуска Vim.

Эта функция объяснена в :h xterm-screens (ссылка)

Таким образом, вы в принципе не хотите этого и поэтому хотите отключить это. Вы можете сделать это, установив :set t_ti= t_te=коды терминала, которые выполняют это, на пустые.

Собрав все это вместе, вы бы хотели запустить Vim так:

vim -c ':set t_ti= t_te= nomore' -c 'scriptnames|q!'

Мы сбрасываем эту 'more'опцию, чтобы вы не увидели приглашение хит-ввода.

Кристиан Брабандт
источник
1
Это УДИВИТЕЛЬНО, большое спасибо! Я на самом деле сомневался, что это возможно.
Хгизель
Позволяет ли это использовать VimL как полноценный системный язык сценариев, позволяя ему писать в стандартный вывод (для особенно мазохистских)?
теневик
1
Одна проблема с этим, я не могу прокрутить терминал. (Если текст длиннее, чем высота моего терминала, я не вижу верхней части). Текст также исчезает, если я открываю vim, затем выхожу.
FDinoff
@FDinoff Вот для чего lessнужны пейджеры . Просто рассортируйте это как можно меньше vim -c ':set t_ti= t_te= nomore' -c 'scriptnames|q!' | less. Поначалу раскладка может быть испорчена (она у меня в терминале), но после нажатия <CL> все хорошо и модно.
Хгизель
Я не вижу вывода при запуске vim -c ':set t_ti= t_te= nomore' -c 'scriptnames|q!', есть только "быстрая вспышка", команда выхода с кодом 0, нет вывода. Я что-то пропустил?
TrungDQ
3

Мы также можем использовать :redirкоманду для перенаправления результатов команд vim в файл

Например,

vim -c "redir! > vimout | scriptnames | redir END | q"

Это перенаправляет вывод scriptnamesв файл "vimout"

MS.Kim
источник
1

Я ценю ответ, предоставленный Кристианом Брабандтом, но думаю, что лучшим ответом было бы разделить команду quit с помощью другой команды -c, например:

vim -c ':set t_ti= t_te= nomore' -c 'scriptnames' -c 'q!' 

Использование этого метода означает, что вы можете связать воедино несколько различных команд, а затем использовать последний 'q!' выйти из vim.

Бенджамин Фрейзер
источник
0

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

vim -c "autocmd! CursorHold * <commands to run>"

Например, я хотел перенаправить вывод :mapв файл из оболочки, но я хотел захватить отображение, которое vim-Airlines создает только после того, как оно отображает свою табулированную строку (строка вверху, показывающая все открытые имена буферов). это асинхронно, простое выполнение -cперенаправления в файл не дает ему времени на сопоставления. Возможно, есть лучший способ, но это работает для меня, тем более, что я уже updatetimeустановил 100(0,1 секунды), который влияет на то, как долго будет происходить CursorHoldсобытие. По умолчанию vim устанавливает его на 4 секунды.

vim -c "autocmd! CursorHold * set nomore | redir! > mapNew | map | redir END | q"
user1902689
источник