Як я можу придушити повідомлення "читання з STDIN" з Vim?


18

Під час використання Vim для читання з stdin він друкує інформаційне повідомлення:

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

$

Це лише приклад. Фактичне використання не дозволяє конструювати оболонки. vim <(echo foo)не є варіантом.

Чи можу я придушити це, використовуючи лише параметри Vim та / або налаштування vimrc?


Якщо вам потрібно знати, що це таке, я намагаюся використовувати Vim для читання вручень (безсоромний штекер). GNU man не дозволяє вбудувати оболонки MANPAGER, і, використовуючи ftplugin/man.vimта інші речі, мені вдалося отримати комфортний досвід просто MANPAGER="vim -". Останнє роздратування, яке залишається, - це непривабливе повідомлення, надруковане після кожної сторінки, яку я переглянув.


Використання export MANPAGER='vim -c "%! col -b" -c "set ft=man nomod nolist ignorecase" -'чи export MANPAGER="vim -"я не бачу проблем? man lsвідкриває сторінку сторінки, як очікувалося.
Martin Tournoij

@Carpetsmoker і після закриття?
муру

Ні, нічого не бачиш ...
Мартін Турноїй

@Carpetsmoker, яку версію Vim ви використовуєте? Що проecho foo | vim -Nu NONE -
muru

In 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 можуть автоматизувати тривалі виклики замість псевдонімів.)
Джон P

Можливо, можливо відредагувати / вставити вихід з сокета, що може бути дуже корисним, якби це було правдою. Я все ще кажу, що найкращим варіантом є тимчасовий файл, якщо тільки немає прийнятих відповідей. Для даної оболонки, можливо, існує існуючий псевдонім / вбудований / синтаксис, який спрощує деяку частину цього процесу, як, наприклад, вказані на сторінці для 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і його поведінку було змінено, щоб також придушити повідомлення Reading from stdin ... в 8.0.1308. (Між іншим, N файли для редагування повідомлення також бути придушені 8.1.1258)
YNN

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)"'

2
Коли буде ALWAYS_USE_GUI визначено, ви знаєте?
муру

2
див. функцію.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для друку нескінченних сторінок, і ви, нарешті, можете позбутися повідомлення віма зecho test | vim < /dev/tty <(cat>
Олександр Соловець

1

У Vim це питання було розглянуто в 234d162фіксації (> = v8.0.1387).

Рішення: Не показуйте, чи --not-a-termбуло використане повідомлення.

Таким чином, повідомлення відображається лише тоді, коли користувач не перенаправив stdin.


Аналогічне питання було розглянуто в останній версії Neovim ( > = v0.2.2-dev ), яку ви могли використовувати замість Vim.

Після випуску NVim v0.2.2 ви зможете запустити:

$ echo foo | nvim -

не маючи повідомлення.


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для роботи спеціальної конструкції потрібен префікс, <(...)якщо оболонка не підтримує її. В основному оригінальне рішення можна спростити до $ echo foo | vim < /dev/tty <(cat)


Обидва вони висвітлюються в існуючих відповідях або в самому запитанні. Що нового тут?
муру

@muru Не було пояснено, як працює другий випадок, і люди цікавились, чому він працює лише в MANPAGE.
Олександр Соловець
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.