【问题标题】:How to make a saved vim macro work when it has ^M in it?当保存的 vim 宏中有 ^M 时,如何使它工作?
【发布时间】:2017-06-24 23:34:37
【问题描述】:

我编写了一个宏来删除某些文本的某些部分,首先删除文本的前导和结尾,然后删除中间的一些行。

这在我直接编写和使用宏时有效,但后来我尝试将宏保存在我的 vimrc 文件中,然后它就不再有效了。

如何解决此问题以使回车符按我预期的方式运行?

保存在我的 .vimrc 文件中的宏是:

let @r='/+\/-^Mdd'
let @y='v/A \\ Z\^M<80>kuxGvN/*\^Mxgg100@r'

我根据.vimrc文件使用的结果是,搜索A\Z正确开始,但是^M并没有导致换行,被认为是搜索的一部分,如图以下:

有问题的文件(缩短):

**** Residual nuclei distribution  **** ****           (Bq/cmc)            ****



  A \ Z   57         58         59         60         61         62         63         64         65         66         67
 154   0.00E+00   0.00E+00   0.00E+00   0.00E+00   0.00E+00   0.00E+00   5.64E+00   0.00E+00   0.00E+00   0.00E+00   0.00E+00
      +/- 0.0 %  +/- 0.0 %  +/- 0.0 %  +/- 0.0 %  +/- 0.0 %  +/- 0.0 %  +/- 8.4 %  +/- 0.0 %  +/- 0.0 %  +/- 0.0 %  +/- 0.0 %
 152   0.00E+00   0.00E+00   0.00E+00   0.00E+00   0.00E+00   0.00E+00   4.45E+01   0.00E+00   0.00E+00   0.00E+00   0.00E+00
      +/- 0.0 %  +/- 0.0 %  +/- 0.0 %  +/- 0.0 %  +/- 0.0 %  +/- 0.0 %  +/- 3.8 %  +/- 0.0 %  +/- 0.0 %  +/- 0.0 %  +/- 0.0 %
  A \ Z    1
   3   4.50E+02
      +/- 1.6 %


  **** Isomers (Bq/cmc)     ****
      A        Z       mth
       34      17       1    1.37E+04 +/- 35.2 %
       42      21       1    5.96E-12 +/- 26.1 %
       44      21       1    6.90E+03 +/- 11.9 %

预期输出

A \ Z   57         58         59         60         61         62         63         64         65         66         67
     154   0.00E+00   0.00E+00   0.00E+00   0.00E+00   0.00E+00   0.00E+00   5.64E+00   0.00E+00   0.00E+00   0.00E+00   0.00E+00
     152   0.00E+00   0.00E+00   0.00E+00   0.00E+00   0.00E+00   0.00E+00   4.45E+01   0.00E+00   0.00E+00   0.00E+00   0.00E+00
A \ Z    1
3   4.50E+02

(忽略输出中的空白问题,这只是因为堆栈溢出)

【问题讨论】:

  • ^ 后跟M 还是用&lt;C-v&gt;&lt;CR&gt; 获得的文字^M
  • @romainl 我如何分辨?
  • 我在普通模式下使用"ap粘贴用于记录它的寄存器的内容,在本例中为a..然后将其更改为let赋值
  • @Sundeep 这就是我为我的 .vimrc 文件生成宏的方式 :)

标签: vim macros


【解决方案1】:

我会使用双引号和键符号。

let @r = "/+\\/-\<cr>dd"
let @y = "v/A \\\\ Z\\<cr>kuxGvN/*\\\<cr>xgg100@r"

基本上所有代表 return^M 都将转换为键符号&lt;cr&gt;。当然,所有关键符号都需要使用\ 以及\ 字符进行转义。

如果您发现自己一直在使用这些,我建议您创建映射而不是使用寄存器。

如需更多帮助,请参阅:

:h key-notation
:h expr-quote

【讨论】:

  • “……而不是使用宏”应该是“……而不是使用寄存器”。
  • 您的解决方案进行了一些小的调整。具体来说,这有效:let @r = "/+\\/-\&lt;cr&gt;dd"let @y = "v/A \\\\ Z\&lt;cr&gt;kxGvN/*\&lt;cr&gt;xgg100@r" 区别在于 之前的单个反斜杠
猜你喜欢
  • 2011-01-02
  • 2011-06-14
  • 2021-03-09
  • 2011-02-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-11-10
  • 1970-01-01
相关资源
最近更新 更多