카테고리 보관물: vi

vi

한 분할 창에서 다른 분할 창으로 텍스트 보내기 구성에 tmux를 사용했습니다. 그러나 지금은 NeoVim

최근 NeoVim에 부가 기능이있어 vim 버퍼에서 터미널을 열 수 있습니다. 이것은 하나의 vim 창에서 다른 복제본, 예를 들어 REPL과 같은 동작으로 텍스트를 보낼 수있는 매력적인 가능성을 가지고 있습니다.

과거에는 이런 종류의 구성에 tmux를 사용했습니다. 그러나 지금은 NeoVim 만 사용하여 시도하고 싶습니다.

내 질문은-어떻게 한 vim split에서 다른 vim split으로 텍스트 블록을 보낼 수 있습니까? 아니면 어쩌면-어떻게 텍스트 선택, 짤깍 소리, 분할 변경 및 붙여 넣기 순서를 자동화 할 수 있습니까?



답변

기본적으로 텍스트를 선택한 경우 키 시퀀스를 다시 매핑하여 복사하고 터미널로 전환하고 붙여 넣은 다음 창을 다시 전환하고 텍스트를 다시 선택하려고합니다. 두 개의 스플릿이 열려 있으면 다음과 같습니다.

vnoremap <F5> y<c-w>wp<c-w>pgv
"explanation:
xnoremap <F5>                   Remap F5 in visual/select mode (could be any key combo)
              y                 copy selected text
               <c-w>w           switch to next window
                     p          paste (for terminals this sends the text to the terminal)
                      <c-w>p    switch to previous window
                            gv  reselect

분할이 두 개 이상이고 텍스트가 선택된 후의 터미널이 아닌 경우 레이아웃에 작동하는 다른 매핑을 사용하거나 (예 : <c-w>t왼쪽 상단 창으로 이동) 원하는 경우 모든 창을 반복하고 올바른 창을 찾는 함수를 작성하십시오.


답변

Neovim 터미널 버퍼에는 항상 연관된 작업 ID가 있으므로 한 가지 방법은 작업 제어 API를 사용하여 텍스트를 보내는 것입니다. 이것을 vimrc에 추가하십시오 :

augroup Terminal
  au!
  au TermOpen * let g:last_terminal_job_id = b:terminal_job_id
augroup END

마지막으로 작성된 터미널의 작업 ID를 g:last_terminal_job_id변수에 저장합니다. 그런 다음 함수를 사용하여 데이터를 보낼 함수 / 명령 / 매핑을 만들 수 있습니다 jobsend. 예는 다음과 같습니다.

function! REPLSend(lines)
  call jobsend(g:last_terminal_job_id, add(a:lines, ''))
endfunction

command! REPLSendLine call REPLSend([getline('.')])

nnoremap <silent> <f6> :REPLSendLine<cr>

위는 현재 행을 보내지 만 시각적 선택을 보내도록 확장 할 수 있습니다.


답변

Neoterm 은 이러한 목적으로 개발 된 neovim 용 플러그인입니다. :TREPLSend현재 줄을 가져 와서 터미널 창으로 보내는 새 명령 을 구현합니다 . 기본 bash 및 REPL 모드가있는 모든 언어에 적합합니다.


답변

여기에 대한 답변 외에도 vim-sendtowindow 라는 플러그인을 구현했습니다 .

인접한 창으로 보낼 텍스트를 선택하기 위해 vim 모션과 결합 할 수있는 으로 보내기 연산자를 제공합니다 . 또한 보낸 텍스트 뒤에 커서를 편리하게 배치하고 도트 반복 가능합니다.

아래의 작은 예 :


답변