vim에서 Helix로 갈아타며 남긴 메모
원문은 Julia Evans님이 에 게재했습니다. 이 블로그 구독하기
안녕하세요! 올여름 초에 친구와 이야기하다가 제가 fish를 얼마나 좋아하는지, 설정할 필요가 없어서 얼마나 좋은지에 대해 얘기했어요. 친구는 helix 텍스트 에디터에 대해 똑같이 느낀다고 하더라고요. 그래서 한번 써보기로 했습니다.
이제 3개월 정도 써봤고, 느낀 점을 몇 가지 적어보려고 합니다.
Helix를 선택한 이유: 언어 서버
Helix를 써보게 된 계기는 제대로 동작하는 언어 서버 설정(예를 들면 “정의로 이동” 같은 기능)을 갖추고 싶었기 때문인 것 같아요. Vim이나 Neovim에서 마음에 드는 설정을 만드는 건 너무 번거롭게 느껴졌거든요.
Vim/Neovim을 20년 동안 쓰면서 “처음부터 내 설정을 직접 만들기”도 해보고 “남이 만들어 둔 설정을 가져다 쓰기”도 해봤는데, Vim을 정말 좋아하면서도 설정을 전혀 손댈 필요 없이 그냥 다 알아서 동작한다는 점이 끌렸어요.
Helix는 언어 서버 지원이 기본으로 내장되어 있어서, 어떤 언어에서든 “심볼 이름 바꾸기” 같은 걸 할 수 있다는 게 참 편하더라고요.
검색이 훌륭하다
Helix에서 가장 좋아하는 기능 중 하나가 검색이에요! 저장소 전체 파일에서 문자열을 검색하면, 일치하는 파일들을 스크롤하면서 해당 부분의 전체 맥락을 함께 볼 수 있어요. 이렇게요:

비교를 위해 제가 기존에 쓰던 vim ripgrep 플러그인은 이렇게 생겼어요:

해당 줄 주변에 어떤 내용이 있는지 맥락을 전혀 볼 수 없죠.
퀵 레퍼런스가 편리하다
Helix의 좋은 점 중 하나는 g를 누르면 어디로 이동할 수 있는지 알려주는 작은 도움말 팝업이 뜬다는 거예요. “정의로 이동”이나 “참조로 이동” 기능을 자주 쓰지 않아서 단축키를 자주 잊어버리는데, 이게 정말 도움이 됩니다.

vim -> Helix 대응 정리
- Helix에는
ma,'a같은 마크 기능이 없어요. 대신Ctrl+O와Ctrl+I로 마지막 커서 위치로 뒤로(또는 앞으로) 이동하고 있어요. - Helix에도 매크로는 있는 걸로 아는데, 예전에 매크로를 썼을 법한 상황에서는 전부 멀티 커서를 쓰고 있어요. 매번 매크로를 작성하는 것보다 멀티 커서가 훨씬 좋더라고요. 문서에서 뭔가를 일괄로 바꾸고 싶으면
%를 눌러 전체를 선택한 뒤s로 (정규식으로) 바꾸고 싶은 부분을 선택하고 한 번에 편집하면 됩니다. - Helix에는 Neovim 스타일의 탭이 없어요. 대신 쓸 만한 버퍼 전환 기능(
<space>b)이 있어서 원하는 버퍼로 이동할 수 있어요. Neovim 스타일 탭을 구현하려는 pull request도 있어요. 또bufferline="multiple"이라는 설정이 있는데,gp,gn으로 이전/다음 “탭”으로 이동하고:bc로 “탭”을 닫는 식으로 탭처럼 쓸 수 있어요.
Helix의 아쉬운 점
지금까지 Helix를 쓰면서 불편했던 점을 모두 적어보면 이렇습니다.
- Helix의
:reflow는 vim의gq로 텍스트를 정리하는 방식보다 훨씬 마음에 덜 들어요. 리스트에서는 제대로 동작하지 않거든요. (github issue) - Markdown 리스트를 작성할 때 리스트 항목 끝에서 “엔터”를 눌러도 리스트가 이어지지 않아요. 글머리 기호 리스트에 대한 부분적인 해결 방법은 있는데, 번호 매기기 리스트에 대한 방법은 모르겠어요.
- 아직 영구 실행 취소 기능이 없어요. vim에서는 undofile을 써서 종료한 뒤에도 변경 사항을 되돌릴 수 있었는데, Helix에는 아직 그 기능이 없어요. (github PR)
- Helix는 디스크에서 파일이 바뀌어도 자동으로 다시 불러오지 않아서,
:reload-all(:ra<tab>)을 직접 실행해 수동으로 다시 불러와야 해요. 크게 불편하진 않아요. - 가끔 패닉이 발생해요. 일주일에 한 번 정도인 것 같아요. 아마 이 이슈 때문인 것 같습니다.
크래시는 대략 이런 식으로 보여요:
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 리스트를 편집할 일이 많아서 “Markdown 리스트”나 리플로우 문제가 자주 생기는데, 그래도 계속 Helix를 쓰고 있으니 그렇게까지 화가 나진 않는 모양이에요.
생각보다 쉽게 갈아탔다
20년간 몸에 밴 Vim 습관을 다시 익혀야 하니 정말 힘들까 봐 걱정했어요.
막상 해보니 생각보다 쉬웠어요. 휴가 중에 부담 없는 사이드 코딩 프로젝트로 Helix를 쓰기 시작했는데, 일주일이나 이주 정도 지나니 더 이상 헷갈리지 않더라고요. 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로 관리하고 있고, 그건 아직 만족하고 있어요).
글을 무작위로 읽기
댓글
로그인하고 댓글 남기기