Jak mogę ukryć komunikat „czytanie z STDIN” z poziomu Vima?

18

Kiedy używasz Vima do czytania ze standardowego wejścia, drukuje komunikat informacyjny:

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

$

To tylko przykład. Rzeczywiste użycie nie pozwala na konstrukcje powłoki. vim <(echo foo)nie jest opcją.

Czy mogę ukryć to używając tylko opcji Vima i / lub ustawień vimrc?


Jeśli musisz wiedzieć, do czego to służy, próbuję użyć Vima do czytania stron podręcznika (bezwstydna wtyczka). GNU man nie zezwala na konstrukcje powłoki MANPAGER, a dzięki użyciu ftplugin/man.vimi innym rzeczom udało mi się wygodnie korzystać z samego MANPAGER="vim -". Ostatnią irytacją jest brzydka wiadomość drukowana po każdej wyświetlonej stronie.

muru
źródło
Używanie export MANPAGER='vim -c "%! col -b" -c "set ft=man nomod nolist ignorecase" -'lub export MANPAGER="vim -"widzę żadnego problemu? man lsotwiera stronę podręcznika zgodnie z oczekiwaniami.
Martin Tournoij
@Carpetsmoker i po zamknięciu?
muru
Nie, nic nie widzę ...
Martin Tournoij
@Carpetsmoker, której wersji Vima używasz? Co powiesz naecho foo | vim -Nu NONE -
muru
W vimie : help lesspodaje kilka informacji na temat używania go jako pagera.
mtklr

Odpowiedzi:

8

Począwszy od wersji Vim 8.0.1308 (listopad 2017 r.), Możesz użyć --not-a-termopcji, aby ukryć ten komunikat; na przykład z quit:

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

Lub z exit:

$ echo hello | vi - --not-a-term -esc 'x!/dev/stdout'
hello
Steven Penny
źródło
Jest to równoważne cat, ale nadal może być przydatne do zastosowania Vimscript do danych wejściowych, np. +'runtime! syntax/2html.vim'Do eksportowania wyróżnionego tekstu jako stylu HTML (przy założeniu dedukcji lub określonego typu pliku). Istnieje kilka innych opcji niż te wspomniane do tej pory; pierwsze, co przychodzi na myśl, to użycie mktempdo przechowywania danych wyjściowych polecenia i użycie ich jako danych wejściowych Vima. Możesz dodać polecenia przekierowania i powłoki Vima, aby „wkleić” wynik polecenia do bufora, ale wymaga to nieco więcej pracy. (Pliki skryptów Vima mogą automatyzować długie wywołania zamiast używać aliasów.)
John P
Może być możliwe edytowanie / wklejanie danych wyjściowych z gniazda, co może być naprawdę przydatne, jeśli to prawda. Nadal twierdzę, że najlepszą opcją jest plik tymczasowy, chyba że istnieją ostrzeżenia gorsze niż te dla zaakceptowanej odpowiedzi. Jednak dla danej powłoki może istnieć alias / wbudowany / składnia, która upraszcza pewną część tego procesu, na przykład te wymienione na stronie podręcznika dla zshmisc (przekierowania itp.) Jeszcze jedno - być może możesz uciec przed wejściem i podać go jako argument po argumencie wchodzącym w tryb wstawiania, więc parsuje się tak, jakby został wpisany?
John P
Widzę --not-a-termw Vim 7.4.1689 w Ubuntu 16.04 (ale nie 7.4.8056 na Macu), ale to nie tłumi wiadomości.
Wstrzymano do odwołania.
@DennisWilliamson Zobacz dziennik zmian autorstwa :help version8.txt. --not-a-termSama opcja została dodana w 7.4.1419, a jego zachowanie zostało zmienione również tłumić wczytuje ze standardowego wejścia ... wiadomości w 8.0.1308. (Nawiasem mówiąc, N plików do edycji wiadomości jest również tłumione od 8.1.1258)
ynn
12

Odpowiedź na dokładne pytanie:

Czy mogę ukryć to używając tylko opcji Vima i / lub ustawień vimrc?

jest: nie, nie jest to możliwe z powodu następującej części kodu

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

co oznacza, że ​​jeśli podasz -vim jako argument, to mechanicznie wyświetli ten komunikat.

jednak w ramach obejścia problemu, jeśli zamiast -argumentu użyjesz przekierowania pliku, pozbędziesz się wiadomości:

echo "foo" | vim < /dev/tty

a oto przykład MANPAGEustawienia, które po prostu działa ™ (wzięte z intertubes):

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
źródło
2
Kiedy jest ALWAYS_USE_GUI zdefiniowany, czy wiesz?
muru
2
zobacz feature.h (dzieje się tak, gdy ALWAYS_USE_GUI nie jest zdefiniowany, więc w zasadzie dla wszystkich wersji unix).
Christian Brabandt,
2
Nie mogę uzyskać obejścia problemu echo "foo" | vim < /dev/tty. Robienie tego daje [2]+ Stopped echo "foo" | vim < /dev/tty.
Léo Léopold Hertz
2
Podobnie jak @ LéoLéopoldHertz 준영, sztuczka tty nie zadziałała dla mnie (gvim daje pusty dokument, vim naprawdę myli się z wejściami z klawiatury, ale przynajmniej nie otrzymuje SIGSTOP). Miałem więcej szczęścia echo "foo" | gvim /dev/stdin(chociaż vim bez GUI nadal będzie narzekał na to:) Vim: Warning: Input is not from a terminal.
Adam Katz
2
Zapomnij o mojej poprzedniej wiadomości. Sztuczka w odpowiedzi jest <(col -b)częściowo. To w istocie wyrafinowana wersja catdo drukowania stron podręcznika i możesz w końcu pozbyć się wiadomości vima zecho test | vim < /dev/tty <(cat>
Alexander Solovets,
1

W Vimie ten problem został rozwiązany w 234d162commit (> = v8.0.1387).

Rozwiązanie: Nie pokazuj, że wiadomość --not-a-termzostała użyta.

Więc komunikat jest wyświetlany tylko wtedy, gdy użytkownik nie przekierował standardowego wejścia.


Podobny problem został rozwiązany w najnowszej wersji Neovim ( > = v0.2.2-dev ), której można użyć zamiast Vima.

Po wydaniu NVim v0.2.2 powinieneś być w stanie uruchomić:

$ echo foo | nvim -

bez wiadomości.

kenorb
źródło
0
  1. W wersji vim 8.0.1387 i nowszych możesz użyć --not-a-termopcji.

  2. W przypadku starszej wersji użyj następującej sztuczki: $ echo foo | bash -c 'vim < /dev/tty <(cat)'

Pierwszy argument w /dev/ttyjakiś sposób zmusza Vima do myślenia, że ​​dane wejściowe pochodzą z klawiatury. Chyba dlatego, że isatty (3) zwraca True dla tego pliku. Drugi argument po prostu przekazuje wszystko, od standardowego wejścia do standardowego wejścia Vima. Wreszcie bash -cprefiks jest wymagany, aby specjalna konstrukcja <(...)działała, jeśli powłoka jej nie obsługuje. W bash oryginalne rozwiązanie można uprościć $ echo foo | vim < /dev/tty <(cat)

Alexander Solovets
źródło
Oba są ujęte w istniejących odpowiedziach lub w samym pytaniu. Co tu nowego?
muru
@muru Nie wyjaśniono, jak działa druga sprawa, a ludzie zastanawiali się, dlaczego działa ona tylko w MANPAGE.
Alexander Solovets