터미널과 파일과 소스 컨트롤
워커가 고친 파일을 직접 열어 보고 싶어지는 때가 옵니다. 테스트를 한 번 돌려 보거나 워커가 쌓아 둔 커밋을 확인해 통합 브랜치로 올리는 일도 마찬가지입니다. 그러자고 다른 앱으로 나갈 필요는 없습니다.
그 일을 하는 화면이 홈입니다. 프로젝트에 들어가면 뜨는 그 화면이고, 다른 화면에서 왔다면 헤더 왼쪽 끝의 로고를 누르세요. 좌측 패널 맨 위에 아이콘 여섯이 나란히 붙어 있습니다.
표면 여섯
세션, 커맨드, 터미널, 소스 컨트롤, 탐색기, 브라우저. 이 여섯을 표면이라고
부릅니다. 그 줄에는 아이콘만 붙어 있고 이름이 글자로 적혀 있지 않습니다. 어느 것이 어느
표면인지 헷갈리면 마우스를 올려 보세요. 이름이 툴팁으로 뜹니다. 이 장이 아래에서 쓰는 이름이
그 이름입니다. 탭을 하나도 안 연 프로젝트에서는 세션이 골라져 있고 그 아래는 대화와
워커 세션 두 그룹입니다. 표면 이름과 그룹 이름에 같은 낱말이 들어가지만 층이 다릅니다.
세션은 두 그룹을 함께 포괄하는 표면 이름이고, 워커 세션은 그 아래 놓인 두 목록 가운데
하나입니다.
다른 표면으로 옮겨도 주소는 그대로입니다. 헤더에 있는 화면 목록도 그대로입니다. 바뀌는 것은 좌측 패널의 아래 단과 오른쪽 칸 둘뿐입니다.
| 고른 표면 | 키 | 좌측 패널 아래 단 | 오른쪽 칸 |
|---|---|---|---|
세션 | ⌘1 | 대화, 워커 세션 | 대화 탭 줄과 스레드 |
커맨드 | ⌘2 | 커맨드 목록과 새 커맨드 버튼 | 고른 커맨드의 단계와 마지막 예약 실행 |
터미널 | ⌘3 | 열어 둔 터미널 목록과 작업 디렉터리 고르기, 새 터미널 버튼 | 터미널 탭 줄과 셸 화면 |
소스 컨트롤 | ⌘4 | 루트와 워크트리 목록, 고른 자리의 git status | 대화 탭 줄과 스레드 그대로 |
탐색기 | ⌘5 | 파일 트리와 찾기 | 지금 연 파일 하나 |
브라우저 | ⌘6 | 지금 도는 브라우저 목록과 그 주인 | 고른 브라우저의 화면 |
표면은 키로도 고릅니다. 홈에서 ⌘1부터 ⌘6까지 누르면 위 표의 순서대로 표면이 바뀌고, 그
아이콘을 누른 것과 결과가 같습니다. 윈도우와 리눅스에서는 ⌘ 대신 Ctrl을 씁니다. 숫자는
아이콘이 왼쪽부터 놓인 순서이고, 아이콘에 마우스를 올리면 툴팁에 이름과 그 키가 같이 뜹니다.
프롬프트 칸에 글을 쓰던 중이어도 키가 듣습니다. 표면을 옮겼다 돌아오면 쓰던 글이 그대로
있습니다. 터미널에 커서가 있을 때도 표면이 바뀌고, 그 키는 셸로 가지 않습니다. 브라우저 표면에
뜬 페이지 안을 누른 뒤라면 그 페이지가 키를 먼저 받습니다. Shift나 Alt를 같이 누르면
아무 일도 없습니다. 보드처럼 홈이 아닌 화면에서 눌러도 마찬가지입니다. 이 여섯 조합은
키설정에서 다른 동작에 지정할 수 없습니다.
크롬에서 웹판으로 열었다면 크롬이 ⌘1~⌘8을 탭 전환에 먼저 쓸 수 있습니다. 그때는 아이콘을
누르세요. 데스크톱 앱에서는 이런 일이 없습니다.
커맨드 표면에서 하는 일은 커맨드에서 따로 다룹니다. 이 장에 남는 것은
나머지 다섯입니다.
탭이 되는 것은 대화와 터미널과 탐색기에서 연 파일과 브라우저, 이 넷입니다. 탭은 다 합쳐 열두 개까지 열립니다. 넘으면 가장 오래 안 본 탭이 저절로 닫힙니다.
탭이 탭 줄 너비를 넘으면 탭 줄을 가로로 스크롤해서 나머지를 봅니다. 다른 화면에 갔다가 홈으로 돌아오면 탭 줄이 골라 둔 탭까지 저절로 스크롤됩니다. 앱 안의 링크를 눌러 링크 브라우저 탭이 골라졌을 때도 그 탭이 탭 줄 안에 들어옵니다. 이미 보이는 탭이면 탭 줄은 움직이지 않습니다.
새로고침해도 보던 화면이 남습니다
브라우저를 새로고침하면 보고 있던 탭이 그대로 골라진 채로 뜹니다. 파일 탭을 보고 있었다면 그 파일이, 터미널 탭이었다면 그 터미널 탭이, 대화 탭이었다면 그 대화가 오른쪽 칸에 그대로 있습니다. 탭 줄의 표식도 같은 탭에 붙어 있습니다.
좌측 패널은 그 탭을 따라옵니다. 파일 탭이면 탐색기, 터미널 탭이면 터미널, 브라우저 탭이면
브라우저, 대화 탭이면 세션이 골라집니다. 탭을 하나도 안 연 프로젝트를 열었을 때만
세션으로 시작합니다.
소스 컨트롤과 커맨드 둘은 좌측 패널이 안 돌아옵니다. 이 둘은 탭을 열지 않는 표면이라,
새로고침한 화면이 어느 표면이었는지 알 방법이 없습니다. 좌측 패널은 세션이 되고 오른쪽 칸에는
보던 대화가 뜹니다. 아이콘을 한 번 더 누르면
보던 표면으로 갑니다.
다만 셸까지 남지는 않습니다. 브라우저를 새로고침하거나 표면을 나갔다 돌아오면 터미널 탭에
끊긴 터미널입니다가 뜨고 좌측 목록의 그 줄에는 끊김이 붙습니다. 셸은 앱이 도는 동안
메모리에만 있어서 화면을 다시 그리면 연결이 끊어집니다. 다시 열기를 누르면 같은
디렉터리에서 새 셸이 뜹니다. 앞서 입력한 명령과 그 출력은 돌아오지 않습니다.
같은 프로젝트를 창 둘에서 열면
한 프로젝트를 브라우저 창 둘에서 동시에 열어도 됩니다. 이때 두 창이 나눠 갖는 것과 창마다 따로 남는 것이 나뉩니다.
| 창 둘이 같이 보는 것 | 창마다 따로 남는 것 |
|---|---|
| 탭 줄에 늘어선 탭 목록 | 그 가운데 지금 골라 둔 탭과 탭 줄의 표식 |
| 파일에 저장한 내용과 쌓인 커밋 | 오른쪽 칸에 뜬 대화 |
저쪽 창에서 파일을 하나 열면 이쪽 창의 탭 줄에도 그 탭이 곧 나타납니다. 그래도 이쪽 화면은 그대로입니다. 표식은 보던 탭에 그대로 있고 오른쪽 칸도 그대로입니다. 저쪽에서 다른 대화로 옮겼을 때도 같습니다. 이쪽에서 새로고침하면 이쪽이 보던 자리로 돌아옵니다.
따라오는 것은 하나뿐입니다. 저쪽 창이 이쪽에서 보고 있던 탭을 닫으면 그 탭은 이쪽 탭 줄에서도 사라집니다. 이때 표식이 빈자리에 남지 않고, 열려 있는 탭 가운데 가장 최근에 본 것으로 옮겨 갑니다. 좌측 패널도 그 탭을 따라갑니다.
창을 새로 열면 탭 목록은 두 창이 같이 보는 것이라 그대로 늘어서 있고, 그 가운데 가장 최근에 본 탭이 골라진 채로 뜹니다.
탭을 닫는 방법
탭마다 오른쪽 끝에 X가 붙습니다. 하나씩 닫을 때는 그 X를 누르세요. 열두 개가 다 찬 탭 줄을 정리하려고 X를 열 번 누를 필요는 없습니다. 탭 하나를 우클릭하면 메뉴가 뜹니다. 항목은 넷입니다.
| 항목 | 닫는 범위 |
|---|---|
좌측 탭 모두 닫기 | 우클릭한 탭보다 왼쪽에 있는 탭 전부 |
닫기 | 우클릭한 탭 하나. 그 탭의 X를 누른 것과 같습니다 |
우측 탭 모두 닫기 | 우클릭한 탭보다 오른쪽에 있는 탭 전부 |
다른 탭 닫기 | 우클릭한 탭 하나만 남기고 나머지 전부 |
좌우는 화면에 늘어선 순서 그대로입니다. 최근에 본 순서도 지금 골라 둔 탭도 좌우를 판정하는
기준에 들어가지 않습니다. 우클릭한 탭 자신도 좌우 어느 쪽에도 포함되지 않습니다.
좌측 탭 모두 닫기를 눌러도 그 탭은 그대로 남습니다.
메뉴 맨 아래 다른 탭 닫기를 누르면 좌우를 구분하지 않고 우클릭한 그 탭 하나만 남습니다. 좌측과
우측을 잇달아 누른 결과와 같습니다. 한 장만 남기고 나머지를 다 닫을 때는 이 항목 하나로
끝납니다.
맨 왼쪽 탭을 우클릭하면 좌측 탭 모두 닫기가 흐리게 뜨고 눌리지 않습니다. 그쪽에 닫을 탭이
없어서 그렇습니다. 열린 탭이 그 하나뿐이면 다른 탭 닫기도 같은 이유로 흐리게 뜹니다. 항목이
사라지지는 않으니 누르는 위치는 어느 탭에서나 같습니다. 탭 줄의 빈 자리를 우클릭하면 이
메뉴가 안 뜹니다. 포인터 아래에 탭이 없으면 좌우를 구분할 수가 없습니다.
고쳐 놓고 저장하지 않은 파일 탭은 여러 장을 한꺼번에 닫는 세 항목에서 안 닫힙니다. 왼쪽
다섯 장을 닫았는데 한 장이 그대로 남아 있으면 그 탭입니다. 다른 탭 닫기를 눌러도 그 파일
탭은 우클릭한 탭과 함께 남습니다. 우클릭한 탭 말고 남은 탭이 전부 그런 파일 탭이면 다른 탭 닫기가 흐리게 떠서 눌리지 않습니다. 편집 중인 내용을 말없이 버리지 않으려고 그렇게 했습니다.
저장한 다음 다시 우클릭하면 그때는 같이 닫힙니다.
그 탭 하나를 닫기로 지목했을 때는 다릅니다. X를 누른 것과 같이 그대로 닫힙니다. 저장하지
않은 편집은 없어집니다.
세션의 페르소나
대화 칸 맨 위에 페르소나 셀렉트가 하나 있습니다. 이 프로젝트의 페르소나 가운데 프로필이 있는
이름이 전부 뜹니다. 처음에는 archive-manager입니다. pm을 골라 물으면 pm의 프로필이 실린 채로
답합니다. 그 프로필이 무엇인지는 페르소나 장에서 다룹니다.
- 회차가 하나라도 있으면 셀렉트가 잠깁니다. 한 대화에 페르소나 둘의 말이 섞이면 그 답이
무엇을 근거로 나온 것인지 나중에 아무도 구별하지 못합니다. 다른 페르소나로 물으려면
새 대화를 누르세요. - 커맨드의
프롬프트단계에는 이 칸이 없습니다. 그 단계는 프로필 없이claude -p한 번으로 돕니다(커맨드 참고).
페르소나를 바꿔도 권한은 안 넓어집니다. developer를 골라도 apps/ 아래를 못 고치고
pm을 골라도 여기서 커밋하거나 푸시하지 못합니다. 세션이 쓰는 도구와 쓰기 권한이 미치는
범위는 고른 이름과 무관하게 하나입니다(화면 소개 참고). 달라지는 것은
프롬프트에 실리는 프로필 글 한 벌뿐입니다.
넓은 권한이 필요한 일은 티켓으로 발행하세요. 워커가 그 티켓을 받으면 그때는 모든 도구를 씁니다. 홈에서 대화하다 요구사항으로 올려 달라고 해도 되고 보드에서 직접 발행해도 됩니다 (티켓 직접 발행하기 참고).
홈 대화는 열린 탭을 압니다
터미널에 뜬 에러를 복사해 붙일 필요가 없습니다. 탭을 열어 둔 채 세션에 터미널에 방금 뭐가 찍혔어?라고 물으면 됩니다. 질문을 보내는 순간 앱이 오른쪽 탭 줄의 목록을 함께 실어 보냅니다.
목록은 가장 최근에 본 탭부터 적힙니다.
| 탭 | 홈 대화가 받는 것 |
|---|---|
| 대화 | 제목과 페르소나. 지금 묻는 대화 자신이면 (이 대화)가 붙습니다 |
| 터미널 | 작업 디렉터리, 마지막 명령, 작업중 여부, 화면 끝 40줄. 색 코드는 벗기고 한 탭에 4,000 B를 넘으면 앞쪽을 자릅니다 |
| 파일 | 절대경로. 저장 안 한 탭이면 (저장 안 함)이 붙습니다 |
| 브라우저 | 해시와 지금 주소와 페이지 제목 |
받는 것은 목록뿐이고 내용은 홈 대화가 직접 읽습니다. 파일은 그 경로를 열어서 읽는데, 이때 읽는 것은 디스크에 저장된 내용입니다. 편집기에서 고치고 아직 저장하지 않은 부분은 홈 대화가 못 봅니다. 물어보기 전에 저장하세요. 다른 대화 탭은 제목만 알고 그 대화가 주고받은 내용은 읽지 않습니다.
마지막 명령은 좌측 터미널 목록의 윗줄에 뜨는 그 명령이고, 목록에 작업 중이 뜬 터미널은
홈 대화에도 작업중으로 갑니다. 그래서 빌드 아직 도는 중이야?나 아까 무슨 명령을 돌렸지?도
물을 수 있습니다. 한 번도 엔터를 안 친 터미널은 명령 자리가 비어 가고, 프롬프트에서 다음 명령을
기다리는 터미널에는 작업중이 안 붙습니다.
셸이 끝난 터미널은 화면 없이 작업 디렉터리 옆에 끊김만 적혀 갑니다. 브라우저가 이미
반납됐거나 1초 안에 답하지 않으면 그 줄은 (슬롯 없음)입니다. 탭을 하나도 안 열었으면 목록
자리에 열린 탭이 없다. 한 줄이 갑니다. 탭 줄을 저장한 기록을 앱이 못 읽었을 때는 이 줄이 가지
않습니다. 대신 탭 목록을 못 읽었다: 뒤에 사유가 붙은 한 줄이 갑니다. 탭이 없는 경우와 목록을
못 읽은 경우는 이렇게 서로 다른 줄로 갑니다.
어느 탭을 지금 보고 있는지는 홈 대화가 모릅니다. 최근에 본 순서로 짐작할 뿐입니다. 탭이 여럿이면 "방금 연 파일" 대신 파일 이름을 말해 주세요.
워커의 브라우저는 보기만 합니다
브라우저 탭은 주인에 따라 홈 대화가 할 수 있는 일이 갈립니다. 주인이 홈 대화이거나 링크인
브라우저는 홈 대화가 페이지를 옮기고 누를 수 있습니다. 주인이 워커이거나 외부 호출인
브라우저는 읽기 전용입니다. 목록의 그 줄에 읽기 전용 - 주인이 쓰는 중이 적혀 가고, 홈 대화는
그 브라우저에 명령을 보내지 않습니다. 워커가 화면을 재는 중에 페이지가 움직이면 그 티켓의
결과가 어긋나기 때문입니다. 워커가 연 페이지의 주소나 제목은 물어도 됩니다. 목록에 이미 적혀
있으니 홈 대화가 브라우저를 건드리지 않고 답합니다.
탭에 손대지 않습니다
홈 대화는 사람의 터미널에 글자를 입력하지 않습니다. 사람이 치던 명령과 섞이면 어느 쪽이 친 것인지 아무도 모르게 됩니다. 명령을 돌려야 하면 홈 대화는 자기 셸에서 따로 돌립니다. 탭을 열거나 닫지도 않습니다. 탭 줄은 사람이 일하는 자리라서 무엇을 열어 둘지는 사람이 정합니다.
워커는 이 목록을 받지 않습니다. 워커는 사람이 연 탭과 상관없이 자기 티켓 하나만 수행합니다.
터미널
터미널을 고르면 좌측 패널 아래 단이 터미널 목록이 됩니다. 그 목록의 머리 줄 오른쪽에
새 터미널 버튼이 있고 바로 아래에 작업 디렉터리 고르기가 붙습니다. 새로 여는 곳과 열어
둔 것을 보는 곳이 모두 왼쪽 한 군데입니다.
작업 디렉터리에서 셸을 띄울 위치를 고릅니다. 프로젝트 루트와 워커들의 워크트리가 전부 목록에 있습니다.새 터미널을 누릅니다. 왼쪽 목록에 줄이 하나 늘고 오른쪽 칸에 프롬프트가 그려집니다.- 명령을 칩니다. 색이 붙은 출력도 그대로 뜨고
vim이나top처럼 화면을 통째로 그리는 프로그램도 돕니다.
오른쪽 칸에 남는 것은 터미널 탭 줄과 셸 화면입니다.
목록의 한 줄
줄 하나가 열어 둔 터미널 하나입니다. 윗줄 왼쪽에는 그 터미널에서 마지막으로 엔터를 친 명령이
그대로 뜹니다. 아직 한 번도 엔터를 안 쳤으면 그 자리에 아직 친 명령이 없습니다가 뜹니다.
윗줄 오른쪽은 표식 자리입니다. 친 명령이 아직 도는 중이면 작업 중이 뜹니다. 셸이
끊어졌으면 끊김입니다. 프롬프트에서 다음 명령을 기다리는 중일 때는 아무 표식도 안 붙습니다.
아랫줄은 그 셸이 도는 작업 디렉터리입니다. 루트에서 열었으면 루트라고 뜹니다. 워크트리에서
열었으면 그 워크트리를 쓰는 워커 id가 대신 뜹니다. 아래 소스 컨트롤에서 보는
그 낱말 그대로여서 루트라고 적힌 줄은 두 화면에서 같은 폴더를 가리킵니다. 어느 쪽이든
새 터미널을 누를 때 고른 그 위치이고 만든 다음에는 바뀌지 않습니다. 옮기려면 cd를 직접 치세요.
앱은 터미널 표면을 보고 있는 동안 이 목록을 5초마다 다시 읽습니다. sleep 30처럼 오래
걸리는 명령을 실행해 두고 다른 일을 하다 돌아와도 어느 터미널이 아직 도는 중인지 목록만 보면
됩니다. 표면을 소스 컨트롤이나 다른 데로 바꿔 두면 그동안은 앱이 이 목록을 안 읽습니다.
줄을 누르면 오른쪽 칸이 그 터미널로 바뀝니다. 오른쪽 탭 줄에서 그 탭을 누르는 것과 같습니다. 닫는 버튼은 탭 줄에만 있고 왼쪽 줄에는 없습니다.
셸은 이 맥에서 평소 쓰는 그 셸입니다. 앱이 대신 고르지 않습니다.
명령에 허용 목록이 없습니다. 터미널 앱에서 칠 수 있는 것은 여기서도 칩니다. 동시에 여덟 개까지
열립니다. 아홉 번째를 열려고 하면 동시에 열 수 있는 터미널은 8개까지입니다.가 뜹니다. 탭을
닫으면 그 셸도 같이 끝납니다.
진행중 티켓을 여기서 고치는 것은 막지 않습니다. 앱이 편집 기능을 제공하지 않는 것과 사람이
자기 맥에서 vim을 여는 것은 다른 일입니다. 다만 그 파일로 지금 세션이 일하고 있다는 사실은
그대로이니 아래 진행중 티켓의 예외를 먼저 읽으세요.
탐색기
탐색기를 고르면 좌측 패널이 프로젝트 루트의 파일 트리가 됩니다.
- 디렉터리를 누르면 그 한 단계만 읽습니다. 큰 저장소에서도 처음 뜨는 데 시간이 안 걸립니다.
숨은 파일 보기가 켜진 채로 열립니다. 큐가 들어 있는.dira가 그 안쪽이라 그렇습니다. 끄면 점으로 시작하는 이름이 트리에서 빠집니다.- 한 디렉터리에 2,000개까지 그립니다. 넘으면 몇 개 가운데 몇 개를 그렸는지가 그 자리에 한 줄로 붙습니다.
- 워크트리 아래로도 내려갑니다. 다만 워크트리 안의
.dira처럼 이미 위쪽에서 펼친 디렉터리를 다시 가리키는 항목은 안 펼치고 사유를 알려 줍니다. 그러지 않으면 앱이 같은 경로를 끝없이 반복해 펼칩니다.
파일을 누르면 오른쪽 칸에 색이 입혀져 뜹니다. 고치고 저장을 누르면 디스크의 그 파일이
바뀝니다. 저장은 임시 파일을 쓴 다음 이름을 바꾸는 방식입니다. 세션이 그 파일을 읽는
중이어도 반쯤 쓰인 상태를 보는 일이 없습니다.
편집기가 하는 일은 열고 고치고 저장하는 셋입니다. 자동완성도 포매터도 없습니다.
안 열리는 파일
- 1MB가 넘는 파일과 텍스트가 아닌 파일은 안 엽니다. 사유와 함께
기본 앱으로 열기하나가 뜹니다. 맥에 등록된 기본 앱으로 넘깁니다. - 티켓과 페르소나와 프로토콜의 마크다운은 이 편집기가 안 엽니다. 누르면 그 파일을 원래 다루던 화면으로 넘어갑니다. 같은 파일을 편집기 둘로 여는 상황을 안 만들려고 그렇게 했습니다.
- 읽은 뒤에 남이 고친 파일은 안 덮습니다. 저장 직전에 파일을 다시 확인해서 바뀌었으면 쓰지 않고 알려 줍니다. 워커 여럿이 도는 저장소라 이 상황이 생각보다 자주 발생합니다. 다시 열어 확인한 다음 저장하세요.
진행중 티켓의 예외
진행중 티켓 파일은 어느 화면에서도 안 고쳐집니다. 탐색기에서 눌러도 편집기로 안 열리고 티켓
상세로 넘어가는데, 거기서는 세션에 할당된 티켓입니다 — 편집·삭제 잠금이 뜹니다.
그 파일로 지금 세션이 일하고 있어서 그렇습니다. 세션은 일하는 내내 그 파일의 체크 상자를 켜고
## 결과를 적습니다. 사람이 같은 파일을 동시에 덮으면 둘 중 한쪽이 조용히 사라집니다. 고쳐야
하면 티켓 상세의 할당 해제로 큐에 되돌린 다음 고치세요
(티켓이 지나는 상태 참고). 그래도 지금 당장 손봐야 한다면 터미널 탭에서 여는
방법을 막아 두지는 않았습니다.
파일 찾기
무엇을 찾느냐에 따라 누르는 곳이 달라집니다.
| 찾고 싶은 것 | 누르는 자리 |
|---|---|
| 프로젝트 안의 파일 이름 | 탐색기 좌측 트리 탭 위 칸 |
| 프로젝트 안의 파일 내용 | 탐색기 좌측 내용 찾기 탭 |
| 지금 열어 둔 파일 한 장 | 탐색기 표면에서 ⌘F |
| 터미널에 지나간 출력 | 터미널 표면에서 ⌘F |
트리와 내용 찾기는 탐색기 좌측 패널 맨 위에 붙은 탭 둘이고, 프로젝트 폴더 전체를 훑습니다.
⌘F가 훑는 범위는 오른쪽 칸에 지금 떠 있는 것 하나뿐입니다.
이름으로 찾기는 트리 탭 위 칸입니다. 치는 대로 트리가 그 이름에 그 글자가 든 파일로
걸러집니다. 프로젝트 폴더 아래를 한 번 훑어 이름 목록을 만들어 두고 .git과 node_modules와
.next는 뺍니다. 이름이 50,000개를 넘으면 거기서 자르고 더 좁혀 달라고 알려 줍니다.
내용으로 찾기는 내용 찾기 탭입니다. 칸에 치고 찾기를 누르면 그 글자가 든 줄이 파일
이름과 줄 번호와 함께 뜹니다. 결과 줄을 누르면 그 파일이 그 줄에서 열립니다. 결과는 200줄에서,
시간은 10초에서 자릅니다. 잘렸으면 그 사실이 목록 아래 한 줄로 붙으니 검색어를 좁혀서 다시
찾으세요.
좌측 패널의 두 찾기 모두 워크트리 사본을 기본으로 뺍니다. 워커가 여덟이면 같은 파일이
아홉 벌이라 결과가 아홉 배로 뜹니다. 워크트리 사본도 보기를 켜면 그 사본들도 들어옵니다.
⌘F로 지금 보고 있는 것에서 찾기
⌘F를 누르면 오른쪽 칸 위에 찾기 바가 뜹니다. 칸에 치는 대로 건수가 1/3처럼 붙습니다.
건수 오른쪽에는 화살표 둘과 X가 있습니다. 위 화살표가 이전이고 아래 화살표가 다음이며,
엔터를 쳐도 다음으로 갑니다. Esc나 X로 접으면 표시가 사라집니다. 이 키는 기본값이고 설정의
키맵에서 바꿉니다.
이 바가 훑는 범위는 표면마다 다릅니다.
- 탐색기 표면에서는 지금 보고 있는 파일 한 장입니다. 트리에 있는 다른 파일은 안 셉니다.
아직 저장하지 않은 글자까지 검색됩니다. 파일을 한 장도 안 열었으면
0/0만 뜹니다. 접으면 커서가 편집기로 돌아갑니다. - 터미널 표면에서는 골라 둔 터미널 탭 하나입니다. 화면에 떠 있는 32줄에서 그치지 않고 스크롤로 위에 올라간 줄까지 찾습니다. 거슬러 가는 한도는 5,000줄입니다. 화면 밖의 줄이 걸렸으면 아래 화살표를 누를 때 그 줄이 화면에 뜹니다. 접으면 곧바로 명령을 이어 칩니다.
- 나머지 표면에서는 오른쪽에 그대로 떠 있는 대화 스레드를 훑습니다.
표면을 바꾸거나 터미널 탭을 바꾸면 바가 닫힙니다. 앞서 센 건수는 새로 옮긴 곳에 남지 않습니다.
소스 컨트롤
소스 컨트롤을 고르면 좌측 패널에 이 프로젝트의 작업 폴더가 전부 뜹니다. 위가 루트, 아래가
워크트리 n입니다. 루트는 프로젝트 폴더 자체이고 워크트리는 워커마다 하나씩 갈라 놓은
사본입니다(워커 참고). 워크트리를 쓰지 않는 프로젝트라면 루트 한 줄만 뜹니다.
하나를 고르면 그 아래가 채워집니다.
- 브랜치 이름과
앞선 커밋 n과뒤처진 커밋 n이 뜹니다. 업스트림을 기준으로 몇 개 앞서고 몇 개 뒤처졌는지를 나타냅니다. - 업스트림 셀렉트. 지금 값이 거기 적혀 있고 원격 브랜치 목록에서 골라 바꿉니다. 아직 없으면
업스트림 없음으로 뜹니다. 전부 스테이지버튼과 목록 둘.스테이지 n과작업 트리 n입니다. 줄 하나를 누르면 두 목록 사이를 오갑니다. 파일 이름 앞에는고침과새 파일과지움과이름 바뀜이 붙습니다.- 커밋 메시지 칸과
커밋. 스테이지 목록이 비었거나 메시지가 비면 안 눌립니다. 메시지 칸에서Cmd+Enter(윈도우와 리눅스는Ctrl+Enter)를 치면커밋을 누른 것과 같습니다. 버튼이 안 눌리는 조건에서는 단축키도 아무 일을 안 합니다. 푸시와풀.
버튼을 누르면 그 버튼 글자가 바뀝니다. 커밋은 커밋 중..., 푸시는 푸시 중..., 풀은
풀 중..., 전부 스테이지는 스테이지 중..., 다시 읽기는 읽는 중...이 됩니다. 이 글자가
보이면 앱이 누른 것을 받아서 git을 돌리는 중입니다. 그동안 다른 버튼은 눌러도 먹히지 않습니다.
파일 한 줄을 눌렀다면 그 줄이 흐려지고 오른쪽 낱말이 옮기는 중...으로 바뀝니다.
글자가 원래대로 돌아오면 끝난 것입니다. 커밋과 푸시와 풀이 성공하면 버튼 줄 아래에
커밋했습니다나 푸시했습니다나 풀했습니다가 한 줄 뜹니다. 이 줄은 다음 버튼을 누르거나
다른 작업 폴더를 고를 때까지 남습니다. 실패하면 이 줄 대신 사유가 뜹니다.
커밋 메시지 칸은 커밋이 성공했을 때만 비워집니다. 실패하면 적은 메시지가 칸에 그대로 남으니, 사유를 보고 고친 뒤 다시 누르면 됩니다.
앱이 이 표면을 저절로 다시 읽지 않습니다. 표면을 여는 순간과 다시 읽기를 누를 때, 그리고
커밋과 푸시와 풀 직후에만 읽습니다. 열어 둔 채 자리를 비워도 git 프로세스가 새로 안 뜹니다.
워커가 그 사이 커밋했다면 다시 읽기를 눌러야 보입니다.
커밋 메시지에는 아무것도 자동으로 안 붙습니다. 워커의 커밋 맨 아래에 붙는 Ticket: 줄은 워커가
마무리하면서 답니다. 사람이 여기서 하는 커밋은 티켓에 연결되지 않습니다.
푸시가 향하는 곳
고르는 칸이 없습니다. 어느 작업 폴더를 고르고 있느냐가 곧 향하는 곳입니다.
| 고른 자리 | 푸시가 가는 곳 |
|---|---|
| 워크트리 | 이 맥 안의 통합 브랜치 |
| 루트 | 이 브랜치에 설정된 업스트림 (업스트림 셀렉트에 적힌 원격 브랜치) |
워크트리에서 푸시하는 경로는 워커들이 쓰는 경로와 같습니다. 여덟이 동시에 푸시해도 어긋나지
않도록 큐에 있는 push.sh가 순서를 잡습니다(워커 참고). 그 파일이 없는 프로젝트에서는
버튼 자리에 이 프로젝트에는 push.sh가 없다가 뜹니다. 앱이 대신 만들어 넣지 않습니다.
루트에서 푸시를 누르면 앱이 먼저 아래 풀과 같은 순서로 업스트림을 받아 합친 뒤 그 원격
브랜치로 보냅니다. 업스트림이 없으면 NO_UPSTREAM이 뜨고 아무것도 보내지 않습니다. git 설정상
푸시가 업스트림과 다른 곳으로 갈 상황이면(pushRemote나 push refspec이 다르게 잡혀 있는 경우)
PUSH_TARGET_MISMATCH를 띄우고 멈춥니다. 앱이 행선지를 짐작해서 고르지 않습니다.
풀은 업스트림을 fetch한 뒤 내 브랜치와 비교해서 동작을 정합니다.
| 상태 | 풀이 하는 일 |
|---|---|
| 같거나 내 쪽만 앞섬 | 아무것도 안 바꾸고 성공합니다 |
| 내 쪽이 뒤처지기만 함 | 빨리 감기(fast-forward)로 따라갑니다 |
| 양쪽에 서로 없는 커밋이 있음 | 머지 커밋을 하나 만들어 합칩니다. 메시지는 git이 정하는 기본값입니다 |
리베이스는 하지 않고, 이미 있는 커밋을 고쳐 쓰지도 않습니다. 받아 올 커밋이 있는데 작업 트리에
커밋하지 않은 변경이 남아 있으면 DIRTY_CHECKOUT을 띄우고 시작하지 않습니다. 머지 도중
충돌이 나면 이번에 시작한 머지만 되돌리고(git merge --abort) MERGE_CONFLICT와 git이 낸
사유를 보여 줍니다. 작업 폴더는 누르기 전 상태로 돌아갑니다. 충돌을 풀어서 합치려면 터미널
탭에서 직접 처리하세요.
브라우저
워커가 화면을 직접 확인해야 하는 티켓이 있습니다. QA가 배포된 사이트를 열어 보거나 디자이너가 방금 고친 화면을 확인하는 경우가 그렇습니다. 그때 워커는 브라우저를 창 없이 띄웁니다. 사람 화면에는 아무것도 안 뜨기 때문에 무슨 페이지를 보고 있는지 알 방법이 없었습니다.
브라우저 표면이 그 화면을 비춥니다. 좌측 패널에 브라우저 하나마다 줄이 하나 생기고, 줄마다
브라우저를 쥔 주인 이름과 해시 여덟 자가 같이 뜹니다. 주인이 티켓이면 이름 자리에 그 티켓의
페르소나와 제목이 옵니다.
홈 대화에서 띄운 브라우저도 같은 목록에 뜹니다. 그 줄의 이름은 홈 대화이고, 사람이 터미널에서
browse.sh를 직접 부른 줄은 외부 호출입니다. 앱 안의 링크를 눌러 열린 줄에는 링크가
붙습니다(화면 소개 참고). 이름 없이 해시만 적힌 줄도 있습니다. 주인을
슬롯에 적어 두는 규칙이 생기기 전에 뜬 옛 브라우저입니다. 앱이 주인을 추정해서 메우지는
않습니다.
줄 왼쪽 끝의 작은 점은 지금 그 브라우저로 명령이 도는 중이라는 표시입니다. 명령과 명령 사이에는 꺼집니다. 누가 쥐고 있는지는 이름으로 알고, 점으로는 화면이 지금 갈리는 중인지만 압니다.
아무도 브라우저를 쓰지 않으면 지금 실행 중인 브라우저가 없습니다가 뜹니다. 목록은 5초마다
저절로 갱신됩니다.
줄을 누르면 그 해시로 탭이 하나 열립니다. 이미 열어 둔 탭이 있으면 새로 만들지 않고 그 탭으로 옮겨 갑니다. 탭 종류가 이것으로 넷이 되고, 열두 개 상한도 넷이 함께 나눠 씁니다.
브라우저를 켜고 끄는 수단은 앱에 거의 없습니다. 띄우는 것도 반납하는 것도 그 브라우저를 쥔
쪽의 일입니다. 예외는 링크 브라우저 하나입니다. 그것은 화면이 띄우고 화면에서 반납합니다. 탭을 닫아도 브라우저는 그대로 돕니다. 닫히는 것은 화면을 실어 오던 연결
하나뿐입니다. 주인이 일을 마치고 반납하면 좌측 목록에서 그 줄이 빠집니다.
반납하지 않고 주인이 먼저 죽는 경우에도 줄이 빠집니다. 세션이 중간에 끊기면 그렇습니다. 그때는 5초 안에 줄이 사라지고 남아 있던 브라우저까지 같이 정리됩니다. 앱이 치우는 것은 주인이 이미 없는 자리뿐이라서 살아 있는 세션의 브라우저는 그대로 돕니다.
줄이 빠질 때 그 탭을 열어 둔 채였다면 화면이 브라우저가 반납되어 화면이 끊겼습니다로
바뀝니다. 탭은 저절로 안 닫히니 손으로 닫으세요.
만지려면 한 번 승인해야 합니다
브라우저 탭은 잠긴 채로 열립니다. 화면 위를 눌러도 그 클릭이 워커 쪽 페이지까지 안 갑니다. 대신 확인 창이 떠서 이렇게 묻습니다.
지금 이 브라우저로 세션이 일하는 중입니다. 만지면 그 회차의 실측이 어긋날 수 있습니다. 계속하시겠습니까?
취소하면 잠긴 그대로입니다. 승인하면 그때부터 마우스와 키보드 입력이 전달됩니다. 화면 머리
줄에는 잠겼든 걷혔든 <주인 이름>이 쓰는 중이 서 있고, 승인한 동안에는 그 줄에 입력 열림이
같이 붙고 오른쪽 끝에 다시 잠그기 버튼이 나타납니다. 열어 둔 것을 잊고 계속 누르는
일을 막으려고 붙여 둔 표식입니다. 다시 잠그기를 누르면 곧바로 잠깁니다.
이렇게 한 번 묻는 까닭은 워커와 같은 페이지를 만지기 때문입니다. 페이지가 하나뿐이라 사람이 스크롤하면 워커가 보던 자리도 같이 움직입니다. 워커가 화면을 측정하던 중이었다면 그 회차의 값이 어긋납니다. 급하면 눌러도 되지만 그 티켓의 결과가 한 번 어긋난다는 점은 알고 누르시는 편이 좋습니다.
승인은 남지 않습니다. 탭을 닫거나 새로고침하면 다시 잠긴 상태로 시작합니다.
도는 티켓의 화면을 보기만 할 거라면 여기까지 올 것도 없습니다. 티켓 상세의 오른쪽 단이 그 화면을 접힘 없이 깔아 둡니다. 그 절을 읽는 법은 화면 소개에 있습니다.
없는 것
- diff 뷰어가 없습니다. 파일 줄을 누르면 편집기로 열립니다.
- 머지와 리베이스와 브랜치 만들기와 태그가 없습니다.
push --force와reset --hard와stash버튼이 없습니다. 되돌리는 명령은 사람의 일로 남겨 뒀습니다.- 자동완성과 포매터와 디버거가 없습니다. 실행은 터미널 탭이 합니다.
- 원격 서버도 컨테이너도 열지 않습니다. 열리는 범위는 등록한 프로젝트의 폴더 하나입니다.
여기 없는 것이 필요하면 터미널 탭에서 직접 치면 됩니다. 사람이 자기 맥에서 할 수 있는 일을 앱이 줄이지는 않습니다.
다음은 티켓 직접 발행하기입니다.