Visual studio code 如何创建一个;终端配置宏“;在VS代码中?轻松打开和拆分多个终端

Visual studio code 如何创建一个;终端配置宏“;在VS代码中?轻松打开和拆分多个终端,visual-studio-code,terminal,configuration,macros,console,Visual Studio Code,Terminal,Configuration,Macros,Console,到第1年约400次: 开放VS代码 打开一个终端 将端子分为两部分 运行“npm热运行”(第一次拆分) 将另一个拆分终端留空 打开第二个端子(带“+”按钮) 把它分成三部分 运行php artisan websockets:serve(第一部分) 运行“php artisan队列:单词”(第二部分) 运行“maidev--ip=localhost”(第三部分) 最后我可以开始工作了 我相信我不是唯一一个遇到这个问题的人。 有没有人能用一个命令或配置来优化它 谢谢你的帮助 我将给出这两个答案,

到第1年约400次:

  • 开放VS代码
  • 打开一个终端
  • 将端子分为两部分
  • 运行
    “npm热运行”
    (第一次拆分)
  • 将另一个拆分终端留空
  • 打开第二个端子(带“+”按钮)
  • 把它分成三部分
  • 运行php artisan websockets:serve(第一部分)
  • 运行“php artisan队列:单词”(第二部分)
  • 运行“maidev--ip=localhost”(第三部分)
  • 最后我可以开始工作了
我相信我不是唯一一个遇到这个问题的人。 有没有人能用一个命令或配置来优化它


谢谢你的帮助

我将给出这两个答案,因为其中一个版本特别长。一个答案使用宏扩展来帮助解决这个问题,另一个答案只使用任务

对于这两种解决方案,请使用以下设置:

“terminal.integrated.windowsEnableConpty”:false
//默认值为true

当您试图删除由这些方法打开的终端时,有一个严重的未解决的错误影响Winpty和vscode


使用宏扩展名。这将进入您的tasks.json:

 {
    "label": "Run 2 terminals with macro",
    "dependsOrder": "sequence", // or parallel
    "dependsOn": [
      "terminal1",
      "terminal2"
    ],
    // "runOptions": { "runOn": "folderOpen" }
  },
  {
    "label": "terminal1",
    "command": "${command:multiCommand.startFirstTerminal}"
  },
  {
    "label": "terminal2", 
    "command": "${command:multiCommand.startSecondTerminal}"
  },
{
  "label": "Run 2 terminals from tasks",
  
  "dependsOrder": "sequence",  // or parallel
  
  "dependsOn": [
    "OpenTerminal1",
    "RunInTerminal1",
    "RenameTerminal1",   // if you care to rename each terminal
    "SplitTerminal1",

    "OpenTerminal2",
    "RunInTerminal2a",
    "RenameTerminal2a",   // if you care to rename each terminal

    "SplitTerminal2",
    "RunInTerminal2b",
    "RenameTerminal2b",   // if you care to rename each terminal

    "SplitTerminal2",
    "RunInTerminal2c",
    "RenameTerminal2c",   // if you care to rename each terminal
  ],
  // "runOptions": { "runOn": "folderOpen" }  // or trigger with keybinding
},
这两个任务由宏运行。这将进入您的settings.json:

"multiCommand.commands": [

{
  "command": "multiCommand.startFirstTerminal",
  "sequence": [
    "workbench.action.terminal.newInActiveWorkspace",
    {
      "command": "workbench.action.terminal.sendSequence",
      "args": {
        "text": "npm run test\u000D"
      }
    },
    {
      "command": "workbench.action.terminal.renameWithArg",
      "args": {
        "name": "npm run hot"
      }
    },
     "workbench.action.terminal.split",
  ]
},
{
  "command": "multiCommand.startSecondTerminal",
  "sequence": [
    "workbench.action.terminal.newInActiveWorkspace",
    {
      "command": "workbench.action.terminal.renameWithArg",
      "args": {
        "name": "websockets:serve"
      }
    },
    {
      "command": "workbench.action.terminal.sendSequence",
      "args": {
        "text": "ls -lrt\u000D"
      }
    },
    "workbench.action.terminal.split",
    {
      "command": "workbench.action.terminal.renameWithArg",
      "args": {
        "name": "queue:words"
      }
    },
    {
      "command": "workbench.action.terminal.sendSequence",
      "args": {
        "text": "ls -lrt\u000D"
      }
    },
    "workbench.action.terminal.split",
    {
      "command": "workbench.action.terminal.renameWithArg",
      "args": {
        "name": "maidev"
      }
    },
    {
      "command": "workbench.action.terminal.sendSequence",
      "args": {
        "text": "ls -lrt\u000D"
      }
    },
  ]
 }
]
  "restoreTerminals.runOnStartup": false,   // true is the default
          // set to false if using a keybinding or the command palette

  "restoreTerminals.terminals": [
    {
      "splitTerminals": [
        {
          "name": "server",
          "commands": [
            "npm run test"
          ]
        },
        {
          "name": "empty",
        }
      ]
    },
    {
      "splitTerminals": [
        {
          "name": "websockets",
          "commands": [
            "ls -l"
          ]
        },
        {
          "name": "queue",
          "commands": [
            "cd zip",
            "gulp sass"
          ]
        },
        {
          "name": "maidev",
          "commands": [
            "cd zip-multiple",
            "gulp"
          ]
        }
      ]
    }
  ],
我重命名了终端以匹配您的命令-也许您不在乎这一点,可以删除
renameWithArg
部分以缩短整个过程

我无法使用您的php设置进行测试,因此我替换了在每个终端中运行的
ls-lrt\u000D
。用你的

   {
      "command": "workbench.action.terminal.sendSequence",
      "args": {
        "text": "php artisan websockets:serve\u000D"
      }
    },
比如说。
\u000D
是一个返回,因此命令立即运行。现在,您可以使用
“runOptions”:{“runOn”:“folderOpen”}
选项,以便在工作区打开时运行主任务,或者为主任务分配键绑定,如

{
  "key": "alt+z",   // or watever you want
  "command": "workbench.action.tasks.runTask",
  "args": "Run 2 terminals with macro"
},

我将给出两个答案,因为其中一个版本特别长。一个答案使用宏扩展来帮助解决这个问题,另一个答案只使用任务

对于这两种解决方案,请使用以下设置:

“terminal.integrated.windowsEnableConpty”:false
//默认值为true

当您试图删除由这些方法打开的终端时,有一个严重的未解决的错误影响Winpty和vscode


使用宏扩展名。这将进入您的tasks.json:

 {
    "label": "Run 2 terminals with macro",
    "dependsOrder": "sequence", // or parallel
    "dependsOn": [
      "terminal1",
      "terminal2"
    ],
    // "runOptions": { "runOn": "folderOpen" }
  },
  {
    "label": "terminal1",
    "command": "${command:multiCommand.startFirstTerminal}"
  },
  {
    "label": "terminal2", 
    "command": "${command:multiCommand.startSecondTerminal}"
  },
{
  "label": "Run 2 terminals from tasks",
  
  "dependsOrder": "sequence",  // or parallel
  
  "dependsOn": [
    "OpenTerminal1",
    "RunInTerminal1",
    "RenameTerminal1",   // if you care to rename each terminal
    "SplitTerminal1",

    "OpenTerminal2",
    "RunInTerminal2a",
    "RenameTerminal2a",   // if you care to rename each terminal

    "SplitTerminal2",
    "RunInTerminal2b",
    "RenameTerminal2b",   // if you care to rename each terminal

    "SplitTerminal2",
    "RunInTerminal2c",
    "RenameTerminal2c",   // if you care to rename each terminal
  ],
  // "runOptions": { "runOn": "folderOpen" }  // or trigger with keybinding
},
这两个任务由宏运行。这将进入您的settings.json:

"multiCommand.commands": [

{
  "command": "multiCommand.startFirstTerminal",
  "sequence": [
    "workbench.action.terminal.newInActiveWorkspace",
    {
      "command": "workbench.action.terminal.sendSequence",
      "args": {
        "text": "npm run test\u000D"
      }
    },
    {
      "command": "workbench.action.terminal.renameWithArg",
      "args": {
        "name": "npm run hot"
      }
    },
     "workbench.action.terminal.split",
  ]
},
{
  "command": "multiCommand.startSecondTerminal",
  "sequence": [
    "workbench.action.terminal.newInActiveWorkspace",
    {
      "command": "workbench.action.terminal.renameWithArg",
      "args": {
        "name": "websockets:serve"
      }
    },
    {
      "command": "workbench.action.terminal.sendSequence",
      "args": {
        "text": "ls -lrt\u000D"
      }
    },
    "workbench.action.terminal.split",
    {
      "command": "workbench.action.terminal.renameWithArg",
      "args": {
        "name": "queue:words"
      }
    },
    {
      "command": "workbench.action.terminal.sendSequence",
      "args": {
        "text": "ls -lrt\u000D"
      }
    },
    "workbench.action.terminal.split",
    {
      "command": "workbench.action.terminal.renameWithArg",
      "args": {
        "name": "maidev"
      }
    },
    {
      "command": "workbench.action.terminal.sendSequence",
      "args": {
        "text": "ls -lrt\u000D"
      }
    },
  ]
 }
]
  "restoreTerminals.runOnStartup": false,   // true is the default
          // set to false if using a keybinding or the command palette

  "restoreTerminals.terminals": [
    {
      "splitTerminals": [
        {
          "name": "server",
          "commands": [
            "npm run test"
          ]
        },
        {
          "name": "empty",
        }
      ]
    },
    {
      "splitTerminals": [
        {
          "name": "websockets",
          "commands": [
            "ls -l"
          ]
        },
        {
          "name": "queue",
          "commands": [
            "cd zip",
            "gulp sass"
          ]
        },
        {
          "name": "maidev",
          "commands": [
            "cd zip-multiple",
            "gulp"
          ]
        }
      ]
    }
  ],
我重命名了终端以匹配您的命令-也许您不在乎这一点,可以删除
renameWithArg
部分以缩短整个过程

我无法使用您的php设置进行测试,因此我替换了在每个终端中运行的
ls-lrt\u000D
。用你的

   {
      "command": "workbench.action.terminal.sendSequence",
      "args": {
        "text": "php artisan websockets:serve\u000D"
      }
    },
比如说。
\u000D
是一个返回,因此命令立即运行。现在,您可以使用
“runOptions”:{“runOn”:“folderOpen”}
选项,以便在工作区打开时运行主任务,或者为主任务分配键绑定,如

{
  "key": "alt+z",   // or watever you want
  "command": "workbench.action.tasks.runTask",
  "args": "Run 2 terminals with macro"
},
使用此设置:

“terminal.integrated.windowsEnableConpty”:false
//默认值为true


在tasks.json中:

 {
    "label": "Run 2 terminals with macro",
    "dependsOrder": "sequence", // or parallel
    "dependsOn": [
      "terminal1",
      "terminal2"
    ],
    // "runOptions": { "runOn": "folderOpen" }
  },
  {
    "label": "terminal1",
    "command": "${command:multiCommand.startFirstTerminal}"
  },
  {
    "label": "terminal2", 
    "command": "${command:multiCommand.startSecondTerminal}"
  },
{
  "label": "Run 2 terminals from tasks",
  
  "dependsOrder": "sequence",  // or parallel
  
  "dependsOn": [
    "OpenTerminal1",
    "RunInTerminal1",
    "RenameTerminal1",   // if you care to rename each terminal
    "SplitTerminal1",

    "OpenTerminal2",
    "RunInTerminal2a",
    "RenameTerminal2a",   // if you care to rename each terminal

    "SplitTerminal2",
    "RunInTerminal2b",
    "RenameTerminal2b",   // if you care to rename each terminal

    "SplitTerminal2",
    "RunInTerminal2c",
    "RenameTerminal2c",   // if you care to rename each terminal
  ],
  // "runOptions": { "runOn": "folderOpen" }  // or trigger with keybinding
},
这就是“主”任务,它调用所有组成任务,它们是:

{
  "label": "OpenTerminal1",
  "command": "${command:workbench.action.terminal.new}",
  "type": "shell",
  "problemMatcher": []
},
{
  "label": "RunInTerminal1",
  "command": "${input:runTerminal1}",
  "type": "shell",
  "problemMatcher": []
},
{
  "label": "RenameTerminal1",
  "command": "${input:renameTerminal1}",
  "type": "shell",
  "problemMatcher": []
},
{
  "label": "SplitTerminal1",
  "command": "${command:workbench.action.terminal.split}",
  "type": "shell",
  "problemMatcher": []
},
// ------------------------------------------------------------------
{
  "label": "OpenTerminal2",
  "command": "${command:workbench.action.terminal.new}",
  "type": "shell",
  "problemMatcher": []
},
{
  "label": "RunInTerminal2a",
  "command": "${input:runTerminal2a}",
  "type": "shell",
  "problemMatcher": []
},
{
  "label": "RenameTerminal2a",
  "command": "${input:renameTerminal2a}",
  "type": "shell",
  "problemMatcher": []
},
// ------------------------------------------------------------------
{
  "label": "SplitTerminal2",
  "command": "${command:workbench.action.terminal.split}",
  "type": "shell",
  "problemMatcher": []
},
{
  "label": "RunInTerminal2b",
  "command": "${input:runTerminal2b}",
  "type": "shell",
  "problemMatcher": []
},
{
  "label": "RenameTerminal2b",
  "command": "${input:renameTerminal2b}",
  "type": "shell",
  "problemMatcher": []
},
// ------------------------------------------------------------------
{
  "label": "RunInTerminal2c",
  "command": "${input:runTerminal2c}",
  "type": "shell",
  "problemMatcher": []
},
{
  "label": "RenameTerminal2c",
  "command": "${input:renameTerminal2c}",
  "type": "shell",
  "problemMatcher": []
},
您可能认为这就足够了,但您可以看到任务需要
args
(发送到终端的内容),因此我必须使用以下表单:

"command": "${input:runTerminal2c}",
这样,
input
就可以提供所需的参数和命令。它们进入任务文件的
输入部分,如下所示:

"inputs": [   

 {
   "id": "openTerminal1",      
   "type": "command",
   "command": "workbench.action.terminal.new",
 },
 {
   "id": "runTerminal1",
   "type": "command",
   "command": "workbench.action.terminal.sendSequence",
   "args": {
     "text": "npm run test\u000D"
   }
 },
 {
   "id": "renameTerminal1",      
   "type": "command",
   "command": "workbench.action.terminal.renameWithArg",
   "args": {
     "name": "npm run hot"
   }
 },

 {
   "id": "openTerminal2",      
   "type": "command",
   "command": "workbench.action.terminal.new",
 },
 {
   "id": "runTerminal2a",      
   "type": "command",
   "command": "workbench.action.terminal.sendSequence",
   "args": {
     "text": "php artisan websockets:serve"
   }
 },
 {
   "id": "renameTerminal2a",
   "type": "command",
   "command": "workbench.action.terminal.renameWithArg",
   "args": {
     "name": "websockets:serve"
   }
 },
 {
   "id": "runTerminal2b",
   "type": "command",
   "command": "workbench.action.terminal.sendSequence",
   "args": {
     "text": "php artisan queue:words"
   }
 },
 {
   "id": "renameTerminal2b",
   "type": "command",
   "command": "workbench.action.terminal.renameWithArg",
   "args": {
     "name": "queue:words"
   }
 },
 {
   "id": "runTerminal2c",
   "type": "command",
   "command": "workbench.action.terminal.sendSequence",
   "args": {
     "text": "maidev"
   }
 },
 {
   "id": "renameTerminal2c",
   "type": "command",
   "command": "workbench.action.terminal.renameWithArg",
   "args": {
     "name": "maidev"
   }
 }
同样,您可能不关心所有重命名终端命令,并且可以消除这些命令。在这里,我刚刚将您的命令发送到终端:

 {
   "id": "runTerminal2c",
   "type": "command",
   "command": "workbench.action.terminal.sendSequence",
   "args": {
     "text": "maidev"
   }
 },
但并没有自动启动它们。要让它们立即启动,请将返回unicode添加到发送到终端的
文本中,如:

 {
   "id": "runTerminal2c",
   "type": "command",
   "command": "workbench.action.terminal.sendSequence",
   "args": {
     "text": "maidev --ip=localhost"
   }
 },


最后是触发主任务的keybinding(如果不使用run-on-folder-open选项):


我更喜欢宏版本——它要短得多,不太容易出现设置错误。两者都非常快。

使用此设置:

“terminal.integrated.windowsEnableConpty”:false
//默认值为true


在tasks.json中:

 {
    "label": "Run 2 terminals with macro",
    "dependsOrder": "sequence", // or parallel
    "dependsOn": [
      "terminal1",
      "terminal2"
    ],
    // "runOptions": { "runOn": "folderOpen" }
  },
  {
    "label": "terminal1",
    "command": "${command:multiCommand.startFirstTerminal}"
  },
  {
    "label": "terminal2", 
    "command": "${command:multiCommand.startSecondTerminal}"
  },
{
  "label": "Run 2 terminals from tasks",
  
  "dependsOrder": "sequence",  // or parallel
  
  "dependsOn": [
    "OpenTerminal1",
    "RunInTerminal1",
    "RenameTerminal1",   // if you care to rename each terminal
    "SplitTerminal1",

    "OpenTerminal2",
    "RunInTerminal2a",
    "RenameTerminal2a",   // if you care to rename each terminal

    "SplitTerminal2",
    "RunInTerminal2b",
    "RenameTerminal2b",   // if you care to rename each terminal

    "SplitTerminal2",
    "RunInTerminal2c",
    "RenameTerminal2c",   // if you care to rename each terminal
  ],
  // "runOptions": { "runOn": "folderOpen" }  // or trigger with keybinding
},
这就是“主”任务,它调用所有组成任务,它们是:

{
  "label": "OpenTerminal1",
  "command": "${command:workbench.action.terminal.new}",
  "type": "shell",
  "problemMatcher": []
},
{
  "label": "RunInTerminal1",
  "command": "${input:runTerminal1}",
  "type": "shell",
  "problemMatcher": []
},
{
  "label": "RenameTerminal1",
  "command": "${input:renameTerminal1}",
  "type": "shell",
  "problemMatcher": []
},
{
  "label": "SplitTerminal1",
  "command": "${command:workbench.action.terminal.split}",
  "type": "shell",
  "problemMatcher": []
},
// ------------------------------------------------------------------
{
  "label": "OpenTerminal2",
  "command": "${command:workbench.action.terminal.new}",
  "type": "shell",
  "problemMatcher": []
},
{
  "label": "RunInTerminal2a",
  "command": "${input:runTerminal2a}",
  "type": "shell",
  "problemMatcher": []
},
{
  "label": "RenameTerminal2a",
  "command": "${input:renameTerminal2a}",
  "type": "shell",
  "problemMatcher": []
},
// ------------------------------------------------------------------
{
  "label": "SplitTerminal2",
  "command": "${command:workbench.action.terminal.split}",
  "type": "shell",
  "problemMatcher": []
},
{
  "label": "RunInTerminal2b",
  "command": "${input:runTerminal2b}",
  "type": "shell",
  "problemMatcher": []
},
{
  "label": "RenameTerminal2b",
  "command": "${input:renameTerminal2b}",
  "type": "shell",
  "problemMatcher": []
},
// ------------------------------------------------------------------
{
  "label": "RunInTerminal2c",
  "command": "${input:runTerminal2c}",
  "type": "shell",
  "problemMatcher": []
},
{
  "label": "RenameTerminal2c",
  "command": "${input:renameTerminal2c}",
  "type": "shell",
  "problemMatcher": []
},
您可能认为这就足够了,但您可以看到任务需要
args
(发送到终端的内容),因此我必须使用以下表单:

"command": "${input:runTerminal2c}",
这样,
input
就可以提供所需的参数和命令。它们进入任务文件的
输入部分,如下所示:

"inputs": [   

 {
   "id": "openTerminal1",      
   "type": "command",
   "command": "workbench.action.terminal.new",
 },
 {
   "id": "runTerminal1",
   "type": "command",
   "command": "workbench.action.terminal.sendSequence",
   "args": {
     "text": "npm run test\u000D"
   }
 },
 {
   "id": "renameTerminal1",      
   "type": "command",
   "command": "workbench.action.terminal.renameWithArg",
   "args": {
     "name": "npm run hot"
   }
 },

 {
   "id": "openTerminal2",      
   "type": "command",
   "command": "workbench.action.terminal.new",
 },
 {
   "id": "runTerminal2a",      
   "type": "command",
   "command": "workbench.action.terminal.sendSequence",
   "args": {
     "text": "php artisan websockets:serve"
   }
 },
 {
   "id": "renameTerminal2a",
   "type": "command",
   "command": "workbench.action.terminal.renameWithArg",
   "args": {
     "name": "websockets:serve"
   }
 },
 {
   "id": "runTerminal2b",
   "type": "command",
   "command": "workbench.action.terminal.sendSequence",
   "args": {
     "text": "php artisan queue:words"
   }
 },
 {
   "id": "renameTerminal2b",
   "type": "command",
   "command": "workbench.action.terminal.renameWithArg",
   "args": {
     "name": "queue:words"
   }
 },
 {
   "id": "runTerminal2c",
   "type": "command",
   "command": "workbench.action.terminal.sendSequence",
   "args": {
     "text": "maidev"
   }
 },
 {
   "id": "renameTerminal2c",
   "type": "command",
   "command": "workbench.action.terminal.renameWithArg",
   "args": {
     "name": "maidev"
   }
 }
同样,您可能不关心所有重命名终端命令,并且可以消除这些命令。在这里,我刚刚将您的命令发送到终端:

 {
   "id": "runTerminal2c",
   "type": "command",
   "command": "workbench.action.terminal.sendSequence",
   "args": {
     "text": "maidev"
   }
 },
但并没有自动启动它们。要让它们立即启动,请将返回unicode添加到发送到终端的
文本中,如:

 {
   "id": "runTerminal2c",
   "type": "command",
   "command": "workbench.action.terminal.sendSequence",
   "args": {
     "text": "maidev --ip=localhost"
   }
 },


最后是触发主任务的keybinding(如果不使用run-on-folder-open选项):



我更喜欢宏版本——它要短得多,不太容易出现设置错误。两个都很快。

好的,在用另外两个答案回答这个问题一天后,我看到了这个扩展:在另一个问题上

这个扩展似乎工作得很好。将其放入您的settings.json:

"multiCommand.commands": [

{
  "command": "multiCommand.startFirstTerminal",
  "sequence": [
    "workbench.action.terminal.newInActiveWorkspace",
    {
      "command": "workbench.action.terminal.sendSequence",
      "args": {
        "text": "npm run test\u000D"
      }
    },
    {
      "command": "workbench.action.terminal.renameWithArg",
      "args": {
        "name": "npm run hot"
      }
    },
     "workbench.action.terminal.split",
  ]
},
{
  "command": "multiCommand.startSecondTerminal",
  "sequence": [
    "workbench.action.terminal.newInActiveWorkspace",
    {
      "command": "workbench.action.terminal.renameWithArg",
      "args": {
        "name": "websockets:serve"
      }
    },
    {
      "command": "workbench.action.terminal.sendSequence",
      "args": {
        "text": "ls -lrt\u000D"
      }
    },
    "workbench.action.terminal.split",
    {
      "command": "workbench.action.terminal.renameWithArg",
      "args": {
        "name": "queue:words"
      }
    },
    {
      "command": "workbench.action.terminal.sendSequence",
      "args": {
        "text": "ls -lrt\u000D"
      }
    },
    "workbench.action.terminal.split",
    {
      "command": "workbench.action.terminal.renameWithArg",
      "args": {
        "name": "maidev"
      }
    },
    {
      "command": "workbench.action.terminal.sendSequence",
      "args": {
        "text": "ls -lrt\u000D"
      }
    },
  ]
 }
]
  "restoreTerminals.runOnStartup": false,   // true is the default
          // set to false if using a keybinding or the command palette

  "restoreTerminals.terminals": [
    {
      "splitTerminals": [
        {
          "name": "server",
          "commands": [
            "npm run test"
          ]
        },
        {
          "name": "empty",
        }
      ]
    },
    {
      "splitTerminals": [
        {
          "name": "websockets",
          "commands": [
            "ls -l"
          ]
        },
        {
          "name": "queue",
          "commands": [
            "cd zip",
            "gulp sass"
          ]
        },
        {
          "name": "maidev",
          "commands": [
            "cd zip-multiple",
            "gulp"
          ]
        }
      ]
    }
  ],
和一个键绑定:

{
  "key": "shift+alt+t",    // whatever keybinding if you wish
  "command": "restore-terminals.restoreTerminals",
},

如果在Windows上,我仍将使用以下设置:

 "terminal.integrated.windowsEnableConpty": false
当使用此扩展作为快速打开和写入终端的任何其他方法时,也会出现同样的问题-如果随后尝试关闭终端,vscode将挂起并最终超时,需要重新打开



好的,在用另外两个答案回答这个问题一天后,我看到了这个扩展:在另一个问题上

这个扩展似乎工作得很好。放