Doom Emacs의 Python 프로그래밍 환경

2022년 9월 6일 수정

이 글은 Doom EmacsPython 프로그래밍 환경을 위한 모듈의 소개와 설정 및 사용법 등을 정리한다.

참고로 macOS 기준이며 다른 OS의 경우 차이가 있을 수 있다.

Python 준비

당연하겠지만 Python이 미리 설치되어 있어야 한다. macOS의 경우 시스템에 기본 설치가 되어있긴 한데 문제는 2.7이라는 이제는 무덤에 들어간 버전이라 최신의 3.x 버전을 설치하는 편이 좋다. Doom Emacs에서는 기본적으로 python3 라는 실행 파일을 먼저 찾기 때문이기도 하다.

설치 자체는 pyenv로 설치하는 것을 추천한다. pyenv로 파이썬 버전 관리하기 글을 참고해서 설치해보자.

Homebrew 버전은 의존 패키지로만 활용하는 것이 좋을 것 같다. 일부 유틸리티형 패키지의 경로가 제대로 안 잡히는 등 상당히 까다로운 문제를 겪었다. 물록 직접 해결 할 수 있다면 어떤 방법을 쓰든 관계는 없다.

init.el

Doom Emacs의 가장 기본이 되는 모듈 설정이다. 개인적으로 문법 체크를 위한 syntax 모듈은 있는 편이 좋다고 생각된다.

아래는 개인적으로 사용하는 모듈과 플래그 설정 중 이 글과 관련된 부분만 뽑아놓은 것이다.

:checkers
syntax

:lang
(python
 +lsp
 +pyenv
 +poetry)

보다시피 LSP(Language Server Protocol)와 pyenv, Poetry 지원을 추가로 설정하고 있다.

LSP Server 설치 및 관련 설정

LSP 서버는 이 글을 처음 작성한 시점에서 아래 세 가지 중 하나를 사용할 수 있게 설정되어 있었다.

Python Language Server (pyls)

pip install 'python-language-server[all]'

개인적으로 자주 죽는 등 불안정한 모습을 자주 봐서 그다지 추천하고 싶지는 않다. 물론 지금은 바뀌었을 수도 있다.

Microsoft Python Language Server (mspyls)

설치는 Doom Emacs 내에서 진행한다. SPC : 혹은 M-x 를 눌러서 lsp-install-server 함수를 실행시키면 선택지가 뜬다. 여기서 mspyls 를 선택하면 알아서 설치가 된다.

설치 후 config.el 을 열어서 아래 코드를 추가해주자.

(after! lsp-python-ms
  (set-lsp-priority! 'mspyls 1))

개인적으로 종종 CPU를 100% 먹는 등의 문제를 겪었다.

Pyright

pyright는 역시 MS가 만든 language server지만 pylance와는 다르게 완벽하게 오픈소스라고 한다.

npm install -g pyright

설치 후 init.el 을 열어서 python쪽에 pyright feature를 추가해주자.

(python +pyright)

sync도 까먹지말자.

필요한 Python 패키지들

이제 pip 커맨드로 필요한 Python 패키지를 설치하자.

pip install flake8 isort nose pytest pyflakes mypy

이 목록은 위 init.el 설정에서 쓰겠다고 한 플래그와 관련이 있다. 더 많은 기능을 사용하려 한다면 아래 외부 링크에서 공식 매뉴얼을 참고하자. 물론 Python 패키지 특유의 요구(?)나 Doom Emacs의 설정이 바뀜에 따라 요구하는 패키지가 바뀌기도 하는데 메시지에 맞게 설치해 주면 왠만한 문제는 해결될 것 같다.

자 그래서 뭐가 되나

Doom Emacs가 구현하고 있는 공통적인 기능은 대체로 동작하는 편이다. 예를 들어 SPC c 로 시작하는 단축키에서 코드와 관련된 기능을 찾을 수 있고, SPC m 로 시작하는 단축키는 메이저모드의 기능과 연관되어 있다.

문법 체크

기본적으로 문법 관련된 모드가 동작하기 때문에 들여쓰기가 자동으로 되거나 자동 들여쓰기가 동작하고 문법 강조가 되는 등 당연히 될 것 같은 기능은 동작한다.

모든 .py 파일을 열 때마다 mspyls가 동작하며 오류 체크를 해준다. flake8이나 pyflake 오류체크에 비해서 약간 덜 빡빡하게 체크하는 느낌이다.

구현부 찾아가기

  • SPC c d 를 누르면 definition 찾기가 된다.
  • SPC c D 를 누르면 reference 찾기가 된다.

다만 위 두 기능은 Projectile 내에서만 이뤄지는 것 같다. 프로젝트에 소속되지 않은 단일 파일로는 아무래 해봐도 mspyls가 비명을 지르기만 할 뿐 잘 찾지 못 하는 느낌을 받았다.

REPL

  • SPC o r 을 누르면 팝업으로 REPL이 뜬다.
  • SPC o R 을 누르면 REPL 버퍼가 전면에 뜬다.
  • REPL이 뜨면 SPC c s 를 이용해 REPL로 코드를 보낼 수 있다.
  • 혹은 SPC c e 를 통해 현재 버퍼의 코드를 그대로 REPL로 보내서 실행시킬 수도 있다.

약간은 무식(?)하게 동작하는 편이라 약간 괴롭긴 한데 그래도 어느 정도는 돌아가는 것 같다.

만약 REPL이 안 돌아간다면 ipython 을 설치해보자.

pip install ipython

기타

뭔가 구현이 이상한 건지 mspyls가 종종 비명을 지른다. 다행히도 프로세스 관리는 Doom Emacs에서 잘 구현되어 있어서 열려있는 파이썬 파일 버퍼를 다 닫으면 mspyls도 알아서 다 종료가 된다. 놀라지 말자.

이게 싫거나 LSP 자체가 싫다면 mspyls 대신 pyflake를 통한 문법 체크를 사용해도 제법 쓸 만 하다. 그저 mspyls 자체를 설치하지 않으면 pyflake(flake8) + flycheck로 문법 체크가 동작한다.