VSCode 筛选 URL 和电子邮件的代码段

VSCode snippet that filters for URLs and emails

以下代码片段通过将 TeX 文件中的选定文本与剪贴板(希望是 URL 中的)组合来创建超链接,

{
  "key": "cmd+l",
  "command": "editor.action.insertSnippet",
  "when": "editorHasSelection && resourceExtname == .tex",
  "args": {
    "snippet": "\href{${CLIPBOARD:url}}{${TM_SELECTED_TEXT}}[=11=]"
  }
}

有没有办法在执行代码段时选中插入的剪贴板内容?此外,有没有办法检查剪贴板是否是有效的网址或电子邮件地址,然后才将其插入?

更新

这是使用正则表达式仅粘贴剪贴板内容的无效尝试,当它是 url。

{
  "key": "cmd+l",
  "command": "editor.action.insertSnippet",
  "when": "editorHasSelection && resourceExtname == .tex",
  "args": {
    "snippet": "\href{${1:${CLIPBOARD/(\^\(\(https\?\)://\)\?\(\[w\|W\]\{3\}\.\)\+\[a-zA-Z0-9-\.\]\{3,\}\.\[a-zA-Z\]\{2,\}\(\.\[a-zA-Z\]\{2,\}\)\?\$)//}}}{${TM_SELECTED_TEXT}}[=12=]"
  }
}

"snippet": "\href{${1:${CLIPBOARD}}}{${TM_SELECTED_TEXT}}[=10=]

当您触发代码段时,

将打印 select CLIPBOARD 内容。不过你会失去 url 提示,我认为没有办法保存它。

你的第二个问题:"is there a way to check whether the clipboard is a valid web or email address and only then insert it?"

我相信:

${1:${CLIPBOARD/(..your regex test for email validity here..)//}}

编辑(检查有效的电子邮件)- 测试:

"snippet": "\href{${1:${CLIPBOARD/([A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,})?(.*)//i}}}{${TM_SELECTED_TEXT}}[=14=]"

我从 www.regular-expressions.info 那里得到了电子邮件正则表达式。

这似乎有效。关键是,如果不匹配,使用片段转换,在本例中为 CLIPBOARD 变量内容,不匹配的内容将通过并打印。换句话说,如果你不捕获它,它就会通过,所以防止错误电子邮件或 url 通过和打印的唯一方法是同时捕获好的 email/url and 错误的版本,只打印好的捕获组。

这是基本形式:(regex email check here)?(.*)

因此 group1 具有有效的电子邮件(如果有),而 group2 具有剪贴板内容(如果它不是有效的电子邮件)。并且只打印 group1。整洁的。似乎有效。


EDIT 2(检查有效的urls)-伪代码:

"snippet": "\href{${1:${CLIPBOARD/(...url regex checker here...)?(.*)//}}}{${TM_SELECTED_TEXT}}[=16=]"

所以我刚刚将 ?(.*) 添加到 url 正则表达式检查的末尾。


编辑 2.5 这是一个 url 检查器,基于您的更新片段中使用的检查器:

"snippet": "\href{${1:${CLIPBOARD/^((https?:\/\/)?([w]{3}\.)+[a-z0-9-]{3,}\.[a-z]{2,}(\.[a-z]{2,})?)?(.*)$/${5:+bad url}/i}}}{${TM_SELECTED_TEXT}}[=18=]"

注意:用于验证 url 的正则表达式非常棘手 - 如果不是不可能的话 - 我使用了问题中的那个并且不保证其完整性。至少你可以看到如何 escape 正则表达式。


EDIT 3 email/url(如果在错误的 email/url 中有您想要的文本变量,在本例中为 $CLIPBOARD,但可以是任何变量):

将此 条件 ${2:+bad email} 添加到片段转换的替换部分,因此对于 email 版本:

"snippet": "\href{${1:${CLIPBOARD/([A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,})?(.*)/${2:+bad email}/i}}}{${TM_SELECTED_TEXT}}[=21=]" // email validater

您想要在 bad email 位置的任何文本。注意,检查组 2 中是否有非空内容,如果有,则打印 "bad email"。您的正则表达式可能正在使用不同的组来捕获 "bad emails/urls" - 在条件 ${2:+bad email}.

中使用该组