Quiero obtener el rango de una palabra personalizada en mi extensión de VS Code, si paso el mouse sobre ella y si la línea de texto coincide con un patrón. Esto es lo que he escrito hasta ahora:
vscode.languages.registerHoverProvider('.mylanguage', { provideHover(document, position, token) { // define `hoverRange` somewhere here const hoverLineText = document.lineAt(position.line).text; const pattern = new RegExp("\\w+\\s{0,}\\(.{0,}\\s{0,}\\)"); if(pattern.test(hoverLineText)){ hoverRange = document.getWordRangeAtPosition(position, pattern); } console.log(hoverRange); //etc. ...
Espero que, si escribe en el editor algo como myFunction ( )
, y pasa el mouse sobre cualquier posición de esa cadena (por ejemplo, incluso en el espacio en blanco), la consola generará hoverRange
, que tendrá en cuenta la posición del cierre paréntesis )
, también.
Sin embargo, si paso el mouse sobre el espacio en blanco, no se envía nada a la consola. En su lugar, necesito desplazarme sobre myFunction
para poder obtener el rango completo de la cadena.
¿Cómo puedo hacer que mi extensión de VS Code trate myFunction ( )
como una sola palabra?
Esto funciona para mí:
let disposable3 = vscode.languages.registerHoverProvider('plaintext', { provideHover(document, position) { let hoverRange; const hoverLineText = document.lineAt(position.line).text; const pattern = new RegExp("\\w+\\s*\\(.*\\s*\\)"); if (pattern.test(hoverLineText)){ hoverRange = document.getWordRangeAtPosition(position, pattern); if (hoverRange) return new vscode.Hover(document.getText(hoverRange), new vscode.Range(position, position)); else return null; } else return null; } }); context.subscriptions.push(disposable3);
Como puede ver, el desplazamiento funciona sobre espacios. Pero la expresión regular es demasiado indulgente para que recoja cosas como
if (asdasdasd)
while(adasd)
ya que también parecen llamadas a una función.