Vim replace中的寄存器值后跟捕获组将导致错误

Vim replace中的寄存器值后跟捕获组将导致错误,vim,replace,Vim,Replace,我正在尝试使用vim将汇编语言文件移植到新的汇编程序。新的汇编程序不支持本地标签。因此,我尝试在每个本地标签之前插入标签名称。但尝试使用紧跟捕获组的寄存器会导致“无效表达式错误” 输入示例: LABEL_NAME: MOV SP,#STACK_POINTER MOV R7,#12 ;WAIT LOOP (3) 12$: MOV R6,#255

我正在尝试使用vim将汇编语言文件移植到新的汇编程序。新的汇编程序不支持本地标签。因此,我尝试在每个本地标签之前插入标签名称。但尝试使用紧跟捕获组的寄存器会导致“无效表达式错误”

输入示例:

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()