ν”Όλ“œλ‘œ λŒμ•„κ°€κΈ°
peektea narrows its gaze πŸ‘€ filter-as-you-type and hidden files
Dev.toDev.to
Frontend

Bubble Tea 기반 TUI의 Immutable νŒ¨ν„΄μ„ ν™œμš©ν•œ μ‹€μ‹œκ°„ 필터링 μ‹œμŠ€ν…œ 섀계

peektea narrows its gaze πŸ‘€ filter-as-you-type and hidden files

Athreya aka Maneshwar2026λ…„ 6μ›” 4일5λΆ„intermediate

Context

터미널 μ‚¬μš©μž μΈν„°νŽ˜μ΄μŠ€(TUI) ν™˜κ²½μ—μ„œ λŒ€λŸ‰μ˜ 파일 리슀트λ₯Ό 효율적으둜 νƒμƒ‰ν•˜κΈ° μœ„ν•œ μ‹€μ‹œκ°„ 필터링 κΈ°λŠ₯의 ν•„μš”μ„± λŒ€λ‘. λ‹¨μˆœν•œ ν…μŠ€νŠΈ μž…λ ₯을 λ„˜μ–΄ μˆ¨κΉ€ 파일 ν† κΈ€κ³Ό 검색어가 κ²°ν•©λœ 볡합 필터링 μƒνƒœ 관리 체계 ꡬ좕이 μš”κ΅¬λ¨.

Technical Solution

  • charmbracelet/bubbles 라이브러리의 textinput μ»΄ν¬λ„ŒνŠΈλ₯Ό λ„μž…ν•˜μ—¬ Vim μŠ€νƒ€μΌμ˜ ν•˜λ‹¨ μ»€λ§¨λ“œ 라인 μΈν„°νŽ˜μ΄μŠ€ κ΅¬ν˜„
  • allEntries와 entries둜 데이터 슬라이슀λ₯Ό μ΄μ›ν™”ν•˜μ—¬ 원본 데이터 보쑴 및 ν•„ν„°λ§λœ 뷰의 λΉ λ₯Έ λ Œλ”λ§ 달성
  • withFilters() ν•¨μˆ˜λ₯Ό ν†΅ν•œ Composable Filter ꡬ쑰 μ„€κ³„λ‘œ μˆ¨κΉ€ 파일 여뢀와 검색어 일치 μ—¬λΆ€λ₯Ό 단일 μ§„μž…μ μ—μ„œ 톡합 처리
  • Bubble Tea의 Immutable-update νŒ¨ν„΄μ„ μ€€μˆ˜ν•˜μ—¬ μƒνƒœ λ³€κ²½ μ‹œλ§ˆλ‹€ μƒˆλ‘œμš΄ λͺ¨λΈ 값을 λ°˜ν™˜ν•˜λŠ” 순수 ν•¨μˆ˜ν˜• μ—…λ°μ΄νŠΈ 둜직 적용
  • textinput.Blink μ»€λ§¨λ“œμ˜ 지속적인 λ°˜ν™˜ 및 전달을 톡해 TUI μ»€μ„œ μ• λ‹ˆλ©”μ΄μ…˜μ˜ 쀑단 μ—†λŠ” λ Œλ”λ§ 보μž₯
  • max(0, len(entries) - 1) 연산을 ν†΅ν•œ 필터링 ν›„ μ»€μ„œ 인덱슀 λ²”μœ„ 초과 λ°©μ§€ 및 UX μ•ˆμ •μ„± 확보

1. 원본 데이터와 λ·° 데이터λ₯Ό λΆ„λ¦¬ν•˜μ—¬ 필터링 μ—°μ‚° μ‹œ 원본 훼손 λ°©μ§€ 및 μž¬κ³„μ‚° νš¨μœ¨μ„± κ²€ν† 

2. 닀쀑 ν•„ν„° 쑰건 적용 μ‹œ κ°œλ³„ ν•¨μˆ˜λ³΄λ‹€ 단일 톡합 ν•„ν„° ν•¨μˆ˜(`withFilters` 방식)λ₯Ό ν†΅ν•œ μƒνƒœ 일관성 μœ μ§€

3. TUI 개발 μ‹œ ν”„λ ˆμž„μ›Œν¬μ˜ μ—…λ°μ΄νŠΈ 사이클(Cmd λ°˜ν™˜ λ“±)을 μ •ν™•νžˆ μ΄ν•΄ν•˜μ—¬ μ• λ‹ˆλ©”μ΄μ…˜ λŠκΉ€ ν˜„μƒ λ°©μ§€

4. μ‚¬μš©μž μ΅μˆ™ν•¨μ„ κ³ λ €ν•œ Vim μŠ€νƒ€μΌμ˜ 단좕킀 및 λ ˆμ΄μ•„μ›ƒ 배치둜 ν•™μŠ΅ 곑선 μ΅œμ†Œν™”

원문 읽기