Senden Sie Text von einem geteilten Fenster zu einem anderen

17

Kürzlich gab es ein Add-On zu NeoVim, das das Öffnen des Terminals in einem VIM-Puffer ermöglicht. Dies bietet attraktive Möglichkeiten, Text von einem VIM-Fenster zu einem anderen zu senden, um beispielsweise ein REPL-ähnliches Verhalten zu reproduzieren.

In der Vergangenheit habe ich tmux für diese Art der Konfiguration verwendet. Jetzt möchte ich es jedoch nur mit NeoVim ausprobieren.

Meine Frage ist - wie kann ich einen Textblock von einem Vim Split zu einem anderen senden? Oder vielleicht eher - wie kann ich die Abfolge des Auswählens, Ziehens, Änderns von Teilungen und anschließenden Einfügens von Text automatisieren?

Karolis Koncevičius
quelle

Antworten:

15

Wenn Sie Text ausgewählt haben, möchten Sie im Grunde eine Tastenfolge neu zuordnen, um zu kopieren, zum Terminal zu wechseln, einzufügen und möglicherweise Fenster zurückzuschalten und den Text erneut auszuwählen. Wenn Sie zwei Spalten geöffnet haben, würde dies ungefähr so ​​aussehen:

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

Wenn es mehr als zwei Teilungen gibt und das Terminal nicht dasjenige ist, in dem Ihr Text ausgewählt ist, möchten Sie entweder eine andere Zuordnung verwenden, die für Ihr Layout geeignet ist (dh <c-w>tSie bewegen sich zum oberen linken Fenster) oder Sie möchten um eine Funktion zu schreiben, die alle Fenster durchläuft und das richtige findet.

Matt Boehm
quelle
Soweit ich sehen kann, wechselt die Verwendung pin einem Terminal-Puffer nicht in den Terminal-Modus, so dass Folgendes <C-\><C-N>nicht erforderlich sein sollte. (Das heißt, es ist auch völlig harmlos.)
Tommcdo
@tommcdo Guter Anruf, hatte die Funktion selbst noch nicht ausprobiert, machte also nur einen Versuch. Ich werde diesen Teil entfernen.
Matt Boehm
17

Neovim-Terminalpuffer haben immer eine zugeordnete Job-ID. Eine Möglichkeit besteht darin, die Jobsteuerungs-API zum Senden des Texts zu verwenden. Fügen Sie dies zu Ihrem vimrc hinzu:

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

Damit wird die Job-ID des zuletzt erstellten Terminals in der g:last_terminal_job_idVariablen gespeichert. Anschließend können Sie einige Funktionen / Befehle / Zuordnungen erstellen, die die Daten mithilfe der jobsendFunktion senden. Hier ein Beispiel:

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

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

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

Das obige würde die aktuelle Zeile senden, aber Sie können sie erweitern, um eine visuelle Auswahl zu senden.

Thiago de Arruda
quelle
2

Neoterm ist ein Plugin für Neovim, das für diesen Zweck entwickelt wurde. Es implementiert einen neuen Befehl, :TREPLSendder die aktuelle Zeile aufnimmt und an ein Terminalfenster sendet. Funktioniert gut für Basic Bash und jede Sprache, die einen REPL-Modus hat.

Placeybordeaux
quelle
0

Zusätzlich zu den Antworten hier habe ich ein Plugin für diesen Zweck implementiert: vim-sendtowindow .

Es bietet einen Send-to-Window- Operator, der mit jeder vim-Bewegung kombiniert werden kann, um Text zum Senden an das benachbarte Fenster auszuwählen. Außerdem positioniert es den Cursor bequem hinter dem gesendeten Text und ist punktwiederholbar.

Ein kleines Beispiel unten:

Beispiel

Karolis Koncevičius
quelle