예를 들어, :echo strftime(%c)
맨 아래에 현재 시간을 표시하지만이 시간 문자열을 텍스트에 삽입하는 방법 (커서 바로 뒤에)?
예를 들어, :echo strftime(%c)
맨 아래에 현재 시간을 표시하지만이 시간 문자열을 텍스트에 삽입하는 방법 (커서 바로 뒤에)?
답변:
당신이 사용할 수있는 표현 레지스터 "=
, 과 p
(또는 P
) 정상 모드에서 또는 <C-R>
삽입 모드에서 :
일반 모드에서 :
( <C-M>
여기서 Control+를 의미 M하거나 Enter/를 누르십시오 Return)
"=strftime('%c')<C-M>p
삽입 모드에서 :
( <C-M>
위와 같은 의미를 가지며, +를 <C-R>
의미합니다 )ControlR
<C-R>=strftime('%c')<C-M>
같은 표현 여러 번의 결과를 삽입 할 경우, 당신이 키에 그들을지도 할 수 있습니다 귀하의 .vimrc
:
(여기 <C-M>
와 <C-R>
(문자로 입력해야합니다 다섯 개 인쇄 할 수있는 일련의 문자 - 빔이 내부적으로 그들을 변환합니다))
:nmap <F2> "=strftime('%c')<C-M>p
:imap <F2> <C-R>=strftime('%c')<C-M>
"=
레지스터. :-/
<C-R>=&sessionoptions
-와일드 모드 탭 완성도 수행합니다!
<c-r>=
하는 명령이 느리면 출력이 많을 수 있고 들여 쓰기가 끊어 질 수 있으므로 출력 텍스트를 읽을 수 없습니다. 예를 들어, <c-r>=execute('nmap')
출력은 한 줄씩 작성되므로 매우 느립니다.
이 명령은 strftime("%c")
커서가있는 곳에 오른쪽 의 출력을 삽입합니다 .
:exe ":normal i" . strftime("%c")
과
:call feedkeys("i". strftime("%c"))
원하는 것을 수행하는 다른 방법이 있습니다 (예 : Mikel의 답변 에있는 것과 같은 방법 ).
편집 : 더 나은 경우, 인서트 인서트의 경우 Chris Johnsen이 설명한대로=
레지스터를 사용하십시오.
vim 명령 의 출력을 삽입하려면 ( 함수 호출 의 반환 값이 아닌 )이를 캡처해야합니다. 이 :redir
명령을 통해 vim의 표준 출력을 변수, 파일, 레지스터 또는 기타 대상으로 리디렉션 할 수 있습니다.
:redir
고통스럽고 사용하기 불편하다. 더 편리한 방식으로 기능을 캡슐화하는 함수를 작성합니다.
funct! Exec(command)
redir =>output
silent exec a:command
redir END
return output
endfunct!
이러한 함수를 선언하면 Chris Johnsen이 설명한대로 식 레지스터를 사용하여 커서 위치에 명령 출력을 삽입 할 수 있습니다. 따라서 일반 모드에서 i^R=Exec('ls')
vim의 현재 버퍼 목록을 삽입하십시오.
명령은 함수 네임 스페이스에서 실행되므로 전역 변수를 사용하는 경우 접두사 앞에 접두사를 붙여 명시 적으로 네임 스페이스를 지정해야합니다 g:
. 또한 Exec()
위에서 언급 한 것처럼 한 줄 출력에도 종료 줄 바꿈이 추가됩니다. substitute()
이를 피하기 위해 함수에 대한 호출을 추가 할 수 있습니다 .
또한 https://stackoverflow.com/questions/2573021/vim-how-to-redirect-ex-command-output-into-current-buffer-or-file/2573054#2573054에 대한 자세한 내용 redir
과 링크는 다음을 참조 하십시오. 관련 명령.
set paste
출력과 set nopaste
이후 를 반환하기 전에 명령을 추가했습니다 . 실제로 현재 붙여 넣기 옵션의 값을 저장하고 반환하고 싶지만 그렇게 할 수 없었습니다.
set nopaste
이후에는 작동하지 않아야 return output
합니다. 이 페이지에 대한 별도의 답변으로이 문제에 대한 해결책을 제시했습니다.
공백을 사용하고 들여 쓰기를 증가시키는 문제를 피하기 위해 @intuited 답변 개선 :
"Examples:
":call Exec('buffers')
"This will include the output of :buffers into the current buffer.
"
"Also try:
":call Exec('ls')
":call Exec('autocmd')
"
funct! Exec(command)
redir =>output
silent exec a:command
redir END
let @o = output
execute "put o"
return ''
endfunct!
:call Exec('command')
일반 모드에서 파일의 현재 위치에 삽입하면 됩니다. 주석 에서 언급했듯이 문자열 =Exec('command')
을 Exec(..)
반환하는 원래 (삽입 모드) Ctrl + R 접근 방식은 을 사용하여 부분적으로 수정할 수 set paste
있지만 set nopaste
어디에나 넣을 수있는 기회는 제공하지 않습니다 .
let @o = output
구문 레지스터 설정 o
변수의 내용을 output
여기에 설명 된 바와 같이 : https://stackoverflow.com/a/22738310/1143274
return ''
의 기본 반환 값이 있도록 행은 0
버퍼에 삽입되지 않습니다.