vim의 텍스트에 명령 결과를 삽입하는 방법은 무엇입니까? 시간 문자열을

예를 들어, :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>

답변

:r!date +\%c

보다 :help :r!


답변

이 명령은 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과 링크는 다음을 참조 하십시오. 관련 명령.


답변

:call append(line('.'), strftime("%c"))

다음 줄에 넣으면 J( Shift+ J)를 눌러 현재 위치에 연결할 수 있습니다.

또는 하나의 명령으로 모두 필요하면 할 수 있습니다.

:call setline(line('.'), getline(line('.')) . strftime("%c"))

또는

:call setline(line('.'), getline(line('.')) . " " . strftime("%c"))

날짜 이전에 공백을 삽입할지 여부에 따라


답변

공백을 사용하고 들여 쓰기를 증가시키는 문제를 피하기 위해 @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버퍼에 삽입되지 않습니다.


답변

이것이 내가하는 방법입니다. 사용하기 때문에 커서 바로 뒤에 놓습니다 p.

" save previous yank
let reg_save = @@

" save your text to the '@' register
let @@ = strftime('%c')
" paste it after the cursor
exec "normal! p"

" restore previous yank
let @@ = reg_save