regex 使用变量赋值生成Visual Studio代码段

wz8daaqr  于 2023-10-22  发布在  其他
关注(0)|答案(1)|浏览(130)

我正在构建一个Visual Studio代码片段。我想把我选择的文本赋给一个变量或其他东西:
${TM_SELECTED_TEXT=${TM_SELECTED_TEXT/(.*)/${1:/upcase}/}}
如果这是不可能的,我想否则大写我所选择的文本在一个条件:SQL:FREE(RECH${${TM_SELECTED_TEXT/(.*)/${1:/upcase}/}:${1}})
例如,我选择的文本是house
对于第一个问题,结果给予我:${TM_SELECTED_TEXT=HOUSE}
对于第二个问题,结果是:SQL:FREE(RECH${HOUSE:})
我想要SQL:FREE(RECHHOUSE)SQL:FREE(RECH),如果没有任何选定的文本,则将光标放在RECH之后。
SQL:FREE(RECH${TM_SELECTED_TEXT:${1}})工作,但我想把它大写。

mwyxok5s

mwyxok5s1#

更新答案

这是一个黑客的解决方案,不是很干净,但我想不出一个更好的。

SQL:FREE(RECH
${                         # 
  TM_SELECTED_TEXT/(.+)/   # If some text is selected,
  ${1:/upcase})/           # uppercase it and put it back along with ')',
}                          # 
$0                         # then the cursor.
${                         # Else,
  TM_SELECTED_TEXT/(.*)/   # 
  ${1:? :)}/               # put ')' after the cursor.
}                          #

由于some issues,条件分支不能为空,即使EBNF说它可以:

format ::= ... | '${' int ':?' if ':' else '}' | ...
if     ::= text
text   ::= .*

这意味着如果TM_SELECTED_TEXT存在,我们需要添加一个尾随空格,并最终得到以下结果:
| 之前|后|光标|
| --|--|--|
| house| SQL:FREE(RECHHOUSE)| HOUSE)| ``|
| <empty>| SQL:FREE(RECH)| RECH| )|

原创

你们关系很好只需将升级后的TM_SELECTED_TEXT Package 在${0:}中,以便将其视为占位符:

SQL:FREE(RECH
${0:${TM_SELECTED_TEXT/(.*)/${1:/upcase}/}}
)

| 之前|后|光标|
| --|--|--|
| house| SQL:FREE(RECHHOUSE)| [ HOUSE ]|
| <empty>| SQL:FREE(RECH)| RECH||
如果您希望光标始终位于TM_SELECTED_TEXT之后,请将$0放在它的正后方:

SQL:FREE(RECH
${TM_SELECTED_TEXT/(.*)/${1:/upcase}/}$0
)

| 之前|后|光标|
| --|--|--|
| house| SQL:FREE(RECHHOUSE)| HOUSE||
| <empty>| SQL:FREE(RECH)| RECH||

相关问题