Как я могу подавить сообщение «чтение из STDIN» из Vim?

18

При использовании Vim для чтения из стандартного ввода выводится информационное сообщение:

$ echo foo | vim -
Vim: Reading from stdin...

$

Это всего лишь пример. Фактическое использование не допускает конструкции оболочки. vim <(echo foo)это не вариант.

Могу ли я подавить это, используя только параметры Vim и / или настройки vimrc?


Если вам нужно знать, для чего это нужно, я пытаюсь использовать Vim для чтения man-страниц (бесстыдный плагин). GNU man не допускает использование оболочек MANPAGER, и, используя ftplugin/man.vimи другие вещи, я успешно справился с удобством использования just MANPAGER="vim -". Последнее остающееся раздражение - неприглядное сообщение, напечатанное после каждой man-страницы, которую я просмотрел.

Мур
источник
Использование export MANPAGER='vim -c "%! col -b" -c "set ft=man nomod nolist ignorecase" -'или export MANPAGER="vim -"я не вижу проблем? man lsоткрывает man-страницу, как и ожидалось.
Мартин Турной
@Carpetsmoker и после того, как ты его закроешь?
Муру
Нет, ничего не вижу ...
Мартин Турной
@Carpetsmoker, какую версию Vim вы используете? Как насчетecho foo | vim -Nu NONE -
Муру
В vim, : help lessдает некоторую информацию для использования его в качестве пейджера.
mtklr

Ответы:

8

Начиная с Vim 8.0.1308 (ноябрь 2017 г.), вы можете использовать --not-a-termопцию для подавления этого сообщения; например с quit:

$ echo hello | vi - --not-a-term -esc '%p|q!'
hello

Или с exit:

$ echo hello | vi - --not-a-term -esc 'x!/dev/stdout'
hello
Стивен Пенни
источник
Как есть, это эквивалентно cat, но все же может быть полезно для применения Vimscript к входным +'runtime! syntax/2html.vim'данным , например, для экспорта выделенного текста в стиле HTML (при условии выведенного или указанного типа файла). Есть несколько вариантов, кроме упомянутых выше; первое, что приходит на ум, - это использовать mktempдля хранения выходных данных команды и использовать их в качестве входных данных Vim. Вы можете добавить команды перенаправления и оболочки Vim, чтобы «вставить» результат команды в буфер, но это потребует дополнительной работы. (Файлы сценариев Vim могут автоматизировать длительные вызовы вместо использования псевдонимов.)
Джон П.
Может быть возможно редактировать / вставлять вывод из сокета, что было бы действительно полезно, если бы оно было правдой. Я по-прежнему говорю, что лучшим вариантом является временный файл, если только нет предосторожностей, которые хуже принятого ответа. Однако для данной оболочки может существовать псевдоним / встроенный / синтаксис, который упрощает некоторую часть этого процесса, например, перечисленные на странице man для zshmisc (перенаправления и т. Д.) Еще один - может быть, вы можете избежать ввода и предоставить его в качестве аргумента после входа аргумента в режим вставки, поэтому он анализируется, как если бы он был напечатан?
Джон П
Я вижу --not-a-termв Vim 7.4.1689 в Ubuntu 16.04 (но не 7.4.8056 на Mac), но это не подавляет сообщение.
Приостановлено до дальнейшего уведомления.
@DennisWilliamson Смотрите список изменений :help version8.txt. --not-a-termсама опция была добавлена, 7.4.1419и ее поведение было изменено, чтобы также подавить чтение из сообщения stdin ... в 8.0.1308. (Кстати, N файлов для редактирования сообщения также будут подавлены 8.1.1258)
Инн
12

Ответ на ваш точный вопрос:

Могу ли я подавить это, используя только параметры Vim и / или настройки vimrc?

это: нет, это не возможно из - за следующую часть коды

    if (read_stdin)
    {
#ifndef ALWAYS_USE_GUI
        mch_msg(_("Vim: Reading from stdin...\n"));
#endif

Это означает, что если вы дадите -vim в качестве аргумента, то это сообщение будет механически показано.

хотя, как обходной путь, если вы используете перенаправление файлов вместо -аргумента, вы избавитесь от сообщения:

echo "foo" | vim < /dev/tty

и вот пример MANPAGEнастройки, которая просто работает ™ (взята из трубок):

export MANPAGER='bash -c "vim -MRn -c \"set ft=man nomod nolist nospell nonu\" -c \"nm q :qa!<CR>\" -c \"nm <end> G\" -c \"nm <home> gg\"</dev/tty <(col -b)"'
ZMO
источник
2
Когда будет ALWAYS_USE_GUI определено, вы знаете?
Муру
2
см. feature.h (это делается, когда ALWAYS_USE_GUI не определен, поэтому в основном для всех версий Unix).
Кристиан Брабандт
2
Я не могу получить обходную echo "foo" | vim < /dev/ttyработу. Делать это дает [2]+ Stopped echo "foo" | vim < /dev/tty.
Лео Леопольд Герц 준영
2
Как и @ LéoLéopoldHertz 준영, уловка tty у меня не сработала (gvim выдает пустой документ, vim действительно путается с вводом с клавиатуры, но, по крайней мере, не получает SIGSTOP). Мне повезло больше echo "foo" | gvim /dev/stdin(хотя vim без GUI по-прежнему будет пожаловаться на это:) Vim: Warning: Input is not from a terminal.
Адам Кац
2
Хорошо, забудь мое предыдущее сообщение. Хитрость в ответе <(col -b)частично. По сути, это какая-то сложная версия catдля печати man-страниц, и вы, наконец, можете избавиться от сообщения vim с помощьюecho test | vim < /dev/tty <(cat>
Alexander
1

В Vim, этот вопрос был рассмотрен в 234d162фиксации (> = v8.0.1387).

Решение: не показывать сообщение с --not-a-termиспользованным.

Таким образом, сообщение отображается только тогда, когда пользователь не перенаправил стандартный ввод.


Подобная проблема была решена в последней версии Neovim ( > = v0.2.2-dev ), которую вы можете использовать вместо Vim.

После выхода NVim v0.2.2 вы сможете запустить:

$ echo foo | nvim -

не имея сообщения.

kenorb
источник
0
  1. С vim версии 8.0.1387 и новее вы можете использовать --not-a-termопцию.

  2. Для более старой версии используйте следующий прием: $ echo foo | bash -c 'vim < /dev/tty <(cat)'

Первый аргумент /dev/ttyкак-то обманывает Vim, полагая, что ввод поступает с клавиатуры. Я думаю, это потому, что isatty (3) возвращает True для этого файла. А второй аргумент просто пропускает все: от стандартного ввода до стандартного ввода Vim. Наконец, bash -cпрефикс необходим для работы специальной конструкции, <(...)если оболочка не поддерживает ее. В bash оригинальное решение может быть упрощено до $ echo foo | vim < /dev/tty <(cat)

Александр Соловец
источник
Обе они описаны в существующих ответах или самом вопросе. Что здесь нового?
Муру
@muru Не было объяснено, как работает второй случай, и люди задавались вопросом, почему он работает только в MANPAGE.
Александр Соловец