es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Cuando se indica excluir carpetas y archivos específicos de mostrar un comando de extensión en un menú contextual.

En mi extensión de VS Code, tengo algunos comandos que deseo tener disponibles en la vista del explorador, y quiero que su disponibilidad se base en lo que está seleccionado. Digamos que abro una carpeta en VS Code, y la carpeta tiene lo siguiente:

/a
/a/1.txt
/a/2.txt

/b
/b/3.txt
/b/4.txt

/c
/c/5.txt
/c/6.txt

Deseo que un comando esté presente cuando se selecciona la carpeta “c” o cualquier cosa dentro de ella, pero no en a ni b.

Además, quiero que la lógica excluya carpetas específicas (y su contenido), no incluya carpetas específicas (por ejemplo, quiero que la lógica sea “el comando está disponible para todo excepto a o b”).

En la función activate() de mi extensión tengo:


vscode.commands.executeCommand(
'setContext',
'ext.list',
[
'a',
'b'
]
);

Y en mi archivo package.json tengo:


{
"command": "samplecommand",
"when": "resourceFilename in ext.list"
}

Cuando ejecuto esto, encuentro que el comando está disponible cuando tengo las carpetas a o b seleccionadas, pero no cuando tengo alguno de los elementos dentro de ellas seleccionado (como a/1.txt). Intenté usar a/*, a/.* y a/*.*, pero no he encontrado nada que funcione.

Entonces, cuando se usa “resourceFilename in”, ¿admite expresiones regulares? ¿O solo hace coincidencias exactas de texto? ¿Cómo puedo obtener una coincidencia positiva cuando se selecciona tanto la carpeta como uno de los elementos dentro de la carpeta?

Ok, luego quiero excluir el comando de todos modos, y cuando intenté:


{
"command": "samplecommand",
"when": "!(resourceFilename in ext.list)"
}

…o:

{
"command": "samplecommand",
"when": "resourceFilename !in ext.list"
}

…el comando no aparece para a, b ni c. ¿Es posible verificar cuando el nombre de archivo no está en la lista? Parece que esto siempre se evalúa como falso.

Entonces, en resumen, me gustaría filtrar los comandos en la vista del Explorador y hacer que no aparezcan para carpetas y elementos específicos. ¿Es esto posible?

Tags:  ,

Answer

  1. Avatar for davy.ai

    Cuando se utiliza resourceFilename in, solo hace una coincidencia exacta de cadenas y no admite expresiones regulares. Para obtener una coincidencia positiva cuando se selecciona la carpeta o alguno de los elementos dentro de la carpeta, debes utilizar resourceFilenameMatches en su lugar. Por ejemplo: "when": "resourceFilenameMatches('^(c\\\\b|c\\\\[\\d]+\\\\.[a-z]+)$')". Este ejemplo coincide con cualquier archivo o carpeta que comience con “c\” y a continuación esté seguido por “b” o un número y una extensión.

    En cuanto a excluir carpetas específicas, puedes utilizar !(resourceFilename in ext.list) para excluir archivos o carpetas que coincidan exactamente con la cadena en la lista. Sin embargo, para excluir una carpeta y su contenido, debes usar !(workspaceFolder in ext.list) en su lugar. Por ejemplo: "when": "!(workspaceFolder in ext.list)". Esto excluirá la carpeta y su contenido del comando.

Comments are closed.