🗂️ Workspace & Produtividade de Projeto#

Esta página cobre o conjunto de ferramentas voltadas à organização do workspace (pasta de projeto) e à produtividade ao alternar entre projetos: troca rápida de workspace, templates de novo projeto, execução de código multi-linguagem, gravação de macros, remapeamento de atalhos e o modelo de confiança de pastas (Workspace Trust).

Acesso à maioria delas: menu Ferramentas → Workspace & Editor.


🔁 Workspace Switcher (src/ui/workspace_switcher.py)#

Atalho: Ctrl+Shift+W ou Ferramentas → Workspace & Editor → Alternar Workspace.

Painel flutuante (700×480) para trocar rapidamente entre workspaces recentemente abertos.

  • Lista de workspaces recentes com ícone indicando o tipo detectado (Git, projeto Python, projeto JS/Node...)
  • Pré-visualização da árvore de diretórios ao passar o mouse sobre um item
  • Busca em tempo real por nome de pasta
  • Ações: abrir, remover da lista de recentes, abrir no explorador de arquivos do sistema

📋 Project Templates (src/ui/project_templates.py)#

Atalho: Ferramentas → Workspace & Editor → Novo Projeto a partir de Template.

Cria projetos novos a partir de templates pré-definidos ou customizados pelo usuário. Cada template é uma pasta com arquivos e um template.json de metadados.

Templates embutidos#

ID Descrição
python_basic Script Python simples
python_package Pacote Python instalável (com pyproject.toml)
fastapi API REST com FastAPI
flask Aplicação web com Flask
cli_tool Ferramenta de linha de comando
node_basic Projeto Node.js básico
typescript_basic Projeto TypeScript básico
data_science Estrutura para notebooks/análise de dados
mkdocs Site de documentação com MkDocs
makefile_c Projeto C/C++ com Makefile

Funcionalidades#

  • Janela de criação (820×580) com preview da estrutura de arquivos antes de confirmar
  • Variáveis de substituição nos arquivos do template: {{project_name}}, {{author}}, {{year}} e outras, substituídas no momento da criação
  • Templates customizados: qualquer pasta pode ser salva como template novo
  • Suporte a comandos pós-criação (ex.: git init, pip install -r requirements.txt) executados automaticamente após gerar os arquivos

▶️ Code Runner Configurável (src/ui/code_runner.py)#

Atalho: Ferramentas → Workspace & Editor → Configurar Code Runner. A execução em si é via F5 (Executar Arquivo).

Permite rodar arquivos em qualquer linguagem com comando, argumentos e variáveis de ambiente customizáveis por linguagem.

Linguagens pré-configuradas#

Python, JavaScript, TypeScript, Ruby, PHP, Go, Rust, Java, Kotlin, Swift, Lua, Perl, Bash, PowerShell, R, Julia, Dart, Scala, Elixir, Haskell, C e C++ - mais de 30 linguagens no total, incluindo variações de runtime.

Funcionalidades#

  • Editar o comando de execução de qualquer linguagem (por exemplo, trocar python por python3.12 ou adicionar flags)
  • Argumentos extras e variáveis de ambiente específicas por linguagem
  • Timeout configurável por execução (evita que um script travado prenda o terminal indefinidamente)
  • Histórico de execuções com timestamp

🎬 Macro Recorder (src/ui/macro_recorder.py)#

Atalhos: Ctrl+Shift+M (iniciar/parar gravação) · Ctrl+Alt+M (reproduzir).

Grava e reproduz sequências de teclas e ações do editor.

Funcionalidades#

  • Toolbar flutuante com botões Gravar / Parar / Reproduzir
  • Captura texto digitado, atalhos de teclado e navegação de cursor
  • Múltiplas macros nomeadas, com persistência em JSON
  • Reprodução com delay configurável (útil para visualizar a macro rodando passo a passo)
  • Importar/exportar macros como arquivo JSON, para compartilhar com outra instância do Codis

⌨️ Key Remapper (src/ui/key_remapper.py)#

Acesso: Configurações → Atalhos de Teclado...

Permite remapear qualquer atalho de teclado da aplicação. Os atalhos customizados são persistidos separadamente da configuração principal e aplicados em toda a sessão.

Arquitetura interna#

Componente Responsabilidade
KeyRemapperStore Lê/grava keybindings.json, separado do config.json
KeyRemapperDialog Janela de edição (760×560) com lista pesquisável e captura interativa de tecla
KeyRemapperManager Aplica os bindings customizados na janela raiz do Tk; usado pelo CodisApp na inicialização

Para redefinir um atalho: localize a ação na lista pesquisável, clique em Capturar, pressione a nova combinação desejada - a janela de captura (320×120) registra a combinação e a salva imediatamente.


🔒 Workspace Trust (src/ui/workspace_trust.py)#

Sistema de segurança acionado automaticamente ao abrir uma pasta nunca aberta antes nesta máquina.

Como funciona#

Ao abrir um workspace novo, o Codis exibe um diálogo de confiança perguntando se o conteúdo da pasta é confiável. Pastas marcadas como não confiáveis têm os seguintes recursos restringidos automaticamente:

Recurso Comportamento em pasta não confiável
Plugins Carregados em modo somente-leitura, sem execução de código
Execução de tarefas/scripts Bloqueada
LSP Desabilitado (servidores de linguagem podem executar código arbitrário)
Terminal integrado Exibe aviso visual de modo restrito

Persistência#

A lista de pastas confiáveis fica em ~/.codis/trusted_workspaces.json. Uma vez confiada, a pasta (e qualquer subpasta dela) não pergunta novamente. Para revogar a confiança de uma pasta, edite ou remova a entrada correspondente nesse arquivo.

Este modelo é equivalente ao "Workspace Trust" do VS Code: protege contra a abertura descuidada de repositórios desconhecidos que poderiam, por exemplo, embutir um .codis/plugins/malicioso.py ou configurar um LSP apontando para um binário malicioso.


🪟 Panel Detach (src/ui/panel_detach.py)#

Gerencia o destacamento de painéis (Terminal, Output, Git, Debug, Regex, Problems) para janelas flutuantes independentes, arrastáveis e redimensionáveis.

Antes da versão atual, o destacamento só funcionava com o modo K-UI ativo, pois a lógica vivia dentro do controlador holográfico. O PanelDetachManager foi extraído como uma classe independente, instanciada uma única vez na inicialização do CodisApp, e funciona tanto no modo clássico quanto no modo K-UI - incluindo a janela flutuante com moldura holográfica (KFloatWindow), que é reaproveitada de K-UI.

Compartilhar uma única instância entre os dois modos resolve um problema de UX: painéis destacados não são fechados à força quando o usuário alterna o K-UI ligado/desligado - eles continuam abertos normalmente.