vim에서 Helix로 갈아타며 남긴 메모
안녕하세요! 올여름 초에 친구와 얘기하다가 제가 fish를 쓰는 걸 얼마나 좋아하는지, 따로 설정할 필요가 없어서 얼마나 편한지에 대해 이야기했어요. 친구는 Helix 텍스트 에디터에 대해서도 똑같이 느낀다고 하더라고요. 그래서 한번 써보기로 했어요.
이제 3개월 정도 써봤는데, 느낀 점을 몇 가지 정리해 봤어요.
왜 Helix인가: 언어 서버
Helix를 써보게 된 가장 큰 이유는 제대로 동작하는 언어 서버 환경을 갖추고 싶었기 때문이에요. “정의로 이동” 같은 기능을 쓰고 싶었는데, Vim이나 Neovim에서 마음에 드는 설정을 만드는 게 너무 번거롭게 느껴졌거든요.
20년 동안 Vim/Neovim을 쓰면서 “처음부터 직접 설정을 만드는” 방식도, “다른 사람이 만들어 둔 설정을 가져다 쓰는” 방식도 둘 다 해봤어요. Vim 자체는 정말 좋아하지만, 이번에는 설정에 손 하나 대지 않고도 그냥 잘 동작하는 걸 써보고 싶었어요.
Helix는 언어 서버 지원이 기본으로 내장되어 있어서, 어떤 언어에서든 “심볼 이름 바꾸기” 같은 기능을 바로 쓸 수 있다는 점이 정말 편해요.
검색 기능이 정말 좋아요
Helix에서 제가 가장 좋아하는 것 중 하나가 검색이에요! 저장소 전체에서 문자열을 검색하면, 일치하는 파일들을 스크롤하면서 각 결과가 어떤 맥락에 있는지 전체를 볼 수 있어요. 이렇게요:

비교해 보면, 제가 Vim에서 쓰던 ripgrep 플러그인은 이렇게 생겼어요:

이건 해당 줄 주변에 뭐가 있는지 전혀 맥락을 볼 수 없죠.
빠른 도움말이 편해요
Helix에서 마음에 드는 또 하나는 g를 누르면 어디로 갈 수 있는지 알려주는 작은 도움말 팝업이 뜬다는 거예요. “정의로 이동”이나 “참조로 이동” 같은 기능은 자주 쓰지 않아서 단축키를 자꾸 잊어버리는데, 이 팝업이 정말 도움이 돼요.

vim에서 Helix로 옮길 때 대응되는 기능들
- Helix에는
ma,'a같은 마크 기능이 없어요. 대신Ctrl+O와Ctrl+I로 마지막 커서 위치로 뒤로 가거나 앞으로 가고 있어요. - Helix에도 매크로가 있는 걸로 알고 있지만, 예전에 매크로를 썼던 상황에서는 전부 다중 커서로 대체하고 있어요. 매번 매크로를 작성하는 것보다 다중 커서가 훨씬 좋더라고요. 문서에서 무언가를 일괄로 바꾸고 싶을 때는
%를 눌러 전체를 선택한 다음,s를 눌러 정규식으로 바꾸고 싶은 대상을 선택하고 바로 한 번에 편집하면 돼요. - Helix에는 Neovim 스타일의 탭이 없어요. 대신 괜찮은 버퍼 전환 기능(
<space>b)이 있어서 원하는 버퍼로 쉽게 옮겨갈 수 있어요. Neovim 스타일 탭을 구현하려는 풀 리퀘스트도 있어요. 또bufferline="multiple"이라는 설정을 쓰면gp,gn으로 이전/다음 “탭”으로 이동하고:bc로 “탭”을 닫는 식으로 탭처럼 쓸 수도 있어요.
Helix에서 조금 불편한 점들
지금까지 Helix를 쓰면서 불편했던 점들을 모아봤어요.
- Helix의
:reflow가 Vim에서gq로 텍스트를 다시 정렬하는 것보다 훨씬 별로예요. 목록에서는 제대로 동작하지 않아요. (깃허브 이슈) - Markdown 목록을 작성할 때 목록 항목 끝에서 엔터를 눌러도 목록이 이어지지 않아요. 글머리 기호 목록에 대한 임시 해결 방법은 있지만, 번호 매기기 목록에 대한 방법은 못 찾았어요.
- 아직 영구 실행 취소 기능이 없어요. Vim에서는 undofile을 써서 종료한 뒤에도 변경 사항을 되돌릴 수 있었는데, Helix에는 아직 그 기능이 없어요. (깃허브 PR)
- Helix는 디스크에서 파일이 변경되어도 자동으로 다시 불러오지 않아요.
:reload-all(:ra<tab>)을 실행해서 직접 다시 불러와야 해요. 크게 불편하진 않아요. - 가끔 패닉(panic)이 발생해요. 일주일에 한 번 정도인 것 같아요. 아마 이 이슈 때문인 것 같아요.
크래시는 대략 이런 식으로 보여요:
thread 'main' panicked at helix-core/src/transaction.rs:499:9:
Positions [(2959, AfterSticky), (2959, AfterSticky)] are out of range for changeset len 2945!
note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace
“Markdown 목록”이나 reflow 문제는 제가 Markdown 목록을 편집할 일이 많아서 자주 겪는데, 그래도 계속 Helix를 쓰고 있으니 그렇게까지 화가 나는 건 아닌가 봐요.
생각보다 갈아타기가 쉬웠어요
20년 동안 몸에 밴 Vim 단축키를 다시 익히려면 정말 힘들지 않을까 걱정했어요.
막상 해보니 생각보다 훨씬 쉬웠어요. 휴가 중에 가볍게 진행하던 사이드 코딩 프로젝트에 Helix를 쓰기 시작했는데, 1~2주 정도 지나니 더 이상 낯설게 느껴지지 않더라고요. Vim과 Helix를 왔다 갔다 하는 건 좀 헷갈릴 수도 있을 것 같긴 한데, 최근에는 Vim을 쓸 일이 없어서 그게 문제가 될지는 아직 모르겠어요.
처음 Helix를 시도했을 때는 Vim과 비슷한 키 바인딩을 억지로 맞춰서 써보려 했는데, 그건 잘 안 맞았어요. 그냥 “Helix 방식”을 그대로 익히는 게 훨씬 쉬웠어요.
아직도 헷갈리는 부분은 남아 있어요. 예를 들어 Vim의 w와 Helix의 w는 “단어”를 바라보는 기준이 달라요. Helix 쪽은 단어 뒤의 공백까지 포함하고, Vim 쪽은 포함하지 않거든요.
터미널 기반 텍스트 에디터를 쓰며
오랫동안 주로 Vim/Neovim의 GUI 버전을 써왔기 때문에, 실제로 터미널 안에서 에디터를 쓰는 건 조금 적응이 필요했어요.
결국 이렇게 정했어요:
- 프로젝트마다 별도의 터미널 창을 쓰고, 그 창 안의 탭들은 (대체로) 모두 같은 작업 디렉터리를 공유해요.
- Helix 탭은 터미널 창의 첫 번째 탭으로 두어요.
꽤 잘 동작하고 있고, 이전 작업 방식보다 오히려 더 마음에 들지도 모르겠어요.
제 설정
Neovim 설정은 수백 줄이었는데, Helix 설정은 정말 간단해서 마음에 들어요. 대부분 단축키 4개뿐이에요.
theme = "solarized_light"
[editor]
# Sync clipboard with system clipboard
default-yank-register = "+"
[keys.normal]
# I didn't like that Ctrl+C was the default "toggle comments" shortcut
"#" = "toggle_comments"
# I didn't feel like learning a different way
# to go to the beginning/end of a line so
# I remapped ^ and $
"^" = "goto_first_nonwhitespace"
"$" = "goto_line_end"
[keys.select]
"^" = "goto_first_nonwhitespace"
"$" = "goto_line_end"
[keys.normal.space]
# I write a lot of text so I need to constantly reflow,
# and missed vim's `gq` shortcut
l = ":reflow"
자동 포맷 끄기 같은 언어별 설정은 별도의 languages.toml 파일에 넣어뒀어요. 예를 들어 Python 설정은 이렇게 해뒀어요:
[[language]]
name = "python"
formatter = { command = "black", args = ["--stdin-filename", "%{buffer_name}", "-"] }
language-servers = ["pyright"]
auto-format = false
앞으로 어떻게 될지 지켜보려고요
3개월은 그리 긴 시간은 아니라서, 언젠가 다시 Vim으로 돌아갈 수도 있어요. 예를 들어 얼마 전에 Nix로 갈아탄 이야기를 쓴 적이 있는데, 8개월 정도 지나고 다시 Homebrew로 돌아왔거든요. 물론 지금도 작은 서버 하나는 NixOS로 관리하고 있고, 그건 여전히 만족하고 있어요.
글을 무작위로 읽기