当前时区为 UTC + 8 小时



发表新帖 回复这个主题  [ 12 篇帖子 ] 
作者 内容
1 楼 
 文章标题 : vim 的超复杂替换1(已解决)
帖子发表于 : 2009-06-29 11:10 

注册: 2009-04-21 9:48
帖子: 86
送出感谢: 12
接收感谢: 0 次
问题提出:
代码移植碰到一个文件格式问题,需要将__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 次

页首
 用户资料  
 
2 楼 
 文章标题 : Re: vim 的超复杂替换
帖子发表于 : 2009-06-29 11:20 

注册: 2009-04-21 9:48
帖子: 86
送出感谢: 12
接收感谢: 0 次
糟啦,// 中的注释是我加的,反而破坏了( )的对称性。重贴一次测试代码
代码:
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{}


页首
 用户资料  
 
3 楼 
 文章标题 : Re: vim 的超复杂替换
帖子发表于 : 2009-06-29 11:38 
头像

注册: 2005-08-14 21:55
帖子: 58428
地址: 长沙
送出感谢: 4
接收感谢: 272
s/(__asm)__\(\)/\1\{\}/g
大概这样的。


_________________
● 鸣学


页首
 用户资料  
 
4 楼 
 文章标题 : Re: vim 的超复杂替换
帖子发表于 : 2009-06-29 11:41 
头像

注册: 2006-10-10 9:40
帖子: 1122
送出感谢: 1
接收感谢: 0 次
ee那个不行的啊
这种情况估计只能用脚本解决了 观望


页首
 用户资料  
 
5 楼 
 文章标题 : Re: vim 的超复杂替换
帖子发表于 : 2009-06-29 11:59 
头像

注册: 2006-10-10 9:40
帖子: 1122
送出感谢: 1
接收感谢: 0 次
LZ看看这个http://book.51cto.com/art/200801/64658.htm


页首
 用户资料  
 
6 楼 
 文章标题 : Re: vim 的超复杂替换
帖子发表于 : 2009-06-29 12:12 
头像

注册: 2006-05-19 9:54
帖子: 1822
地址: Shanghai
送出感谢: 2
接收感谢: 11
简简单单录一段宏即可... ...


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


页首
 用户资料  
 
7 楼 
 文章标题 : Re: vim 的超复杂替换
帖子发表于 : 2009-06-29 12:17 
头像

注册: 2006-04-12 20:05
帖子: 8495
地址: 杭州
送出感谢: 0 次
接收感谢: 8
这个复杂了,要做C的语法分析了,如果(是出现在字符串中或者注释中的,还要忽略才行...


_________________
关注我的blog: ε==3


页首
 用户资料  
 
8 楼 
 文章标题 : Re: vim 的超复杂替换
帖子发表于 : 2009-06-29 12:20 
头像

注册: 2005-08-14 21:55
帖子: 58428
地址: 长沙
送出感谢: 4
接收感谢: 272
额。{}分开的啊。也容易的,分步就是。一行正则,没那么智能的。
分步替换,上下文判断而已。
我那句,改改也可以,只是只能perl了。因为需要非贪婪匹配。那.*改成包括全部asm内容就是啊。


_________________
● 鸣学


页首
 用户资料  
 
9 楼 
 文章标题 : Re: vim 的超复杂替换
帖子发表于 : 2009-06-29 13:01 

注册: 2009-04-21 9:48
帖子: 86
送出感谢: 12
接收感谢: 0 次
简简单单录一个宏是可以,大概意思是
/__asm__
s/__asm__/__asm
f(
%%
r{
''
r}
用%正好可以实现嵌套的括号匹配。
用script 估计调用call searchpair 或match 一类的函数应该也能实现嵌套匹配吧。所以求助。
script 的好处是像个程序,可存可分发。
宏我现在用法是随用随录,用完就丢。虽然用宏可以解决,但还是希望能给一份script.


页首
 用户资料  
 
10 楼 
 文章标题 : Re: vim 的超复杂替换
帖子发表于 : 2009-06-29 13:37 
头像

注册: 2006-05-19 9:54
帖子: 1822
地址: Shanghai
送出感谢: 2
接收感谢: 11
宏的好处也是一个程序,可存,可分发...

你把录好的宏寄存器的内容p出来,写个script,设置随便那个宏为你p出来的那些内容不就行了...


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


页首
 用户资料  
 
11 楼 
 文章标题 : Re: vim 的超复杂替换
帖子发表于 : 2009-06-29 14:57 

注册: 2009-04-21 9:48
帖子: 86
送出感谢: 12
接收感谢: 0 次
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 就可以了。 或者在命令行里输入。
只差最后一点点了!


页首
 用户资料  
 
12 楼 
 文章标题 : Re: vim 的超复杂替换
帖子发表于 : 2009-06-29 15:19 

注册: 2009-04-21 9:48
帖子: 86
送出感谢: 12
接收感谢: 0 次
哦!明白了,下面是我写的script,可以针对一个文件。
代码:
:while search("__asm__","w") > 0
:s/__asm__/__asm/
:normal f(%%r{''r}
:endwhile


不过我认为它虽从宏演变而来,但已经不能叫宏了,是一个地道的script 了。
多个文件就来个命令行批处理吧。
谢谢strange, 在你的启发下完成!


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

当前时区为 UTC + 8 小时


在线用户

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


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

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

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