Пользовательские фрагменты с определенным поведением с привязкой клавиш в VS Code

#visual-studio-code #customization #vscode-snippets

#visual-studio-code #настройка #vscode-фрагменты

Вопрос:

Я пытаюсь вставить фрагмент %>% с привязкой Ctrl Shift M клавиш в VS Code.

Пример кода:

 data %>% select()
  

Я могу достичь этого (не совсем доволен) с помощью этого параметра в keybindings.json

 // Place your key bindings in this file to override the defaults
[
    {
        "key": "Ctrl Shift M",
        "command": "editor.action.insertSnippet",
        "when": "editorTextFocus",
        "args": {
          "snippet": " %>% "
        }
      }
]
  

В RStudio IDE, независимо от того, есть ли у меня пробел после data или нет, при Ctrl Shift M привязке клавиш он вставляет только один пробел между data и %>% . Смотрите это:

введите описание изображения здесь

Однако в настройках, которые я создал keybindings.json в VS Code, я не могу ограничить пространство между data и %>% только одним пробелом. С моей настройкой у меня будет два пробела между ними. Смотрите это:

введите описание изображения здесь

Я прочитал это и это, но не смог помочь. Как я мог ограничить пространство только одним пробелом?

Ответ №1:

Как правило, сложно делать то, что вы хотите, потому что фрагменты vscode просто вставляют, есть ли курсор, но вы не можете удалить что-то перед курсором. Это было бы легко сделать, если бы вы выбрали это предыдущее слово, как data в вашем случае, но вы, вероятно, не хотите этого делать.

Но с помощью условной замены это возможно:

 {
  "key": "Ctrl Shift M",
  "command": "editor.action.insertSnippet",
  "when": "editorTextFocus",
  "args": {
    "snippet": "${TM_CURRENT_WORD/(.*)/${1:? %>% :%>% }/}"
  }
},
  

Этот фрагмент просматривается word под курсором при его запуске. Если есть слово, например, когда курсор находится сразу после слова, которое имеет значение, будет группа захвата 1. Если нет слова, например, если вы сначала ввели пробел, а пробел считается word , по-видимому, для целей TM_CURRENT_WORD , не будет группы захвата 1.

Текст замены — ${1:? %>% :%>% } это условная замена, в которой говорится: если есть группа захвата 1, регистр без пробела, вставьте %>% с одним начальным и конечным пробелом. В противном случае, когда захватывается группа 1, так что уже есть начальный пробел, вставьте %>% без начального пробела, кроме одного конечного пробела.

ДЕМОНСТРАЦИЯ:

демонстрация фрагмента с / без пробелов

Единственный случай, когда это работает не так, как вы хотите, — это случай 4 в демо, который, надеюсь, не является для вас распространенным вариантом использования — возврат к тексту для вставки вашего фрагмента. Это добавляет дополнительное пространство, потому что курсор находится прямо перед словом, которое считается a TM_CURRENT_WORD и попадает в группу захвата 1. В противном случае я думаю, что единственным решением для этого варианта использования было бы расширение или требование, чтобы вы сначала выбрали это предыдущее слово.

Комментарии:

1. Выполняет работу для моего варианта использования. Хотелось бы увидеть обходной путь и для случая 4. Спасибо.