-1

// My Section -----------------------------------------------------------------

以上是想要的结果。


想象一下这个场景

// ----------------------------------------------------------------------------
// firebase

// ----------------------------------------------------------------------------
// utils

可以使用例如这个 regex 将线条修剪到一定长度/(^.{20}).*$/$1/,这将给出

// -----------------
// firebase

// -----------------
// utils

但是,如果我想在一次运行中将其他行填充到这样的设定长度怎么办?那可能吗?

  • 一个正则表达式仅用于正确填充,而不是修剪
// -----------------
// firebase --------

// -----------------
// utils -----------

很久以前,我在做一些正则表达式忍者挑战,我们应该做数学,所以....正则表达式很神奇。


我最终想要实现的是一个允许我编写的 VSCode 片段:My Section --
然后触发一个片段,将插入的文本转换为 80 个字符宽的注释,其中包含

// My Section -----------------------------------------------------------------

https://code.visualstudio.com/docs/editor/userdefinedsnippets

4

3 回答 3

3

我怀疑您是否可以在不运行某些代码的情况下一步完成您想做的事情。但是您可以使用宏来执行此操作,这样您就可以一次触发多个步骤。在此示例中,我使用宏扩展multi-command,但还有其他宏扩展。

在您的 settings.json 中:

"multiCommand.commands": [

 {
   "command": "multiCommand.commentSection",
   // "interval": 750,  // you don't need this, just for illustration

   "sequence": [  
     "cursorEnd",            
     {
       "command": "type",  // add 75 -'s'
       "args": {
         "text": " ---------------------------------------------------------------------------"
       }
     },

     "editor.action.addCommentLine",

     // select this wrapped line so the next snippet can use TM_SELECTED_TEXT
     "cursorHomeSelect",
     "cursorHomeSelect",

     {
       "command": "editor.action.insertSnippet",  // trim to first 80 characters
       "args": {
         "snippet": "${TM_SELECTED_TEXT/(.{80}).*/$1/g}",
       }
     }
   ]
 }
],

然后在 keybindings.json 中选择任何键绑定

{
  "key": "ctrl+alt+-",
  "command": "extension.multiCommand.execute",
  "args": { "command": "multiCommand.commentSection" }
},

基本思想是添加太多连字符(例如 75 个),然后选择整个换行并仅保留前 80 个字符,从而修剪尾随连字符以填充该行总共 80 个字符。

正如演示结尾所展示的,它也适用于空白行。

用字符填充一行到一定长度的演示

于 2019-07-03T16:16:52.960 回答
1

添加另一个与我之前的宏扩展答案非常不同的答案。

我做了一个扩展Find and Transform,它很容易做到这一点,因为您可以在查找/替换中执行 javascript 操作,如数学。

使用这个键绑定(在你的keybindings.json):

{
  "key": "alt+r",                      // whatever keybinding you want
  "command": "findInCurrentFile",
  "args": {
       
    "find": "(${TM_CURRENT_LINE})",
    
    "replace": "${LINE_COMMENT} $${ return '$1 '.padEnd(79 - '${LINE_COMMENT}'.length, '-') }$$",

    "isRegex": true,
    "restrictFind": "line"    // can have multiple lines with a cursor
}

或者,您可以将它(以稍微不同的形式)放入您settings.json将创建命令的地方 - 并且可以从命令面板访问,并且更容易在设置之间同步。

padEnd 到 80,带有 Find and Transform 扩展


"replace": "${LINE_COMMENT} $${ return '$1 '.padEnd(79 - '${LINE_COMMENT}'.length, '-') }$$",

替换为当前编辑器语言的行注释。添加一个 javascript 操作,$${...}$$以使解析更容易。

return '$1 '.padEnd(79 - '${LINE_COMMENT}'.length, '-')返回捕获组 1(后跟一个空格)并填充到总共 80 个字符(必须考虑行注释字符后的空格// )。减去因语言而异的行注释字符的长度。

请注意,表示字符串的项目,例如$1 ${LINE_COMMENT}用单引号表示为字符串(您也可以使用反引号)。否则 javascript 会将它们解释为未知的变量名。

如果您不关心使用不同样式和长度的行注释,您可以使用更简单的:

"replace": "// $${ return '$1'.padEnd(79, '-') }$$",

于 2022-02-22T06:38:50.743 回答
-1

您可以使用replace的回调函数,并且可以根据长度替换值

let str = `// ----------------------------------------------------------------------------
// firebase

// ----------------------------------------------------------------------------
// utils`

let final = str.replace(/^.*$/gm, (match)=>{
  return match.length === 0 ? match : match.length > 20 ? match.substr(0,20) : match + `-`.repeat(20-match.length)
})

console.log(final)

于 2019-07-03T11:31:36.287 回答