모드 없는 Vim 기술
(github.com/SebastianMuskalla)- ModelessVim은
vim설정 파일 모음으로, 터미널에서vim의 기능을 유지하면서 GUI 편집기식 키 바인딩으로 저장·선택·복사·붙여넣기를 할 수 있게 함 - 대상 사용자는
vim을 선호하는 숙련자가 아니라, 평소 VSCode 같은 GUI 편집기를 쓰지만 가끔 터미널 편집기가 필요한 사람임 - 기본 구성은
Ctrl+S저장,Shift+방향키선택,Ctrl+C/V복사·붙여넣기,Ctrl+F검색,F3/F4검색 이동 같은 표준 단축키를 제공함 - 상단에는 키 바인딩을 알려주는 인포바, 하단에는 파일명·커서 위치 등 정보를 보여주는 상태바가 있으며, 기본 구성은 Nerd Font와 유니코드 표시를 요구함
vim8.2, Debian 11 Bullseye, WSL2, Windows 10 21H2, Windows Terminal 환경에서 테스트됐고, MIT 라이선스의 자유·오픈소스 설정 파일 모음임
GUI 편집기처럼 쓰는 vim
- ModelessVim은
vim을 모드 없는 편집기처럼 동작하게 만드는 설정 파일 모음임 - 일반적인 모드 없는 편집기에서는 글자 키로 바로 텍스트를 입력하고, 저장 같은 명령은 키 바인딩으로 실행함
- GUI 편집기 대부분과
nano같은 일부 터미널 편집기가 여기에 해당함
- GUI 편집기 대부분과
- 기본
vim같은 모드 있는 편집기는 명령 모드, 입력 모드, 비주얼 모드 등 여러 모드를 사용함- 예: 저장은 명령 모드에서
w를 쓰고, 실제 입력은 입력 모드에서 수행함
- 예: 저장은 명령 모드에서
대상 사용자와 설계 이유
- 이 구성은 그래픽 편집기보다
vim을 선호하는 애호가를 대상으로 하지 않음 - 평소 VSCode 같은 GUI 편집기를 쓰지만, 때때로 터미널에서 실행되는 편집기가 필요한 사용자를 대상으로 함
vim명령을 배워도 정기적으로 쓰지 않으면 계속 잊어버린다는 문제가 있음nano같은 모드 없는 터미널 편집기보다vim은 여러 언어에 대한 문법 강조 지원 등 기능이 더 강력하므로, 이 설정은vim기능을 유지하면서 모드 없는 사용성을 제공함
제공 기능
- 표준적인 키 바인딩을 지원함
- 화면 상단에 키 바인딩을 떠올릴 수 있는 인포바를 표시함
- 화면 하단에는 파일, 커서 위치, 기타 정보를 보여주는 상태바를 표시함
- 여러 옵션에 대해 합리적인 기본 설정을 제공함
- 테스트 환경은 다음과 같음
vim8.2- Debian 11 Bullseye
- Windows 10 21H2의 WSL2
- Windows Terminal
설치와 사용 방식
- 저장소를
~/.vim에 클론함git clone --sparse \ https://github.com/SebastianMuskalla/ModelessVim.git \ ~/.vim vim은~/.vim안의vimrc파일을 자동 감지해야 함- 자동 감지가 되지 않으면
~/.vimrc에서~/.vim/modeless.vimrc같은 파일로 심볼릭 링크를 만들 수 있음ln -s ~/.vim/modeless.vimrc ~/.vimrc sudoedit에서 모드 없는vim을 쓰려면.bashrc,.zshrc등에 다음 설정을 넣음export EDITOR=vim
모드 있는 vim도 유지하는 방식
- 일반적인 모드 있는
vim을 계속 쓸 수 있도록,vi명령은 모드 있는 버전을 실행하게 두는 구성을 권장함 /usr/bin/vi심볼릭 링크는 셸 스크립트로 안전하게 교체할 수 있음- 저장소의
vi스크립트 예시는~/.vim/virc가 있으면 이를 사용해vim을 실행하고, 없으면 기본vim을 실행함#!/bin/sh if [ -e "$HOME/.vim/virc" ] then vim -u "$HOME/.vim/virc" "$@" else vim "$@" fi
Nerd Font와 ASCII 대안
- 기본 구성은 Nerd Fonts를 필요로 함
- Nerd Font는 추가 아이콘이 들어간 고정폭 글꼴임
- 상단 인포바와 하단 상태바가 Nerd Font의 커스텀 아이콘 일부를 사용함
- 터미널은 유니코드 문자 표시를 지원해야 함
- 커스텀 글꼴을 쓰지 않거나 쓸 수 없는 경우를 위해 ASCII만 쓰는 파일도 제공함
statusline_ascii.vimrcinfoline_ascii.vimrc
_ascii버전 사용법은modeless.vimrc또는modeful.vimrc안의 지침을 따름
주요 키 바인딩
- 열기·저장·종료
Ctrl+Q: 모든 탭을 닫고 각 파일 저장 여부를 물음Ctrl+W: 현재 탭을 닫고 저장 여부를 물음Ctrl+O: 파일 열기Ctrl+S: 현재 파일 저장- 이름이 없는 파일은 저장이 동작하지 않음
- 검색과 치환
Ctrl+F: 찾기F3: 다음 검색 결과F4: 이전 검색 결과Ctrl+R: 특정 텍스트의 모든 등장 위치를 치환
- 선택·잘라내기·복사·붙여넣기
Ctrl+A: 전체 선택Shift+Left/Right/Down/Up: 해당 방향으로 선택Ctrl+C: 현재 선택 영역 복사, 선택이 없으면 현재 줄 복사Ctrl+X: 현재 선택 영역 잘라내기, 선택이 없으면 현재 줄 잘라내기Ctrl+D: 현재 줄 잘라내기Ctrl+V: 붙여넣기
- 기타 동작
Ctrl+Z: 실행 취소Ctrl+Y: 다시 실행Shift+Tab: 4칸 되돌리기Ctrl+L: 줄 번호 토글Ctrl+N,Ctrl+B: 일반vim모드에서 다음 명령 입력을 허용하며,:q!같은vim명령을 입력할 수 있음F2: 붙여넣기 모드 토글- 붙여넣기 모드에서는
vim이 붙여넣은 텍스트를 다시 포맷하지 않음
- 붙여넣기 모드에서는
저장소 파일 구성과 라이선스
modeless.vimrc: 모드 없는vim설정을 로드함modeful.vimrc: 모드 있는vim용 설정 일부를 로드함colorscheme.vimrc: 어두운 배경의 흰 글자 환경을 위한 색상 스킴keybinds.vimrc: 키 바인딩infoline_nerdfont.vimrc: 키 바인딩을 보여주는 상단 인포라인infoline_ascii.vimrc: ASCII만 쓰는 인포라인statusline_nerdfont.vimrc: 파일명, 커서 위치, 사용자, 호스트명, 시계를 보여주는 하단 상태라인statusline_ascii.vimrc: ASCII만 쓰는 상태라인options_basic.vimrc: 모드 있는vim과 모드 없는vim공통 기본 옵션options_modeless.vimrc: 모드 없는vim용 옵션vimrc:modeless.vimrc를 로드하는 vimrc 파일virc:modeful.vimrc를 로드하는 vimrc 파일vi:~/.vim/modeless.vimrc로드를 시도하는 스크립트- 이 설정 파일 모음은 MIT License의 자유·오픈소스 소프트웨어임
댓글과 토론
Hacker News 의견들
-
저자가 든 이유, 즉 구문 강조나 여러 기능에서 Vim이 다른 터미널 기반 편집기보다 낫다는 설명은 개념적으로 충분히 이해됨
다만 뭔가 신성모독 같은 느낌이 있음. Tesla에 V8 엔진을 얹거나, 호박파이에서 호박을 빼는 것 같음
더 많은 사람이 Vim에 접근할 수 있게 되는 건 좋지만, 방식은 마음에 들지 않음. 그래도 만든 사람에게는 박수를 보냄- “호박파이에서 호박을 빼는 것 같다”는 비유와 달리, 대부분의 호박파이는 실제로는 호박이 아니라 버터넛 스쿼시나 비슷한 호박류로 만들어짐
https://en.wikipedia.org/wiki/Cucurbita_moschata
https://www.thekitchn.com/whats-actually-in-your-canned-pump... - Emacs도 터미널에서 돌아감. 어디에나 설치된 건 Vim이 아니라 Vi이고, 어차피 편집기와 설정을 설치할 거라면 그냥 Emacs를 설치해도 됨
- 모르는 사람을 위해 덧붙이면, 실제로 V8 엔진을 얹은 Tesla가 적어도 두 대는 있음
https://youtu.be/x-6kHjF1U1E?t=402
https://twitter.com/FthePump1/status/1738425546621825468 - 실제 기타는 프렛과 배워야 할 코드가 너무 많으니 Guitar Hero를 더 좋아하는 것과 비슷함
- 진심으로 좀 아픔. 말은 되지만 아픔
편집기 모드로 더 부드럽게 들어가는 길이 있었으면 좋겠음. 구석에 모드와 명령을 간단한 그래픽으로 보여주는 식이면 어떨까 싶음
사용자가 가장 쓸 법한 명령을 알려주는 동적 Vim 인포그래픽 같은 것 말임
- “호박파이에서 호박을 빼는 것 같다”는 비유와 달리, 대부분의 호박파이는 실제로는 호박이 아니라 버터넛 스쿼시나 비슷한 호박류로 만들어짐
-
이미 Vim에 내장된 기능을 저자가 몰랐던 것 같기도 함: easy vim, 즉
evim이나vim -y가 있음.man vim을 보면 됨
그래도 모드 없는 편집기를 찾는다면 Vim은 원하는 편집기가 아님. Vim의 본질과 어긋나고 Vim의 힘을 묶어버림
Vim을 배우는 건 여정이고, 익숙해지고 나면 왜 Vim인지 이해하게 됨- 알아두면 좋겠음
물론 easy vim을 종료하는 방법은 결국 구글링해야 했음 - “Vim의 본질과 어긋나고 힘을 묶는다”는 말은 첫 번째도 마지막도 아닌 해키한 프로젝트를 떠올리게 함. 브라우저 밖에서 쓰이는 JS V8 같은 느낌임
모드 없는 Vim이나 서버 쪽 JavaScript를 피해야 할 좋은 이유가 있을 수도 있지만, 업계는 충분히 괜찮은 해법과 충분히 괜찮은 결과를 압도적으로 받아들임
결국 Vim go brrrrrr 같은 느낌임
- 알아두면 좋겠음
-
Vim 관련 글마다, Vim이 끝내 와닿지 않았다는 가상의 댓글에 대해 늘 하는 말이 있음: Escape 키를 CapsLock으로 재매핑하라는 것임. 정상적인 사람이라면 안 그러고는 Vim을 좋아하기 어려움
Escape는 가장 중요한 키이고, 삽입할 때마다 문장부호처럼 눌러야 함. 그러니 손가락에서 가장 먼 키여서는 안 됨
그렇게 된 건 역사적 우연일 뿐임. 피해자가 되지 말고 재매핑하길 바람
Ctrl+[나Ctrl+C를 쓰는 사람들도 알고 있고, 익숙해진 건 알지만 사람은 뭐든 익숙해질 수 있음. 그렇다고 좋은 건 아님. 이상한 조합은 별로고Ctrl+C에는 몇 가지 특이점이 있음 → https://vi.stackexchange.com/questions/25764/use-control-c-i...
jk도 알고 있음. 영리한 방법이긴 하지만, 내 매핑은 시스템 전체에 적용되기 때문에 bash, zsh, fish, gdb, firenvim의 Vim 모드에서도 추가 설정 없이 올바른 위치의 Escape를 누릴 수 있음- 이 조언은 Vim 사용자든 아니든 모두에게 좋다고 봄. 8년쯤 전 HN에서 누가 이 제안을 했고, 그 뒤로 돌아본 적이 없음
CapsLock은 현대 컴퓨팅에서는 사실상 쓸모가 거의 없지만, 왼손 새끼손가락 바로 아래에 No/Cancel/Quit/Esc 버튼이 있는 건 훌륭함
뇌는 하루쯤이면 익숙해지니 한번 시도해볼 만함 Ctrl+C가 Escape와 동일하다는 오해가 계속 반복되는 걸 막고 싶음.Ctrl+C는 Escape와 같지 않음
특히InsertLeave를 트리거하지 않아서 몇몇 플러그인이 동작하지 않음
조언은 “Esc를 더 편한 곳에 재매핑하라”로 요약할 수 있음. 내 CapsLock은 탭하면 Escape, 누르고 있으면 Ctrl임
삽입 모드 탈출에는jk를 씀. 손가락이 항상 J/K 위에 있는데, 왜 새끼손가락을 한 키라도 뻗는 “피해자”가 되어야 하나 싶음- 그럼 나는 정상인이 아닌가 봄. 재매핑한 적이 없는데도 10년째 열성적인 Vim 사용자임
- “좋다는 뜻은 아니다”가 곧 문제라는 뜻도 아님. 그리고 재매핑을 좋아하는 사람들은 이미 Ctrl을 그 자리에 두고 있음
- CapsLock 키는 확실히 키보드의 황금 자리를, 자주 쓰지도 않는 기능이 차지하고 있음
나는 CapsLock을 기능 키로 재매핑하고, CapsLock 자체는 기능+Shift로 옮겼음
기능+Tab은 Escape로 매핑했는데, 새끼손가락 하나로 쉽게 누를 수 있는 조합임
이렇게 하면 손을 움직여야 하는 많은 키를 기능+[영숫자 키]로 옮길 수 있음. 기능+i는 insert, 기능+u는 page up, 기능+j는 page down, 기능+r은 home, 기능+f는 end 같은 식임
QMK를 지원하는 키보드를 써서 이 커스터마이징은 전부 키보드 안에 들어가지만, Windows의 AutoHotKey 같은 컴퓨터 쪽 소프트웨어로도 아마 가능할 것임
- 이 조언은 Vim 사용자든 아니든 모두에게 좋다고 봄. 8년쯤 전 HN에서 누가 이 제안을 했고, 그 뒤로 돌아본 적이 없음
-
오래된 Vim 고인물로서, 잘됐으면 좋겠음
vim -y도 확인해보길 권함. 그리고 그걸 써보면 아마 질문이 하나 생길 텐데, 답은Ctrl-l임
이걸 이단이라고 비난하는 사람들에게는 그냥 놔두라고 하고 싶음. 각자 흐름에 맞는 편집기를 쓰면 됨
프로그래밍은 남이 생각하는 “네 편집기는 이렇게 써야 한다”는 믿음까지 맞춰가며 하기엔 이미 충분히 어려움 -
IBM CUA
수십 년 전에 TUI 앱을 위한 Common User Access, 즉 FILE | EDIT 같은 표준 메뉴 시스템이 Windows나 Mac OS처럼 정의되어 있었다면 오늘날 Unix/Linux가 얼마나 달랐을지 늘 궁금했음
표준 덕분에 VI와 Emacs가 같은 키 바인딩을 가졌을 수도 있음
https://sqlite.org/hctree/doc/hctree/doc/hctree/index.html#s...- vi와 emacs는 선사시대 유물임. 요즘 사람들은
/와\정도는 괜찮아하고, 일부는 파일 구분자로:도 감당할 수 있음
하지만 선캄브리아 시대에는 특정 버전의 파일을 편집하려면^를 알아야 했음. 차이가 추적되고 있었기 때문임
둘 다 훌륭하고 놀라운 도구이며 뭐든 처리할 수 있음. 파일 시스템이 막 새로 나온 발명품 같았고 무엇이 좋은지 나쁜지 아무도 몰라서, 모든 걸 다 집어넣어야 했기 때문임
표준이 존재하기 전에 표준을 만들기는 어려움 - Vi의 힘은 키 바인딩이 IBM CUA보다 훨씬 인체공학적이라는 데 있음. 터치 타이핑을 한다면 특히 그렇음
Vi/Vim/NeoVim의 키 바인딩은 편리하고, 조합 가능하고, 기억하기 쉬워서 바꿀 이유가 없음 - 정말 맞는 말임. 1980년대 말에서 1990년대 초쯤, 큰 DOS 앱들은 이상한 독자 UI를 버리고 CUA UI로 갈아탔음
예전 UI로 돌아가는 옵션이 가끔 있었지만 많지는 않았고, 일부는 예전 UI도 함께 남겼지만 대체로 한 번에 바뀌었음
그리고 모든 게 나아졌고, 사용자들은 적응했고, 아무도 뒤돌아보지 않았으며 우리 모두에게 더 좋았음
안타깝게도 그 메모는 Unix 세계에는 닿지 않았고, 끔찍한 1970년대 방식이 이제는 성전처럼 모셔지고 있음 - Emacs에는
cua-mode라는 모드가 있고, 브라우저 같은 현대 GUI 프로그램과 더 비슷한 키 바인딩을 제공함
- vi와 emacs는 선사시대 유물임. 요즘 사람들은
-
내가 Vim을 가끔만 쓰는 주된 이유는 이 글이 다루는 것과 조금 다름. 일반적인 조직에서 배포한 모든 VM에 기본으로 있고, SSH 너머에서 쓸 수 있는 유일하게 합리적인 편집기가 Vim이기 때문임
거기서는 보통 기본 설정이고, 설정을 바꾸거나 다른 편집기를 설치하기가 간단하지 않음
좋은 시도이고 멋져 보이지만, 결국 커서를 그럭저럭 움직이는 기본기는 배워야 하는 처지임- 기본기는 15분 안에 배울 수 있음
- CapsLock을 Escape로 재매핑하면 더 좋아짐
이제 Vim을 억지로 쓰는 게 아니라 실제로 즐길 수 있고, 좋아하는 셸의 Vim 모드도 써보면서 명령줄 닌자가 될 수 있음
j/k로 명령 기록을 오르내리고/만으로 명령 기록을 검색하는 걸 상상해보면 됨 - 이게 내가 Vim만 쓰는 정확한 사용 사례이고, 그래서 스스로 최소 설정으로만 쓰도록 강제함
- 다행히 보통은 nano가 설치되어 있고, vi(m)보다 한 자릿수 정도는 더 낫다고 봄
셸 안에서는 편집기에 들어가 몇 줄 고치고 바로 나오는 게 필요한데, nano가 그걸 아주 잘함
-
터미널에서 가끔 이상한 설정 파일을 고치려고 Vim을 쓰는 사용자에게 커스텀 Vim 설정을 만지라고 기대하는 건 비현실적이라고 봄
GUI 편집기처럼 동작하는 좋은 편집기를 정말 찾는다면 micro를 강력히 추천함 [1]
기본으로 마우스를 지원하고, 많은 언어의 구문 강조가 바로 들어 있으며, 대부분의 키 바인딩이 GUI 편집기와 같고 복사/붙여넣기도 기대한 대로 동작함
[1] https://github.com/zyedidia/micro -
35년 전, vi를 처음 접한 지 며칠 안 돼서 이런 시도를 해봤음
하지만 여러 머신에 계속 로그인해야 했기 때문에 곧 그냥 기본 vi를 그대로, 모드까지 포함해 쓰는 게 낫다고 판단했음
그 철학은 세월이 지나도 잘 맞았음- 대학에서 Vim을 처음 배운 초기에 비슷한 깨달음을 얻었음. 어떤 도구든 커스터마이징은 결국 수확 체감 지점에 도달하고, 그 이후의 변경은 기본 상태의 도구를 쓰는 능력을 떨어뜨림
이 통찰은 거의 모든 도구에 적용된다고 봄. 소프트웨어부터 하드웨어와 그 밖의 것들까지 마찬가지임
도구의 기본 동작을 익힌 뒤 커스터마이징으로 효율을 높이되, 수정되지 않은 상태에서 더 이상 효과적으로 쓸 수 없을 정도로 커스터마이징하지는 말아야 함
때로는 남의 도구를 써야 하고, 그때도 제대로 일할 수 있어야 함 - 전적으로 동의하지만, 기본값은 다음 10억 사용자를 수용해야 한다는 점도 인정해야 함
배포판은 easy-mode를 sensible-editor로 두고,runtime mswin.vim,set nocompatible같은 것을 skel vimrc로 넣을 권리가 있어야 한다고 봄
새 사용자가 “vi 종료하는 법”을 구글링하게 만드는 것보다 이런 설정은 바꾸기 쉬움
하지만 이 글처럼Ctrl-O를 재매핑하는 건 호환성을 깨는 변경임 - 그때 어떤 플러그인이나 프로젝트를 썼는지 기억나는지 궁금함. 링크된 것은 꽤 최근 것처럼 보임 [1]
다른 구현도 있나?
[1]: https://github.com/SebastianMuskalla/ModelessVim/blob/main/L... - 지금은 자체 설정 파일을 포함하는 실제로 이식 가능한 실행 파일이 있음. 여러 플랫폼과 여러 운영체제를 지원하니, 바이너리 하나만
scp하면 끝낼 수 있음
- 대학에서 Vim을 처음 배운 초기에 비슷한 깨달음을 얻었음. 어떤 도구든 커스터마이징은 결국 수확 체감 지점에 도달하고, 그 이후의 변경은 기본 상태의 도구를 쓰는 능력을 떨어뜨림
-
저자가 말하듯 이건 다른 편집기를 쓰는 사용자를 위한 것임. 그렇다면 언제 필요할까 싶음
아마 사용자가 다른 장치에 로그인했고 터미널 접근만 가능한 상황을 말하는 것 같은데, 그런 경우 이 설정은 기본 설치되어 있지 않을 것임. 그래서 Vim이나 Emacs를 배우는 이유가 생김
사용 사례가 원격 박스에 이걸 설치하는 것이고 권한도 허용된다는 뜻인가? 권한이 있다면 기존 IDE로 접속해서 터미널을 아예 건너뛸 수 있지 않을까?- 내가 이걸 쓰기 시작한 이유는 좋아하는 편집기인 micro의 Ruby 구문 강조가 매우 좋지 않아서였음
아주 구체적인 사용 사례지만 꽤 괜찮고, 모드 없는 Vim으로 갈아탈까 생각 중임 - 이건 그냥 Vim 설정임. 공유 시스템에서는 홈 디렉터리는 수정할 수 있지만 추가 소프트웨어 설치 권한은 없는 경우가 아주 흔함
홈 디렉터리에 소프트웨어를 설치하는 것도 가능하긴 하지만 대체로 좋게 보지 않음 - IDE를 안 쓰는 주된 이유는 sshfs가 늘 짜증나게 느리다고 느끼기 때문이고, VPS에서 코드를 바로 편집하는 게 편할 때가 많음
그래서 이건 꼭 시도해볼 생각임
- 내가 이걸 쓰기 시작한 이유는 좋아하는 편집기인 micro의 Ruby 구문 강조가 매우 좋지 않아서였음
-
모드 없는 Vim이라니, 땅콩버터 없는 땅콩버터 샌드위치 같음. 그래도 그게 원한다면 잘 쓰면 됨
- Vim을 아주 가끔만 만지는 사람이, 그럴 수도 있는 순간을 위해 이 저장소를 내려받을지는 잘 상상이 안 됨