vim 的超复杂替换1(已解决)

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

vim 的超复杂替换1(已解决)

#1

帖子 hjjdebug » 2009-06-29 11:10

问题提出:
代码移植碰到一个文件格式问题,需要将__asm__(), 替换为__asm{}
由于书写的随意性,源文件__asm__与( 可能有空格。这个好办,但难度是这个(会与不在同一行的)匹配
中间可能会嵌套().
要求将__asm__替换为__asm, 重点是把跟在__asm__后的小括号对()替换为大括号对{},不要动无关()
举例如下:
$ cat 1.txt
static inline void cpu_arm920_cache_clean_invalidate_all(void)
{
__asm__( //you should change this ( to {
" mov r1, #0\n" /* this () can't be change */
" mov r1, #7 << 5\n" /* 8 segments */
"1: orr r3, r1, #63 << 26\n" /* 64 entries */
"2: mcr p15, 0, r3, c7, c14, 2\n" /* clean & invalidate D index */
" subs r3, r3, #1 << 26\n"
); //you should change this ) to }
}
static inline void cpu_arm920_tlb_invalidate_all(void)
{
__asm__ ( //you should change this ( to {
"mov r0, #0\n"
"mcr p15, 0, r0, c7, c10, 4\n" /* drain WB */
"mcr p15, 0, r0, c8, c7, 0\n" /* invalidate I & D TLBs */
); //you should change this ) to }
}

用%s///好像是不行了,因为()有嵌套。
用宏是可以解决问题。我目前是这么做的。()的匹配用%可以找到。
更好的办法应该是用script,这样可以方便的把script 保留或分发。
烦请高手帮忙解决一下这个问题。 3Q!
上次由 hjjdebug 在 2009-06-30 9:48,总共编辑 1 次。
hjjdebug
帖子: 94
注册时间: 2009-04-21 9:48

Re: vim 的超复杂替换

#2

帖子 hjjdebug » 2009-06-29 11:20

糟啦,// 中的注释是我加的,反而破坏了( )的对称性。重贴一次测试代码

代码: 全选

static inline void cpu_arm920_cache_clean_invalidate_all(void)
{
	__asm__(
		" mov r1, #0\n" /* begin() */
		" mov r1, #7 << 5\n" /* 8 segments */
		"1: orr r3, r1, #63 << 26\n" /* 64 entries */
		"2: mcr p15, 0, r3, c7, c14, 2\n" /* clean & invalidate D index */
		" subs r3, r3, #1 << 26\n"
	); 
}
要求把__asm__() 换为__asm{}
头像
eexpress
帖子: 58428
注册时间: 2005-08-14 21:55
来自: 长沙

Re: vim 的超复杂替换

#3

帖子 eexpress » 2009-06-29 11:38

s/(__asm)__\(\)/\1\{\}/g
大概这样的。
● 鸣学
头像
peakgg
帖子: 1122
注册时间: 2006-10-10 9:40

Re: vim 的超复杂替换

#4

帖子 peakgg » 2009-06-29 11:41

ee那个不行的啊
这种情况估计只能用脚本解决了 观望
头像
peakgg
帖子: 1122
注册时间: 2006-10-10 9:40

Re: vim 的超复杂替换

#5

帖子 peakgg » 2009-06-29 11:59

LZ看看这个http://book.51cto.com/art/200801/64658.htm
头像
Strange
帖子: 1824
注册时间: 2006-05-19 9:54
来自: Shanghai

Re: vim 的超复杂替换

#6

帖子 Strange » 2009-06-29 12:12

简简单单录一段宏即可... ...
ニンニク入れますか?
x60 with gentoo
头像
bones7456
帖子: 8495
注册时间: 2006-04-12 20:05
来自: 杭州
联系:

Re: vim 的超复杂替换

#7

帖子 bones7456 » 2009-06-29 12:17

这个复杂了,要做C的语法分析了,如果(是出现在字符串中或者注释中的,还要忽略才行...
关注我的blog: ε==3
头像
eexpress
帖子: 58428
注册时间: 2005-08-14 21:55
来自: 长沙

Re: vim 的超复杂替换

#8

帖子 eexpress » 2009-06-29 12:20

额。{}分开的啊。也容易的,分步就是。一行正则,没那么智能的。
分步替换,上下文判断而已。
我那句,改改也可以,只是只能perl了。因为需要非贪婪匹配。那.*改成包括全部asm内容就是啊。
● 鸣学
hjjdebug
帖子: 94
注册时间: 2009-04-21 9:48

Re: vim 的超复杂替换

#9

帖子 hjjdebug » 2009-06-29 13:01

简简单单录一个宏是可以,大概意思是
/__asm__
s/__asm__/__asm
f(
%%
r{
''
r}
用%正好可以实现嵌套的括号匹配。
用script 估计调用call searchpair 或match 一类的函数应该也能实现嵌套匹配吧。所以求助。
script 的好处是像个程序,可存可分发。
宏我现在用法是随用随录,用完就丢。虽然用宏可以解决,但还是希望能给一份script.
头像
Strange
帖子: 1824
注册时间: 2006-05-19 9:54
来自: Shanghai

Re: vim 的超复杂替换

#10

帖子 Strange » 2009-06-29 13:37

宏的好处也是一个程序,可存,可分发...

你把录好的宏寄存器的内容p出来,写个script,设置随便那个宏为你p出来的那些内容不就行了...
ニンニク入れますか?
x60 with gentoo
hjjdebug
帖子: 94
注册时间: 2009-04-21 9:48

Re: vim 的超复杂替换

#11

帖子 hjjdebug » 2009-06-29 14:57

strange 的意思是否是这样的。
以修改一个函数为例,其宏为:
直接p出来是: /__asm__^M:s/__asm__/__asm/^Mf(%%r{''r}
录制宏我知道了,分发宏,让别人使用宏我也知道。

将宏修改为script, 还不会修改,请指教。
:exe /__asm__ " 该句不正确,需要修改 ??! 怎样用: 命令运行search命令
:s/__asm__/__asm/<enter>
:normal f(%%r{''r}

还有,这是一个函数的修改,文件中会存在多个函数,script 怎样修改 (宏是用999@a)
如果写好了script叫1.vim, 我用so 1.vim 就可以了。 或者在命令行里输入。
只差最后一点点了!
hjjdebug
帖子: 94
注册时间: 2009-04-21 9:48

Re: vim 的超复杂替换

#12

帖子 hjjdebug » 2009-06-29 15:19

哦!明白了,下面是我写的script,可以针对一个文件。

代码: 全选

:while search("__asm__","w") > 0
:s/__asm__/__asm/
:normal f(%%r{''r}
:endwhile
不过我认为它虽从宏演变而来,但已经不能叫宏了,是一个地道的script 了。
多个文件就来个命令行批处理吧。
谢谢strange, 在你的启发下完成!
回复