From 0fe2ad11d5bf02e4ea7f1f2deec5b601c99b7c4f Mon Sep 17 00:00:00 2001 From: Jerry Chae Date: Wed, 13 May 2026 13:13:35 +0900 Subject: [PATCH] =?UTF-8?q?tmux=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 4 + README.md | 57 ++++++++++++- install-tmux.ps1 | 197 ++++++++++++++++++++++++++++++++++++++++++++ install-tmux.sh | 208 +++++++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 464 insertions(+), 2 deletions(-) create mode 100644 install-tmux.ps1 create mode 100755 install-tmux.sh diff --git a/.gitignore b/.gitignore index 0c14430..3f01530 100644 --- a/.gitignore +++ b/.gitignore @@ -40,3 +40,7 @@ dist/ # Dependencies node_modules/ vendor/ + +# pi +.pi/ +thought/ diff --git a/README.md b/README.md index 393df71..3c909d9 100644 --- a/README.md +++ b/README.md @@ -4,6 +4,7 @@ ## 지원 도구 +- [tmux](https://github.com/tmux/tmux) - 터미널 멀티플렉서 - [bottom](https://github.com/ClementTsang/bottom) - 호스트 모니터링 - [lazygit](https://github.com/jesseduffield/lazygit) - Git 터미널 UI - [ctop](https://github.com/bcicen/ctop) - 컨테이너 모니터링 @@ -14,60 +15,112 @@ ### MacOS / Linux +**tmux:** + +```bash +curl -fsSL "https://gl.isitsoft.kr/publicproj/install-sh/-/raw/main/install-tmux.sh?ref_type=heads" | bash +``` + **bottom:** + ```bash curl -fsSL "https://gl.isitsoft.kr/publicproj/install-sh/-/raw/main/install-bottom.sh?ref_type=heads" | bash ``` **lazygit:** + ```bash curl -fsSL "https://gl.isitsoft.kr/publicproj/install-sh/-/raw/main/install-lazygit.sh?ref_type=heads" | bash ``` **ctop:** + ```bash curl -fsSL "https://gl.isitsoft.kr/publicproj/install-sh/-/raw/main/install-ctop.sh?ref_type=heads" | bash ``` **uv:** + ```bash curl -LsSf https://astral.sh/uv/install.sh | sh ``` **pi (Pi Coding Agent + 추천 패키지):** + ```bash curl -fsSL "https://gl.isitsoft.kr/publicproj/install-sh/-/raw/main/install-pi.sh?ref_type=heads" | bash ``` ### Windows (PowerShell): +**tmux:** + +```powershell +powershell -ExecutionPolicy Bypass -c "$t=\"$env:TEMP\install-tmux.ps1\"; iwr -useb 'https://gl.isitsoft.kr/publicproj/install-sh/-/raw/main/install-tmux.ps1' -OutFile $t; & $t" +``` + **bottom:** + ```powershell powershell -ExecutionPolicy Bypass -c "$t=\"$env:TEMP\install-bottom.ps1\"; iwr -useb 'https://gl.isitsoft.kr/publicproj/install-sh/-/raw/main/install-bottom.ps1' -OutFile $t; & $t" ``` **lazygit:** + ```powershell powershell -ExecutionPolicy Bypass -c "$t=\"$env:TEMP\install-lazygit.ps1\"; iwr -useb 'https://gl.isitsoft.kr/publicproj/install-sh/-/raw/main/install-lazygit.ps1' -OutFile $t; & $t" ``` **ctop:** + ```powershell powershell -ExecutionPolicy Bypass -c "$t=\"$env:TEMP\install-ctop.ps1\"; iwr -useb 'https://gl.isitsoft.kr/publicproj/install-sh/-/raw/main/install-ctop.ps1' -OutFile $t; & $t" ``` **uv:** + ```powershell powershell -ExecutionPolicy ByPass -c "irm https://astral.sh/uv/install.ps1 | iex" ``` **pi (Pi Coding Agent + 추천 패키지):** + ```powershell powershell -ExecutionPolicy Bypass -c "$t=\"$env:TEMP\install-pi.ps1\"; iwr -useb 'https://gl.isitsoft.kr/publicproj/install-sh/-/raw/main/install-pi.ps1' -OutFile $t; & $t" ``` ## 도구별 사용법 +### tmux + +터미널 멀티플렉서입니다. 하나의 터미널에서 여러 세션과 창을 관리할 수 있습니다. + +- **세션 관리** — 백그라운드 세션 유지, detach/attach +- **창 분할** — 수평/수직 분할로 여러 패널 동시 작업 +- **vim 스타일 이동** — h/j/k/l로 패널 간 이동 +- **마우스 지원** — 마우스로 패널 선택 및 스크롤 + +```bash +tmux # 새 세션 시작 +tmux new -s # 이름 지정 세션 시작 +tmux attach -t # 세션 접속 +tmux ls # 세션 목록 +``` + +| 단축키 | 동작 | +| ---------------- | ------------------------ | +| `Ctrl-a` | Prefix key (기본 Ctrl-b) | +| `Prefix \|` | 수평 분할 | +| `Prefix -` | 수직 분할 | +| `Prefix h/j/k/l` | 패널 이동 (vim 스타일) | +| `Prefix r` | .tmux.conf 다시 로드 | +| `Prefix Space` | 레이아웃 전환 | +| `Prefix o` | 패널 회전 | +| `Prefix ,` | 창 이름 변경 | +| `Prefix &` | 창 닫기 | + +> `install-tmux` 스크립트는 `.tmux.conf`를 홈 디렉토리에 자동 배포합니다. 기존 파일이 있으면 백업 후 덮어씁니다. + ### bottom 호스트 모니터링 터미널 UI 도구입니다. @@ -158,10 +211,10 @@ CLI 기반 AI 코딩 어시스턴트입니다. `install-pi` 스크립트는 Pi | [pi-docparser](https://pi.dev/packages/pi-docparser) | 문서 파싱 도구 — PDF, 오피스 문서, 스프레드시트, 이미지, OCR | | [pi-ollama-cloud](https://pi.dev/packages/pi-ollama-cloud?name=ollama) | Ollama Cloud 제공자 플러그인 — 동적 모델 발견, 웹 검색/패치 도구, 로컬 서버 불필요 | - > **Ollama Cloud 사용 시**: `~/.pi/agent/auth.json`에 API 키를 설정하세요. 자세한 내용은 [pi-ollama-cloud 문서](https://pi.dev/packages/pi-ollama-cloud?name=ollama)를 참조하세요. > ~/.pi/agent/auth.json에 "api.key" : "YOUR_API_KEY" 형태로 추가한다. + ```json { "anthropic": { @@ -185,4 +238,4 @@ pi list # 설치된 패키지 목록 --- -*GitLab: https://gitlab.com/publicproj/install-sh* \ No newline at end of file +_GitLab: https://gitlab.com/publicproj/install-sh_ diff --git a/install-tmux.ps1 b/install-tmux.ps1 new file mode 100644 index 0000000..e2c4102 --- /dev/null +++ b/install-tmux.ps1 @@ -0,0 +1,197 @@ +#Requires -Version 5.1 +<# +.SYNOPSIS + Installs tmux (terminal multiplexer) and deploys .tmux.conf. + +.DESCRIPTION + Installs tmux via winget (arndawg.tmux-windows) and deploys a + customized .tmux.conf to the current user's home directory. + + Supported platforms: + - Windows x64 (AMD64 / Intel 64bit) + - Windows ARM64 + + Prerequisites: + - winget (Windows Package Manager) — built into Windows 10 1709+ + +.EXAMPLE + .\install-tmux.ps1 + + # One-liner install from remote: + powershell -ExecutionPolicy Bypass -c "$t=\"$env:TEMP\install-tmux.ps1\"; iwr -useb 'https://gl.isitsoft.kr/publicproj/install-sh/-/raw/main/install-tmux.ps1' -OutFile $t; & $t" + +.NOTES + If execution policy error occurs: + Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope CurrentUser +#> + +[CmdletBinding()] +param() + +Set-StrictMode -Version Latest +$ErrorActionPreference = 'Stop' + +# ──────────────────────────────────────────── +# Utility functions +# ──────────────────────────────────────────── +function Info { Write-Host "[INFO] $args" -ForegroundColor Cyan } +function Warn { Write-Host "[WARN] $args" -ForegroundColor Yellow } +function Success { Write-Host "[OK] $args" -ForegroundColor Green } +function ErrExit { Write-Host "[ERROR] $args" -ForegroundColor Red; exit 1 } + +# ──────────────────────────────────────────── +# Constants +# ──────────────────────────────────────────── +$ConfFile = Join-Path $env:USERPROFILE '.tmux.conf' + +# ──────────────────────────────────────────── +# Step 1: Install tmux +# ──────────────────────────────────────────── +Info "Installing tmux..." + +$tmuxCmd = Get-Command tmux -ErrorAction SilentlyContinue +if ($tmuxCmd) { + $currentVer = & tmux -V 2>$null + if ($LASTEXITPR -ne 0) { $currentVer = "unknown" } + Info "tmux is already installed ($currentVer). Skipping installation." +} else { + if (-not (Get-Command winget -ErrorAction SilentlyContinue)) { + ErrExit "winget is required. Install it from the Microsoft Store or https://learn.microsoft.com/en-us/windows/package-manager/winget/" + } + + winget install --id arndawg.tmux-windows --accept-package-agreements --accept-source-agreements + if ($LASTEXITPR -ne 0) { + ErrExit "tmux installation via winget failed." + } + Success "tmux installed via winget" +} + +# Verify tmux is available (may need PATH refresh) +$tmuxCmd = Get-Command tmux -ErrorAction SilentlyContinue +if ($tmuxCmd) { + Success "tmux is available: $($tmuxCmd.Source)" +} else { + # Refresh PATH for current session + $env:Path = [System.Environment]::GetEnvironmentVariable('Path', 'User') + ';' + [System.Environment]::GetEnvironmentVariable('Path', 'Machine') + $tmuxCmd = Get-Command tmux -ErrorAction SilentlyContinue + if ($tmuxCmd) { + Success "tmux is available: $($tmuxCmd.Source)" + } else { + Warn "tmux was not found in PATH after installation. You may need to restart your terminal." + } +} + +# ──────────────────────────────────────────── +# Step 2: Deploy .tmux.conf +# ──────────────────────────────────────────── +if (Test-Path $ConfFile) { + $timestamp = Get-Date -Format 'yyyyMMddHHmmss' + $backup = "${ConfFile}.bak.${timestamp}" + Copy-Item $ConfFile $backup + Warn "Existing .tmux.conf found at $ConfFile" + Info "Backup saved to $backup" +} + +$tmuxConf = @' +# .tmux.conf 샘플 + +# Prefix key 변경 (기본은 Ctrl-b) +set -g prefix C-a +unbind C-b +bind C-a send-prefix + +# 창 분할 단축키 변경 +bind | split-window -h -c "#{pane_current_path}" +bind - split-window -v -c "#{pane_current_path}" +unbind '"' +unbind % + +# 창 이동 단축키 (vim 스타일) +bind h select-pane -L +bind j select-pane -D +bind k select-pane -U +bind l select-pane -R + +# 창 전환 단축키 +bind -r C-h previous-window +bind -r C-l next-window + +# 창 재정렬 +bind Space next-layout + +# 창 회전 +bind o rotate-window + +# 창 이름 변경 +bind , command-prompt "rename-window %%" + +# 창 닫기 +bind & kill-window + +# 세션 재시작 +bind r source-file ~/.tmux.conf \; display "Reloaded!" + +# 상태 표시줄 설정 +set -g status-bg colour235 +set -g status-fg colour136 +set -g status-left-length 40 +set -g status-right-length 40 +set -g status-interval 5 +set -g history-limit 10000 + +# 상태 표시줄 왼쪽 내용 +set -g status-left '#[fg=green]#S #[fg=yellow]#H' + +# 상태 표시줄 오른쪽 내용 +set -g status-right '#[fg=cyan]%Y-%m-%d #[fg=green]%H:%M:%S' + +# 활성 창 스타일 +#set -g window-active-style 'fg=colour250,bg=colour232' + +# 비활성 창 스타일 +#set -g window-style 'fg=colour247,bg=colour236' + +# 패널 테두리 색상 +#set -g pane-border-fg colour238 +#set -g pane-active-border-fg colour51 +set-option -g pane-border-style 'fg=colour244' +set-option -g pane-active-border-style 'fg=colour77' + +# 복사 모드에서 vi 키 바인딩 사용 +setw -g mode-keys vi + +# 마우스 지원 활성화 +set -g mouse on + +# 256색 지원 +set -g default-terminal "screen-256color" + +# for pi +set -g extended-keys on +set -g extended-keys-format csi-u +'@ + +Set-Content -Path $ConfFile -Value $tmuxConf -Encoding UTF8 +Success ".tmux.conf deployed to $ConfFile" + +# ──────────────────────────────────────────── +# Step 3: Post-install notes +# ──────────────────────────────────────────── +Info "" +Info "==================================================" +Success "tmux installation complete!" +Info "==================================================" +Info "" +Info "Getting started:" +Info " tmux - Start a new session" +Info " tmux new -s - Start a named session" +Info " tmux attach -t - Attach to a session" +Info " tmux ls - List sessions" +Info "" +Info "Key bindings (customized via .tmux.conf):" +Info " Ctrl-a | - Split horizontally" +Info " Ctrl-a - - Split vertically" +Info " Ctrl-a h/j/k/l - Navigate panes (vim-style)" +Info " Ctrl-a r - Reload .tmux.conf" +Info "" +Info "Config file: $ConfFile" \ No newline at end of file diff --git a/install-tmux.sh b/install-tmux.sh new file mode 100755 index 0000000..cd2a1b5 --- /dev/null +++ b/install-tmux.sh @@ -0,0 +1,208 @@ +#!/usr/bin/env bash +# shellcheck disable=SC2086 + +# Installs tmux (terminal multiplexer) and deploys .tmux.conf. +# tmux: https://github.com/tmux/tmux +# +# Supported platforms: +# macOS : Intel (x86_64), Apple Silicon (arm64) — via Homebrew +# Linux : x86_64, aarch64 — via apt, yum, dnf, zypper, or pacman +# +# Prerequisites: +# - macOS: Homebrew (brew) +# - Linux: a supported package manager (apt, yum, dnf, zypper, or pacman) + +set -euo pipefail + +# ──────────────────────────────────────────── +# Constants +# ──────────────────────────────────────────── +CONF_FILE="${HOME}/.tmux.conf" + +# ──────────────────────────────────────────── +# Utility functions (all stderr output) +# ──────────────────────────────────────────── +info() { echo "[INFO] $*" >&2; } +warn() { echo "[WARN] $*" >&2; } +error() { + echo "[ERROR] $*" >&2 + exit 1 +} +success() { echo "[OK] $*" >&2; } + +# ──────────────────────────────────────────── +# Detect OS +# ──────────────────────────────────────────── +OS="$(uname -s)" +ARCH="$(uname -m)" + +case "$OS" in +Darwin | Linux) ;; +*) + error "Unsupported OS: $OS. This script only supports macOS and Linux." + ;; +esac + +info "Platform: $OS ($ARCH)" + +# ──────────────────────────────────────────── +# Step 1: Install tmux +# ──────────────────────────────────────────── +info "Installing tmux..." + +if command -v tmux &>/dev/null; then + CURRENT_VER="$(tmux -V 2>/dev/null || echo 'unknown')" + info "tmux is already installed ($CURRENT_VER). Skipping installation." +else + case "$OS" in + Darwin) + if command -v brew &>/dev/null; then + brew install -y tmux + success "tmux installed via Homebrew" + else + error "Homebrew (brew) is required on macOS. Install it from https://brew.sh/" + fi + ;; + Linux) + if command -v apt-get &>/dev/null; then + sudo apt-get update -y + sudo apt-get install -y tmux + success "tmux installed via apt-get" + elif command -v dnf &>/dev/null; then + sudo dnf install -y tmux + success "tmux installed via dnf" + elif command -v yum &>/dev/null; then + sudo yum install -y tmux + success "tmux installed via yum" + elif command -v zypper &>/dev/null; then + sudo zypper -n install tmux + success "tmux installed via zypper" + elif command -v pacman &>/dev/null; then + sudo pacman -S --noconfirm tmux + success "tmux installed via pacman" + else + error "No supported package manager found (apt, dnf, yum, zypper, pacman). Install tmux manually." + fi + ;; + esac +fi + +# Verify tmux is available +if command -v tmux &>/dev/null; then + success "tmux is available: $(command -v tmux)" +else + warn "tmux was not found in PATH after installation. You may need to open a new terminal." +fi + +# ──────────────────────────────────────────── +# Step 2: Deploy .tmux.conf +# ──────────────────────────────────────────── +if [ -f "$CONF_FILE" ]; then + warn "Existing .tmux.conf found at $CONF_FILE" + BACKUP="${CONF_FILE}.bak.$(date +%Y%m%d%H%M%S)" + cp "$CONF_FILE" "$BACKUP" + info "Backup saved to $BACKUP" +fi + +cat >"$CONF_FILE" <<'TMUXCONF' +# .tmux.conf 샘플 + +# Prefix key 변경 (기본은 Ctrl-b) +set -g prefix C-a +unbind C-b +bind C-a send-prefix + +# 창 분할 단축키 변경 +bind | split-window -h -c "#{pane_current_path}" +bind - split-window -v -c "#{pane_current_path}" +unbind '"' +unbind % + +# 창 이동 단축키 (vim 스타일) +bind h select-pane -L +bind j select-pane -D +bind k select-pane -U +bind l select-pane -R + +# 창 전환 단축키 +bind -r C-h previous-window +bind -r C-l next-window + +# 창 재정렬 +bind Space next-layout + +# 창 회전 +bind o rotate-window + +# 창 이름 변경 +bind , command-prompt "rename-window %%" + +# 창 닫기 +bind & kill-window + +# 세션 재시작 +bind r source-file ~/.tmux.conf \; display "Reloaded!" + +# 상태 표시줄 설정 +set -g status-bg colour235 +set -g status-fg colour136 +set -g status-left-length 40 +set -g status-right-length 40 +set -g status-interval 5 +set -g history-limit 10000 + +# 상태 표시줄 왼쪽 내용 +set -g status-left '#[fg=green]#S #[fg=yellow]#H' + +# 상태 표시줄 오른쪽 내용 +set -g status-right '#[fg=cyan]%Y-%m-%d #[fg=green]%H:%M:%S' + +# 활성 창 스타일 +#set -g window-active-style 'fg=colour250,bg=colour232' + +# 비활성 창 스타일 +#set -g window-style 'fg=colour247,bg=colour236' + +# 패널 테두리 색상 +#set -g pane-border-fg colour238 +#set -g pane-active-border-fg colour51 +set-option -g pane-border-style 'fg=colour244' +set-option -g pane-active-border-style 'fg=colour77' + +# 복사 모드에서 vi 키 바인딩 사용 +setw -g mode-keys vi + +# 마우스 지원 활성화 +set -g mouse on + +# 256색 지원 +set -g default-terminal "screen-256color" + +# for pi +set -g extended-keys on +set -g extended-keys-format csi-u +TMUXCONF + +success ".tmux.conf deployed to $CONF_FILE" + +# ──────────────────────────────────────────── +# Step 3: Post-install notes +# ──────────────────────────────────────────── +info "" +info "==================================================" +success "tmux installation complete!" +info "==================================================" +info "" +info "Getting started:" +info " tmux - Start a new session" +info " tmux new -s - Start a named session" +info " tmux attach -t - Attach to a session" +info " tmux ls - List sessions" +info "" +info "Key bindings (customized via .tmux.conf):" +info " Ctrl-a | - Split horizontally" +info " Ctrl-a - - Split vertically" +info " Ctrl-a h/j/k/l - Navigate panes (vim-style)" +info " Ctrl-a r - Reload .tmux.conf" +info "" +info "Config file: $CONF_FILE"