vim의 텍스트에 명령 결과를 삽입하는 방법은 무엇입니까?


42

예를 들어, :echo strftime(%c)맨 아래에 현재 시간을 표시하지만이 시간 문자열을 텍스트에 삽입하는 방법 (커서 바로 뒤에)?


1
OP는 "Vim 식의 결과를 텍스트에 삽입하는 방법"을 의미한다고 생각합니다.
Alastair Irvine

정적 텍스트 블록을 삽입하는 vim 함수 작성 과 같은 질문 은 아니지만 일부 답변이 여전히 적용 된다는 점도 언급 할 가치가 있습니다.
Alastair 어바인

당신의 예는 말 그대로 나의 유스 케이스이며 나는 당신에게 경의를 표합니다.

레지스터로 리디렉션 참조 : stackoverflow.com/questions/2573021/…
NeilG

답변:


49

당신이 사용할 수있는 표현 레지스터 "=,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>

2
+1 할인 코스! "=레지스터. :-/
Eelvex

2
vim 변수 (예 : sessionoptions)의 값을 얻으려면 : <C-R>=&sessionoptions-와일드 모드 탭 완성도 수행합니다!
Justin M. Keyes

2
: put = strftime ( '% c') <CM>
brunch875

삽입 모드에서 사용 <c-r>=하는 명령이 느리면 출력이 많을 수 있고 들여 쓰기가 끊어 질 수 있으므로 출력 텍스트를 읽을 수 없습니다. 예를 들어, <c-r>=execute('nmap')출력은 한 줄씩 작성되므로 매우 느립니다.
jdhao

22

:r!date +\%c

보다 :help :r!


1
date!OP는 vim 명령을 요청하는 동안 외부 명령이며 외부 명령을 호출합니다.
Eelvex

@eelvex 아니 그는하지 않았다. 그리고 ! vim 및 vi 명령입니다. 이것은 정식 방법입니다. 다른 많은 것들에도 적용됩니다.
키이스

5
@Keith : yes !외부 명령을 호출하는 vi (m) 명령입니다 . vim 명령 만 출력하고 싶지는 않지만 OP가 맞을 수도 있지만 그렇지 !않을 수도 있습니다.
Eelvex

11

이 명령은 strftime("%c")커서가있는 곳에 오른쪽 의 출력을 삽입합니다 .

:exe ":normal i" . strftime("%c")

:call feedkeys("i". strftime("%c"))

원하는 것을 수행하는 다른 방법이 있습니다 (예 : Mikel의 답변 에있는 것과 같은 방법 ).

편집 : 더 나은 경우, 인서트 인서트의 경우 Chris Johnsen이 설명한대로= 레지스터를 사용하십시오.


10

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


2
이것은 잘 작동합니다. 줄이 공백으로 시작할 때 계단 들여 쓰기를 피하기 위해 set paste출력과 set nopaste이후 를 반환하기 전에 명령을 추가했습니다 . 실제로 현재 붙여 넣기 옵션의 값을 저장하고 반환하고 싶지만 그렇게 할 수 없었습니다.
Juan Lanus

1
@JuanLanus return 문은 함수의 종료점이므로 set nopaste이후에는 작동하지 않아야 return output합니다. 이 페이지에 대한 별도의 답변으로이 문제에 대한 해결책을 제시했습니다.
Evgeni Sergeev

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

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

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

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

또는

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

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


4

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


2

이것이 내가하는 방법입니다. 사용하기 때문에 커서 바로 뒤에 놓습니다 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
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.