Vim에서 "STDIN에서 읽기"메시지를 표시하지 않으려면 어떻게해야합니까?


18

Vim을 사용하여 stdin에서 읽을 때 유익한 메시지를 인쇄합니다.

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

$

이것은 단지 예일뿐입니다. 실제 사용은 쉘 구조를 허용하지 않습니다. vim <(echo foo)옵션이 아닙니다.

Vim 옵션 및 / 또는 vimrc 설정 사용하는 것을 억제 할 수 있습니까 ?


이것이 무엇인지 알아야 할 경우 맨 페이지 (shameless plug) 를 읽는 데 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 그리고 닫은 후에?
muru

아뇨, 아무것도 보이지 않습니다 ...
Martin Tournoij

@ Carpetsmoker 어떤 버전의 Vim을 사용하고 있습니까? 무엇에 대한echo foo | vim -Nu NONE -
muru

vim에서는 : help less호출기로 사용하기위한 정보를 제공합니다.
mtklr

답변:


8

Vim 8.0.1308 (2017 년 11 월) 부터 --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 스크립트 파일은 별칭을 사용하는 대신 긴 호출을 자동화 할 수 있습니다.)
John P

소켓에서 출력을 편집 / 붙여 넣기하는 것이 가능할 수 있는데, 이것이 사실이라면 실제로 유용 할 수 있습니다. 나는 여전히 가장 좋은 대답은 임시 답변이라고 말합니다. 허용 된 답변보다 더 나쁜 경고가 없다면. 그러나 주어진 쉘의 경우 zshmisc 맨 페이지 (리디렉션 등)에 나열된 것과 같이이 프로세스의 일부를 단순화하는 기존의 별명 / 내장 / 구문이있을 수 있습니다. 입력을 피하고 공급할 수 있습니다 삽입 모드로 들어가는 인수 뒤에 인수로 입력되므로 입력 한 것처럼 구문 분석합니까?
John P

내가 볼 --not-a-term우분투 16.04 (Mac의 경우는 아니지만 7.4.8056)에 빔 1689년 4월 7일에 있지만 메시지를 표시하지 않습니다.
추후 공지가있을 때까지 일시 중지되었습니다.

@DennisWilliamson의 변경 내역을 참조하십시오 :help version8.txt. --not-a-term옵션 자체가 추가되었으며 7.4.1419동작이에서 읽기 메시지를 표시하지 않도록 변경 되었습니다 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은 작동하는 ™ 설정 ( 예 : 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)"'

2
하면 된다 ALWAYS_USE_GUI 정의, 당신은 알고 있습니까?
muru

2
feature.h를 참조하십시오 (ALWAYS_USE_GUI가 정의되어 있지 않으면 기본적으로 모든 유닉스 버전에 적용됩니다).
Christian Brabandt

2
해결 방법을 찾을 수 없습니다 echo "foo" | vim < /dev/tty. 그것을 제공합니다 [2]+ Stopped echo "foo" | vim < /dev/tty.
Léo Léopold Hertz 준영

2
@ LéoLéopoldHertz 준영과 마찬가지로 tty 트릭은 저에게 효과적이지 않습니다 (gvim은 빈 문서를 제공하고 vim은 키보드 입력과 실제로 혼동되지만 적어도 SIGSTOP을받지 못합니다). 나는 더 많은 행운을 얻었습니다 echo "foo" | gvim /dev/stdin(GUI가 아닌 vim은 여전히 ​​그것에 대해 불만을 제기하지만 Vim: Warning: Input is not from a terminal).
Adam Katz

2
글쎄, 내 이전 메시지를 잊어 버려. 답의 속임수는 <(col -b)일부입니다. 그것은 본질적으로 어떤 정교한 버전의 cat설명서 페이지를 인쇄, 당신은 마지막으로 정력의 메시지를 제거 할 수echo test | vim < /dev/tty <(cat>
알렉산더 Solovets

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

@muru 두 번째 사례가 어떻게 작동하는지 설명하지 않았으며 사람들은 왜 MANPAGE에서만 작동했는지 궁금했습니다.
Alexander Solovets
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.