Vim replace中的寄存器值后跟捕获组将导致错误
我正在尝试使用vim将汇编语言文件移植到新的汇编程序。新的汇编程序不支持本地标签。因此,我尝试在每个本地标签之前插入标签名称。但尝试使用紧跟捕获组的寄存器会导致“无效表达式错误” 输入示例:Vim replace中的寄存器值后跟捕获组将导致错误,vim,replace,Vim,Replace,我正在尝试使用vim将汇编语言文件移植到新的汇编程序。新的汇编程序不支持本地标签。因此,我尝试在每个本地标签之前插入标签名称。但尝试使用紧跟捕获组的寄存器会导致“无效表达式错误” 输入示例: LABEL_NAME: MOV SP,#STACK_POINTER MOV R7,#12 ;WAIT LOOP (3) 12$: MOV R6,#255
LABEL_NAME:
MOV SP,#STACK_POINTER
MOV R7,#12 ;WAIT LOOP (3)
12$: MOV R6,#255 ;TIME WASTER
11$: MOV R5,#255 ;MUST WAIT !!!!
10$: RESET_WATCH_DOG
DJNZ R5,10$
DJNZ R6,11$
DJNZ R7,12$
LABEL_NAME:
MOV SP,#STACK_POINTER
MOV R7,#12 ;WAIT LOOP (3)
LABEL_NAME12$: MOV R6,#255 ;TIME WASTER
LABEL_NAME11$: MOV R5,#255 ;MUST WAIT !!!!
LABEL_NAME10$: RESET_WATCH_DOG
DJNZ R5,LABEL_NAME10$
DJNZ R6,LABEL_NAME11$
DJNZ R7,LABEL_NAME12$
所需输出:
LABEL_NAME:
MOV SP,#STACK_POINTER
MOV R7,#12 ;WAIT LOOP (3)
12$: MOV R6,#255 ;TIME WASTER
11$: MOV R5,#255 ;MUST WAIT !!!!
10$: RESET_WATCH_DOG
DJNZ R5,10$
DJNZ R6,11$
DJNZ R7,12$
LABEL_NAME:
MOV SP,#STACK_POINTER
MOV R7,#12 ;WAIT LOOP (3)
LABEL_NAME12$: MOV R6,#255 ;TIME WASTER
LABEL_NAME11$: MOV R5,#255 ;MUST WAIT !!!!
LABEL_NAME10$: RESET_WATCH_DOG
DJNZ R5,LABEL_NAME10$
DJNZ R6,LABEL_NAME11$
DJNZ R7,LABEL_NAME12$
当然,这是可行的:
:,10s/\(\d\+\$\)/LABEL\u NAME\1/
将标签名称拉入寄存器a
后,这:
:,10s/\(\d\+\$\)/\=@a/
给我这个:
LABEL_NAME:
MOV SP,#STACK_POINTER
MOV R7,#12 ;WAIT LOOP (3)
LABEL_NAME: MOV R6,#255 ;TIME WASTER
LABEL_NAME: MOV R5,#255 ;MUST WAIT !!!!
LABEL_NAME: RESET_WATCH_DOG
DJNZ R5,LABEL_NAME
DJNZ R6,LABEL_NAME
DJNZ R7,LABEL_NAME
但这是:
:,10s/\(\d\+\$\)/\=@a\1/
仅产生以下结果:
E15:无效表达式:@a\1
我使用的是gVim 7.3。理想情况下,我想知道为什么不能在replace语句中先使用寄存器扩展,然后再使用捕获组扩展。但也希望有其他解决方案。如果在替换零件中使用表达式,则必须在整个零件中使用表达式,而不是混合表达式。这应该起作用:
:.,10s/\(\d\+\$\)/\=@a . submatch(1)/g
简要说明:
\= " the replacement will be expression
@a " read the value from register 'a'
. " the string concatenation
submatch(x) " (function) get the matched group from your :s command, x=0,1,2...
帮助项目:
:h :s
:h submatch()
若在替换零件中使用表达式,则必须在整个零件中使用表达式,而不是混合表达式。这应该起作用:
:.,10s/\(\d\+\$\)/\=@a . submatch(1)/g
简要说明:
\= " the replacement will be expression
@a " read the value from register 'a'
. " the string concatenation
submatch(x) " (function) get the matched group from your :s command, x=0,1,2...
帮助项目:
:h :s
:h submatch()