diff --git a/ansible/inventory/group_vars/desktop.yml b/ansible/inventory/group_vars/desktop.yml index 6d554aa..e69eb98 100644 --- a/ansible/inventory/group_vars/desktop.yml +++ b/ansible/inventory/group_vars/desktop.yml @@ -30,7 +30,18 @@ desktop_source_tools: desktop_binary_tools: [] -desktop_npm_packages: "{{ ai_agents_npm_packages + [] }}" +desktop_npm_packages: >- + {{ + ai_agents_npm_packages + + [ + {'name': '@mermaid-js/mermaid-cli', 'state': 'latest'}, + {'name': 'vscode-langservers-extracted', 'state': 'latest'} + ] + }} + +desktop_uv_tools: + - debugpy + - python-lsp-server desktop_common_dotfiles: - name: XDG autostart entries diff --git a/ansible/inventory/group_vars/void.yml b/ansible/inventory/group_vars/void.yml index 5c5ac82..26e65f4 100644 --- a/ansible/inventory/group_vars/void.yml +++ b/ansible/inventory/group_vars/void.yml @@ -170,11 +170,13 @@ desktop_hyprland_packages: profile_packages: - alacritty + - bash-language-server - bluez - bridge-utils - ctags - firefox - deluge-gtk + - delve - dnsmasq - emacs-pgtk - poppler-glib @@ -186,6 +188,9 @@ profile_packages: - gvfs-mtp - gvfs-smb - gufw + - golangci-lint + - gopls + - hunspell - libvirt - libspa-bluetooth - libreoffice @@ -209,6 +214,7 @@ profile_packages: - ristretto - rsync - shotwell + - shfmt - ruff - terminus-font - texlive diff --git a/ansible/roles/profile_desktop_common/tasks/main.yml b/ansible/roles/profile_desktop_common/tasks/main.yml index fc50967..45d9929 100644 --- a/ansible/roles/profile_desktop_common/tasks/main.yml +++ b/ansible/roles/profile_desktop_common/tasks/main.yml @@ -552,3 +552,21 @@ when: desktop_npm_packages | length > 0 loop_control: label: "{{ item.name }}" + +- name: Install desktop Python tools with uv + tags: [packages, emacs] + ansible.builtin.command: + cmd: "uv tool install --upgrade {{ item }}" + become: true + become_user: "{{ username }}" + environment: + HOME: "{{ user_home }}" + register: profile_desktop_common_uv_tool_install + changed_when: >- + (profile_desktop_common_uv_tool_install.stdout | default('') + + profile_desktop_common_uv_tool_install.stderr | default('')) + is regex('(?i)installed|updated') + loop: "{{ desktop_uv_tools | default([]) }}" + when: desktop_uv_tools | default([]) | length > 0 + loop_control: + label: "{{ item }}" diff --git a/dotfiles/desktop/.emacs.d/lisp/lang/python.el b/dotfiles/desktop/.emacs.d/lisp/lang/python.el index 8ec025d..5a345fb 100644 --- a/dotfiles/desktop/.emacs.d/lisp/lang/python.el +++ b/dotfiles/desktop/.emacs.d/lisp/lang/python.el @@ -40,9 +40,6 @@ (setq-local process-environment (copy-sequence process-environment)) (setenv "PATH" (concat venv-bin path-separator (getenv "PATH"))))) -(defvar fscotto/python-lsp-install-asked nil - "Non-nil if user was already asked about installing pylsp this session.") - (defun fscotto/resolve-pylsp () "Return the pylsp binary path if found, else nil. Checks: project .venv, uv tool install path, and PATH." @@ -60,41 +57,18 @@ Checks: project .venv, uv tool install path, and PATH." (fscotto/resolve-pylsp)) (defun fscotto/python-ensure-lsp-server () - "Ensure a Python LSP server is installed, prompting the user if needed. -If pylsp is already available, start LSP immediately. Otherwise, ask once -whether to install it via uv. On confirmation, install python-lsp-server -as a uv tool and then start LSP." - (unless (fboundp 'lsp-deferred) - (message "python: lsp-mode not available") - (return-from fscotto/python-ensure-lsp-server)) - - (if (fscotto/python-lsp-server-available-p) - (progn - (setq lsp-pylsp-server-command (fscotto/resolve-pylsp)) - (lsp-deferred)) - (when (or fscotto/python-lsp-install-asked - (y-or-n-p "python-lsp-server not found. Install it via uv? ")) - (setq fscotto/python-lsp-install-asked t) - (let ((buf (current-buffer))) - (message "Installing python-lsp-server via uv in background...") - (make-process - :name "uv-pylsp-install" - :buffer (get-buffer-create " *uv-pylsp-install*") - :command '("uv" "tool" "install" "--upgrade" "python-lsp-server") - :sentinel - (lambda (proc event) - (cond - ((string-match-p "finished" event) - (message "python-lsp-server installed.") - (setq lsp-pylsp-server-command (fscotto/resolve-pylsp)) - (with-current-buffer buf - (lsp-deferred))) - ((string-match-p "exited\\|failed" event) - (with-current-buffer buf - (message "python-lsp-server installation failed. Check *uv-pylsp-install* buffer.")))))))))) + "Start Python LSP when its Ansible-managed pylsp executable is available." + (cond + ((not (fboundp 'lsp-deferred)) + (message "python: lsp-mode not available")) + ((fscotto/python-lsp-server-available-p) + (setq lsp-pylsp-server-command (fscotto/resolve-pylsp)) + (lsp-deferred)) + (t + (message "python: pylsp not found; run the desktop Ansible profile")))) (defun fscotto/python-maybe-start-lsp () - "Start Python LSP, installing pylsp via uv if needed." + "Start Python LSP when pylsp is available." (fscotto/python-ensure-lsp-server)) (defun fscotto/python-setup-check-command () diff --git a/dotfiles/desktop/.emacs.d/lisp/tools/dap.el b/dotfiles/desktop/.emacs.d/lisp/tools/dap.el index 80c2245..3bcdaf5 100644 --- a/dotfiles/desktop/.emacs.d/lisp/tools/dap.el +++ b/dotfiles/desktop/.emacs.d/lisp/tools/dap.el @@ -21,4 +21,11 @@ ;; Loading DAP adapters ;; For Python (require 'dap-python) - (setq dap-python-debugger 'debugpy)) + (setq dap-python-debugger 'debugpy + dap-python-executable + (let ((uv-debugpy-python + (expand-file-name + "~/.local/share/uv/tools/debugpy/bin/python"))) + (if (file-executable-p uv-debugpy-python) + uv-debugpy-python + "python3"))))