[英]Yank the first word from each line in vim
我正在使用vim,我想复制一系列连续行的第一个单词。 我唯一能想到的是:4,32yw
(对于4-32行),但它没有用。 任何帮助都提前感谢,谢谢!
你可以做到,但它可能比你使用简单的命令要复杂一点。
您尝试运行的是正常模式命令作为执行命令。 这不会像你那样工作。 正常模式下的命令(如按yw
)将无法运行es ex-commands。
要在ex-command模式下运行正常模式命令,应使用normal
命令(有关更多信息,请参阅:help normal
)。 但是,即使您将命令更改为使用普通模式命令(例如:4,32 normal! yw
),它仍然不起作用,因为这将针对每一行运行,每次都在上一个被拉动的值上运行。
您可以使用vim寄存器执行所需的操作,该寄存器将在每个循环中附加该字(有关您可以读取的寄存器的更多信息:help registers
)。
要做到这一点,你应该将命令更改为:3,32 normal! ^"Ayw
:3,32 normal! ^"Ayw
。
要分解此命令:
:
- 进入ex-command模式。 3,32
- 运行命令的范围。 normal!
- 要运行的实际命令。 在没有任何自定义映射的情况下运行它,以避免在所需操作上运行的映射。 ^
- 转到该行的开头。 "A
- 将yank运行到一个寄存器中,将数据附加到之前保存的数据中。 yw
- Yank当前的单词。 稍后,要打印复制的值,您应该在所需位置使用"ap
(在正常模式下)”。
请注意,该命令将新字插入寄存器,忽略寄存器的第一个值。 这意味着如果在运行此命令后寄存器不为空,则所有字都将附加到寄存器的当前值。
要清除寄存器的先前值,可以运行以下命令:
:let @a=''
在运行你的yank命令之前。
如果你想多次这样做,你可能想要使用一个简单的函数来完成所有这些操作,而不是让你每次都运行这两个命令。
一个简单的功能,可以做到这一点:
function! CopyFirst(register) range
execute "let @" . a:register. "=''"
execute a:firstline . "," . a:lastline . "normal! ^\"" . toupper(a:register) . "yw"
endfunction
用法:
:3, 32 call Copyfirst('a')
"ap
此函数使用函数范围(有关此功能的更多信息:help func-range
):
" Get the first word of the line for a given range of lines
function! GetFirstWord() range
let @a=""
execute a:firstline.",".a:lastline."g/.*/y A"
echo split(substitute(@a," *\\(\\w\\+\\).\\{-}\\n","\\1 ","g"))
endfunction
第一行清理注册a 。 第二行将范围内的线条拉入寄存器a 。 最后一行打印一个List,其中包含每行的第一个单词。 示例输入文件:
some sample
text abc
123 456
function
yy xx
样本调用和输出:
:2,4call GetFirstWord()
['text', '123', 'function']
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.