
Emacs의 Eglot에서 Python 언어 서버 python-lsp-server(pylsp)를 사용할 때 저장소별 .dir-locals.el 파일로 플러그인을 지정하면, 프로젝트마다 다른 도구와 편집기 설정을 적용할 수 있다. Ruff를 쓰는 구성에서는 중복 진단과 버퍼 갱신 지연을 줄이도록 기존 플러그인을 끄고, Pylint는 함께 켜 둔다.
저장소별 설정과 Ruff 구성
eglot-workspace-configuration을 전역으로 설정하면 여는 모든 Python 프로젝트가 같은 도구와 서식 규칙을 사용한다. 대신 저장소 루트에 .dir-locals.el을 두면 해당 디렉터리 트리 안의 파일을 방문하는 버퍼에만 설정이 적용된다. fill-column, 들여쓰기, LSP 플러그인 설정을 프로젝트의 pyproject.toml에 맞출 수 있다.
아래 구성은 Python 환경에 python-lsp-server와 python-lsp-ruff가 설치되어 있다는 전제다. 기존 플러그인을 명시적으로 끌 때 nil이 아니라 :json-false를 쓴다. Eglot의 JSON-RPC 직렬화기가 언어 서버에 false를 전달하도록 하기 위해서다. 설정 대상은 python-base-mode이므로 일반 python-mode와 python-ts-mode 모두에 적용된다.
((nil . ((sentence-end-double-space . nil) (require-final-newline . t))) (python-base-mode . ((indent-tabs-mode . nil) (tab-width . 4) (python-indent-offset . 4) (fill-column . 88) (eglot-workspace-configuration . (:pylsp (:plugins (:ruff ( :enabled t :formatEnabled t) :pylint (:enabled t) :flake8 (:enabled :json-false) :mccabe (:enabled :json-false) :pyflakes (:enabled :json-false) :pycodestyle (:enabled :json-false) :pydocstyle (:enabled :json-false) :isort (:enabled :json-false) :autopep8 (:enabled :json-false) :yapf (:enabled :json-false) :jedi_completion ( :enabled t :include_class_objects t :include_function_objects t :include_params t))))))))
Ruff와 Pylint의 역할
자료는 Ruff가 Rust로 작성된 단일 실행 파일이며, 전통적인 Python 린터보다 빠르다고 설명한다. Eglot 버퍼에서 저장 시 포맷팅과 실시간 문법 검사가 거의 즉시 이뤄져 언어 서버를 막거나 편집기를 지연시키지 않는다는 주장이다.
python-lsp-ruff를 통해 Ruff를 pylsp에 연결하면 Flake8·Pyflakes·pycodestyle의 문법 및 스타일 검사, Black·autopep8·YAPF의 포맷팅, isort의 임포트 정렬, McCabe의 순환 복잡도 분석, pydocstyle의 독스트링 검사, pyupgrade의 구식 문법 업데이트를 대체할 수 있다고 설명한다. 설정을 pyproject.toml 한 곳에 모아 .flake8, setup.cfg, .isort.cfg 등에 나눠 관리할 필요도 줄인다.
다만 Ruff가 Pylint의 모든 검사를 구현한 것은 아니므로, 자료는 클래스 계층의 오류와 잘못된 속성 접근, 구조적 설계 문제를 잡기 위해 Pylint를 함께 켜 두도록 안내한다.
Ruff를 쓰지 않는 프로젝트
Ruff로 이전하지 않은 기존 코드베이스에서는 아래처럼 전통적인 pylsp 플러그인을 켤 수 있다. 이 구성은 Ruff도 활성화하므로, Ruff를 사용하지 않으려면 :ruff 플러그인을 비활성화해야 한다. YAPF는 autopep8과 포맷팅이 충돌하지 않도록 꺼 둔다.
((nil . ((sentence-end-double-space . nil) (require-final-newline . t))) (python-base-mode . ((indent-tabs-mode . nil) (tab-width . 4) (python-indent-offset . 4) (fill-column . 88) (eglot-workspace-configuration . (:pylsp (:plugins (:ruff ( :enabled t :formatEnabled t) :pylint (:enabled t) :flake8 (:enabled t) :mccabe (:enabled t) :pyflakes (:enabled t) :pycodestyle (:enabled t) :pydocstyle (:enabled t) :isort (:enabled t) :autopep8 (:enabled t) :yapf (:enabled :json-false) :jedi_completion ( :enabled t))))))))
댓글 (0)
로그인하면 이 기사에 내 생각을 남길 수 있어요