vcom/plans/feature-roadmap.md
vrubelroman 08c095e74f feat: add interactive file search/filter (feature #1)
Pressing / opens a filter bar at the bottom of the screen. As the user
types, the active pane's entries are filtered in real-time using
case-insensitive substring matching. The .. entry is always preserved.

Key bindings:
  /       - open filter input (re-opens with previous query if active)
  Esc     - clear filter and restore full list
  Enter   - commit filter (keeps filtering active, closes input bar)
  Up/Down - navigate the filtered list while typing
  PgUp/Dn - scroll the filtered list

Filter is automatically cleared when navigating to a different directory
(Enter on a folder, Backspace to parent, opening an archive).

Modified files:
  - internal/ui/keymap.go: added Filter key binding (/)
  - internal/ui/model.go: filterMode, filterQuery, filterInput fields;
    filteredPane() helper for View rendering; filter handling in Update();
    renderFilterBar() for the bottom bar UI; clearFilter() helper;
    adjustCursorForFilter() to keep cursor in bounds

Created files:
  - plans/feature-roadmap.md
2026-04-27 17:14:48 +03:00

44 lines
2.9 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# Feature Roadmap — vcom
## Выбранные фичи (по приоритету)
### 1. Поиск/фильтрация файлов (`/`)
- [ ] **Filter mode**: при нажатии `/` открывается текстовый инпут внизу экрана (поверх footer, как модальное окно)
- [ ] Фильтрация `[]Entry` в активной панели на лету по `strings.Contains`/fuzzy-match
- [ ] Подсветка совпадений в строках (изменить `renderEntryRow` — передать query, подсветить matched part)
- [ ] `Esc` — выход из filter mode, восстановление полного списка
- [ ] `Enter` — зафиксировать фильтр (оставить отфильтрованный список), выход из filter mode
- [ ] При смене директории фильтр сбрасывается
### 2. Bulk rename (массовое переименование)
- [ ] Выделить файлы (`Shift+↑/↓`), нажать `Ctrl+R` (новая клавиша)
- [ ] Модальное окно с текстовым полем для паттерна: `prefix_%N.ext`
- [ ] Превью результата (старое имя → новое имя)
- [ ] Выполнить rename для всех выделенных
### 3. Корзина (trash support)
- [ ] `Delete/F8` — перемещать в `~/.local/share/Trash/` по freedesktop spec
- [ ] `Shift+Delete` —永久ное удаление (как сейчас)
- [ ] `browser.confirm_delete` применяется к永久ному удалению
- [ ] Новая опция конфига: `behavior.use_trash = true` (default: true)
### 4. Directory history (назад/вперед)
- [ ] `[]string` стек истории на каждую панель
- [ ] `Alt+←` / `Alt+→` — навигация назад/вперед
- [ ] При переходе в новую директорию (Enter, Backspace, клик) — push в history
- [ ] При навигации по истории — не создавать новые записи
### 5. Расширенный превью форматов
- [ ] PDF — извлечение текста через `pdftotext` (если доступен)
- [ ] Аудио — метаданные через `ffprobe` (битрейт, длительность, кодек)
- [ ] Видео — метаданные + превью через `ffmpegthumbnailer`/`ffprobe`
- [ ] Fallback если утилита не установлена
---
## Процесс
1. Каждая фича реализуется в отдельной ветке `feature/N-имя`
2. После реализации — commit + push
3. После апрува — merge в main
4. Порядок: 1 → 4 → 3 → 2 → 5 (от простого к сложному)