【问题标题】:Perform pre-defined Find-Replace-All in VSCode using a keybinding使用键绑定在 VSCode 中执行预定义的 Find-Replace-All
【发布时间】:2019-12-23 18:19:41
【问题描述】:

我似乎找不到可以从 VSCode 键绑定运行的记录命令的良好列表。

在在线 VSCode 文档中,Commands Guide 列出了两种发现命令的方法:

为键盘快捷键找到的命令通常是不带参数的“简单”命令。 “高级命令 api”似乎缺少一些非常基本的基本命令。

例如,在VSCode Keybindings 页面上有一个名为“命令参数”的部分,其中包含以下示例条目:

{ "key": "enter", "command": "type",
  "args": { "text": "Hello World" },
  "when": "editorTextFocus" }

但我没有看到任何记录 type 命令的地方。所以我假设可能还有其他几个类似这样的基本命令存在,但我不知道在哪里可以找到它们的文档。

无论如何,我现在真正在寻找的是一个命令,我可以运行该命令在当前编辑器中执行预定义的搜索和替换,指定查找文本、替换文本和选项......类似于下面:

{ "key": "ctrl+shift+8", 
  "command": "findReplaceAll",
  "args": { 
    "findText": "Company(\\w+)", 
    "replaceText": "User$1"
    "options": { "ignoreCase": false, "wholeWord": true, "regex": true }
  },
  "when": "editorTextFocus" }

但是我在文档中找不到任何这样的findReplaceAll 命令或类似的东西,但肯定存在这样的东西,对吧?

谢谢!

【问题讨论】:

    标签: visual-studio-code vscode-settings key-bindings vscode-extensions


    【解决方案1】:

    安装扩展Replace Rules

    在您的settings.json(工作区或用户)中构造一个搜索替换。阅读有关可能性的页面。

      "replacerules.rules": {
        "Replace User": {
          "find": "User(\d+)",
          "replace": "Player$1"
        }
      }
    

    keybindings.json 中定义以下键绑定:

      {
      "key": "ctrl+shift+alt+u",
      "command": "replacerules.runRule",
      "when": "editorTextFocus",
      "args": { "ruleName": "Replace User"}
      }
    

    如果您选择某些文本,则搜索替换将仅在所选内容中执行。

    【讨论】:

    • 谢谢。我会试试这个。我希望找到执行此操作的内置命令(而不是扩展),但似乎这些命令没有很好地记录(并且内置的搜索和替换命令可能不存在)。无论如何,我认为您的解决方案可以正常工作。
    【解决方案2】:

    我一直在寻找一个 API 来作为扩展编写器执行此操作,并且它似乎是在不到一个月前添加的(如果我理解正确的话,您可能也可以使用它来手动定义键绑定):

    https://github.com/microsoft/vscode/commit/8e96e0b389aedf46423431487190b878d4243edb

    【讨论】:

      【解决方案3】:

      正如@AurSaraf 所指出的,即将推出的新工作将允许创建一个内置方式的命令(或在扩展中使用)以使用预设的 find/ 在当前文件中查找 替换和选项。

      我已经评论了 github 问题,试图让 args 与其他类似命令保持一致,但无济于事。以下是键绑定中当前可用的参数:

      {
        "key": "alt+p",
        "command": "editor.actions.findWithArgs",
        "args": {
      
          "searchString": "howd\\d",      // double-escaped
          "replaceString": "qqqq9",
          "isRegex": true,
          // "regexOverride": 1,
          "findInSelection": false,
          "matchWholeWord": false,
          // "matchCase": false,
          // "matchCaseOverride": 0,
          "preserveCase": false,
          "isCaseSensitive": false
          // "preserveCaseOverride": 0,
          // "wholeWordOverride": 0
        }
      }
      

      注释掉的参数是不可用,虽然智能感知显示它们是 - 所以命令仍然有点“粗糙” - 目前仅在 Insiders Build 中可用。 不要依赖args 键的智能感知 - 其中许多键名称错误或此时不起作用。

      另外,请注意,此命令当前使用 searchStringreplaceString 而不是 workbench.action.findInFilessearch.action.openEditor(打开新的搜索编辑器)键绑定中使用的 queryreplace某种原因。


      有关使用所有参数执行大量预定义查找/替换或搜索/替换的强大扩展,请参阅Find and Transform(我写的)。特别是有很多用于设置 files to include 范围过滤器的选项 - 例如当前文件或在以前的搜索结果中找到的最后一个文件,以将搜索范围缩小到仅这些文件。


      还有一种内置方法可以跨文件查找,我不知道是否在您的问题之后添加了参数。无论如何,我同意有时很难发现哪些命令可以带参数。

      有时,您的命令中的键绑定中的智能感知会显示它们,但并非总是如此。

      所以检查一下:

      {
       "key": "ctrl+shift+f",
       "command": "workbench.action.findInFiles",
       "args": {
         <cursor here>  // cursor there and type Ctrl+space
        }
      }
      

      将显示可用的args,如下例所示。


      {
        "key": "ctrl+shift+f",
        "command": "workbench.action.findInFiles",
        "args": {
      
          "query": "Company(\\w+)",   // needs to be double-escaped
          "replace": "User$1",
          "triggerSearch": true,
          "isRegex": true,
        
          // "filesToExclude": "",
          // "filesToInclude": "",
          "matchWholeWord": true,
          "isCaseSensitive": true
        }
      },
      

      这将执行搜索,但不会在您的文件中进行实际替换 - 您必须自己触发 replace [all]

      【讨论】:

      • 我喜欢 Mark 的方法,"workbench.action.findInFiles" 看起来像 best-documented command (arguments as described by Mark, and here) 请注意 "workbench.action.findWithArgs" 在我的 VS Code (1.62.3; the最新截至 2021 年 11 月 29 日),我收到错误“找不到命令 'editor.actions.findWithArgs'”。最后,您可以使用tasks.json创建一个任务来“触发replace [all]自己”; "search.action.replaceAll" 命令对我有用(但打开了一个确认对话框)
      • @TheRedPea 我应该更清楚地表明workbench.action.findWithArgs 现在在 Insiders Build 中(我提到它即将推出)。所以它很可能很快就会进入稳定版——不过我不知道它是否会出现在下一个版本中。
      • 糟糕,我看到你说得很清楚了。我没注意;谢谢!
      • 我明白我可能会混淆“editor.actions.findWithArgs”和“workbench.action” .findWithArgs”,我需要小心!同样GitHub link/thread 也提到了 Insider 构建,就像 Mark 所说的那样——所以我期待构建。
      • 我保证很快停止评论!我对新的editor.actions.findWithArgseditor.action.startFindReplaceAction 感到困惑;我认为前者does allow us to pass args 给出初始值,即在查找/替换字段中;但后者does not 允许任何参数初始化状态
      【解决方案4】:

      如果你愿意使用tasks.json;一个原生的 VS 代码概念——并且你可以访问像 bash(我使用带有 GitBash 的 Windows)或 Powershell(Windows 内置)这样的 shell,你可以在没有 VS 的情况下使用该 shell 的强大功能代码扩展,或任何新的部署——在我的例子中,我使用sed 命令来进行文件替换:

      {
              "label": "find-replace-task-name",
              "type": "shell",
              "command": "sed -i -E \"s/Company(\\w+)/User\\1/g; s/user/User/g\" \"${file}\""
      },
      

      在 shell 命令中使用tasks.json 的优点:

      • 就我而言,我希望团队中的其他开发人员使用我的解决方案,因此我喜欢使用 tasks.json,因为它存储在 .vscode 文件夹中,我们确实包含在该文件夹中我们的版本控制(keybindings.json 未存储在.vscode 文件夹中)
      • 我可以在今天的版本 VSCode 上使用我的解决方案(我不需要Insiders build),
      • 我可以使用我的它无需安装任何 VSCode 扩展程序
      • 因为我的任务依赖于 shell,所以我获得了 shell 及其任何“内置”命令的强大功能

      就我而言,我可以使用bash shell 和sed utility,它们功能强大、富有表现力且易于使用,可用于文件操作(包括查找-替换)。

      外壳帮助我从不同的角度解决这个问题;即"how to find-replace a file, using (bash|Powershell)..."(因此您可以将此方法调整为Powershell,而不是bashmore on that...

      注意:

      • 我使用了sed to perform multiple find-replacements(我需要,这个问题的 OP 不需要 - 所以我在我的命令中链接了“user”->“User”的替换)
      • 我使用"${file}" 变量替换将文件路径传递给当前打开的文件

      而且我可以与键绑定关联,因此更容易运行任务。请注意,键绑定仅适用于"when":"editorTextFocus",也许我应该添加一个条件,即打开了一些文件!

      {
          "key": "ctrl+shift+alt+s",
          "when": "editorTextFocus",
          "command": "workbench.action.tasks.runTask",
          "args": "find-replace-task-name"
      }
      

      我的方法有一些缺点

      • 我编写的sed 脚本非常密集,并且有多个级别的“转义字符”,因此很难阅读/解释/排除故障(与易于阅读的 JSON sn-p 相比,例如 {"searchString":..., "replaceString":...} )
      • 它对 VS Code 的文件 outside 进行操作,所以没有“撤消”操作看起来您可以“撤消”更改,特别是您可以“撤消”VS Code 的自动重新加载文件,(VS Code 可能会识别出 sed 修改了文件;但 VS Code 仍然允许您“Ctrl+Z”在修改之前返回)
      • 只有打开文件才能工作
      • 不使用 $1 替换 RegEx、instead uses the "extended regular expressions" flag -E and the syntax \1
      • 等等...

      【讨论】:

        猜你喜欢
        • 2021-02-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-03-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多