내부 vim 명령의 출력을 버퍼로 덤프


18

쉘 명령이 아닌 내부 vim 명령을 새 버퍼에 덤프하는 방법은 무엇입니까?

예를 들어, 나는에 모든 플러그인의 목록을 덤프 할 :enew에서 :scriptnames나는 그것을 검색 할 수 있도록.

답변:


24

:redir출력을 변수, 레지스터 또는 파일로 리디렉션하는 데 사용할 수 있습니다 . 명명되지 않은 레지스터로 리디렉션하는 예 :

:redir @">|silent scriptnames|redir END|enew|put

또는 Tim Pope의 scriptease.vim 은 빠른 수정 목록 및로 :Scriptnames로드 :scriptnames되는 명령을 제공합니다 :copen.

많은 명령을 리디렉션하는 것을 발견하면이를 명령으로 마무리 할 수 ​​있습니다.

command! -nargs=+ -complete=command Redir let s:reg = @@ | redir @"> | silent execute <q-args> | redir END | new | pu | 1,2d_ | let @@ = s:reg

이제 :Redir명령을 사용하여 출력을 새 버퍼로 리디렉션 할 수 있습니다 . 예를 들어 :Redir scriptnames또는 :Redir ls.

Vim 8+

Vim 8은 새로운 execute()기능 과 함께 제공됩니다 . ex 명령 출력을 캡처 execute()하는 대신이 기능을 사용할 수 있습니다 :redir.

 :enew|pu=execute('scriptnames') 

자세한 내용은 다음을 참조하십시오.

:h :redir
:h :silent
:h :scriptnames
:h :enew
:h :put
:h execute()

무슨 END뜻입니까?
Bryce Guinta

1
출력을 레지스터로 리디렉션하는 것을 중지하므로 정기적으로 다시 출력 할 수 있습니다.
텀블러 41

1
:redir ENDVim에게 메시지 리디렉션을 종료하도록 지시합니다. 참조:h :redir
Peter Rincker

외부 명령을 실행하고 Vim 변수에서 출력을 캡처하려면 system ()을 사용하십시오. : let hostname = system ( 'hostname')
user3751385

2

완성도를 위해, 나는 romainl 에서 수집 ( 독점 ) 한이 멋진 기능을 제시하고 싶습니다.

" redirect the output of a Vim or external command into a scratch buffer
function! Redir(cmd)
  if a:cmd =~ '^!'
    execute "let output = system('" . substitute(a:cmd, '^!', '', '') . "')"
  else
    redir => output
    execute a:cmd
    redir END
  endif
  tabnew
  setlocal nobuflisted buftype=nofile bufhidden=wipe noswapfile
  call setline(1, split(output, "\n"))
  put! = a:cmd
  put = '----'
endfunction
command! -nargs=1 Redir silent call Redir(<f-args>)

이것은 일반 또는 시스템 명령 출력을 가져 와서 새 탭에 넣습니다. 줄을 변경 자유롭게 tabnewvsplit또는 split



@DynoFu, 내 답변에 대한 링크가 추가되었습니다.
klaus

1

bufferize.vim 플러그인 도 있습니다 :

:Bufferize scriptnames

기본적으로 허용 된 답변의 패키지 버전 (을 사용하여 :redir)이며 일부에게는 더 편리 할 수 ​​있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.