All Articles

Python을 위한 ctags 세팅

Vim과 ctags를 같이 사용하면 왠만한 IDE 부럽지 않은 생산성을 낼수 있다. 나 같은 경우에는 Scala 코드를 짤때도 오직 Vim만 사용하는데, ctags를 사용해서 code navigation를 하고 있다. 파이썬 또한 ctags를 사용해서 쉽게 코드 navigation을 할수 있다. 예를 들어, C-] 커맨드를 사용하여 클라스 나 함수의 정의 부분으로 점프 할수 있다. 같은 이름의 함수 나 클라스가 여러게가 있다면 g]커맨드를 사용하여 리스트를 생성시키고 그 중 하나를 골라서 점프 할수도 있다.

ctags를 사용하여 멋지고 생상선 높은 파이썬 코딩을 하기 위해선 첫번째로 ctags를 설치한다 (ctags가 아직 설치 되어 있지 않다면). Mac의 경우 이미 설치되어 나오는 ctags는 vim과 사용할수 없는 ctags이고 exuberant-ctags를 인스톨 해야 한다. Homebrew를 통해서 인스톨 하면 된다. 리눅스의 경우에는 apt-get이나 yum 같은 해당 리눅스의 package manager를 사용해서 인스톨 하면 된다. 윈도우는… 개발자 이고 게다가 vim을 사용하는데 OS를 윈도우를 쓰신다면… 지금 ctags가 문제가 아니다.. 하다못해 우번투 라도 사용하시길 권한다.

일반 적으로 ctags는 ctags -R . 커맨드를 사용하여 현재 디렉토리의 코드를 index하여 tags 파일을 생성해준다. 하지만 위에 기본 커맨드를 사용하면 몇가지 불편한 점이 생기게 되는데, 그 중 하나는 바로 import 와 variable 부분들도 다 인덱싱이 된다는 점이다. 대부분 클라스나 함수의 정의를 보고 싶어하지 variable이나 import 하는 부분을 보고 싶어 하지 않는다. 아래 커맨드를 사용하면 이 부분이 해결된다.

ctags -R --fields=+l --languages=python --python-kinds=-iv -f /.tags ./

위에 커맨드는 현재 디렉토리와 하위 디렉토리에 있는 모든 파이썬 코드를 인덱스 하는데 import와 변수들은 인덱스에서 제외한다 (-iv 옵션). 하지만 위의 커맨드는 pip을 사용해서 인스톨한 모듈이나 python의 standard library module들은 인덱스 하지 않는다. ctags를 정말 파워풀 하게 사용해서 인스톨된 모듈들이나 파이썬 라이브러리 코드들의 코드도 vim에서 직접 보고 싶으면 (IntelliJ에서 라이브러리들의 소스코드를 볼수 있듯이) 모듈들이 설치되어 있는 path들의 리스트를 찾아서 ctags에 지정해주면 된다.

그러나 파이썬에서 모듈들이 설치되어 있는 path들을 찾는게 생각보다 쉽지는 않다. 왜냐하면 파이썬 프로젝트를 개발할때는 가상환경 (virtual env)를 사용하는게 일반적이기 때문에 가상환경을 사용할때와 아닐때 등등 몇가지 변수에 따라 모듈들의 path가 달라진다. 다행이도 파이썬 코드를 커맨드 라인에서 직접 실행시킬수 있기 때문에 sys.path를 직접 inline에서 출력시켜서 ctags 커맨드와 합하면 된다.

ctags -R --fields=+l --languages=python --python-kinds=-iv -f ./tags . $(python -c "import os, sys; print(' '.join('{}'.format(d) for d in sys.path if os.path.isdir(d)))")

위에 커맨드를 사용하면 프로젝트 코드 뿐만이 아니라 인스톨된 모듈들 과 파이썬 standard 라이브러리 코드들도 다 인덱스 되어서 손쉽게 navigate할수 있다. 나 같은 경우에는 위에 커맨드를 alias로 지정하여서 사용한다.

alias python_ctags="ctags -R --fields=+l --languages=python --python-kinds=-iv -f ./tags . $(python -c "import os, sys; print(' '.join('{}'.format(d) for d in sys.path if os.path.isdir(d)))")"