当前时区为 UTC + 8 小时



发表新帖 回复这个主题  [ 13 篇帖子 ] 
作者 内容
1 楼 
 文章标题 : vim 超复杂查找替换2(已解决)
帖子发表于 : 2009-06-29 21:58 

注册: 2009-04-21 9:48
帖子: 86
送出感谢: 12
接收感谢: 0 次
超复杂替换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 次

页首
 用户资料  
 
2 楼 
 文章标题 : Re: vim 超复杂查找替换2
帖子发表于 : 2009-06-29 22:31 
头像

注册: 2006-10-10 9:40
帖子: 1122
送出感谢: 1
接收感谢: 0 次
分两步
:s/make\s-C\(.*\)/make -C\1\1/
然后再把后面那组中的/替换成_


页首
 用户资料  
 
3 楼 
 文章标题 : Re: vim 超复杂查找替换2
帖子发表于 : 2009-06-30 8:21 

注册: 2009-04-21 9:48
帖子: 86
送出感谢: 12
接收感谢: 0 次
to: peakgg:
第一步很容易,难的就是第二步。
第一步甚至可以在补充的内容上插上一个标记,例如‘#’, 方便后续处理查找。
即%s/make -C\(.*\)/make -C\1 #\1/
但第二步的时候,将/换成_不好处理。


页首
 用户资料  
 
4 楼 
 文章标题 : Re: vim 超复杂查找替换2
帖子发表于 : 2009-06-30 8:40 
头像

注册: 2006-05-19 9:54
帖子: 1822
地址: Shanghai
送出感谢: 2
接收感谢: 11
处理的方法多种多样。
这个问题麻烦在列操作。
我个人推荐不用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


页首
 用户资料  
 
5 楼 
 文章标题 : Re: vim 超复杂查找替换2
帖子发表于 : 2009-06-30 9:24 

注册: 2006-09-11 22:47
帖子: 2841
送出感谢: 0 次
接收感谢: 4
提出那样两个问题,感觉楼主对 vim 宏了解得不够。

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

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

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

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

上面这个宏假定 make 位于一行的第一个字符,如果不是,需要在yyp后面加一个 ^ 符号。



_________________
评价: 3.85% hjjdebug
 
页首
 用户资料  
 
6 楼 
 文章标题 : Re: vim 超复杂查找替换2
帖子发表于 : 2009-06-30 9:44 

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


页首
 用户资料  
 
7 楼 
 文章标题 : Re: vim 超复杂查找替换2(已解决)
帖子发表于 : 2009-06-30 9:55 

注册: 2009-04-21 9:48
帖子: 86
送出感谢: 12
接收感谢: 0 次
懂了觉得很简单,不懂则觉得很复杂。万事皆如此。大有深入浅出之感! 向所有关心,关注,和帮助本贴的人表示感谢。


页首
 用户资料  
 
8 楼 
 文章标题 : Re: vim 超复杂查找替换2(已解决)
帖子发表于 : 2009-06-30 10:05 

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


是的,用好宏,你会经常想要用宏去完成那些以前觉得用其它编辑器“不可能的任务”。

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

基于每行的宏我一般都是这个流程。而且你看到@和q这两个键非常近。——永远用q宏,我从来不保存宏,这些事情都很简单,临时做一个并不麻烦。


页首
 用户资料  
 
9 楼 
 文章标题 : Re: vim 超复杂查找替换2(已解决)
帖子发表于 : 2009-06-30 10:22 
头像

注册: 2006-05-19 9:54
帖子: 1822
地址: Shanghai
送出感谢: 2
接收感谢: 11
啊,对了,用分割线是因为平常用的比较多,把用分割线合并的一堆东西直接绑定在一个键上了。
不然的话,的确一行一行来的好呢。

顺便,我mark和macro都喜欢用a,总觉得按顺序用,比较不容易忘记
:em02


_________________
ニンニク入れますか?
x60 with gentoo


页首
 用户资料  
 
10 楼 
 文章标题 : Re: vim 超复杂查找替换2(已解决)
帖子发表于 : 2009-06-30 10:40 

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


页首
 用户资料  
 
11 楼 
 文章标题 : Re: vim 超复杂查找替换2(已解决)
帖子发表于 : 2012-03-01 23:38 

注册: 2009-04-21 9:48
帖子: 86
送出感谢: 12
接收感谢: 0 次
当初我还很嫩! 回顾往事。。。


页首
 用户资料  
 
12 楼 
 文章标题 : Re: vim 超复杂查找替换2
帖子发表于 : 2012-03-02 7:42 
头像

注册: 2008-12-28 16:01
帖子: 728
送出感谢: 2
接收感谢: 15
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('/','_')


_________________
爱因斯坦会弹钢琴
爱因斯坦会拉小提琴
爱因斯坦会骑自行车


页首
 用户资料  
 
13 楼 
 文章标题 : Re: vim 超复杂查找替换2(已解决)
帖子发表于 : 2012-03-13 18:31 

注册: 2007-10-27 1:04
帖子: 403
送出感谢: 0 次
接收感谢: 1
1. 挖坟贴
2. 条条大路通罗马

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

比如:

#
all:board_dnp1110

board_dnp1110
gcc $@ $< ...

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

无须第三部分。


页首
 用户资料  
 
显示帖子 :  排序  
发表新帖 回复这个主题  [ 13 篇帖子 ] 

当前时区为 UTC + 8 小时


在线用户

正在浏览此版面的用户:没有注册用户 和 2 位游客


不能 在这个版面发表主题
不能 在这个版面回复主题
不能 在这个版面编辑帖子
不能 在这个版面删除帖子
不能 在这个版面提交附件

前往 :  
本站点为公益性站点,用于推广开源自由软件,由 DiaHosting VPSBudgetVM VPS 提供服务。
我们认为:软件应可免费取得,软件工具在各种语言环境下皆可使用,且不会有任何功能上的差异;
人们应有定制和修改软件的自由,且方式不受限制,只要他们自认为合适。

Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
简体中文语系由 王笑宇 翻译