我需要使返回的文本echo $(which bash)
可粘贴到在 Vim 中打开的文本文件中。
令我感到困惑的是,似乎至少有三个剪贴板:
- 系统剪贴板(例如,Command-C > Command-V)
- shell 剪贴板(例如 Control-U > Control-Y)
- Vim 剪贴板(例如,yy > p)
因此,为了完成我的任务,我可以例如键入echo $(which bash) | pbcopy
,打开 Vim,然后按 Command-V。
这是可行的,但我不确定非新手 Vim 用户是否愿意这样做,因为在这种情况下 Vim 会从系统剪贴板读取,而从系统剪贴板读取有很多细微差别:例如,你的 Vim 是否使用特定选项编译,你是否在你的 中有适当的设置.vimrc
,等等。
实现这一目标更正确的方法是什么?
除了使用剪贴板之外,此用例还非常适合
:r!
:
进入命令模式r
意味着我们将读取一些内容(如果我们不包括!
,那么它将读取一个文件)。!
表示我们将执行一个过程。stdout 将被输入r
并插入到我们的文档中。请注意,在最好的情况下,
echo
这里不是很有用。which bash
已经返回了类似的东西/usr/bin/bash
,所以我们只运行echo /usr/bin/bash
输出/usr/bin/bash
。在最坏的情况下,您运行的进程可能会输出 echo 的选项,例如-e
或一些转义序列,例如\b
,或者输出带有IFS=
字符的东西。这可能会导致echo
解释其输入并采取行动,而不是逐字打印。因此,我建议删除echo
(或至少用替换printf
)。:r!
下面是我在日常生活中使用的例子。如果我尝试将未版本控制的文件添加到svn:ignore
(类似于 subversion 的属性.gitignore
),我会这样做:然后,在 中
vim
,我可以:这将调用
svn status
列出所有已修改、丢失、未版本控制、新、已删除的文件。然后我使用 来awk
关注以 开头的任何内容?
(表示未版本控制),然后打印文件名。vim
将结果插入到我的svn:ignore
临时文件中,然后:wq
将会退出编辑器并设置属性。如果您按照问题标签使用macos ,则默认 Vim 具有剪贴板支持:
因此,如果内容已复制到系统剪贴板(使用
pbcopy
、CmdC或其他方法),则使用"+p
或"*p
(或P
,取决于您想要如何粘贴)。在 macOS 上,+
和*
是等效的。这无需任何额外的 vimrc 配置(例如,运行vim -u NONE
或时vim --clean
)。我没有将 Vim 版本映射到 macOS 版本,但任何最新的 macOS 都应该有一个带有命令的 Vim 版本( 2017 年添加),您可以使用该
:terminal
命令在Vim 中运行终端,并访问该终端的内容以在 Vim 中进行复制粘贴。使用:term
启动终端,运行命令,使用C-w N
进入终端正常模式,像在正常模式下一样复制和选择文本,像平常一样切换到要粘贴的缓冲区,然后像平常一样粘贴。