Фрагменты в VS Code, которые используют текст, найденный в файле с регулярным выражением - PullRequest
0 голосов
/ 21 марта 2019

У меня есть фрагмент кода React Native, который export default connect(mapStateToProps, mapDispatchToProps)($0), где курсор появляется в последних скобках, чтобы я мог ввести имя класса.

Предполагая, что я всегда использую этот фрагмент в файле, в котором определен класс (class ClassName extends Component {), есть ли способ написать фрагмент так, чтобы он автоматически заполнял текущее имя класса ? Для начала используйте регулярное выражение или что-то еще.

Например, с помощью этого кода в начале файла:

import React, { Component } from "react";
import { connect } from "react-redux";

class MyClass extends Component {
  ...
  ...

Когда я набираю внутри этого файла, мой фрагмент кода для того, что в настоящее время export default connect(mapStateToProps, mapDispatchToProps)($0) (который дает мне этот код с курсором, где находится $0), я хочу, чтобы он мгновенно получил это:

export default connect(mapStateToProps, mapDispatchToProps)(MyClass)

Возможно, это что-то вроде этого:

"body": "export default connect(mapStateToProps, mapDispatchToProps)({/class (\w+) extends/})"```

1 Ответ

0 голосов
/ 22 марта 2019

Вы не можете поместить регулярное выражение во фрагмент, кроме как для преобразования одной из встроенных переменных. Если MyClass уже есть в буфере обмена, вы можете просто использовать $CLIPBOARD в своем фрагменте:

"body": "export default connect(mapStateToProps, mapDispatchToProps)($CLIPBOARD)"

Предполагая, что имя класса не всегда должно быть всегда в буфере обмена, существует другой хитрый способ найти имя класса, выбрать его и скопировать в буфер обмена, чтобы его можно было использовать в фрагменте как $CLIPBOARD ,

Для начала вам понадобится расширение макроса, например multi-command .

Во-вторых, этот параметр в settings.json:

"multiCommand.commands": [
  {
  "command": "multiCommand.regexSnippet",  // name of the macro to use a keybinding
  "interval": 1000,  // delay between the following commands, left long to watch it work
                     // you don't need any interval, that option can be commented out

  "sequence": [
    // first command, on a blank line type out a regular expression
    {
      "command": "type",
      "args": {
        "text": "(?<=class )(.*)(?= extends)"
      }
    },

    // select and cut that regex
    "cursorHomeSelect",
    "editor.action.clipboardCutAction",

   // now $CLIPBOARD has your class name on it

    // open the find widget
    "actions.find",

    // "toggleFindRegex",  // you should have the find regex option already selected

    // paste the regex into the find widget
    "editor.action.clipboardPasteAction",

    // select and copy the match that the regex finds
    "editor.action.selectAllMatches",
    "editor.action.clipboardCopyAction",

    // go back to where you were in the code to insert the snippet
    "workbench.action.navigateToLastEditLocation",

    {
      "command": "editor.action.insertSnippet",
      "args": {

        // "snippet": "export default $1($2, $3)($CLIPBOARD)",
        // use the above if  those values are not pre-determined like in your question

        "snippet": "export default connect(mapStateToProps, mapDispatchToProps)($CLIPBOARD)"
      }
    }
  ]
 }
],

В-третьих, некоторые комбинации клавиш для запуска этого макроса:

{
  "key": "shift-alt-2",
  "command": "multiCommand.regexSnippet"
},

Примечание: вы запускаете макрос, не фрагмент - поэтому нет смысла.

Вот рисунок с длинным интервалом, чтобы вы могли видеть шаги в действии («Режим переключения экрана» для просмотра клавиш управления):

regex find and insert a snippet

Пара важных моментов:

  1. Вы можете удалить или закомментировать параметр интервала, и он будет мгновенным.

  2. Макрос предполагает, что у вас уже выбрана опция find regex - что у меня всегда так. К сожалению, есть команда для переключения опции find regex , но нет команды, чтобы убедиться, что она включена.

  3. Макрос выглядит огромным, но это наполовину пояснительные комментарии.

  4. Очевидно, что если в файле содержится более одного class MyClass extends, этот макрос может не работать.

  5. Вы должны запустить макрос (с выбранной связью клавиш) в пустой строке - иначе первоначальный выбор регулярного выражения будет неправильным.

Дайте мне знать, если это работает для вас.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...