14

在使用 NeoVim 的:terminal功能时,我希望能够从寄存器中粘贴文本。

在使用标准文本缓冲区时,我经常使用两种方法从寄存器中粘贴文本:

  • 在正常模式下:"{register}p
  • 在插入模式下:<C-r>{register}

我无法让这些命令按照我希望它们在终端缓冲区中的方式工作。当终端缓冲区处于正常模式时,我可以使用"{register}p将寄存器的内容附加到当前命令行的末尾。有时我想在当前命令行的开头或中间插入文本,似乎没有办法使用这个命令来做到这一点。

在我看来,这应该可以通过切换到终端模式(这似乎是相当于插入模式的终端缓冲区)并使用<C-r>{register}命令来实现。但是ctrl+r直接发送到我的外壳。我正在使用 bash shell,它将这些键映射到反向搜索功能,所以我发现自己在看这个提示:

(reverse-i-search)`':

有什么方法可以<C-r>{register}在终端模式下使用吗?

4

3 回答 3

15

Nvim 对于在终端模式下处理任何键(除了<C-\><C-N>)是保守的,因此默认情况下不处理 CTRL-R。此外,Nvim 不知道里面运行的是哪个应用程序:terminal,所以p只是盲目地将文本发送到输入流。

话虽如此,您可以使用:tnoremapCTRL-R 获得类似的效果:

:tnoremap <expr> <C-R> '<C-\><C-N>"'.nr2char(getchar()).'pi'
于 2017-01-16T20:25:09.420 回答
4

实际上不需要在配置中插入控制字符。您可以让 Nvim 为您解除转义。

"Enable CTRL-V in terminal mode
tnoremap <expr> <C-R> '<C-\><C-N>"'.nr2char(getchar()).'pi'
于 2017-01-17T07:41:02.090 回答
1

在文档中

neovim 文档 ( :help terminal-input) 建议:

To simulate i_CTRL-R in terminal-mode:
    :tnoremap <expr> <C-R> '<C-\><C-N>"'.nr2char(getchar()).'pi'

对于普通键盘

不幸的是,这与终端历史搜索 Cr 冲突。您可以修改它以使用普通键盘上的 Alt 键:

To simulate i_CTRL-R in terminal-mode:
    :tnoremap <expr> <A-R> '<C-\><C-N>"'.nr2char(getchar()).'pi'

适用于 Macbook

但这在 MacbookPro 上不起作用,因为 Alt 不是一个东西,而且 NeoVim 不为 Command⌘ 做绑定。这适用于 MacbookPro,到目前为止我觉得它很舒服:

To simulate i_CTRL-R in terminal-mode:
    :tnoremap <expr> <C-\><C-\> '<C-\><C-N>"'.nr2char(getchar()).'pi'

免责声明:我set -o vi在终端中使用。所以就是这样。你的旅费可能会改变。哦,我没有使用 iTerm2。我正在使用 Alacritty 终端仿真器。因此,当我进行历史搜索时,我所做的Ctrl-[就是nnnnN直到找到我的东西。或Ctrl-[, /,等<searchterm><enter>_nnNn

于 2019-04-24T21:31:14.490 回答