繁体   English   中英

从vim的每一行中取出第一个单词

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM