GitHub - mkusaka/it2: ๐Ÿ–ฅ๏ธ A powerful command-line interface for controlling iTerm2 using its Python API - Send commands, manage sessions/windows/tabs, monitor output, and more!
Service

GitHub - mkusaka/it2: ๐Ÿ–ฅ๏ธ A powerful command-line interface for controlling iTerm2 using its Python API - Send commands, manage sessions/windows/tabs, monitor output, and more!

mkusaka
2026.02.07
ยทGitHubยทby ๋„ค๋ฃจ
#CLI#iTerm2#Python#Automation#API

ํ•ต์‹ฌ ํฌ์ธํŠธ

  • 1`it2`๋Š” iTerm2์˜ Python API๋ฅผ ํ™œ์šฉํ•˜์—ฌ macOS ํ™˜๊ฒฝ์—์„œ iTerm2๋ฅผ ๊ฐ•๋ ฅํ•˜๊ฒŒ ์ œ์–ดํ•  ์ˆ˜ ์žˆ๋Š” CLI ๋„๊ตฌ์ž…๋‹ˆ๋‹ค.
  • 2์ด ๋„๊ตฌ๋Š” ์„ธ์…˜, ์œˆ๋„์šฐ, ํƒญ ๊ด€๋ฆฌ, ํ”„๋กœํŒŒ์ผ ์ ์šฉ, ๋ธŒ๋กœ๋“œ์บ์ŠคํŒ…, ์‹ค์‹œ๊ฐ„ ์ถœ๋ ฅ ๋ชจ๋‹ˆํ„ฐ๋ง ๋“ฑ iTerm2์˜ ๋‹ค์–‘ํ•œ ๊ธฐ๋Šฅ์„ ์ปค๋งจ๋“œ ๋ผ์ธ์—์„œ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ฉ๋‹ˆ๋‹ค.
  • 3`pip`์œผ๋กœ ์‰ฝ๊ฒŒ ์„ค์น˜ ๊ฐ€๋Šฅํ•˜๋ฉฐ, `~/.it2rc.yaml` ํŒŒ์ผ์„ ํ†ตํ•ด ์‚ฌ์šฉ์ž ์ •์˜ ํ”„๋กœํŒŒ์ผ๊ณผ alias๋ฅผ ์„ค์ •ํ•˜์—ฌ ์›Œํฌํ”Œ๋กœ์šฐ๋ฅผ ์ž๋™ํ™”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

it2๋Š” iTerm2์˜ Python API๋ฅผ ํ™œ์šฉํ•˜์—ฌ iTerm2 ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์ œ์–ดํ•˜๋Š” ๊ฐ•๋ ฅํ•œ ์ปค๋งจ๋“œ ๋ผ์ธ ์ธํ„ฐํŽ˜์ด์Šค(CLI) ๋„๊ตฌ์ž…๋‹ˆ๋‹ค. ์ด ๋„๊ตฌ๋Š” macOS ํ™˜๊ฒฝ์—์„œ iTerm2 3.3.0 ์ด์ƒ ๋ฒ„์ „๊ณผ Python 3.9 ์ด์ƒ์ด ์„ค์น˜๋˜์–ด ์žˆ๊ณ  iTerm2์˜ Python API๊ฐ€ ํ™œ์„ฑํ™”๋˜์–ด ์žˆ์„ ๋•Œ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.

it2์˜ ํ•ต์‹ฌ ๊ธฐ๋Šฅ์€ iTerm2 ์ธ์Šคํ„ด์Šค์™€ ์ง์ ‘ ํ†ต์‹ ํ•˜์—ฌ ํ„ฐ๋ฏธ๋„ ์„ธ์…˜, ์œˆ๋„์šฐ, ํƒญ, ํ”„๋กœํŒŒ์ผ ๋“ฑ ๋‹ค์–‘ํ•œ ์š”์†Œ๋ฅผ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ๋ฐฉ์‹์œผ๋กœ ์กฐ์ž‘ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด๋Š” iTerm2๊ฐ€ ์ œ๊ณตํ•˜๋Š” ๋‚ด์žฅ Python API๋ฅผ ํ†ตํ•ด ์ด๋ฃจ์–ด์ง€๋ฉฐ, it2 CLI๋Š” ์ด API์— ๋Œ€ํ•œ ํŽธ๋ฆฌํ•œ ์ ‘๊ทผ ๊ณ„์ธต์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

ํ•ต์‹ฌ ๋ฐฉ๋ฒ•๋ก  ๋ฐ ๊ธฐ์ˆ ์  ์„ค๋ช…:

it2์˜ ์ž‘๋™ ๋ฐฉ์‹์€ src/it2/cli.py๋ฅผ ๋ฉ”์ธ ์ง„์ž…์ ์œผ๋กœ ์‚ฌ์šฉํ•˜์—ฌ Click ํ”„๋ ˆ์ž„์›Œํฌ ๊ธฐ๋ฐ˜์˜ CLI๋ฅผ ๊ตฌ์„ฑํ•˜๊ณ , src/it2/core/connection.py๋ฅผ ํ†ตํ•ด iTerm2์˜ Python API์™€ ์—ฐ๊ฒฐํ•˜๋Š” ๊ฒƒ์— ์ค‘์ ์„ ๋‘ก๋‹ˆ๋‹ค.

  1. iTerm2 Python API ์—ฐ๊ฒฐ: it2๋Š” iTerm2๊ฐ€ ๋กœ์ปฌ์—์„œ ์‹คํ–‰ ์ค‘์ธ iTerm2 ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜๊ณผ ํ†ต์‹ ํ•˜๊ธฐ ์œ„ํ•ด ์ œ๊ณตํ•˜๋Š” iterm2.Connection ๊ฐ์ฒด๋ฅผ ํ™œ์šฉํ•ฉ๋‹ˆ๋‹ค. ์ด ์—ฐ๊ฒฐ์€ iTerm2๊ฐ€ ๋‚ด๋ถ€์— ํ˜ธ์ŠคํŒ…ํ•˜๋Š” Python ์Šคํฌ๋ฆฝํŠธ ํ™˜๊ฒฝ๊ณผ ์™ธ๋ถ€ ํ”„๋กœ์„ธ์Šค(์—ฌ๊ธฐ์„œ๋Š” it2 CLI) ๊ฐ„์˜ IPC(Inter-Process Communication)๋ฅผ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค. connection.py ๋ชจ๋“ˆ์€ ์ด ์—ฐ๊ฒฐ์„ ์ดˆ๊ธฐํ™”ํ•˜๊ณ  ์œ ์ง€ํ•˜๋ฉฐ, iTerm2 API์˜ ๋น„๋™๊ธฐ ํŠน์„ฑ์„ ์ฒ˜๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด asyncio๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ์—ฐ๊ฒฐ์ด ์„ค์ •๋˜๋ฉด, it2๋Š” iterm2.app.App, iterm2.Session, iterm2.Window ๋“ฑ์˜ ๊ฐ์ฒด๋ฅผ ํ†ตํ•ด ํ˜„์žฌ iTerm2 ์ƒํƒœ์— ์ ‘๊ทผํ•˜๊ณ  ๋ช…๋ น์„ ๋ณด๋‚ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  1. ๋ช…๋ น์–ด ๊ตฌ์กฐํ™”:
    • ์„ธ์…˜ ๊ด€๋ฆฌ (it2 session, it2 send, it2 run): iterm2.Session ๊ฐ์ฒด๋ฅผ ํ†ตํ•ด ํ…์ŠคํŠธ๋ฅผ ์ „์†ก(write()), ๋ช…๋ น์–ด๋ฅผ ์‹คํ–‰(async_send_text()), ์„ธ์…˜ ๋ถ„ํ• (async_split_pane()), ๋˜๋Š” ์„ธ์…˜ ๋ชฉ๋ก ์กฐํšŒ(async_get_sessions()) ๋“ฑ์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค. send ๋ฐ run ๋ช…๋ น์–ด๋Š” ๊ฐ๊ฐ write() ๋ฉ”์„œ๋“œ์™€ async_send_text() ๋ฉ”์„œ๋“œ๋ฅผ ๋ž˜ํ•‘ํ•˜๋ฉฐ, ํ›„์ž๋Š” ํ…์ŠคํŠธ ๋์— ๊ฐœํ–‰ ๋ฌธ์ž(newline)๋ฅผ ์ถ”๊ฐ€ํ•˜์—ฌ ์‹คํ–‰์„ ํŠธ๋ฆฌ๊ฑฐํ•ฉ๋‹ˆ๋‹ค. --session <id> ๋˜๋Š” --all ์˜ต์…˜์„ ํ†ตํ•ด ํŠน์ • ์„ธ์…˜ ๋˜๋Š” ๋ชจ๋“  ์„ธ์…˜์„ ๋Œ€์ƒ์œผ๋กœ ์ง€์ •ํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์ด๋Š” async_get_session_by_id() ๋˜๋Š” async_get_sessions()๋ฅผ ํ†ตํ•ด ์–ป์€ ์„ธ์…˜ ๊ฐ์ฒด์— ๋ช…๋ น์„ ์ „๋‹ฌํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ๊ตฌํ˜„๋ฉ๋‹ˆ๋‹ค.
    • ์œˆ๋„์šฐ ๋ฐ ํƒญ ์ œ์–ด (it2 window, it2 tab): iterm2.Window ๋ฐ iterm2.Tab ๊ฐ์ฒด๋ฅผ ํ™œ์šฉํ•˜์—ฌ ์œˆ๋„์šฐ ์ƒ์„ฑ(async_create_window()), ์ด๋™(set_dimensions()), ํฌ๊ธฐ ์กฐ์ ˆ(set_dimensions()), ํƒญ ์ƒ์„ฑ(async_create_tab()), ํƒญ ์„ ํƒ(async_select_tab()) ๋“ฑ GUI์™€ ๊ด€๋ จ๋œ ์กฐ์ž‘์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค. it2 window arrange ๊ธฐ๋Šฅ์€ ํ˜„์žฌ ์œˆ๋„์šฐ ๋ฐฐ์—ด ์ƒํƒœ๋ฅผ YAML ํŒŒ์ผ์— ์ €์žฅํ•˜๊ฑฐ๋‚˜ ๋ณต์›ํ•˜๋Š” ๋…ผ๋ฆฌ๋ฅผ ํฌํ•จํ•˜์—ฌ ๋ณต์žกํ•œ ์›Œํฌํ”Œ๋กœ์šฐ๋ฅผ ์ž๋™ํ™”ํ•ฉ๋‹ˆ๋‹ค.
    • ํ”„๋กœํŒŒ์ผ ๊ด€๋ฆฌ (it2 profile): iterm2.profile.Profile ๊ฐ์ฒด๋ฅผ ํ†ตํ•ด iTerm2 ํ”„๋กœํŒŒ์ผ์„ ๋‚˜์—ด(async_get_profiles()), ์ ์šฉ(async_set_profile()), ๋˜๋Š” ํŠน์ • ์†์„ฑ์„ ์„ค์ •(async_set_profile_setting())ํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” iTerm2์˜ ๋‚ด๋ถ€ ์„ค์ • ์‹œ์Šคํ…œ์— ์ง์ ‘ ์ ‘๊ทผํ•˜์—ฌ ํฐํŠธ ํฌ๊ธฐ, ๋ฐฐ๊ฒฝ์ƒ‰, ํˆฌ๋ช…๋„ ๋“ฑ ์‹œ๊ฐ์ /๊ธฐ๋Šฅ์  ์„ค์ •์„ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ฉ๋‹ˆ๋‹ค.
  1. ๋ชจ๋‹ˆํ„ฐ๋ง (it2 monitor): it2๋Š” iTerm2์˜ ์ด๋ฒคํŠธ ์ŠคํŠธ๋ฆผ์„ ๊ตฌ๋…ํ•˜์—ฌ ์‹ค์‹œ๊ฐ„์œผ๋กœ ํ„ฐ๋ฏธ๋„ ์ถœ๋ ฅ์„ ๊ฐ์‹œ(session.on_output()), ํ‚ค์ŠคํŠธ๋กœํฌ๋ฅผ ๋กœ๊น…(session.on_keystroke()), iTerm2 ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋˜๋Š” ์„ธ์…˜ ๋ณ€์ˆ˜๋ฅผ ์ถ”์ (app.on_variable_changed(), session.on_variable_changed()), ๊ทธ๋ฆฌ๊ณ  ์‰˜ ํ†ตํ•ฉ์„ ํ†ตํ•ด ํ”„๋กฌํ”„ํŠธ ์ด๋ฒคํŠธ๋ฅผ ๋ชจ๋‹ˆํ„ฐ๋งํ•ฉ๋‹ˆ๋‹ค. -f (follow) ์˜ต์…˜์€ ๋น„๋™๊ธฐ ์ด๋ฒคํŠธ ๋ฆฌ์Šค๋„ˆ๋ฅผ ์œ ์ง€ํ•˜๋ฉด์„œ ์ƒˆ๋กœ์šด ๋ฐ์ดํ„ฐ๋ฅผ ์ง€์†์ ์œผ๋กœ ์ŠคํŠธ๋ฆฌ๋ฐํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ๊ตฌํ˜„๋ฉ๋‹ˆ๋‹ค. -p (pattern) ์˜ต์…˜์€ ์ˆ˜์‹ ๋œ ๋ฐ์ดํ„ฐ์— ๋Œ€ํ•ด ์ •๊ทœ ํ‘œํ˜„์‹(re ๋ชจ๋“ˆ) ๊ธฐ๋ฐ˜์˜ ํ•„ํ„ฐ๋ง์„ ์ ์šฉํ•ฉ๋‹ˆ๋‹ค.
  1. ์„ค์ • ๊ด€๋ฆฌ (~/.it2rc.yaml): ์‚ฌ์šฉ์ž๋Š” ~/.it2rc.yaml ํŒŒ์ผ์„ ํ†ตํ•ด ์‚ฌ์šฉ์ž ์ง€์ • ํ”„๋กœํŒŒ์ผ(profiles) ๋ฐ ๋ช…๋ น์–ด ๋ณ„์นญ(aliases)์„ ์ •์˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
    • ํ”„๋กœํŒŒ์ผ: YAML ๊ตฌ์กฐ๋Š” ์ผ๋ จ์˜ it2 ๋ช…๋ น์–ด ์‹œํ€€์Šค๋ฅผ ์ •์˜ํ•˜์—ฌ ๋ณต์žกํ•œ ํ™˜๊ฒฝ ์„ค์ • ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์ถ”์ƒํ™”ํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, split: vertical์€ it2 vsplit๊ณผ ๋™์ผํ•˜๊ฒŒ ์ž‘๋™ํ•˜๋ฉฐ, pane1: command๋Š” ํ•ด๋‹น ๋ถ„ํ• ๋œ pane์— ํŠน์ • ๋ช…๋ น์–ด๋ฅผ ์ „์†กํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ํŒŒ์‹ฑ๋ฉ๋‹ˆ๋‹ค. it2load<profilename>it2 load <profile_name> ๋ช…๋ น์–ด๋Š” ์ด YAML ์ •์˜๋ฅผ ์ฝ์–ด ํ•ด๋‹น it2 ๋ช…๋ น์–ด๋ฅผ ์ˆœ์ฐจ์ ์œผ๋กœ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.
    • ๋ณ„์นญ: aliases ์„น์…˜์€ ๊ธด it2 ๋ช…๋ น์–ด๋ฅผ ์งง์€ ์‚ฌ์šฉ์ž ์ง€์ • ๋ณ„์นญ์œผ๋กœ ๋งคํ•‘ํ•˜์—ฌ it2alias<aliasname>it2 alias <alias_name>์œผ๋กœ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ฉ๋‹ˆ๋‹ค.
  1. ์˜ค๋ฅ˜ ์ฒ˜๋ฆฌ: it2๋Š” iTerm2์™€์˜ ์—ฐ๊ฒฐ ์‹คํŒจ(์—๋Ÿฌ ์ฝ”๋“œ 2), ๋Œ€์ƒ(์„ธ์…˜/์œˆ๋„์šฐ/ํƒญ)์„ ์ฐพ์„ ์ˆ˜ ์—†๋Š” ๊ฒฝ์šฐ(์—๋Ÿฌ ์ฝ”๋“œ 3), ๋˜๋Š” ์ž˜๋ชป๋œ ์ธ์ˆ˜(์—๋Ÿฌ ์ฝ”๋“œ 4)์™€ ๊ฐ™์€ ํŠน์ • ์‹œ๋‚˜๋ฆฌ์˜ค์— ๋Œ€ํ•ด ์ •์˜๋œ ์ข…๋ฃŒ ์ฝ”๋“œ(sys.exit())๋ฅผ ๋ฐ˜ํ™˜ํ•˜์—ฌ ์Šคํฌ๋ฆฝํŠธ ๋˜๋Š” ์ž๋™ํ™” ์›Œํฌํ”Œ๋กœ์šฐ์—์„œ ์˜ค๋ฅ˜๋ฅผ ์‰ฝ๊ฒŒ ๊ฐ์ง€ํ•˜๊ณ  ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•ฉ๋‹ˆ๋‹ค.

์ด๋Ÿฌํ•œ ๊ธฐ๋Šฅ๋“ค์€ it2๊ฐ€ iTerm2 ์‚ฌ์šฉ์ž๋“ค์ด ๋ณต์žกํ•œ ํ„ฐ๋ฏธ๋„ ํ™˜๊ฒฝ์„ ๋ช…๋ น์ค„์—์„œ ํšจ์œจ์ ์œผ๋กœ ์ž๋™ํ™”ํ•˜๊ณ  ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ๋„๋ก ์ง€์›ํ•˜๋Š” ๊ฐ•๋ ฅํ•œ ๋„๊ตฌ๊ฐ€ ๋˜๊ฒŒ ํ•ฉ๋‹ˆ๋‹ค.