‘모던한’ 터미널 환경을 갖추려면 무엇이 필요할까요?
안녕하세요! 얼마 전 터미널에 대한 설문조사를 진행하면서 어떤 점이 불편한지 물어봤어요. 한 분이 이렇게 답해 주셨어요:
모던한 터미널 경험을 하려면 챙겨야 할 요소가 너무 많아요. 그냥 처음부터 다 갖춰져 나오면 좋겠어요.
처음에는 ‘에이, 모던한 터미널 환경 만드는 거 별로 어렵지 않은데, 그냥 …만 하면 되지’라고 생각했어요. 그런데 곰곰이 생각할수록 ‘그냥 …만 하면 된다’는 목록은 점점 길어졌고, 단서 조항도 계속 떠오르더라고요.
그래서 저 개인에게 ‘모던한’ 터미널 경험이란 무엇인지, 그리고 사람들이 그 단계까지 가기 어렵게 만드는 요인은 무엇인지 한번 정리해 보려고 해요.
‘모던한 터미널 경험’이란 무엇일까요?
저에게 중요한 몇 가지를, 각각을 담당하는 시스템 영역과 함께 정리해 봤어요:
- 복사·붙여넣기 시 여러 줄 지원: 셸에 명령어 3개를 붙여 넣었다고 해서 전부 바로 실행되면 안 되죠! 너무 무섭잖아요! (셸, 터미널 에뮬레이터)
- 무한 셸 히스토리: 셸에서 실행한 명령어는 500개 같은 제한 때문에 지워지지 않고 영원히 저장되어야 해요. 그리고 셸 세션을 종료할 때가 아니라 실행하는 즉시 히스토리에 저장되었으면 좋겠어요. (셸)
- 유용한 프롬프트: 프롬프트에 현재 디렉터리와 현재 git 브랜치가 없으면 정말 불편해요. (셸)
- 24비트 컬러: 256색만 지원하는 터미널보다 24비트 컬러를 지원하는 터미널에서 neovim 테마를 입히는 게 훨씬 쉽더라고요. 그래서 저에겐 정말 중요해요. (터미널 에뮬레이터)
- 클립보드 연동: vim과 운영체제 사이의 클립보드 연동이에요. Firefox에서 복사한 내용을 vim에서
p만 눌러 붙여 넣을 수 있어야 해요. (텍스트 에디터, 어쩌면 OS/터미널 에뮬레이터도) - 똑똑한 자동 완성: 예를 들어 git 같은 명령어는 명령어에 특화된 자동 완성이 지원되어야 해요. (셸)
ls에 컬러 표시하기 (셸 설정)- 마음에 드는 터미널 테마: 터미널에서 보내는 시간이 많다 보니 예쁘게 꾸미고 싶고, 터미널 에디터 테마와도 어울렸으면 좋겠어요. (터미널 에뮬레이터, 텍스트 에디터)
- 자동 터미널 복구: 어떤 프로그램이 이상한 이스케이프 코드를 출력해서 터미널이 깨져도 자동으로 리셋되어 터미널이 망가지지 않았으면 좋겠어요. (셸)
- 키 바인딩:
Ctrl+left arrow같은 단축키가 동작해야 해요. (셸 또는 애플리케이션) less같은 프로그램에서 스크롤 휠 사용하기 (터미널 에뮬레이터와 애플리케이션)
이 외에도 터미널을 편리하게 만드는 요소는 수없이 많고 사람마다 중요하게 생각하는 것도 다르지만, 저는 이 정도 없으면 정말 불편하더라고요.
저는 ‘모던한 경험’을 어떻게 만들고 있나요?
제가 택한 기본적인 방법은 이래요:
fish셸을 써요. 크게 설정하지 않고 딱 두 가지만 해요:EDITOR환경 변수를 제가 좋아하는 터미널 에디터로 지정해요ls를ls --color=auto로 alias를 지정해요
- 24비트 컬러를 지원하는 터미널 에뮬레이터라면 아무거나 써요. 예전에는 GNOME Terminal, Terminator, iTerm을 써봤지만 크게 가리지는 않아요. 폰트 고르는 것 말고는 따로 설정하지 않아요.
neovim을 써요. 설정은 지난 9년 정도에 걸쳐 아주 천천히 쌓아 온 거예요. (vim 설정을 다 지우고 처음부터 다시 만든 게 9년 전이에요.)- 모든 테마는 base16 프레임워크로 통일해요.
제 방식에 영향을 주는 몇 가지 전제가 있어요:
- 다른 머신에 SSH로 접속해서 작업하는 시간이 길지 않아요.
- 모든 걸 키보드로 하려고 애쓰기보다 마우스를 조금 쓰는 편을 선호해요.
- 하나의 큰 프로젝트보다 작은 프로젝트 여러 개를 다뤄요.
‘모던한’ 경험을 위한 ‘바로 쓸 수 있는’ 옵션들
좋은 경험을 원하지만 설정에 많은 시간을 쓰고 싶지 않다면 어떻게 해야 할까요? 저도 vim을 마음에 들게 설정하는 데 거의 10년이 걸렸어요. 정말 긴 시간이죠!
최소한의 설정으로 괜찮은 터미널 경험을 얻는 방법에 대한 제 나름의 추천은 이래요:
- 셸:
fish아니면 oh-my-zsh를 얹은zsh - 터미널 에뮬레이터: 24비트 컬러를 지원하는 것이라면 거의 다 괜찮아요. 예를 들어 다음 것들이 인기가 많아요:
- 리눅스: GNOME Terminal, Konsole, Terminator, xfce4-terminal
- 맥: iTerm (Terminal.app은 256컬러를 지원하지 않아요)
- 크로스 플랫폼: kitty, alacritty, wezterm, ghostty
- 셸 설정:
EDITOR환경 변수를 좋아하는 터미널 텍스트 에디터로 지정해요ls를ls --color=auto로 alias 지정하는 것도 고려해 보세요
- 텍스트 에디터: 이건 좀 어려운 문제예요. 아마 micro나 helix 정도가 좋지 않을까요? 둘 다 본격적으로 써본 적은 없지만 둘 다 정말 멋진 프로젝트 같고, 특히 micro에서는 평소 GUI 에디터에서 쓰는 명령어(
Ctrl-C로 복사,Ctrl-V로 붙여넣기,Ctrl-A로 전체 선택)를 그대로 쓰면 예상대로 동작한다는 점이 놀라워요. helix로 갈아타 보고 싶기도 하지만 vim에 익숙해진 손 기억을 다시 훈련시키는 게 너무 힘들 것 같아요. 그리고 helix는 아직 GUI나 플러그인 시스템이 없기도 하고요.
개인적으로 저는 터미널 에뮬레이터로 xterm, rxvt, Terminal.app은 쓰지 않을 것 같아요. 예전에 써봤을 때 제게는 터미널을 쓰기 어렵게 만드는 핵심 기능이 빠져 있었거든요. (Terminal.app의 경우 24비트 컬러 같은 기능이요.)
그렇다고 ‘모던한’ 터미널 경험을 얻는 게 실제보다 쉽다고 포장하고 싶지는 않아요. 어렵게 만드는 문제가 두 가지 있다고 생각해요. 하나씩 얘기해 볼게요!
‘모던한’ 경험을 가로막는 문제 1: 셸
bash와 zsh는 압도적으로 가장 인기 있는 두 셸이지만, 둘 다 기본 상태 그대로는 제가 만족하며 쓸 수 있는 경험을 주지 않아요. 예를 들면요:
- 프롬프트를 직접 커스터마이즈해야 해요
- 기본적으로 git 자동 완성이 들어 있지 않아서 직접 설정해야 해요
- 기본적으로 bash는 히스토리를 500줄(!)만 저장하고, zsh도 (적어도 Mac OS에서는) 2000줄만 저장하도록 설정되어 있는데, 여전히 많지 않아요
- bash의 탭 완성은 정말 답답하다고 느껴요. 일치하는 항목이 두 개 이상이면 탭으로 넘겨가며 탐색할 수 없거든요
그리고 저는 fish를 정말 좋아하지만, fish가 POSIX를 따르지 않는다는 점 때문에 많은 분이 갈아타기 어려워하는 것도 사실이에요.
물론 bash 등에서 프롬프트를 커스터마이즈하는 법을 배우는 것 자체는 충분히 가능하고, 그렇게 복잡할 필요도 없어요. (bash라면 저는 아마 export PS1='[\u@\h \W$(__git_ps1 " (%s)")]\$ ' 같은 것부터 시작하거나, starship을 쓸 것 같아요.) 하지만 이런 ‘별로 복잡하지 않은’ 것들이 하나하나 쌓이면 결국 부담이 되고, 특히 여러 시스템에서 설정을 동일하게 유지해야 한다면 더 힘들어요.
‘모던한’ 셸 경험을 얻는 아주 인기 있는 방법 중 하나가 oh-my-zsh예요. 정말 좋은 프로젝트 같고 많은 분이 만족하며 잘 쓰고 계신 걸 알지만, 저는 과거에 이런 설정 시스템 때문에 어려움을 겪은 적이 있어요. 지금 기준으로 oh-my-zsh 기본 설정만 해도 약 3000줄의 config가 추가되는 것 같고, 이런 추가 설정 시스템이 있으면 뭔가 문제가 생겼을 때 무슨 일이 일어나고 있는지 디버깅하기가 더 어렵더라고요. 저 같은 경우는 플러그인을 이것저것 추가하다가 시스템이 느려지고, 느려진 것에 짜증이 나서 결국 다 지워버리고 처음부터 새 설정을 만드는 패턴을 반복하곤 했어요.
‘모던한’ 경험을 가로막는 문제 2: 텍스트 에디터
얼마 전 진행한 터미널 설문조사에서 가장 인기 있는 터미널 텍스트 에디터는 압도적으로 vim, emacs, nano였어요.
터미널 텍스트 에디터의 주요 선택지는 크게 이렇게 정리할 수 있을 것 같아요:
- vim이나 emacs를 써서 마음에 들게 설정해요. 공을 들이면 원하는 기능은 거의 다 넣을 수 있어요
- nano를 쓰고 꽤 제한적인 경험을 감수해요. (예를 들어 nano에서는 마우스로 텍스트를 선택한 뒤 ‘잘라내기’ 하는 것이 안 되는 걸로 알고 있어요)
micro나helix를 써요. 두 에디터는 기본 상태만으로도 꽤 괜찮은 경험을 주는 것 같지만, 덜 주류인 에디터를 쓰다 보니 가끔 문제가 생길 수도 있어요- 가능하면 터미널 텍스트 에디터 자체를 최대한 쓰지 않아요. 예를 들어 VSCode를 쓰고, 터미널 작업도 VSCode 터미널에서 다 하며, 터미널에서 파일을 직접 편집하는 일은 거의 하지 않는 거예요. 실제로 터미널에서
EDITOR를code로 쓰는 분도 많이 봤어요
문제 3: 개별 애플리케이션
마지막 문제는 제가 쓰는 개별 프로그램들이 가끔 불편하다는 점이에요. 예를 들어 제 Mac OS 머신에서 /usr/bin/sqlite3는 Ctrl+Left Arrow 단축키를 지원하지 않아요. SQLite에서 그나마 쓸 만한 터미널 경험을 만들려고 이걸 고치는 과정이 좀 복잡했는데, 이렇게 해야 했어요:
- 왜 이런 일이 일어나는지 파악해요 (Mac OS는 GNU 도구를 기본 제공하지 않고, ‘Ctrl-Left arrow’ 지원은 GNU readline에서 온다는 걸 알게 됐어요)
- 우회 방법을 찾아요 (readline을 지원하는 Homebrew 버전의 sqlite를 설치해요)
- 환경을 조정해요 (Homebrew의 sqlite3를 PATH에 넣어요)
이런 애플리케이션별 문제를 디버깅하는 건 정말 쉽지 않고, 종종 ‘그럴 가치가 있나’ 싶기도 해요. 그래서 사소한 불편을 그냥 감수하고 쓰는 경우가 많아요. 몇 시간씩 파고들고 싶지 않으니까요. 이번 건을 알아낼 수 있었던 유일한 이유는 최근에 터미널에 대해 정말 많은 시간을 들여 고민해 왔기 때문이에요.
터미널 프로그램으로 ‘모던한’ 경험을 얻는 큰 부분은 그냥 더 새로운 터미널 프로그램을 쓰는 것이기도 해요. 예를 들어 저는 top에서 컬럼을 정렬하는 단축키를 외우기가 귀찮은데, htop에서는 컬럼 헤더를 마우스로 클릭하기만 하면 정렬돼요. 그래서 htop을 쓰죠! 하지만 더 ‘모던한’ 커맨드라인 도구를 새로 발견하는 일 자체가 쉽지 않고 (그래도 여기에 목록을 정리해 두긴 했어요), 실제로 써보니 마음에 드는 것을 찾는 데도 시간이 걸리며, 다른 머신에 SSH로 접속한 상황에서는 그런 도구들이 항상 있는 것도 아니에요.
모든 것이 서로 영향을 미쳐요
터미널을 ‘좋게’ 설정할 때 까다롭다고 느끼는 점 중 하나는, 워크플로에서 겉보기에 사소한 하나를 바꿔도 다른 모든 것에 영향을 줄 수 있다는 거예요. 예를 들어 저는 지금 tmux를 쓰지 않아요. 하지만 다시 tmux를 써야 한다면 (예를 들어 다른 머신에 SSH로 접속해서 작업을 많이 해야 해서), 몇 가지를 고민해야 할 거예요. 이를테면:
- SSH를 통해 tmux의 복사가 시스템 클립보드와 동기화되길 원한다면, 터미널 에뮬레이터가 OSC 52를 지원하는지 확인해야 해요
- iTerm의 tmux 연동 기능(tmux 탭을 iTerm 탭으로 만들어 주는 기능)을 쓰고 싶다면, 컬러 설정 방식을 바꿔야 해요. 지금은 셸이 시작될 때 실행하는 셸 스크립트로 컬러를 지정하는데, 그러면 tmux 세션을 복원할 때 컬러가 사라져 버려요.
그리고 아마 제가 아직 생각하지 못한 것들도 더 있을 거예요. ‘tmux를 쓰려면 컬러 관리 방식을 바꿔야 한다’는 말은 얼핏 말이 안 되는 것처럼 들리지만, 실제로 제게 일어났던 일이고, 저는 ‘음, 지금 컬러 관리 방식을 바꾸고 싶진 않으니 그 기능은 안 쓰기로 해야겠다’고 결정했어요.
내가 어떤 기능에 의존하고 있는지를 기억하는 것 자체도 어려워요. 예를 들어 지금 쓰는 터미널은 어쩌면 OSC 52를 지원해서 tmux에서 SSH를 통해 복사가 항상 그냥 잘 됐을 수도 있어요. 그러면 그게 필요한 기능인지조차 모른 채 쓰다가, 터미널을 바꾸는 순간 갑자기 이유를 알 수 없이 안 되게 되는 거죠.
천천히 바꿔 나가기
개인적으로 제 설정이 그렇게까지 복잡하다고 생각하지는 않지만, 여기까지 오는 데 20년이 걸렸어요! 터미널 설정 변경은 예상치 못한, 이해하기 어려운 결과를 낳을 가능성이 높기 때문에, 한 번에 많은 걸 바꾸면 문제가 생겼을 때 무엇이 잘못됐는지 파악하기가 훨씬 어려워지고, 정말 방향을 잃은 기분이 들더라고요.
그래서 저는 보통 아주 작은 변화만 주려고 하고, 변화에 익숙해지는 데 정말 오랜 시간이 걸릴 수도 있다는 걸 받아들이려고 해요. 예를 들어 1~2년 전에 ls 대신 eza로 바꿨는데, 마음에 들긴 하지만 (eza -l이 기본적으로 사람이 읽기 쉬운 파일 크기를 출력해 주거든요) 아직 완전히 확신은 서지 않았어요. 하지만 때로는 큰 변화를 주는 것도 가치가 있어요. 10년 전에 bash에서 fish로 갈아탄 건 정말 잘한 선택이었다고 생각해요.
‘모던한’ 터미널을 갖추는 건 그리 쉽지 않아요
터미널 설정이 얼마나 ‘쉬운지’ 설명하려고 하면 할수록, 사실 꽤 어렵고 저조차도 아직 가끔 헷갈린다는 생각이 들어요.
터미널에서는 다른 모든 것과 완벽하게 호환되는 단 하나의 완벽한 설정 방법이란 없다는 걸 알게 됐어요. 그냥 이것저것 시도해 보면서 저에게 맞는 일종의 국소적으로 안정적인 상태를 찾아내고, 새로운 도구를 쓰기 시작하면 시스템이 흔들릴 수도 있고 다시 고민해야 할 수도 있다는 걸 받아들이는 수밖에 없더라고요.
글을 무작위로 읽기