요약. 1편 끝에 "WezTerm의 화면 분할에는 이 성질이 없습니다. 창을 닫으면 그 안의 작업도 끝납니다" 라고 적었습니다. 기본 설정에서만 맞는 말이었습니다. 설정 한 줄이면 창을 닫아도 그 안의 작업이 계속 돌고, 나눠 놓은 화면 구성까지 그대로 돌아옵니다. 제 PC에서 확인한 그대로 옮깁니다.
창을 닫아도 빌드는 계속 돕니다
터미널 창에 명령을 걸어 두면 창을 닫는 순간 명령도 같이 죽습니다. 창과 프로그램이 한 몸이기 때문입니다.
이 둘을 떼어 놓을 수 있습니다. 프로그램은 뒤에서 도는 별도의 서버가 붙들고 있고, 창은 그것을 들여다보는 유리창 역할만 맡습니다. 유리창을 치워도 안쪽은 계속 돕니다. 다시 갖다 대면 그동안 쌓인 출력까지 보입니다.
이런 상황을 생각하면 쉽습니다. 화면을 셋으로 나눠 왼쪽에서 dotnet build 를 돌리고, 오른쪽 위에서 로그를 보고, 오른쪽 아래에 셸을 하나 열어 뒀습니다. 빌드는 10분쯤 걸립니다. 여기서 창을 닫아도
- 빌드는 중단되지 않고 계속 진행되며
- 나중에 다시 열면 그 세 칸 구성이 크기까지 그대로 돌아오고
- 닫기 전에 찍혔던 출력도 남아 있습니다
터미널이 멈춰서 다시 띄워야 할 때, 설정을 고쳐 재시작해야 할 때, 실수로 창을 닫았을 때 모두 같습니다. 창만 새로 붙이면 하던 자리로 돌아갑니다.
1편에서 tmux 는 자기가 도는 리눅스 안쪽 세계에 갇힌다고 적었습니다. 여기서 작업을 붙들어 두는 서버는 Windows 프로그램이라 그 제약이 없습니다. 칸마다 Git Bash 를 띄우든 PowerShell 로 닷넷 빌드를 돌리든 똑같이 살아남습니다.
설정 한 줄과 단축키 둘
~/.wezterm.lua 에 세션을 정의하는 줄을 하나 넣습니다. mux 는 제가 붙인 이름이라 원하는 대로 바꿔도 됩니다.
config.unix_domains = { { name = "mux" } }
이 줄만으로는 아무것도 달라지지 않습니다. WezTerm 은 평소처럼 평범한 창으로 열리고, 세션에 들어갈지는 그때그때 고릅니다. 그래서 드나드는 단축키를 하나씩 답니다. 1편에서 만든 leader 함수를 그대로 씁니다.
leader("a", act.AttachDomain("mux")) -- 세션에 붙기
leader("e", act.DetachDomain("CurrentPaneDomain")) -- 세션에서 빠져나오기
서버는 따로 띄우지 않아도 처음 붙을 때 알아서 뜹니다. 세션이 비어 있으면 칸 하나짜리로 시작하고, 이미 쓰던 세션이 있으면 그 구성을 그대로 불러옵니다.
닫고 되살리는 순서
- 위 설정을 저장합니다. 저장하는 순간 반영됩니다.
Ctrl+U다음a로 세션에 붙습니다. 처음에는 칸 하나짜리로 시작합니다.- 평소대로 화면을 나누고 빌드를 겁니다. 1편의
Ctrl+U다음w,v를 그대로 씁니다. Ctrl+U다음e로 빠져나옵니다. 그냥 창을 닫아도 결과는 같습니다.- 다시
Ctrl+U다음a. 나눠 둔 구성이 그대로 뜹니다.
제가 확인한 결과입니다. 화면을 셋으로 나눠 둔 상태에서 창을 닫고 다시 붙였더니 각 칸의 크기가 닫기 전과 한 글자도 다르지 않았고, 닫기 전에 출력된 줄도 그대로 남아 있었습니다. 창이 하나도 없는 동안에도 서버 프로세스는 계속 떠 있었습니다.
4번에서 창을 닫는 쪽과 e 를 누르는 쪽이 같아 보이는 것은 정상입니다. 세션 칸으로만 채워진 창이라면 세션을 떼어내는 순간 그 창에 남는 것이 없기 때문입니다.
주의할 점은 둘입니다. 작업을 붙들고 있는 것은 PC에서 도는 서버 프로세스이므로, PC를 끄거나 다시 시작하면 사라집니다. 창을 닫는 것과 컴퓨터를 끄는 것은 다릅니다. 그리고 창을 닫아도 세션은 끝나지 않으니, 걸어 둔 작업을 정말 끝낼 때는 각 칸을 닫아야 합니다.
정리
창과 프로그램을 떼어 놓으면 창을 닫아도 빌드가 이어지고, 나눠 둔 화면 구성 그대로 다시 불러옵니다. 설정은 한 줄이고, 드나드는 것은 단축키 둘입니다. 1편에서 tmux 쪽이 낫다고 꼽았던 지점 하나가 이걸로 사라집니다.
한 줄을 넣고 Ctrl+U 다음 a 를 눌러 보십시오. 화면을 나눈 다음 빠져나왔다 다시 들어오는 데까지 5분이면 됩니다.
