Warning: this is an htmlized version!
The original is here, and
the conversion rules are here.
;; This file:
;;   http://anggtwu.net/elisp/2025-serghei-1.el.html
;;   http://anggtwu.net/elisp/2025-serghei-1.el
;;          (find-angg "elisp/2025-serghei-1.el")
;; Author: Eduardo Ochs <eduardoochs@gmail.com>
;;
;; (defun e () (interactive) (find-angg "elisp/2025-serghei-1.el"))
;;
;; «.sergp»	(to "sergp")

;; «sergp»  (to ".sergp")
;; https://blog.serghei.pl/posts/emacs-python-ide/index.html
;; (find-fline "$S/https/blog.serghei.pl/posts/emacs-python-ide/")
;; (find-htmlpdf-links "sergp" "https://blog.serghei.pl/posts/emacs-python-ide/index.html")
(code-pdf-page  "sergp" "$S/https/blog.serghei.pl/posts/emacs-python-ide/index.html.pdf")
(code-pdf-text8 "sergp" "$S/https/blog.serghei.pl/posts/emacs-python-ide/index.html.pdf")
;; (find-sergppage)
;; (find-sergptext)
;; (find-sergppage 6 "lsp-pyright")
;; (find-sergptext 6 "lsp-pyright")
;; (find-sergppage 17 "envrc-global-mode")
;; (find-sergptext 17 "envrc-global-mode")
;; (find-sergppage 18 "flymake and flycheck")
;; (find-sergptext 18 "flymake and flycheck")
;; (find-sergppage 20 "yasnippet")
;; (find-sergptext 20 "yasnippet")
;; (find-sergppage 22 "~/.emacs.d/snippets/python-mode/")
;; (find-sergptext 22 "~/.emacs.d/snippets/python-mode/")
;; (find-sergppage 44 "complete setup")
;; (find-sergptext 44 "complete setup")
;; (find-sergppage 49 "https://emacs-lsp.github.io/lsp-pyright/")
;; (find-sergptext 49 "https://emacs-lsp.github.io/lsp-pyright/")

;; https://blog.serghei.pl/posts/emacs-python-ide/index.html#bringing-it-all-together

;; (package-install 'yasnippet)
;; (package-install 'flymake)
;; (package-install 'lsp-ui)
;; (package-install 'lsp-pyright)
;; (package-install 'dap-mode)
;; (package-install 'envrc)
;; apti direnv

(require 'yasnippet)
(require 'flymake)
(require 'lsp-mode)
(require 'lsp-ui)
(require 'lsp-pyright)
(require 'dap-mode)
(require 'envrc)

(with-eval-after-load 'yasnippet
  (yas-reload-all))

;; Only if you use `flymake-mode'.
(with-eval-after-load 'flymake
  (define-key flymake-mode-map (kbd "M-n") 'flymake-goto-next-error)
  (define-key flymake-mode-map (kbd "M-p") 'flymake-goto-prev-error))

;; Set LSP keymap prefix.
(setopt lsp-keymap-prefix "C-c l")

;; Shut down LSP server after close all buffers associated with the server.
(setopt lsp-keep-workspace-alive nil)

;; Configure LSP UI enhancements.
(setopt lsp-headerline-breadcrumb-segments
        '(path-up-to-project
          file
          symbols))

(with-eval-after-load 'lsp-ui
  ;; Remap `xref-find-definitions' (bound to M-. by default).
  (define-key lsp-ui-mode-map
              [remap xref-find-definitions]
              #'lsp-ui-peek-find-definitions)
  ;;
  ;; Remap `xref-find-references' (bound to M-? by default).
  (define-key lsp-ui-mode-map
              [remap xref-find-references]
              #'lsp-ui-peek-find-references))

;; Configure LSP mode for enhanced experience.
(with-eval-after-load 'lsp-mode
  ;; Remap `lsp-treemacs-errors-list' (bound to C-c l g e).
  (define-key lsp-mode-map
              [remap lsp-treemacs-errors-list]
              #'consult-lsp-diagnostics)
  ;;
  ;; Remap `xref-find-apropos' (bound to C-c l g a).
  (define-key lsp-mode-map
              [remap xref-find-apropos]
              #'consult-lsp-symbols)
  ;;
  ;; Enable `which-key-mode' integration for LSP.
  (add-hook 'lsp-mode-hook #'lsp-enable-which-key-integration))

;; Auto configure dap minor mode.
(setopt dap-auto-configure-mode t)

(defmacro company-backend-for-hook (hook backends)
  `(add-hook ,hook (lambda ()
                     (set (make-local-variable 'company-backends)
                          ,backends))))

(defun setup-python-environment ()
  "Setup a Python development environment in the current buffer."
  ;; Update the current buffer's environment.
  (envrc--update)
  ;;
  ;; Enable YASnippet mode.
  (yas-minor-mode 1)
  ;;
  ;; Setup active backends for `python-mode'.
  (company-backend-for-hook 'lsp-completion-mode-hook
                            '((company-capf :with company-yasnippet)
                              company-dabbrev-code))
  ;;
  ;; Prevent `lsp-pyright' start in multi-root mode.
  ;; This must be set before the package is loaded.
  (setq-local lsp-pyright-multi-root nil)
  ;;
  ;; Enable LSP support in Python buffers.
  (require 'lsp-pyright)
  (lsp-deferred)
  ;;
  ;; Enable DAP support in Python buffers.
  (require 'dap-python)
  (setq-local dap-python-debugger 'debugpy)
  ;;
  (dap-mode 1))

;; Configure hooks after `python-mode' is loaded.
(add-hook 'python-mode-hook #'setup-python-environment)

;; Setup buffer-local direnv integration for Emacs.
(when (executable-find "direnv")
  ;; `envrc-global-mode' should be enabled after other global minor modes,
  ;; since each prepends itself to various hooks.
  (add-hook 'after-init-hook #'envrc-global-mode))



;; Local Variables:
;; coding:  utf-8-unix
;; End: