LINUX.ORG.RU

Ответ на: комментарий от Bakamashine

логи выводятся в специальные буферы (на вроде message, *-log *-error), переключатся между буферами можно комбинацией Ctrl-x b. Как организуете работу с питоном lsp или tree-sitter? Например eglot+tree-sitter выглядит примерно так:

(add-to-list 'major-mode-remap-alist '(python-mode . python-ts-mode))

(use-package eglot
  :ensure t
  :defer t
  :bind (:map eglot-mode-map
              ("C-c e c" . 'comment-region)
              ("C-c e u" . 'uncomment-region)
              ("C-c e d" . eldoc)
              ("C-c M-p" . helm-projectile)
              ("C-c e r" . eglot-rename)
              ("C-c M-e h" . eglot-inlay-hints-mode)
              ("C-c e f" . eglot-format-buffer)
              ("C-c f d" . flymake-show-project-diagnostics)
              ("C-c f n" . flymake-goto-next-error)
              ("C-c f p" . flymake-goto-prev-error)
              ("C-c C-c" . compile-multi))
  :hook((python-ts-mode . (lambda ()
                            (eglot-ensure)
                            (py-autopep8-mode)
                            (pyvenv-mode)
                            (setq tab-always-indent 'complete)
                            (projectile-mode)
                            (eldoc-box-hover-mode)
                            (company-mode)
                            (yas-minor-mode)
                            (hs-minor-mode)
                            (flyspell-mode)
                            (imenu-list-minor-mode)
                            (prettify-symbols-mode)
                            (setq indent-tabs-mode nil)
                            (display-line-numbers-mode)))     

        ;; (eglot-managed-mode . (lambda()
        ;;                         (eglot-inlay-hints-mode -1)))
        ))

соотвествено должны быть установлены недостающие language-grammar

treesit-install-language-grammar

И должны быть установлены language-server, например python-lsp-server

Silerus ★★★★
()
Ответ на: комментарий от Silerus

В логах есть это:

Command "pyright-langserver --stdio" is present on the path.

Вот что записано в init.el по поводу pyright:

(use-package lsp-pyright
  :ensure t
  :hook (python-mode . (lambda ()
                          (require 'lsp-pyright)
                             (lsp))))  ; or lsp-deferred


Bakamashine
() автор топика
16 июня 2024 г.

По умолчанию Emacs, а точнее его пакеты, в том числе LSP и Eglot, ищут исполняемые файлы нужных приложений в переменной окружения PATH.

Таким образом, получается, что pyright установлен не в систему, а в подкаталог node_modules/ каталога проекта. Это значит, что с помощью переменной окружения PATH найти исполняемый файл pyright не получится.

У этой проблемы есть несколько решений.

  1. Расширить значение переменной PATH, добавив в конце .bashrc примерно такой код:

    export PATH="$PATH:/home/user/project/node_modules/pyright/"
    

    Разумеется, нужно будет применить изменения:

    source ~/.bashrc
    
  2. В каталоге проекта создать скрипт для активации нужных переменных окружения. Обычно этот файл именуют как-то вроде .envrc и пишут в него команды типа той, что указана выше. В случае с виртуальными окружениями Python обычно делают так:

    1. Создаём окружение:

      python3 -m venv .venv
      
    2. В .envrc добавляем строку:

      source .venv/bin/activate
      
    3. Активируем окружение:

      source .envrc
      
    4. Устанавливаем pyright через PIP:

      pip3 install pyright
      

    Теперь самое интересное: если запустить Emacs в активном виртуальном окружении, он подхватит переменные среды, в том числе пути к исполняемым файлам PyRight. В этом случае всё будет работать.

  3. Каждый раз активировать окружение и запускать оттуда Emacs может быстро надоесть. Поэтому упрощаем жизнь небольшим усложнением:

    1. Устанавливаем пакет buffer-env.

    2. Добавляем в init.el код активации:

      (use-package buffer-env
        :ensure t
        :pin "gnu"
        :defer
        :hook
        ((hack-local-variables
          comint-mode) . buffer-env-update))
      
    3. Создаём в каталоге проекта файл .dir-locals, а значения локальных переменных задаём примерно так:

      ((nil . ((buffer-env-script-name . ".venv/bin/activate")
               (indent-tabs-mode . nil)))
       (eglot-mode . ((eglot-workspace-configuration . (:pylsp
                                                        (:plugins
                                                         (:plugins
                                                          (:jedi_completion
                                                           (:include_params t :fuzzy t)
                                                           :pylint
                                                           (:enabled :json-false)))))))))
      

    При первом открытии файлов проекта Emacs спросит, можно ли доверять этому коду, переменным и их значениям. Нужно нажать [!], чтобы считать этот файл доверенным. С этой минуты PyRight будет работать как надо, а Emacs можно запускать как обычно, а не в активном виртуальном окружении.

dunmaksim
()