在VIM中收集具有相同名称模式的变量

时间:2016-07-06 00:11:46

标签: vim

来自以下

# industrials
# * airlines: AAL
aal_score = run("AAL")

# information technology
# * MSFT
# * AAPL
msft_score = run("MSFT")
aapl_score = run("AAPL")

# materials
# * Agnico Eagle Mines AEM
aem_score = run("AEM")

# telecommunication services
# * ATT
att_score = run("ATT")

# utilities
# * AEP
aep_score = run("AEP")

我想收集变量名称并打印它们的值,比如

print "AAL score {%2.2f}".format(aal_score)
print "MSFT score {%2.2f}".format(msft_score)
print "AAPL score {%2.2f}".format(aapl_score)
...

如何在Vim中有效地做到这一点?

1 个答案:

答案 0 :(得分:4)

这是一个流水线命令,可以执行您想要的操作,您将在名为Output的文件中找到结果:

:g/^\s*\(\w*_score\)\s*=\s*run("\(\w*\)").*$/ s//&\rprint "\2 score {2.2f}".format(\1)/ | :. w! >> Output | normal! dd
  • 说明:

上面的命令实际上分为3个命令:

  1. :g/^\s*\(\w*_score\)\s*=\s*run("\(\w*\)").*$/ s//&\rprint "\2 score {2.2f}".format(\1)/
  2. 首先是全局搜索,它搜索具有模式^\s*\(\w*_score\)\s*=\s*run("\(\w*\)").*$的行(即这些行)

      

    aal_score = run(“AAL”)

         

    msft_score = run(“MSFT”)

         

    aapl_score = run(“AAPL”)

         

    aem_score = run(“AEM”)

         

    att_score = run(“ATT”)

         

    aep_score = run(“AEP”)

    - [----- \ 1 ------] --------- [\ 2]

    在每一行我们通过将其包围到\(...\) (反向引用和分组)来捕获所需文本,然后我们使用替换:

    s//&\rprint "\2 score {2.2f}".format(\1)/
    

    每次生成(例如:)

      

    aep_score = run(“AEP”)

         

    打印“AEP得分{2.2f}”。格式(aep_score)

    1. :. w! >> Output
    2. 对于第二个命令,我们将在文件Output

      的末尾写下打印行
      1. normal! dd :.d
      2. 从当前文件中删除打印行