如何将粘贴的文本粘贴到Vim命令行?
我想将抽取的文本粘贴到Vim命令行中。 可能吗?
是。 按Ctrl – R然后是“ ,如果你有字面控制字符的话,使用Ctrl – R , Ctrl – O , ” 。
这里是一个解释你可以用寄存器做什么。 你可以用寄存器做什么是非凡的,一旦你知道如何使用它们,你就离不开它们。
寄存器基本上是string的存储位置。 Vim有许多工作方式不同的寄存器:
-
0
(yank寄存器:当你在正常模式下使用y
,没有指定一个寄存器,被抽出的文本到那里,也是默认的寄存器), -
1
到9
(移动删除寄存器,当你使用c
或d
这样的命令时,删除的内容到寄存器1,寄存器1到寄存器2的内容等等 ), -
"
(默认寄存器,也称为未命名的寄存器,这是”进入Ctrl – R “的地方 ) -
a
到z
供您自己使用(大写字母A
到Z
用于附加到相应的寄存器)。 -
_
(像/dev/null
(Unix)或NUL
(Windows),你可以写入,但是它被丢弃,当你读它时,它总是空的), -
-
(小删除寄存器), -
/
(search模式寄存器,当您查找带有/
,?
,*
或#
文本时更新;您也可以通过写入来dynamic更改search模式), -
:
通过Q
或:
,只读存储最后的VimLtypes命令), -
+
和*
(系统剪贴板寄存器,您可以写信给他们设置剪贴板并从中读取剪贴板中的内容)
请参阅:help registers
以供参考。
您可以随时使用:registers
来显示所有寄存器的内容。 这个命令的同义词和简写是:display
, :reg
和:di
。
在插入或命令行模式下, Ctrl – R加上一个寄存器名称,插入该寄存器的内容。 如果你想直接插入它们(不需要自动缩进,不需要像0x08
这样的控制字符转换到退格键等等),你可以使用Ctrl – R , Ctrl – O ,注册名。 请参阅:help i_CTRL-R
和以下段落以获取更多参考。
但是你也可以做下面的事情(我可能忘记了寄存器的许多用途)。
-
在正常模式下,点击“ : p 。你在vim中使用的最后一个命令被粘贴到你的缓冲区中。
让我们分解一下:"
是一个普通模式命令,可以让你select在下一个抽签,删除或者粘贴操作中使用哪个寄存器,所以” :select冒号寄存器(存储最后的命令)。 那么p是你已经知道的一个命令,它粘贴寄存器的内容。比照
:help "
,:help quote_:
-
你正在编辑一个VimL文件(比如你的
.vimrc
文件),现在想执行几行连续的行: y j : @ “ Enter” 。
在这里, y j把当前行和下一行(这是因为j是一个行向运动,但是这个超出了这个回答的范围)写入默认寄存器(也称为未命名寄存器)。 然后:@
@Ex命令播放存储在寄存器中的Ex命令作为参数,"
你是如何引用未命名的寄存器的,同样参见这个答案的顶部。不要混淆在这里使用(这是一个注册名称)与
"
来自前面的例子,这是一个正常模式命令。比照
:help :@
和:help quote_quote
-
在插入模式下将最后的search模式插入到文件中,或者使用Ctrl – R , /插入到命令行中。
比照
:help quote_/
,help i_CTRL-R
推论:保持你的search模式,但添加一个替代:
/
Ctrl – R , /\|alternative
。 -
你已经在视觉模式中select了一行中间的两个单词,用
y
抽出它们,它们在未命名的寄存器中。 现在你想在你的下面打开一个新的行,用这两个词:pu
。 这是:put "
简写:put
命令与许多Ex命令一样,只能以线性方式工作。比照
:help :put
你也可以这样做::
:call setreg('"', @", 'V')
然后p
。setreg
函数将给定名称的寄存器设置为第一个参数(作为string),使用第二个参数的内容对其进行初始化(并且可以使用寄存器作为名称@x
variables,其中x
是VimL),并将其转换为第三个参数中指定的模式,V
为linewise,characterwise和literal分别为^V
和blockwise。比照
:help setreg()
。 相反的function是getreg()
和getregtype()
。 -
如果你用
qa
…q
logging了一个macros,那么:echo @a
会告诉你你input的内容,而@a
将重放macros(可能你知道这个macros对于避免重复任务非常有用)比照
:help q
,help @
前面例子的推论:如果剪贴板中有
8go
,那么@+
会将剪贴板内容作为一个macros来播放,然后转到文件的第8个字节。 其实这将几乎每个登记册。 如果最后插入的string在插入模式下是dd
,那么@.
将(因为.
寄存器包含最后插入的string)删除一行。 (Vim文档在这方面是错误的,因为它指出寄存器#
,%
:
和.
只能和p
,P
,:put
和Ctrl – R一起工作 )。比照
:help @
不要混淆
:@
(从寄存器播放Vim命令的命令)和@
(从寄存器播放正常模式命令的正常模式命令)。值得注意的例外是
@:
:。 命令寄存器不包含最初的冒号也不包含最终的回车。 然而在普通模式下,@:
会做你所期望的,把这个寄存器解释为一个Ex命令,而不是在正常模式下播放它。 所以如果你的最后一个命令是:e
,寄存器包含e
但是@:
将重新加载文件,而不是到词的结尾。比照
:help @:
-
在正常模式下显示您将要执行的操作:
@='dd'
。 只要你按=
键,Vim就会切换到expression式求值:当你input一个expression式并按回车键 ,Vim就会计算出来,结果作为寄存器内容。 当然,register=
是只读的,而且是一次性的。 每次你开始使用它,你将不得不input一个新的expression式。比照
:help quote_=
推论:如果你正在编辑一个命令,并且你意识到你应该需要在你的命令行插入当前缓冲区的一行:不要按Esc ! 使用Ctrl – R
=getline(58)
Enter 。 之后,你将回到命令行编辑,但它已经插入了第58行的内容。 -
手动定义search模式
:let @/ = 'foo'
比照
:help :let
请注意,这样做,你不需要逃避
/
在模式中。 但是,当然,你需要加倍所有的单引号。 -
复制所有以
foo
开头的行,然后把所有包含bar
行都链接到剪贴板,链接这些命令:qaq
(复位寄存器中存储一个空的macros):g/^foo/y A
,:g/bar/y A
,:let @+ = @a
。使用资本注册名称使注册工作在附加模式
更好的是,如果
Q
没有被mswin.vim
重新映射,用Q
启动Ex模式,链接那些实际上更好的叫做“Ex命令”的“冒号命令”,并通过inputvisual
返回到正常模式。比照
:help :g
,:help :y
,:help Q
-
双空间你的文件::
:g/^/put _
。 这使黑洞寄存器的内容(在读取时为空,但是可写,像/dev/null
)在每行之后(因为每行都有一个开始!)。 -
在每行之前添加一个包含
foo
行:::g/^/-put ='foo'
。 这是expression式寄存器的巧妙使用。 在这里,-
是.-1
的同义词(参见:help :range
)。 因为:put
把文本:put
行后面,你必须明确地告诉它对前一行进行操作。 -
将整个缓冲区复制到系统剪贴板
:%y+
。比照
:help :range
(对于%
部分)和:help :y
。 -
如果你错误地logging了一个macros,你可以input
:let @a='
Ctrl – R=replace(@a,"'","''",'g')
input'
并编辑它。 这将修改存储在寄存器a
中的macros的内容,这里显示了如何使用expression式寄存器来完成这个操作。 -
如果你做了
dddd
,你可以做uu
来撤销。 用p
你可以得到最后删除的行。 但实际上,您也可以使用寄存器@1
到@9
来恢复多达9次删除。更好的是,如果你做的是
"1P
,那么在普通模式下会播放"2P
,依此类推。比照
:help .
和:help quote_number
-
如果要在插入模式下插入当前date: Ctrl – R
=strftime('%y%m%d')
input 。比照
:help strftime()
再次,有什么可以混淆的:
-
:@
是一个命令行命令,它将一个寄存器的内容解释为vimscript并将其发送 -
@
在正常模式命令中,将寄存器的内容解释为正常模式的击键(除了当你使用:
register时,包含最后播放的命令而没有初始冒号:在这种情况下,它重放命令,就好像你也重新input了冒号和最后的返回键)。 -
"
在正常模式命令,可以帮助您select一个注册为扬,粘贴,删除,正确等 -
"
也是有效的寄存器名称(默认或未命名的寄存器),因此可以作为期望寄存器名称的命令的parameter passing
粘贴系统剪贴板的东西,你可以使用SHIFT-INS
。
它在Windows中工作,但我猜测它在Linux中也能很好地工作。
“我想把抽取的文本粘贴到Vim命令行中。”
虽然最高投票答案是非常完整的,我更喜欢编辑命令历史。
在正常模式下,input: q:
这会给你一个最近的命令列表,可以用普通的vim命令编辑和search。 您将从底部的空白命令行开始。
对于文章所要求的确切的事情,粘贴一个被抽出的线(或任何东西)插入到命令行中,抽出你的文本,然后: q:p
(进入命令历史编辑模式,然后(p)一个新的命令行,随意编辑, 进入执行。
要摆脱命令历史模式,情况正好相反。 在命令历史logging的正常模式下,input:q
+ enter
值得注意的是,这些跳转寄存器与macros缓冲区相同。 换句话说,你可以简单地在你的文档(包括你粘贴的代码片段)中写出你的整个命令,然后"by
将它们放到b
寄存器中,然后用@b
运行它。
将系统剪贴板中的内容粘贴到vim命令行(“命令模式”)中,使用Ctrl + R后跟+ 。 对我来说,至less在Ubuntu上, Shift + Ins不起作用。
PS:不知道为什么Ctrl + R后面跟着* ,这在理论上与Ctrl + R跟+是一样的。 我search并发现了+版本,它似乎始终工作,至less在我的盒子上。
我有一个类似的问题。 我希望所选文本最终以一个命令结束,但不要依赖于粘贴。下面是我正在尝试编写映射的命令:
:call VimuxRunCommand("python")
这个插件的文档只显示使用string文字。 如果您尝试select包含双引号的文本,以下操作将会中断:
vnoremap y:call VimuxRunCommand("<cr>"")<cr>
为了解决这个问题,你只需使用@
引用macros的内容:
vnoremap y:call VimuxRunCommand(@")<cr>
传递未命名registry的内容,并与我的双引号和多行边框一起使用。
OSX
如果您在MAC OSX中使用vim,不幸的是,它带有较旧的版本,而不符合剪贴板选项。 幸运的是,自制软件很容易解决这个问题。
安装vim:
brew install vim --with-lua --with-override-system-vi
安装vim的gui verion:
brew install macvim --with-lua --with-override-system-vi
重启terminal生效。
~/.vimrc
附加到~/.vimrc
set clipboard=unnamed
现在你可以在vim中用yy
复制该行,并将其粘贴到系统范围内。