이 글은 2022년 4월 9일 트위터에 쓴 글을 백업한 것입니다.

으아 11시라니 벌써
Vㅏ
ㅁ 이 되었군요…

오늘은 무슨 이야기를 할까요.. 어제의 저는 session 이야기를 생각하고 있었군요.

음 뭐부터 얘기하지.. 만약 요즘의 제 트윗을 vim에 관심은 있지만 지속적인 사용에 번번이 어려움을 겪는 분들이 읽고 계신다면 오늘의 주제인 세션이 필요하셨을지도 모르겠습니다.

세션은 화면 구성을 보존해두고 다시 재생하는 기능입니다. vim을 껐다 켜도 화면이 유지되는 거죠.

vs code나 intellij 에서 뭔가 화면을 분할해 놓고 작업을 하다가 IDE를 껐다고 합시다. 나중에 다시 켜봐도 이전에 작업하던 파일들이랑 분할된 화면 모양이 다시 복원되어 있죠. 같은 기능입니다.

만약 vim의 session 기능을 모른다면 vim을 실행할 때마다 매번 편집할 파일을 찾아 열고, 내가 좋아하는 위치로 윈도우를 분할해서 옮겨놓고 하는 노가다를 일일이 해야 합니다. 그래서 그냥 화면 분할 같은 건 정말 필요할 때만 쓰고 윈도우 하나만 쓰는 경우도 있죠.

그런데 vim의 session 기능은 생각보다 사용하기 좀 짜증나고 번잡스러운 면이 있습니다. 저장/복원이 명령 하나로 해결되는 것도 아니고 이런저런 옵션이 있어서 일일이 생각하기 좀 그렇죠. IDE처럼 생각할 필요 없이 그냥 자동으로 세션이 저장되고, 다시 실행할 때 알아서 복원되면 좋으련만..

vim help

그래서 저는 session이라는 기능이 있다는 것만 알아두고, session을 관리해주는 플러그인을 쓰는 쪽을 선호합니다. 제가 쓰는 세션 관리 플러그인은 vim-startify 입니다.

https://github.com/mhinz/vim-startify

세션을 관리해주는 vim 플러그인은 꽤 다양한 편이라 선택을 할 때 꽤 고민하게 될 수 있는데요, vim-startify는 꽤 상쾌한 시작 화면을 제공해서, vim을 시작했을 때 (IDE처럼) 어떤 프로젝트를 작업할 것인지를 선택할 수 있게 해줍니다. 그리고 vim을 종료할 때 자동으로 화면 구성을 session으로 저장해 주죠. 사진은 제 vim을 실행한 직후의 화면입니다. cowsay가 맞아주죠.

startify 화면

화면을 뜯어봅시다. 가운데를 보면 Sessions라고 있죠. IDE로 치면 이게 프로젝트들입니다. 화면구성 뿐만 아니라 pwd도 저장되던가 해서 커서를 놓고 엔터를 치거나 숫자를 누르면 해당 프로젝트의 화면 구성이 복원되며 코딩을 바로 시작할 수 있습니다. 그 밑에는 최근에 편집한 파일들이 있고요.

staritfy 화면 설명

물론 이 화면은 자신의 취향에 맞게 커스터마이즈하는 것이 가능합니다. 뭘 추가하던가 뭘 뺄 수도 있고, 순서를 바꾸는 것도 가능하고요. 한편 제일 위에 있는 속담/격언을 보여주는 cow는 fortune 명령에 파이프를 연결해 cowsay로 출력한 것입니다.

컴퓨터에 fortune이 설치되어 있다면 터미널에서 fortune을 입력해보세요. 격언이나 속담 같은게 하나씩 나올 겁니다. 꽤 귀여운 명령인데, 이 명령은 데이터베이스 파일을 자신이 직접 편집할 수 있다는 게 매력적입니다. 저는 책을 읽다가 본 좋은 문구를 넣어두곤합니다.

[[/cmd/fortune]]

그런데 이 fortune 명령을 개발한 사람이 또 대단한 레전드 프로그래머입니다. 바로… [[/article/vim-night/20220408-ctags]]{어제도 이야기가 나왔던 ctags}의 개발자 켄 아놀드 님입니다. 이 분은 로그 라이크 장르의 시초가 된 게임인 로그를 개발한 분이기도 하죠.

아무튼 세션으로 돌아가죠. 전 vim-staritfy를 쓰기 시작하고 나서는 vim에서 session을 직접 조작하는 방법을 거의 잊게 됐습니다. 적어도 수동으로 세션을 조작할 일은 아예 없었죠. 그래서 너무 행복하고 너무 편했습니다. 더 좋은 세션 플러그인들도 있었겠지만 굳이 조사할 필요도 못 느꼈어요.

바로 2달 전까지 말이죠… 몇 년이나 세션을 직접 다루질 않고 살았기 때문에 2022년에 세션에 문제가 생길 거라곤 전혀! 한 순간도! 생각해보질 않았던 겁니다. 이거 이야기하자면 좀 한참 걸릴 수도 있는데 음….

어떤 플러그인을 쓰다가, 그 플러그인이 숨겨진 버퍼를 다루는 방식이 세션을 저장하고 복원할 때 특정 순간에 예외상황이 발생하곤 하는 문제를 발견한 겁니다. 그래서 그 플러그인의 github에 가서 알아보니 누가 약 반년 전에 같은 이슈로 고생한 적이 있는데 아직 해결이 안 됐더라고요.

그런데 원인이 뚜렷하지 않은데다가, 해당 플러그인이 vimscript로 만들어진 것이 아니어서 굉장히 난감했습니다. (그렇습니다. 다른 언어로도 vim 플러그인을 만들 수 있어요.) 게다가 그 언어가 흔한 언어도 아닌 Lisp의 방언이어서 너무나 난감했습니다.

python이나 perl이라면 어떻게든 해볼텐데 그렇다고 이거 하나 고치자고 그 언어를 공부하기도 애매한 상황이어서… 저는 꼼수 하나를 떠올리게 됩니다. 제가 한두달 쯤 전에 타임라인에서 청테이프로 해결하니 뭐니 하며 투덜거린 트윗을 보신 분들이 있을지도 모르겠습니다. 그 청테이프로 해결한 문제가 바로 이 건을 말합니다.

제가 그 문제를 어떻게… 해결했냐면(해결이라고 하기 부끄럽다).. vim session 파일을 디버깅해서 문제 패턴을 파악한 다음에, vim을 띄울 때마다 실행되는 훅에 vim session 파일에서 문제 패턴을 perl로 공백 문자로 치환해버리는 방법을 썼습니다. 주석 빼고 4줄 밖에 안 되는 셸스크립트였죠.

그래서 vim이 실행될 때마다 스크립트도 실행되면서 문제의 원인을 날려버리는 방법.. 잘 작동하긴 했지만 썩 아름다운 방법은 아니었죠. 그래도 이 방법을 해당 이슈에 남겨서 다른 사람들도 참고할 수 있게는 해 놓았긴 합니다. 그 플러그인을 계속 썼다면 더 나은 방법을 생각했을지도 모르겠어요.

하지만 이제 그 플러그인은 안 쓰고, 다른 걸 쓰게 되어서 더 생각하지 않게 됐습니다. 세상엔 풀어야 할 문제가 널려 있고, 어떤 문제를 풀지 않을지 결정하는 것도 중요하다고 생각하거든요. 게다가 세션은 그냥 자동생성되는 vimscript여서 인식의 뒤편에서 계속 적당히 작동해주길 바랄 뿐입니다

이야기하다 보니 벌써 12시가 거의 다 됐네요. 오늘은 여기까지 하죠. 읽어주셔서 감사합니다.