vim 超复杂查找替换2(已解决)

Vim、Emacs配置和使用
回复
hjjdebug
帖子: 94
注册时间: 2009-04-21 9:48

vim 超复杂查找替换2(已解决)

#1

帖子 hjjdebug » 2009-06-29 21:58

超复杂替换1曾经用一个%,较轻松找到了匹配点。
这个超复杂替换2是什么呢? 请看下文:

输入文件:

代码: 全选

        make -C  board/dnp1110
        make -C  board/d2n/ext
        make -C  common
        make -C  cpu/arm720t
        make -C  cpu/sa1100
        make -C  pher/io/serial
该内容显然是make 在进入各子目录编译的过程。
现在,我需要为每一个目录创建一个对应的文件,文件名称就是路径名称。文件内容
可以暂时不装任何东西。
我想到的一个办法是,暂时将文件名称补到原文件后,再做处理。这样就要求是如下输出。

输出文件:

代码: 全选

        make -C  board/dnp1110  board_dnp1110
        make -C  board/d2n/ext  board_d2n_ext
        make -C  common         common
        make -C  cpu/arm720t    cpu_arm720t
        make -C  cpu/sa1100     cpu_sa1100
        make -C  pher/io/serial  pher_io_serial
即把文件目录中的/换成_, 补到行尾。
这一下麻烦了,连宏也不大好处理,因为/在一行中可能没有,或1,2,3,4...个
各位对这种情况,该用何法来解决问题呢 ?
3Q! 为大家带来了不少问题。
上次由 hjjdebug 在 2009-06-30 9:47,总共编辑 1 次。
头像
peakgg
帖子: 1122
注册时间: 2006-10-10 9:40

Re: vim 超复杂查找替换2

#2

帖子 peakgg » 2009-06-29 22:31

分两步
:s/make\s-C\(.*\)/make -C\1\1/
然后再把后面那组中的/替换成_
hjjdebug
帖子: 94
注册时间: 2009-04-21 9:48

Re: vim 超复杂查找替换2

#3

帖子 hjjdebug » 2009-06-30 8:21

to: peakgg:
第一步很容易,难的就是第二步。
第一步甚至可以在补充的内容上插上一个标记,例如‘#’, 方便后续处理查找。
即%s/make -C\(.*\)/make -C\1 #\1/
但第二步的时候,将/换成_不好处理。
头像
Strange
帖子: 1824
注册时间: 2006-05-19 9:54
来自: Shanghai

Re: vim 超复杂查找替换2

#4

帖子 Strange » 2009-06-30 8:40

处理的方法多种多样。
这个问题麻烦在列操作。
我个人推荐不用vim,用随便哪种spread sheet,即使是google doc,做这件事情也轻而易举。spreadsheet天生就是用来列操作的。

用vim的话,分两步,录个宏....

代码: 全选

        make -C  board/dnp1110
        make -C  board/d2n/ext
        make -C  common
        make -C  cpu/arm720t
        make -C  cpu/sa1100
        make -C  pher/io/serial
------------------------------------------
        make -C  board/dnp1110
        make -C  board/d2n/ext
        make -C  common
        make -C  cpu/arm720t
        make -C  cpu/sa1100
        make -C  pher/io/serial
复制下去,加个标志线

代码: 全选

        make -C  board/dnp1110
        make -C  board/d2n/ext
        make -C  common
        make -C  cpu/arm720t
        make -C  cpu/sa1100
        make -C  pher/io/serial
------------------------------------------
        board_dnp1110
        board_d2n_ext
        common
        cpu_arm720t
        cpu_sa1100
        pher_io_serial
替换

代码: 全选

        make -C  board/dnp1110  board_dnp1110
        make -C  board/d2n/ext  board_d2n_ext
        make -C  common         common
        make -C  cpu/arm720t    cpu_arm720t
        make -C  cpu/sa1100     cpu_sa1100
        make -C  pher/io/serial  pher_io_serial
------------------------------------------
借助标志线合并,最后删除标志线


看看有没有更好的办法
ニンニク入れますか?
x60 with gentoo
poet
帖子: 2841
注册时间: 2006-09-11 22:47

Re: vim 超复杂查找替换2

#5

帖子 poet » 2009-06-30 9:24

提出那样两个问题,感觉楼主对 vim 宏了解得不够。

这种临时性的需求,绝对应该用宏,而不是替换。因为你会经常存在类似的,但又不完全相同的需求,制作一个替换的时间早就把宏搞定了。

这就是我用的宏,可以搞定你说的事情:

yypi/^[:.s/\//_/g^MxdwxdwkJ0j

注意上面这一行中: ^[ 代表按 esc 键, ^M 代表按回车键,其它原样拷贝就可以。

上面这个宏假定 make 位于一行的第一个字符,如果不是,需要在yyp后面加一个 ^ 符号。
hjjdebug
帖子: 94
注册时间: 2009-04-21 9:48

Re: vim 超复杂查找替换2

#6

帖子 hjjdebug » 2009-06-30 9:44

谢谢poet & strange:
明白了:
其中poet 的简单些,原理是复制该行处理完后合并完成一行。
strange 则是直接复制该段,处理完后将两段合并。
经此洗礼,对vim宏了解又有所进步了,感谢! :em06
hjjdebug
帖子: 94
注册时间: 2009-04-21 9:48

Re: vim 超复杂查找替换2(已解决)

#7

帖子 hjjdebug » 2009-06-30 9:55

懂了觉得很简单,不懂则觉得很复杂。万事皆如此。大有深入浅出之感! 向所有关心,关注,和帮助本贴的人表示感谢。
poet
帖子: 2841
注册时间: 2006-09-11 22:47

Re: vim 超复杂查找替换2(已解决)

#8

帖子 poet » 2009-06-30 10:05

hjjdebug 写了:懂了觉得很简单,不懂则觉得很复杂。万事皆如此。大有深入浅出之感! 向所有关心,关注,和帮助本贴的人表示感谢。
是的,用好宏,你会经常想要用宏去完成那些以前觉得用其它编辑器“不可能的任务”。

一般我用宏最简单的办法是用 qq 开始录制宏,然后一个 q 结束录制,然后 @q 运行第一次宏,@@ 运行剩下的次数(把@键按住不动就可以持续运行宏了)。

基于每行的宏我一般都是这个流程。而且你看到@和q这两个键非常近。——永远用q宏,我从来不保存宏,这些事情都很简单,临时做一个并不麻烦。
头像
Strange
帖子: 1824
注册时间: 2006-05-19 9:54
来自: Shanghai

Re: vim 超复杂查找替换2(已解决)

#9

帖子 Strange » 2009-06-30 10:22

啊,对了,用分割线是因为平常用的比较多,把用分割线合并的一堆东西直接绑定在一个键上了。
不然的话,的确一行一行来的好呢。

顺便,我mark和macro都喜欢用a,总觉得按顺序用,比较不容易忘记
:em02
ニンニク入れますか?
x60 with gentoo
hjjdebug
帖子: 94
注册时间: 2009-04-21 9:48

Re: vim 超复杂查找替换2(已解决)

#10

帖子 hjjdebug » 2009-06-30 10:40

是的,我mark,macro都喜欢用a, 如果同时有第二个接着用b, haha! :em05
宏我也从不保留,随用随录,随录随丢!
这次的先复制后处理,还有上次strange 提出的在宏中使用变量和函数,受益良多!
hjjdebug
帖子: 94
注册时间: 2009-04-21 9:48

Re: vim 超复杂查找替换2(已解决)

#11

帖子 hjjdebug » 2012-03-01 23:38

当初我还很嫩! 回顾往事。。。
头像
Fermat618
帖子: 728
注册时间: 2008-12-28 16:01

Re: vim 超复杂查找替换2

#12

帖子 Fermat618 » 2012-03-02 7:42

poet 写了:提出那样两个问题,感觉楼主对 vim 宏了解得不够。
这种临时性的需求,绝对应该用宏,而不是替换。因为你会经常存在类似的,但又不完全相同的需求,制作一个替换的时间早就把宏搞定了。
这就是我用的宏,可以搞定你说的事情:
yypi/^[:.s/\//_/g^MxdwxdwkJ0j
注意上面这一行中: ^[ 代表按 esc 键, ^M 代表按回车键,其它原样拷贝就可以。
上面这个宏假定 make 位于一行的第一个字符,如果不是,需要在yyp后面加一个 ^ 符号。
你这个限定做得很好。宏解决临时性需要不错,但如果要是写脚本时也用这个,就很让人崩溃了。用宏写出来的代码效率一般不会高先不说,其可读性可理解性基本是负的。

要是对字符串处理函数比较熟悉的话,这个任务用脚本来做也很快。

代码: 全选

:for i in range(line("$")+1) | call setline(i, getline(i) . ' '. substitute(split(getline(i), ' \+
')[2], '/', '_', 'g')) | endfor
如果vim带了python支持的话,还可以写得更清晰一点。我的vim带python3支持,先在python里面起个短点的别名。

代码: 全选

:py3 from vim import current as cur
:py3 for i,line in enumerate(cur.buffer): cur.buffer[i] += ' ' + line.split()[2].replace('/','_')
或者

代码: 全选

:py3 cur.buffer[:] = list(map(lambda x: x+' '+x.split()[2].replace('/','_'), cur.buffer))
在vim下交互,还有个:g命令十分的方便

代码: 全选

:g/^/call setline(".", getline(".") .' '. substitute(split(getline("."), ' \+')[2], '/', '_', 'g'))
python版本的会更简单

代码: 全选

:g/^/py3 cur.line += ' '+cur.line.split()[2].replace('/','_')
爱因斯坦会弹钢琴
爱因斯坦会拉小提琴
爱因斯坦会骑自行车
sarrow
帖子: 403
注册时间: 2007-10-27 1:04

Re: vim 超复杂查找替换2(已解决)

#13

帖子 sarrow » 2012-03-13 18:31

1. 挖坟贴
2. 条条大路通罗马

其实,在makfile文件中,将需要自动创建的目标放在第一个就好了。

比如:

#
all:board_dnp1110

board_dnp1110
gcc $@ $< ...

然后,上层的makefile 只需要:
make -C board/dnp1110
这样即可。

无须第三部分。
回复