본문으로 건너뛰기
피드

Bash readline을 갈아엎겠다는 Rust 기반 라인 에디터, Flyline

open-source 약 9분
vote
0
댓글
북마크

Flyline은 Bash에서 명령 입력을 처리하는 readline을 대체하려는 Rust 기반 플러그인이다. undo/redo, fuzzy history, 마우스 지원, AI 명령 작성, 동적 프롬프트 위젯, 향상된 탭 완성까지 한 번에 넣어 현대적인 쉘 입력 경험을 만들겠다는 프로젝트다.

  • 1

    Flyline은 Bash와 같은 프로세스 안에서 동작하는 readline 대체 플러그인이다

  • 2

    Rust와 ratatui.rs로 복잡한 터미널 UI를 그린다

  • 3

    AI 에이전트에 자연어 명령을 넘겨 Bash 명령으로 바꾸는 기능을 지원한다

  • 4

    Bash 탭 완성, fuzzy history, inline suggestion, 마우스 이벤트, Kitty 키보드 프로토콜까지 다룬다

Bash 입력창을 통째로 현대화하려는 프로젝트

  • Flyline은 Bash의 readline을 대체하겠다는 Rust 기반 플러그인임

    • Bash에서 명령을 입력할 때 키 입력, 커서 이동, 히스토리 탐색 같은 걸 처리하는 계층이 readline임
    • Flyline은 이 계층을 바꿔서 undo/redo, fuzzy history, syntax highlighting, text selection 같은 기능을 넣음
    • 비슷한 프로젝트로 ble.sh를 언급하지만, Flyline은 Rust와 ratatui.rs로 복잡한 터미널 UI를 그리는 쪽임
  • 설치 방식은 Bash에 shared object를 builtin처럼 로드하는 구조임

    • 릴리스에서 libflyline.so를 받은 뒤 enable -f /path/to/libflyline.so flyline로 활성화함
    • Bash 4.4에서 BASH_LOADABLES_PATH가 도입됐고, Bash 5.2-alpha부터 기본값이 추가됐다는 설명도 포함돼 있음
    • 특정 시스템 경로에 설치하면 enable flyline만으로도 로드할 수 있음
  • 기능 목록만 보면 쉘 프롬프트라기보다 작은 TUI 앱에 가까움

    • prompt animation, right prompt, 비동기 위젯, 툴팁, 마우스 지원, 커서 스타일과 애니메이션을 다룸
    • PS1, RPS1 또는 RPROMPT, PS1_FILL 같은 변수를 활용해 왼쪽/오른쪽 프롬프트와 채움 영역을 꾸밀 수 있음
    • 시간 escape sequence도 매 렌더마다 다시 평가해서 현재 시간이 계속 갱신되게 만들 수 있음

중요

> Flyline의 핵심은 '예쁜 프롬프트'가 아니라 Bash 입력 루프 자체를 확장 가능한 UI 플랫폼처럼 바꾸려는 시도임.

AI 명령 작성과 프롬프트 위젯

  • AI 에이전트와 연결해서 자연어를 Bash 명령으로 바꾸는 기능도 들어감

    • 예를 들어 ai: list files older than three days처럼 버퍼에 적으면 에이전트가 Bash 명령으로 변환하는 식임
    • Alt+Enter로 현재 버퍼를 에이전트에 넘길 수 있고, 설정이 안 돼 있으면 설정을 도와주는 흐름도 있음
    • 제안된 명령은 syntax highlighting으로 보여주고, markdown 출력도 렌더링한다고 함
  • 프롬프트 위젯은 꽤 세세하게 커스터마이즈 가능함

    • animation, mouse-mode, copy-buffer, custom, last-command-duration 타입을 만들 수 있음
    • custom 위젯은 shell command를 실행해서 출력값을 프롬프트에 넣을 수 있고, 기본은 non-blocking으로 이전 값을 보여주며 백그라운드에서 갱신함
    • blocking 모드도 있고, 500ms 같은 timeout을 걸어서 느린 명령이 프롬프트를 영원히 붙잡지 않게 할 수 있음
  • 마우스 지원은 편하지만 터미널 세계답게 트레이드오프가 있음

    • disabled, simple, smart 세 가지 모드를 제공함
    • smart가 기본값이고, 스크롤하거나 viewport 위쪽을 클릭하면 마우스 캡처를 끄고 키 입력이나 포커스 복귀 때 다시 켬
    • 작성자는 마우스 캡처가 켜져 있는지 알 수 있게 mouse mode 위젯을 설정하라고 권장함

탭 완성과 히스토리도 꽤 공격적으로 건드림

  • Bash 탭 완성을 단순 목록 표시보다 훨씬 풍부하게 만들려는 쪽임

    • 제안 목록에서 바로 fuzzy search를 할 수 있음
    • alias를 확장한 뒤 completion을 시도해서 gcgit commit alias일 때도 gc --verbo<Tab>이 기대대로 동작하게 함
    • subshell, command substitution, process substitution 안에서도 completion을 지원한다고 설명함
  • completion description도 터미널 UI답게 꾸밀 수 있음

    • 제안에 tab 문자가 들어 있으면 tab 뒤쪽을 설명으로 표시함
    • tab이 여러 개면 24fps로 frame을 애니메이션처럼 돌릴 수 있음
    • ANSI style도 description에 적용되고, 파일 completion 결과는 $LS_COLORS를 따른다고 함
  • 히스토리 검색은 fzf나 skim 느낌을 Bash 안에 넣는 방향임

    • Ctrl+R로 fuzzy history search를 열 수 있음
    • 입력 중에는 최근 매칭 히스토리를 inline suggestion으로 보여주고, 커서가 끝에 있을 때 Right 또는 End로 수락함
    • Up 키로 현재 입력 prefix와 맞는 히스토리를 순회할 수 있고, Zsh history도 선택적으로 읽을 수 있음

터미널 호환성은 재미와 고통이 같이 온다

  • VS Code 터미널 설정까지 따로 안내하는 걸 보면 키 입력 호환성이 중요한 프로젝트임

    • terminal.integrated.macOptionIsMeta로 Option 키를 Meta로 넘기라고 권장함
    • Kitty keyboard protocol 전달을 켜야 Flyline이 더 많은 키 이벤트를 받을 수 있음
    • cursor 아래 foreground 색이 바뀌는 걸 막기 위해 minimum contrast ratio 설정도 언급함
  • Copilot이나 터미널 에뮬레이터와의 충돌 가능성도 직접 언급됨

    • 특정 설정에서는 Copilot이 터미널과 상호작용하지 못할 수 있다고 함
    • Command+키 조합은 터미널 에뮬레이터가 가로채는 경우가 많아서, Control+키로 매핑하거나 Kitty 확장 키보드 프로토콜을 지원하는 터미널을 쓰라는 식의 우회책을 제시함
    • OSC 133, OSC 633 escape code를 출력해 shell integration도 제공하며, 필요하면 끌 수 있음

기술 맥락

  • Flyline이 readline을 건드리는 이유는 Bash의 기본 입력 경험이 요즘 개발자 기대치와 꽤 멀어졌기 때문이에요. undo/redo, fuzzy search, inline suggestion, 마우스 선택 같은 기능은 IDE나 Zsh 플러그인 환경에서는 익숙한데, 순정 Bash에서는 여러 도구를 붙여야 하거든요.

  • Rust와 ratatui를 고른 건 단순 성능보다 UI 복잡도 때문으로 보여요. 프롬프트 안에서 목록, 설명, 애니메이션, 툴팁, 마우스 이벤트를 다루려면 문자열 치환만으로는 한계가 빨리 오거든요. 그래서 터미널을 작은 애플리케이션 화면처럼 다루는 TUI 라이브러리가 필요해져요.

  • Bash 안에 libflyline.so를 로드하는 구조는 강력하지만 부담도 있어요. 같은 프로세스 안에서 동작하니 입력 루프를 깊게 바꿀 수 있지만, 충돌이 나면 그냥 외부 명령 하나가 죽는 게 아니라 쉘 경험 전체가 흔들릴 수 있거든요.

  • 마우스 캡처와 Kitty 키보드 프로토콜을 다루는 것도 같은 맥락이에요. 더 많은 입력 이벤트를 받으면 기능은 좋아지지만, 터미널 에뮬레이터마다 지원 수준이 달라서 설정과 호환성 문제가 따라와요. Flyline이 VS Code 터미널 설정까지 길게 적어둔 이유가 여기에 있어요.

쉘 커스터마이징을 여러 플러그인으로 이어 붙이는 대신, Bash 입력 경험 자체를 현대적인 TUI 앱처럼 바꾸려는 시도다. 다만 터미널 키 이벤트, 마우스 캡처, Copilot 같은 도구와의 충돌 가능성이 있어서 파워유저용 장난감이자 실험장에 가깝다.

댓글

댓글

댓글을 불러오는 중...

open-source

위키피디아에도 빅테크식 반노조 플레이북이 들어왔다

위키미디어 재단이 5월 열흘 사이 MediaWiki 장기 핵심 개발자를 해고하고, 자원봉사 편집자 요청을 처리하던 Community Tech 팀을 해산했다는 비판 글이다. 해고된 인력 상당수가 노조 조직 활동과 연결돼 있었고, 위키피디아 편집자들은 연대 파업까지 거론하고 있다. 재단은 2억9660만 달러의 준비금과 빠르게 성장하는 AI 대상 API 매출을 갖고 있어, 이 사안이 단순 비용 절감으로 보기 어렵다는 게 글의 핵심이다.

open-source

캘리포니아, 연령 확인법에서 리눅스 빼려는 수정안 추진

캘리포니아가 운영체제에 사용자 나이 확인을 요구하는 법안에서 대부분의 오픈소스 운영체제를 제외하는 수정안을 추진 중이다. 데비안, 페도라, 우분투, 아치, 리눅스 민트 같은 배포판은 빠질 가능성이 커졌지만, 스팀OS처럼 독점 앱 생태계와 연결된 플랫폼은 여전히 애매한 상태다.

open-source

마이크로소프트, 45년 전 86-DOS 소스코드를 오픈소스로 공개

마이크로소프트가 86-DOS 1.00 출시 45주년에 맞춰 지금까지 발견된 것 중 가장 오래된 DOS 소스코드를 공개했어. 팀 패터슨의 차고에 있던 도트 매트릭스 출력물을 스캔하고 옮겨 적어, 원본 바이너리와 바이트 단위로 동일하게 다시 컴파일되는 수준까지 복원한 게 포인트야.

open-source

밤부 랩, AGPLv3 위반 논란으로 오픈소스 커뮤니티와 충돌

3D 프린터 제조사 밤부 랩이 AGPLv3 라이선스 위반 논란에 휘말렸고, Software Freedom Conservancy가 두 건의 위반 사례를 확인했다는 내용이야. Louis Rossmann과 Gamers Nexus는 관련 개발자의 법적 방어를 위해 2만달러를 기부했고, 갈등의 핵심은 오픈소스 기반 생태계를 클라우드와 DRM으로 점점 닫아가려는 움직임이야.

open-source

플리퍼, 리눅스 기반 확장형 기기 '플리퍼 원' 공개

플리퍼가 기존 플리퍼 제로를 대체하는 후속작이 아니라, 리눅스 기반 네트워킹·확장형 기기인 플리퍼 원을 공개했어. RK3576 8코어 ARM 칩, 와이파이 6E, 듀얼 이더넷, NVMe, HDMI 4K 120Hz까지 넣으면서 장난감 같은 해킹 도구에서 훨씬 범용적인 리눅스 장비 쪽으로 방향을 넓히는 그림이야.