# GNU Screen 빠른 참조

*세션, 윈도우, 분할, 복사 모드, 공유*

> Source: GNU Screen Manual (gnu.org/software/screen) · MIT

## 세션 관리

### 세션 생성 및 목록

```
screen                        # 이름 없는 새 세션
screen -S work                # "work"라는 이름의 새 세션
screen -ls                    # 모든 세션 목록
screen -list                  # -ls와 동일
```

### 세션 명령어

| Command | Description |
|---------|-------------|
| `screen -S name` | 이름 있는 새 세션 시작 |
| `screen -r name` | 분리된 세션에 재연결 |
| `screen -x name` | 이미 연결된 세션에 공유 연결 |
| `screen -d name` | 원격 세션 분리 |
| `screen -d -r name` | 다른 곳에서 분리 후 여기서 재연결 |
| `screen -D -RR` | 강제 분리 후 재연결 (적극적) |
| `screen -ls` | PID와 함께 모든 세션 목록 |
| `screen -wipe` | 죽은 세션 정리 |

## 윈도우

### 윈도우 기본

| Command | Description |
|---------|-------------|
| `Ctrl-a c` | 새 윈도우 생성 |
| `Ctrl-a n` | 다음 윈도우 |
| `Ctrl-a p` | 이전 윈도우 |
| `Ctrl-a 0-9` | 번호로 윈도우 전환 |
| `Ctrl-a "` | 모든 윈도우 목록 (대화형) |
| `Ctrl-a '` | 이름/번호로 윈도우 전환 |
| `Ctrl-a A` | 현재 윈도우 이름 변경 |
| `Ctrl-a k` | 현재 윈도우 종료 |

### 윈도우 관리

| Command | Description |
|---------|-------------|
| `Ctrl-a w` | 상태 표시줄에 윈도우 목록 표시 |
| `Ctrl-a Ctrl-a` | 마지막 두 윈도우 간 전환 |
| `Ctrl-a N` | 윈도우 번호와 이름 표시 |
| `exit / Ctrl-d` | 윈도우 닫기 (쉘 종료) |

## 분할 및 영역

### 분할 명령어

| Command | Description |
|---------|-------------|
| `Ctrl-a S` | 수평 분할 (위/아래) |
| `Ctrl-a \|` | 수직 분할 (왼쪽/오른쪽) |
| `Ctrl-a Tab` | 다음 영역으로 포커스 이동 |
| `Ctrl-a X` | 현재 영역 닫기 |
| `Ctrl-a Q` | 현재 영역 제외 모두 닫기 |

### 영역 워크플로

```
Ctrl-a S             # 수평 분할
Ctrl-a Tab           # 새 영역으로 이동
Ctrl-a c             # 영역에서 윈도우 생성
Ctrl-a :resize 20   # 영역을 20줄로 설정
```

## 복사 모드

### 스크롤백 및 복사

| Command | Description |
|---------|-------------|
| `Ctrl-a [` | 복사/스크롤백 모드 진입 |
| `Space` | 선택 시작/종료 (복사 모드에서) |
| `Enter` | 선택 복사 후 복사 모드 종료 |
| `Ctrl-a ]` | 복사한 텍스트 붙여넣기 |
| `h/j/k/l` | 커서 이동 (복사 모드에서 vi 키) |
| `Ctrl-u / Ctrl-d` | 반 페이지 위/아래 스크롤 |
| `/ or ?` | 앞/뒤로 검색 |
| `Esc` | 복사 모드 종료 |

### 복사 워크플로

```
Ctrl-a [         # 복사 모드 진입
Space            # 시작 표시 (먼저 이동)
Space            # 끝 표시 + 복사 (먼저 이동)
Ctrl-a ]         # 현재 윈도우에 붙여넣기
```

## 분리 및 재연결

### 분리

| Command | Description |
|---------|-------------|
| `Ctrl-a d` | 현재 세션 분리 |
| `Ctrl-a D D` | 분리 후 로그아웃 |
| `Ctrl-a z` | screen 일시 중단 (Ctrl-Z처럼) |
| `screen -d PID` | PID로 원격 세션 분리 |

### 재연결

```
screen -r                 # 재연결 (세션이 하나인 경우)
screen -r work            # 이름으로 재연결
screen -r 12345           # PID로 재연결
screen -d -r work         # 다른 터미널에서 세션 빼앗기
```

### 지속적인 워크플로

```
# 장시간 작업 시작, 분리, 나중에 재연결
screen -S build
make -j4 all        # 빌드 시작
Ctrl-a d             # 분리, 귀가
screen -r build      # 나중에 재연결
```

## 공유

### 다중 사용자 모드

```
# 호스트가 다중 사용자 활성화
Ctrl-a :multiuser on
Ctrl-a :acladd alice    # 사용자 alice에게 접근 권한 부여
# Alice가 연결
screen -x hostuser/sessionname
```

### 접근 제어

| Command | Description |
|---------|-------------|
| `:multiuser on` | 다중 사용자 모드 활성화 |
| `:acladd user` | 사용자에게 전체 접근 권한 부여 |
| `:aclchg user -w '#'` | 사용자를 읽기 전용으로 설정 (모든 윈도우) |
| `:acldel user` | 사용자 접근 권한 제거 |
| `screen -x user/sess` | 공유 세션에 연결 |

## 설정

### ~/.screenrc 필수 설정

```
startup_message off          # 시작 화면 건너뛰기
defscrollback 10000          # 스크롤백 버퍼 줄 수
hardstatus alwayslastline
hardstatus string '%{gk}%H %{wk}%?%-Lw%?%{bw}%n*%f %t%{wk}%?%+Lw%?'
shell -$SHELL                # 로그인 쉘 사용
```

### 유용한 설정

| Command | Description |
|---------|-------------|
| `startup_message off` | 시작 메시지 숨기기 |
| `defscrollback N` | 스크롤백 버퍼 설정 (기본 100) |
| `escape ^Bb` | 접두키를 Ctrl-b로 변경 |
| `shelltitle '$ \|bash'` | 윈도우 제목 자동 설정 |
| `caption always '%n %t'` | 항상 윈도우 정보와 함께 캡션 표시 |
| `autodetach on` | 연결 끊김 시 자동 분리 (기본 활성) |
| `vbell on` | 청각 대신 시각적 벨 사용 |

## 일반 패턴

### 개발 환경 설정

```
# .screenrc에서 윈도우 자동 생성
screen -t editor 0 vim
screen -t server 1 python -m http.server
screen -t shell  2 bash
select 0                     # 에디터 윈도우에서 시작
```

### 로깅 및 모니터링

```
Ctrl-a H                     # screenlog.N에 로깅 토글
Ctrl-a M                     # 활동을 위한 윈도우 모니터링
Ctrl-a _                     # 침묵을 위한 윈도우 모니터링
```

### 빠른 참조

| Command | Description |
|---------|-------------|
| `Ctrl-a ?` | 모든 키 바인딩 표시 |
| `Ctrl-a :help` | 내장 도움말 |
| `Ctrl-a :source file` | 설정 파일 로드 |
| `Ctrl-a :screen cmd` | 새 윈도우에서 명령 실행 |
| `Ctrl-a :quit` | 모든 윈도우 종료 및 세션 종료 |
