J'essaie d'insérer un extrait %>% avec un raccourci clavier Ctrl+Shift+M dans VS Code.

Exemple de code:

data %>% select()

Je suis capable d'y parvenir (pas totalement satisfait) avec ce paramètre dans 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": " %>% "
        }
      }
]

Dans RStudio IDE que j'aie un espace après data ou non, avec le raccourci clavier Ctrl+Shift+M, il n'insère qu'un seul espace entre data et %>%. Regarde ça:

enter image description here

Cependant, dans le cadre que j'ai créé dans keybindings.json dans VS Code, je ne suis pas en mesure de limiter l'espace entre data et %>% à un seul espace. Avec mon réglage, j'aurai deux espaces entre les deux. Regarde ça:

enter image description here

J'ai lu https://code.visualstudio.com/docs/editor/userdefinedsnippets, et https://code.visualstudio.com/docs/getstarted/keybindings#_advanced -personnalisation mais n'a pas pu aider. Comment pourrais-je éventuellement limiter l'espace à un seul espace?

0
Suman Khanal 31 oct. 2020 à 16:18

1 réponse

Meilleure réponse

En général, il est difficile de faire ce que vous voulez, car les extraits de code vscode insèrent simplement si le curseur est - mais vous ne pouvez pas supprimer quelque chose avant le curseur. Ce serait facile à faire si vous choisissiez ce mot précédent, comme data dans votre cas, mais vous ne voulez probablement pas le faire.

Mais en utilisant un remplacement conditionnel, il est possible :

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

Cet extrait regarde le word sous le curseur lorsque vous le déclenchez. S'il y a un mot, comme lorsque le curseur est juste après un mot qui compte, il y aura un groupe de capture 1. S'il n'y a pas de mot, comme si vous avez d'abord entré un espace et qu'un espace est considéré comme un word apparemment pour les besoins de TM_CURRENT_WORD, il n'y aura pas de groupe de capture 1.

Le texte de remplacement est ${1:? %>% :%>% } qui est un remplacement conditionnel qui dit : s'il existe un groupe de capture 1, le cas sans espace, insérez %>% avec un espace de début et de fin. Sinon, lors de la capture du groupe 1, il y a déjà un espace de début, insérez %>% sans espace de début mais un espace de fin.

Démo:

demo of snippet with/without spaces

Le seul cas où cela ne fonctionne pas comme vous le souhaitez est le cas 4 dans la démo qui, espérons-le, n'est pas un cas d'utilisation courant pour vous - revenir dans le texte pour insérer votre extrait. Cela ajoute de l'espace supplémentaire car avec le curseur juste avant un mot qui est considéré comme un TM_CURRENT_WORD et tombe dans le groupe de capture 1. Sinon, je pense que la seule solution à ce cas d'utilisation serait une extension ou vous obligerait à sélectionner ce qui précède mot d'abord.

0
Mark 31 oct. 2020 à 19:56