vim 的超复杂替换1(已解决)
-
- 帖子: 94
- 注册时间: 2009-04-21 9:48
vim 的超复杂替换1(已解决)
问题提出:
代码移植碰到一个文件格式问题,需要将__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!
代码移植碰到一个文件格式问题,需要将__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 次。
-
- 帖子: 94
- 注册时间: 2009-04-21 9:48
Re: vim 的超复杂替换
糟啦,// 中的注释是我加的,反而破坏了( )的对称性。重贴一次测试代码
要求把__asm__() 换为__asm{}
代码: 全选
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"
);
}
- eexpress
- 帖子: 58428
- 注册时间: 2005-08-14 21:55
- 来自: 长沙
- peakgg
- 帖子: 1122
- 注册时间: 2006-10-10 9:40
Re: vim 的超复杂替换
ee那个不行的啊
这种情况估计只能用脚本解决了 观望
这种情况估计只能用脚本解决了 观望
- peakgg
- 帖子: 1122
- 注册时间: 2006-10-10 9:40
Re: vim 的超复杂替换
LZ看看这个http://book.51cto.com/art/200801/64658.htm
- Strange
- 帖子: 1824
- 注册时间: 2006-05-19 9:54
- 来自: Shanghai
- bones7456
- 帖子: 8495
- 注册时间: 2006-04-12 20:05
- 来自: 杭州
- 联系:
- eexpress
- 帖子: 58428
- 注册时间: 2005-08-14 21:55
- 来自: 长沙
Re: vim 的超复杂替换
额。{}分开的啊。也容易的,分步就是。一行正则,没那么智能的。
分步替换,上下文判断而已。
我那句,改改也可以,只是只能perl了。因为需要非贪婪匹配。那.*改成包括全部asm内容就是啊。
分步替换,上下文判断而已。
我那句,改改也可以,只是只能perl了。因为需要非贪婪匹配。那.*改成包括全部asm内容就是啊。
● 鸣学
-
- 帖子: 94
- 注册时间: 2009-04-21 9:48
Re: vim 的超复杂替换
简简单单录一个宏是可以,大概意思是
/__asm__
s/__asm__/__asm
f(
%%
r{
''
r}
用%正好可以实现嵌套的括号匹配。
用script 估计调用call searchpair 或match 一类的函数应该也能实现嵌套匹配吧。所以求助。
script 的好处是像个程序,可存可分发。
宏我现在用法是随用随录,用完就丢。虽然用宏可以解决,但还是希望能给一份script.
/__asm__
s/__asm__/__asm
f(
%%
r{
''
r}
用%正好可以实现嵌套的括号匹配。
用script 估计调用call searchpair 或match 一类的函数应该也能实现嵌套匹配吧。所以求助。
script 的好处是像个程序,可存可分发。
宏我现在用法是随用随录,用完就丢。虽然用宏可以解决,但还是希望能给一份script.
- Strange
- 帖子: 1824
- 注册时间: 2006-05-19 9:54
- 来自: Shanghai
Re: vim 的超复杂替换
宏的好处也是一个程序,可存,可分发...
你把录好的宏寄存器的内容p出来,写个script,设置随便那个宏为你p出来的那些内容不就行了...
你把录好的宏寄存器的内容p出来,写个script,设置随便那个宏为你p出来的那些内容不就行了...
ニンニク入れますか?
x60 with gentoo
x60 with gentoo
-
- 帖子: 94
- 注册时间: 2009-04-21 9:48
Re: vim 的超复杂替换
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 就可以了。 或者在命令行里输入。
只差最后一点点了!
以修改一个函数为例,其宏为:
直接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 就可以了。 或者在命令行里输入。
只差最后一点点了!
-
- 帖子: 94
- 注册时间: 2009-04-21 9:48
Re: vim 的超复杂替换
哦!明白了,下面是我写的script,可以针对一个文件。
不过我认为它虽从宏演变而来,但已经不能叫宏了,是一个地道的script 了。
多个文件就来个命令行批处理吧。
谢谢strange, 在你的启发下完成!
代码: 全选
:while search("__asm__","w") > 0
:s/__asm__/__asm/
:normal f(%%r{''r}
:endwhile
多个文件就来个命令行批处理吧。
谢谢strange, 在你的启发下完成!