Zellij: Rust로 만든 차세대 터미널 멀티플렉서

Zellij: Rust로 만든 차세대 터미널 멀티플렉서

터미널에서 개발하다 보면 창이 부족해지는 순간이 오죠. 개발 서버 하나 돌리고, 로그 보면서, 또 다른 창에서 Git 작업하고, 테스트도 돌려야 하고… 결국 터미널 탭이 열 개쯤 열려 있는 자신을 발견하게 됩니다. 😅

이런 문제를 해결하려고 tmux 같은 터미널 멀티플렉서를 써보신 분들도 계실 텐데요. 솔직히 tmux는 진입 장벽이 꽤 높습니다. 키 바인딩을 외워야 하고, 설정 파일도 복잡하고, 처음 켜면 뭘 어떻게 해야 하는지 막막하죠.

Zellij는 이런 고민을 깔끔하게 해결해주는 차세대 터미널 멀티플렉서입니다. Rust로 만들어서 빠르고, 화면 하단 상태바에 사용 가능한 단축키가 항상 표시되기 때문에 아무것도 외울 필요가 없어요. GitHub에서 30k의 스타를 받고 있고, MIT 라이선스로 누구나 무료로 사용할 수 있습니다.

터미널 멀티플렉서가 뭔가요?

터미널 멀티플렉서는 쉽게 말해 하나의 터미널 창 안에서 여러 개의 터미널을 동시에 쓸 수 있게 해주는 도구입니다. 화면을 가로세로로 분할해서 여러 작업을 한눈에 보면서 진행할 수 있죠.

거기에 더해서 세션(session)이라는 개념이 있는데요. SSH로 원격 서버에 접속해서 작업하다가 연결이 끊어져도 세션에 다시 붙으면 끊기기 전 상태 그대로 이어서 작업할 수 있습니다. 서버에서 오래 걸리는 작업을 돌려놓고 퇴근할 때도 유용하고요.

tmux가 이 분야의 대표 주자인데 Zellij는 여기서 한 발 더 나아갑니다. 화면 하단에 상태바가 있어서 현재 누를 수 있는 단축키를 실시간으로 알려줍니다. 모드 기반 인터페이스로 키 충돌 없이 기능을 제공하고, 세션 부활(resurrection) 기능으로 Zellij를 완전히 종료했다가 다시 켜도 이전 레이아웃을 복원할 수 있어요.

Zellij 설치

macOS에서는 Homebrew로 간편하게 설치할 수 있습니다.

$ brew install zellij

Rust 개발자라면 Cargo로도 설치 가능하고요.

$ cargo install --locked zellij

설치 없이 그냥 한 번 체험해 보고 싶으시다면 원라이너 스크립트도 제공됩니다.

$ bash <(curl -L zellij.dev/launch)

이 명령어를 실행하면 임시로 Zellij 바이너리를 다운로드해서 바로 실행해볼 수 있어요. 설치 전에 살짝 맛보기 용도로 딱입니다.

Linux 사용자분들도 대부분의 패키지 매니저를 통해 설치할 수 있고, GitHub 릴리즈 페이지에서 바이너리를 직접 다운로드하는 방법도 있습니다.

기본 사용법

설치가 끝났으면 터미널에서 zellij를 입력해보세요.

$ zellij

실행하면 기존 터미널 화면이 Zellij 안으로 들어가면서 화면 상단에 탭 바, 하단에 상태바가 나타납니다. 이 상태바가 Zellij의 핵심이에요. 현재 모드에서 쓸 수 있는 단축키가 전부 표시되니까 별도로 뭔가를 암기할 필요가 없습니다.

Zellij는 모드(mode) 기반으로 동작합니다. Vim을 써보셨다면 익숙한 개념일 텐데요, 현재 어떤 모드에 있느냐에 따라 같은 키가 다른 동작을 합니다.

기본적으로 Normal 모드에서 시작하는데, 자주 쓰는 단축키 몇 가지만 알면 바로 쓸 수 있습니다.

  • Alt(⌥) + n(New) — 새 패널 생성
  • Alt(⌥) + h/j/k/l 또는 Alt(⌥) + 방향키 — 패널 간 이동 (좌우는 탭 이동도 겸함)
  • Alt(⌥) + f(Floating) — 플로팅 패널 토글
  • Ctrl(⌃) + q(Quit) — Zellij 종료

이 네 가지만 알아도 기본적인 사용은 충분합니다. 나머지는 화면 하단 상태바를 보면서 하나씩 익히면 돼요.

macOS 사용자라면 한 가지 주의할 점이 있는데요. macOS 터미널에서는 Option(⌥) 키가 기본적으로 특수문자 입력용으로 설정되어 있어서 Zellij의 Alt 단축키가 바로 안 먹을 수 있습니다. iTerm2를 쓰시는 분은 Profiles → Keys → General에서 Left/Right Option key를 “Esc+“로 바꿔주시면 되고, 기본 Terminal.app에서는 Profiles → Keyboard에서 “Use Option as Meta key”를 체크하면 됩니다.

패널(Pane) 관리

패널은 Zellij에서 가장 많이 다루게 되는 단위입니다. 화면을 분할해서 여러 터미널을 동시에 보여주는 각각의 영역이 패널이에요.

패널 관련 기능은 Pane 모드(Ctrl(⌃) + p(Pane))에서 사용합니다. 진입하면 상태바에 쓸 수 있는 키가 바로 표시되는데요.

  • d(Down) — 아래로 분할 (수평 분할)
  • r(Right) — 오른쪽으로 분할 (수직 분할)
  • x(eXit) — 현재 패널 닫기
  • p(Pane) — 패널 포커스 전환

예를 들어 Ctrl(⌃) + p를 누른 다음 r을 누르면 현재 패널의 오른쪽에 새로운 패널이 생깁니다. 직접 해보시면 감이 바로 올 거예요.

그리고 플로팅 패널이라는 재미있는 기능도 있는데요. Alt(⌥) + f를 누르면 기존 레이아웃 위에 떠다니는 패널이 나타납니다. 잠깐 명령어 하나 실행하고 싶을 때 레이아웃을 건드리지 않고 띄웠다 닫았다 할 수 있어서 정말 편리합니다. 숨겨두어도 명령어가 계속 실행되기 때문에 백그라운드 작업용으로도 쓸 만합니다.

패널 크기를 조절하고 싶으면 Resize 모드(Ctrl(⌃) + n(Resize))에 진입해서 방향키로 조절하면 됩니다. 패널 하나를 전체 화면으로 키우고 싶을 때는 Pane 모드에서 f(Fullscreen)를 누르면 전체 화면 토글이 됩니다.

탭 관리

패널이 한 화면 안에서 분할하는 거라면, 탭은 완전히 다른 화면으로 전환하는 개념입니다. 예를 들어 “프론트엔드” 탭, “백엔드” 탭, “인프라” 탭 이런 식으로 작업 맥락별로 나눌 수 있죠.

탭 관련 기능은 Tab 모드(Ctrl(⌃) + t(Tab))에서 사용합니다.

  • n(New) — 새 탭 생성
  • x(eXit) — 현재 탭 닫기
  • r(Rename) — 탭 이름 변경
  • 방향키 — 탭 간 이동

탭 이름을 지정해두면 나중에 탭이 많아졌을 때 원하는 작업 공간을 빠르게 찾을 수 있어요. 숫자키 Alt(⌥) + 1, Alt(⌥) + 2, Alt(⌥) + 3으로도 탭을 바로 이동할 수 있습니다.

세션 관리

세션은 Zellij의 전체 작업 공간을 의미합니다. 탭과 패널의 배치부터 실행 중인 명령어까지 모두 세션에 포함되죠.

이름을 지정해서 세션을 시작할 수 있습니다.

$ zellij -s my-project

현재 실행 중인 세션 목록은 다음 명령어로 확인합니다.

$ zellij ls

작업 중에 세션을 분리(detach)하려면 Session 모드(Ctrl(⌃) + o(Session))에서 d(Detach)를 누르면 됩니다. 세션이 분리되면 Zellij 화면에서 빠져나오지만 세션 안의 프로세스는 백그라운드에서 계속 실행됩니다.

다시 붙으려면 이렇게 하면 돼요.

$ zellij attach my-project

여러 세션을 오가면서 작업해야 할 때는 세션 매니저가 편리합니다. Ctrl(⌃) + o를 누른 다음 w(Session-manager)를 누르면 세션 매니저가 열리는데요. 현재 실행 중인 모든 세션을 목록으로 보여주고, 선택하면 바로 전환됩니다.

그리고 Zellij의 킬러 기능 중 하나가 세션 부활(resurrection)인데요. Ctrl(⌃) + q로 Zellij를 완전히 종료해도 세션 메타데이터가 자동으로 저장됩니다. 나중에 세션 매니저(Ctrl(⌃) + ow)를 열고 Tab 키를 누르면 종료된 세션(EXITED) 목록이 나타나요. 여기서 원하는 세션을 선택하면 패널과 탭 레이아웃이 그대로 복원됩니다. 복원된 패널에서는 이전에 실행했던 명령어가 “Press ENTER to run…”이라는 메시지와 함께 표시되어, 원하는 것만 골라서 다시 실행할 수 있습니다.

컴퓨터를 재부팅해도 세션을 살릴 수 있으니 장기 프로젝트 작업할 때 안심이 되죠.

레이아웃 설정

매번 Zellij를 켜고 패널을 수동으로 분할하는 건 귀찮을 수 있는데요. 레이아웃 파일을 만들어두면 한 번에 원하는 작업 환경을 구성할 수 있습니다.

Zellij의 레이아웃은 KDL(KDL Document Language) 포맷으로 작성합니다. 간단한 예제부터 살펴볼까요?

layout {
    pane split_direction="vertical" {
        pane
        pane
    }
}

이렇게 하면 화면을 수직으로 반으로 나눈 레이아웃이 만들어집니다.

좀 더 실용적인 예제를 보겠습니다. 풀스택 개발할 때 쓸 만한 레이아웃이에요.

layout {
    tab name="code" focus=true {
        pane split_direction="vertical" {
            pane size="60%"
            pane split_direction="horizontal" {
                pane command="npm" {
                    args "run" "dev"
                }
                pane
            }
        }
    }
    tab name="server" {
        pane split_direction="horizontal" {
            pane command="docker" {
                args "compose" "logs" "-f"
            }
            pane
        }
    }
}

첫 번째 탭은 “code”라는 이름으로, 왼쪽 60%에 에디터를 열 공간을 두고 오른쪽에는 개발 서버와 여유 터미널을 배치했습니다. 두 번째 탭은 “server”로, Docker 로그를 보면서 추가 작업을 할 수 있게 구성했고요.

이 레이아웃 파일을 dev.kdl로 저장한 다음, 아래 명령어로 실행하면 됩니다.

$ zellij --layout dev.kdl

프로젝트마다 레이아웃 파일을 하나씩 만들어두면 매번 같은 환경을 빠르게 셋업할 수 있어서 생산성이 올라갑니다.

마치며

Zellij는 터미널 멀티플렉서가 처음인 분들에게 특히 추천하고 싶은 도구입니다. 상태바가 단축키를 계속 안내해주니까 tmux처럼 키 바인딩을 달달 외우지 않아도 되고, 모드 기반 인터페이스 덕분에 기능이 깔끔하게 정리되어 있어요. 플로팅 패널이나 세션 부활, KDL 레이아웃은 한번 맛보면 없이는 못 살게 됩니다.

터미널 기반 개발 환경을 제대로 갖추고 싶다면 NeoVim과 함께 쓰는 것도 추천합니다. NeoVim으로 코드를 편집하면서 Zellij로 터미널을 분할하면 마우스 없이도 쾌적한 개발 워크플로우를 만들 수 있어요. 터미널 앱 자체를 바꿔보고 싶다면 Ghostty도 한번 살펴보세요.

더 자세한 내용은 Zellij 공식 문서에서 확인하실 수 있습니다.

This work is licensed under CC BY 4.0 CC BY

Discord