0

我已经尝试了一天让片段与正则表达式一起使用,但我似乎无法围绕一种方法来解决问题。

用例是编写 LaTeX,特别是带有自动标签的部分。我有一些标签问题,因为 LaTeX 不允许在标签中使用某些丹麦字符。因此,我希望代码片段能够处理替换本身以及其他一些格式。这意味着我想要以下内容:

  1. 将所有内容设为小写
  2. 将字母“æ”、“ø”和“å”更改为“ae”、“oe”和“aa”
  3. 删除特殊字符(因此字符只有 az 和 0-9)
  4. 将空格更改为“_”

最后,我想突出显示“转换后的”文本,以便在需要时将其更改为不同的内容(以防重复标签)。

该代码段如下所示:

\section{$1} \label{sec:${2:$1(after regex)}

希望这有任何意义

转换将执行以下操作

Ørne og Mus!-> oerne_og_mus

这在 Textmate 中是可行的,带有以下代码段

\section{${1:section name}}
\label{sec:${2:${1/(\w+)(\W+$)?|\W+/${1:?${1:/asciify/downcase}:_}/g}}}

但这与 VS 代码不兼容。可以以某种方式将其更改为与 VS 代码一起使用吗?

4

2 回答 2

0

好的,所以我最终可能找到了一个可以用作片段的解决方案

"\\section{$1}",
"\\label{sec:${2:${1/(æ)|(ø)|(å)|(é)|( +)|[^A-Za-z0-9]/${1:+ae}${2:+oe}${3:+aa}${4:+e}${5:+_}/g}}}",

我只发现了几个问题。

  1. 我必须手动将重音字母添加到列表中,例如 é
  2. 没有底壳
  3. 如果有一个字符串说“!!”,它将被替换为两个下划线而不是 1,因为空格之间有一个中断。

有人知道如何改变吗?或者我什至可以在哪里找到这种类型的正则表达式的好资源(我一直找不到)

于 2020-01-16T05:03:44.240 回答
0

编辑:试试这个片段:

"latex labels": {
  "prefix": "_ll",
  "body": [
      "\\section{$1}",
      "\\label{sec:${2:${1/(\\w*)((æ)|(ø)|(å)|(é)|(\\s+)|([^a-zA-Z0-9_ ]))/${1:/downcase}${3:+ae}${4:+oe}${5:+aa}${6:+e}${7:+_}/gi}}}",
    ],
    "description": "Transform to latex labels"
},

如果您有更多丹麦语字符,则必须单独添加它们 - vscode 不支持/asciify转换。


上一个答案:

我真的不认为你可以在一个正则表达式中做到这一点。这意味着正常的代码段将不起作用。不过,宏可以运行任意数量的片段转换。

使用宏扩展多命令将其放入您的 settings.json 中:

  "multiCommand.commands": [

    {
      "command": "multiCommand.latexLabelTransform",
      "sequence": [
        "cursorHomeSelect",
        "editor.action.clipboardCopyAction",
        {
          "command": "editor.action.insertSnippet",
          "args": {
              "snippet": "${TM_SELECTED_TEXT/(æ)|(ø)|(å)/${1:+ae}${2:+oe}${3:+aa}/gi}"
          }
        },
        "cursorHomeSelect",
        {
          "command": "editor.action.insertSnippet",
          "args": {
              "snippet": "${TM_SELECTED_TEXT/(.*)/${1:/downcase}/}"
          }
        },
        "cursorHomeSelect",
        {
          "command": "editor.action.insertSnippet",
          "args": {
              "snippet": "${TM_SELECTED_TEXT/[^a-z0-9 ]//g}"
          }
        },
        "cursorHomeSelect",
        {
          "command": "editor.action.insertSnippet",
          "args": {
              "snippet": "\\section {$CLIPBOARD} \\label{sec:${2:${TM_SELECTED_TEXT/\\s/_/g}}}"
          }
        }
      ]
    }
  ]

还有一些键绑定:

{
  "key": "alt+d",
  "command": "extension.multiCommand.execute",
  "args": { "command": "multiCommand.latexLabelTransform" }
},

如果你从文本开始,例如Ørne og Mus!看下面的演示:

乳胶片断变换


如演示中所示,选择转换后的部分。在触发宏之前光标位于文本末尾。\section {yourTextHere}如果需要的话,我也可以让它开始工作。

我试图让它作为一个常规片段工作,但它似乎不是一种在单个转换中获得你想要完成的多个转换的方法。

让我知道这是否适合您。

于 2020-01-16T00:48:18.930 回答