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!
ํต์ฌ ํฌ์ธํธ
- 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์ ์ฐ๊ฒฐํ๋ ๊ฒ์ ์ค์ ์ ๋ก๋๋ค.
- iTerm2 Python API ์ฐ๊ฒฐ:
it2๋ iTerm2๊ฐ ๋ก์ปฌ์์ ์คํ ์ค์ธ iTerm2 ์ ํ๋ฆฌ์ผ์ด์ ๊ณผ ํต์ ํ๊ธฐ ์ํด ์ ๊ณตํ๋iterm2.Connection๊ฐ์ฒด๋ฅผ ํ์ฉํฉ๋๋ค. ์ด ์ฐ๊ฒฐ์ iTerm2๊ฐ ๋ด๋ถ์ ํธ์คํ ํ๋ Python ์คํฌ๋ฆฝํธ ํ๊ฒฝ๊ณผ ์ธ๋ถ ํ๋ก์ธ์ค(์ฌ๊ธฐ์๋it2CLI) ๊ฐ์ IPC(Inter-Process Communication)๋ฅผ ์ค์ ํฉ๋๋ค.connection.py๋ชจ๋์ ์ด ์ฐ๊ฒฐ์ ์ด๊ธฐํํ๊ณ ์ ์งํ๋ฉฐ, iTerm2 API์ ๋น๋๊ธฐ ํน์ฑ์ ์ฒ๋ฆฌํ๊ธฐ ์ํดasyncio๋ฅผ ์ฌ์ฉํฉ๋๋ค. ์ฐ๊ฒฐ์ด ์ค์ ๋๋ฉด,it2๋iterm2.app.App,iterm2.Session,iterm2.Window๋ฑ์ ๊ฐ์ฒด๋ฅผ ํตํด ํ์ฌ iTerm2 ์ํ์ ์ ๊ทผํ๊ณ ๋ช ๋ น์ ๋ณด๋ผ ์ ์์ต๋๋ค.
- ๋ช
๋ น์ด ๊ตฌ์กฐํ:
- ์ธ์
๊ด๋ฆฌ (
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์ ๋ด๋ถ ์ค์ ์์คํ ์ ์ง์ ์ ๊ทผํ์ฌ ํฐํธ ํฌ๊ธฐ, ๋ฐฐ๊ฒฝ์, ํฌ๋ช ๋ ๋ฑ ์๊ฐ์ /๊ธฐ๋ฅ์ ์ค์ ์ ๋ณ๊ฒฝํ ์ ์๊ฒ ํฉ๋๋ค.
- ์ธ์
๊ด๋ฆฌ (
- ๋ชจ๋ํฐ๋ง (
it2 monitor):it2๋ iTerm2์ ์ด๋ฒคํธ ์คํธ๋ฆผ์ ๊ตฌ๋ ํ์ฌ ์ค์๊ฐ์ผ๋ก ํฐ๋ฏธ๋ ์ถ๋ ฅ์ ๊ฐ์(session.on_output()), ํค์คํธ๋กํฌ๋ฅผ ๋ก๊น (session.on_keystroke()), iTerm2 ์ ํ๋ฆฌ์ผ์ด์ ๋๋ ์ธ์ ๋ณ์๋ฅผ ์ถ์ (app.on_variable_changed(),session.on_variable_changed()), ๊ทธ๋ฆฌ๊ณ ์ ํตํฉ์ ํตํด ํ๋กฌํํธ ์ด๋ฒคํธ๋ฅผ ๋ชจ๋ํฐ๋งํฉ๋๋ค.-f(follow) ์ต์ ์ ๋น๋๊ธฐ ์ด๋ฒคํธ ๋ฆฌ์ค๋๋ฅผ ์ ์งํ๋ฉด์ ์๋ก์ด ๋ฐ์ดํฐ๋ฅผ ์ง์์ ์ผ๋ก ์คํธ๋ฆฌ๋ฐํ๋ ๋ฐฉ์์ผ๋ก ๊ตฌํ๋ฉ๋๋ค.-p(pattern) ์ต์ ์ ์์ ๋ ๋ฐ์ดํฐ์ ๋ํด ์ ๊ท ํํ์(re๋ชจ๋) ๊ธฐ๋ฐ์ ํํฐ๋ง์ ์ ์ฉํฉ๋๋ค.
- ์ค์ ๊ด๋ฆฌ (
~/.it2rc.yaml): ์ฌ์ฉ์๋~/.it2rc.yamlํ์ผ์ ํตํด ์ฌ์ฉ์ ์ง์ ํ๋กํ์ผ(profiles) ๋ฐ ๋ช ๋ น์ด ๋ณ์นญ(aliases)์ ์ ์ํ ์ ์์ต๋๋ค.- ํ๋กํ์ผ: YAML ๊ตฌ์กฐ๋ ์ผ๋ จ์
it2๋ช ๋ น์ด ์ํ์ค๋ฅผ ์ ์ํ์ฌ ๋ณต์กํ ํ๊ฒฝ ์ค์ ์คํฌ๋ฆฝํธ๋ฅผ ์ถ์ํํฉ๋๋ค. ์๋ฅผ ๋ค์ด,split: vertical์it2 vsplit๊ณผ ๋์ผํ๊ฒ ์๋ํ๋ฉฐ,pane1: command๋ ํด๋น ๋ถํ ๋ pane์ ํน์ ๋ช ๋ น์ด๋ฅผ ์ ์กํ๋ ๋ฐฉ์์ผ๋ก ํ์ฑ๋ฉ๋๋ค. ๋ช ๋ น์ด๋ ์ด YAML ์ ์๋ฅผ ์ฝ์ด ํด๋นit2๋ช ๋ น์ด๋ฅผ ์์ฐจ์ ์ผ๋ก ์คํํฉ๋๋ค. - ๋ณ์นญ:
aliases์น์ ์ ๊ธดit2๋ช ๋ น์ด๋ฅผ ์งง์ ์ฌ์ฉ์ ์ง์ ๋ณ์นญ์ผ๋ก ๋งคํํ์ฌ ์ผ๋ก ์คํํ ์ ์๊ฒ ํฉ๋๋ค.
- ํ๋กํ์ผ: YAML ๊ตฌ์กฐ๋ ์ผ๋ จ์
- ์ค๋ฅ ์ฒ๋ฆฌ:
it2๋ iTerm2์์ ์ฐ๊ฒฐ ์คํจ(์๋ฌ ์ฝ๋ 2), ๋์(์ธ์ /์๋์ฐ/ํญ)์ ์ฐพ์ ์ ์๋ ๊ฒฝ์ฐ(์๋ฌ ์ฝ๋ 3), ๋๋ ์๋ชป๋ ์ธ์(์๋ฌ ์ฝ๋ 4)์ ๊ฐ์ ํน์ ์๋๋ฆฌ์ค์ ๋ํด ์ ์๋ ์ข ๋ฃ ์ฝ๋(sys.exit())๋ฅผ ๋ฐํํ์ฌ ์คํฌ๋ฆฝํธ ๋๋ ์๋ํ ์ํฌํ๋ก์ฐ์์ ์ค๋ฅ๋ฅผ ์ฝ๊ฒ ๊ฐ์งํ๊ณ ์ฒ๋ฆฌํ ์ ์๋๋ก ํฉ๋๋ค.
์ด๋ฌํ ๊ธฐ๋ฅ๋ค์ it2๊ฐ iTerm2 ์ฌ์ฉ์๋ค์ด ๋ณต์กํ ํฐ๋ฏธ๋ ํ๊ฒฝ์ ๋ช
๋ น์ค์์ ํจ์จ์ ์ผ๋ก ์๋ํํ๊ณ ๊ด๋ฆฌํ ์ ์๋๋ก ์ง์ํ๋ ๊ฐ๋ ฅํ ๋๊ตฌ๊ฐ ๋๊ฒ ํฉ๋๋ค.