C++20으로 IntelliSense 스타일 셸 히스토리 도구 구축
Source: Dev.to
문제점: “검색” vs. “흐름”
우리는 모두 터미널 안에서 살아갑니다. 오랫동안 Ctrl + R이나 .zsh_history를 grep하는 방식에 의존했죠. Atuin 같은 도구가 SQLite와 동기화를 도입하면서 혁신을 일으켰지만, 제 작업 흐름에는 딱 맞지 않았습니다.
대부분의 최신 히스토리 도구는 검색 엔진처럼 동작합니다. 현재 작업을 멈추고, 단축키를 눌러 전체 화면 UI를 열고, 명령을 검색한 뒤 실행하죠. 마치 컨텍스트 전환을 하는 느낌입니다.
저는 IntelliSense와 같은 느낌을 원했습니다—즉:
- 입력하면서 내가 원하는 것을 예측해 주는 것.
- 내 상황을 이해해 주는 것(예: “나는
feature/login브랜치가 있는 Git 저장소 안에 있다”). - 필요할 때만 나타나고, 그 외에는 방해하지 않는 것.
그래서 BSH (Better Shell History) 를 만들었습니다.
아키텍처
BSH는 로컬‑우선, 지연‑민감 쉘 히스토리 관리자이며, Zsh 라인 에디터(ZLE)에 훅을 걸어 매 키 입력마다 예측 오버레이를 업데이트합니다.
클라이언트‑데몬 모델
| Component | Description |
|---|---|
Daemon (bsh-daemon) | C++20으로 작성된 백그라운드 프로세스. SQLite 데이터베이스(WAL 모드)와 libgit2를 이용한 Git 저장소 상태의 인‑메모리 캐시에 지속적으로 연결됩니다. |
Client (bsh) | 가볍고 일시적인 바이너리. 각 키 입력을 직렬화해 Unix Domain Socket을 통해 데몬에 전송하고, 응답을 출력합니다. |
| Interface | FTXUI를 사용해 TUI 오버레이를 렌더링합니다. |
지연은 적이다가 큰 적입니다: 10 ms 정도의 지연도 무겁게 느껴지므로 목표는 그 이하입니다.
시도해 보시고 “IntelliSense” 방식과 기존 검색 방식 중 어느 쪽이 더 좋은지 의견을 공유해주세요!