What's involved in getting a "modern" terminal setup?

Julia Evans

‘모던한’ 터미널 환경을 갖추려면 무엇이 필요할까?

원문은 Julia Evans님이 에 게재했습니다. 이 블로그 구독하기

안녕하세요! 최근에 터미널에 관한 설문조사를 진행하면서 사람들을 답답하게 만드는 게 무엇인지 물었는데요. 한 분이 이렇게 답해주셨습니다:

모던한 터미널 경험을 하려면 맞춰야 할 게 너무 많아요. 그냥 처음부터 다 갖춰져 나오면 좋겠네요.

처음에는 “아, 모던한 터미널 경험 갖추는 거 어렵지 않은데, 그냥… 하면 되잖아”라고 생각했어요. 그런데 곰곰이 생각할수록 “그냥…” 뒤에 붙는 목록은 점점 길어지고, 고려해야 할 예외도 계속 늘어났습니다.

그래서 개인적으로 생각하는 “모던한” 터미널 경험이 무엇인지, 그리고 왜 사람들이 그런 환경을 갖추기 어려워하는지에 대해 몇 가지 메모를 적어보기로 했습니다.

“모던한 터미널 경험”이란 무엇일까?

제가 중요하게 생각하는 몇 가지를 시스템의 어느 부분이 담당하는지와 함께 정리해 봤습니다:

  • 복사·붙여넣기 시 여러 줄 지원: 셸에 명령어 3개를 붙여 넣었을 때 전부 바로 실행되지 않아야 합니다! 그건 무서우니까요! (, 터미널 에뮬레이터)
  • 무한 셸 히스토리: 셸에서 명령어를 실행하면 영원히 저장되어야 합니다. 500개쯤 지나면 사라진다거나 해서는 안 되죠. 또 셸 세션을 종료할 때가 아니라 명령어를 실행하자마자 바로 히스토리에 저장되어야 합니다 ()
  • 유용한 프롬프트: 프롬프트에 현재 디렉터리현재 git 브랜치가 없으면 안 됩니다 ()
  • 24비트 컬러: 256색만 지원하는 터미널보다 24비트 컬러를 지원하는 터미널에서 neovim 테마를 맞추는 게 훨씬 쉬워서 저에게는 중요합니다 (터미널 에뮬레이터)
  • 클립보드 연동: vim과 운영체제 사이의 클립보드 연동이 되어서 Firefox에서 복사한 내용을 vim에서 그냥 p를 눌러 붙여 넣을 수 있어야 합니다 (텍스트 에디터, 어쩌면 OS/터미널 에뮬레이터도)
  • 똑똑한 자동완성: 예를 들어 git 같은 명령어는 명령어별 자동완성을 지원해야 합니다 ()
  • ls색상이 표시되는 것 (셸 설정)
  • 마음에 드는 터미널 테마: 터미널에서 보내는 시간이 많은 만큼 보기 좋아야 하고, 터미널 에디터 테마와도 어울렸으면 합니다 (터미널 에뮬레이터, 텍스트 에디터)
  • 자동 터미널 복구: 어떤 프로그램이 이상한 이스케이프 코드를 출력해서 터미널을 망가뜨려도 자동으로 리셋되어 터미널이 엉망이 되지 않았으면 합니다 ()
  • 키 바인딩: Ctrl+left arrow가 동작했으면 합니다 ( 또는 애플리케이션)
  • less 같은 프로그램에서 스크롤 휠을 사용할 수 있는 것: (터미널 에뮬레이터애플리케이션)

이 밖에도 터미널을 편하게 해주는 기능은 수도 없이 많고 사람마다 중요하게 여기는 것도 다르겠지만, 저는 이 정도 없이는 정말 불편하더라고요.

나는 어떻게 “모던한 경험”을 만들고 있을까

제 기본적인 방법은 이렇습니다:

  1. fish 셸을 쓴다. 거의 따로 설정하지 않고, 딱 두 가지만 한다:
    • EDITOR 환경 변수를 내가 좋아하는 터미널 에디터로 설정하기
    • lsls --color=auto로 alias 설정하기
  2. 24비트 컬러를 지원하는 터미널 에뮬레이터라면 아무거나 쓴다. 예전에는 GNOME Terminal, Terminator, iTerm을 써봤지만 크게 가리지는 않는다. 폰트 고르는 것 외에는 따로 설정하지도 않는다.
  3. neovim을 쓴다. 지난 9년 정도에 걸쳐 아주 천천히 쌓아온 설정으로 쓰고 있다 (vim 설정을 지우고 처음부터 다시 만든 게 9년 전이다)
  4. 모든 테마는 base16 framework로 통일한다

제 방식에 영향을 주는 몇 가지는 이렇습니다:

  • 다른 머신에 SSH로 접속해서 작업하는 시간이 많지 않다
  • 모든 걸 키보드로 하려고 애쓰기보다는 마우스를 조금 쓰는 편이 낫다고 생각한다
  • 하나의 큰 프로젝트보다는 작은 프로젝트들을 많이 한다

“모던한” 경험을 위한 “기본 제공” 옵션 몇 가지

편한 환경을 원하지만 설정에 많은 시간을 쓰고 싶지 않다면 어떨까요? 마음에 드는 vim 설정을 찾는 데에만 정말 10년 정도가 걸렸으니, 꽤 오래 걸린 셈이죠!

최소한의 설정으로 괜찮은 터미널 경험을 얻는 제 나름의 베스트 아이디어는 이렇습니다:

  • 셸: fishoh-my-zsh를 얹은 zsh 중 하나
  • 터미널 에뮬레이터: 24비트 컬러를 지원하는 것이라면 거의 다 괜찮습니다. 예를 들어 이런 것들이 인기 있습니다:
    • linux: GNOME Terminal, Konsole, Terminator, xfce4-terminal
    • mac: iTerm (Terminal.app은 256색도 지원하지 않습니다)
    • 크로스 플랫폼: kitty, alacritty, wezterm, ghostty
  • 셸 설정:
    • EDITOR 환경 변수를 좋아하는 터미널 텍스트 에디터로 설정하기
    • 가능하면 lsls --color=auto로 alias 설정하기
  • 텍스트 에디터: 이건 좀 어렵네요. 아마 microhelix 정도가 아닐까요? 둘 다 본격적으로 써본 적은 없지만 둘 다 정말 멋진 프로젝트 같고, 특히 micro에서는 평소 GUI 에디터에서 쓰던 명령어(Ctrl-C로 복사, Ctrl-V로 붙여넣기, Ctrl-A로 전체 선택)를 그대로 쓰면 예상대로 동작한다는 점이 놀랍다고 생각합니다. vim에 익숙해진 손 기억을 다시 훈련하는 게 너무 힘들 것 같아서 helix로 갈아타 보지는 않을 것 같고요. 게다가 helix는 아직 GUI나 플러그인 시스템도 없습니다.

개인적으로는 xterm, rxvt, Terminal.app은 터미널 에뮬레이터로 쓰지 않을 겁니다. 예전에 써보니 핵심 기능(예를 들어 Terminal.app의 경우 24비트 컬러)이 빠져 있어서 터미널을 쓰기가 더 어렵더라고요.

그렇다고 “모던한” 터미널 경험을 갖추는 게 실제보다 쉽다고 포장하고 싶지는 않습니다. 어렵게 만드는 문제가 두 가지 정도 있다고 생각해요. 하나씩 이야기해 보죠!

“모던한” 경험을 가로막는 문제 1: 셸

bash와 zsh는 압도적으로 가장 인기 있는 두 셸인데, 둘 다 기본 상태로는 제가 만족하며 쓸 수 있는 경험을 제공하지 않습니다. 예를 들면:

  • 프롬프트를 직접 커스터마이즈해야 합니다
  • git 자동완성이 기본으로 제공되지 않아 직접 설정해야 합니다
  • 기본적으로 bash는 500줄(!)의 히스토리만 저장하고, zsh도 (적어도 Mac OS에서는) 2000줄만 저장하도록 설정되어 있는데, 이것도 여전히 많지 않습니다
  • bash의 탭 자동완성은 꽤 답답합니다. 일치하는 항목이 두 개 이상이면 탭으로 순회할 수 없거든요

그리고 저는 fish를 정말 좋아하지만, POSIX를 따르지 않는다는 점 때문에 많은 분들이 갈아타기 어려워합니다.

물론 bash 등에서 프롬프트를 커스터마이즈하는 법을 배우는 것 자체는 충분히 가능하고, 그리 복잡할 필요도 없습니다 (bash라면 아마 export PS1='[\u@\h \W$(__git_ps1 " (%s)")]\$ ' 같은 것부터 시작하거나, starship을 쓸 것 같아요). 하지만 이런 “별거 아닌” 것들이 하나둘 쌓이면 결국 꽤 많아지고, 특히 여러 시스템에서 설정을 동기화해야 한다면 더 힘들어집니다.

“모던한” 셸 경험을 위한 아주 인기 있는 해결책은 oh-my-zsh입니다. 멋진 프로젝트 같고 많은 분들이 아주 만족하며 쓰고 있다는 것도 알고 있지만, 저는 예전에 비슷한 설정 시스템 때문에 고생한 적이 있습니다. 지금 기준으로 기본 oh-my-zsh만 해도 약 3000줄의 설정이 추가되는 것 같고, 이런 추가 설정 시스템이 있으면 뭔가 잘못됐을 때 무슨 일이 일어나고 있는지 디버깅하기가 더 어려워지더라고요. 저는 개인적으로 플러그인을 잔뜩 추가했다가 시스템을 느리게 만들고, 느려진 것에 답답해하다가 결국 다 지우고 처음부터 새로 설정을 짜는 패턴을 반복하는 편입니다.

“모던한” 경험을 가로막는 문제 2: 텍스트 에디터

최근에 진행한 터미널 설문조사에서 압도적으로 가장 인기 있는 터미널 텍스트 에디터는 vim, emacs, nano였습니다.

터미널 텍스트 에디터의 주요 선택지는 크게 이렇다고 생각합니다:

  • vim이나 emacs를 쓰고 마음에 들게 설정한다. 노력만 들이면 원하는 기능은 거의 다 넣을 수 있을 것이다
  • nano를 쓰고 꽤 제한적인 경험을 감수한다 (예를 들어 nano에서는 마우스로 텍스트를 선택한 뒤 “잘라내기”를 할 수 없는 걸로 알고 있다)
  • 기본 제공 경험이 꽤 괜찮아 보이는 microhelix를 쓴다. 다만 덜 주류인 에디터를 쓰다 보면 가끔 문제가 생길 수도 있다
  • 터미널 텍스트 에디터 사용 자체를 최대한 피한다. 예를 들어 VSCode를 쓰고, 터미널 작업도 전부 VSCode의 터미널에서 처리하며, 터미널에서는 거의 파일을 편집하지 않는 것이다. 아니면 많은 분들이 터미널에서 EDITORcode를 쓰고 있다는 것도 알고 있다.

문제 3: 개별 애플리케이션

마지막 문제는 가끔 제가 쓰는 개별 프로그램들이 좀 성가시다는 것이다. 예를 들어 제 Mac OS 머신에서는 /usr/bin/sqlite3Ctrl+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를 지원해서 SSH를 통한 tmux 복사가 늘 그냥 잘 되어 왔다면, 나는 그게 필요한 기능인지조차 모른 채 지내다가 터미널을 바꾸는 순간 갑자기 동작하지 않게 되어 당황하게 된다.

천천히 바꾸기

개인적으로 내 설정이 그렇게 복잡하다고 생각하지는 않지만, 여기까지 오는 데 20년이 걸렸다! 터미널 설정 변경은 예상치 못하고 이해하기 어려운 결과를 초래할 가능성이 높기 때문에, 한 번에 많은 터미널 설정을 바꾸면 문제가 생겼을 때 무엇이 잘못됐는지 파악하기가 훨씬 어려워지고, 정말 방향을 잃은 느낌이 들더라.

그래서 나는 보통 아주 작은 변경만 하는 걸 선호하고, 변화에 익숙해지는 데 정말 오랜 시간이 걸릴 수 있다는 걸 받아들인다. 예를 들어 1~2년 전에 ls에서 eza로 바꿨는데, 마음에 들긴 하지만(eza -l이 기본적으로 사람이 읽기 쉬운 파일 크기를 출력해 주거든요) 아직 완전히 확신이 서지는 않는다. 하지만 때로는 큰 변화를 감행할 가치도 있다. 10년 전에 bash에서 fish로 갈아탄 것처럼 말이다. 그 결정은 정말 잘했다고 생각한다.

“모던한” 터미널을 갖추는 건 그리 쉽지 않다

터미널을 설정하는 게 얼마나 “쉬운지” 설명하려고 하면 할수록, 사실은 꽤 어렵고 나조차도 여전히 가끔 헷갈린다는 생각만 든다.

터미널에서 모든 것과 완벽하게 호환되는 단 하나의 설정 방법 같은 건 없다는 걸 알게 됐다. 그냥 이것저것 시도해 보고, 나에게 맞는 일종의 국소적으로 안정적인 상태를 찾은 뒤, 새로운 도구를 쓰기 시작하면 시스템이 흔들릴 수도 있고 다시 고민해야 할 수도 있다는 걸 받아들여야 한다.

이 글은 muse-spark-1.2-contributor 모델을 사용해 번역했습니다.

댓글