205 lines
7.6 KiB
Markdown
205 lines
7.6 KiB
Markdown
# grimoir
|
||
|
||
Терминальный текстовый редактор в стиле Vim, написанный на Go.
|
||
|
||
Поддерживает Markdown с live preview, подсветку синтаксиса для 10 языков, встроенный файловый менеджер, экспорт в PDF с кириллицей, загрузку статей по URL и гибкую настройку через конфиг-файл.
|
||
|
||
---
|
||
|
||
## Возможности
|
||
|
||
### Редактор
|
||
- **Vim-режимы** — NORMAL, INSERT, COMMAND, SEARCH с полным набором команд
|
||
- **Unicode** — полная поддержка кириллицы и любых других символов при вводе
|
||
- **Undo / Redo** — до 100 шагов (`u` / `Ctrl+R`)
|
||
- **Числовые префиксы** — `5j`, `3dd`, `10G`
|
||
- **Поиск** — `/pattern` с навигацией `n`/`N`, поиск символа `f`/`t`, парные скобки `%`
|
||
- **Замена** — `:s/old/new/` и `:s/old/new/g`
|
||
- **Автосохранение** — настраиваемый интервал
|
||
|
||
### Markdown
|
||
- **Live preview** — разделённый экран редактор + preview
|
||
- **Рендер** — заголовки, списки, таблицы, blockquotes, code blocks с подсветкой, ссылки, bold/italic
|
||
|
||
### Подсветка синтаксиса
|
||
Go, Python, JavaScript, TypeScript, Rust, C/C++, Java, SQL, Bash
|
||
|
||
### Файловый менеджер
|
||
- Дерево файлов с vim-навигацией
|
||
- Открытие файлов прямо из дерева
|
||
- `Ctrl+B` — показать/скрыть, `Tab` — переключить фокус
|
||
|
||
### PDF экспорт
|
||
- Встраивает системный шрифт с кириллицей — полноценный русский текст в PDF
|
||
- Автоматический поиск шрифта (LiberationSans, DejaVu, Arial и др.)
|
||
- Subset embedding — в PDF попадают только использованные глифы
|
||
- Fallback — транслитерация если шрифт не найден
|
||
|
||
### Загрузка статей
|
||
```bash
|
||
grimoir https://example.com/article
|
||
# или прямо в редакторе:
|
||
:fetch https://example.com/article
|
||
```
|
||
Скачивает страницу, извлекает основной контент, конвертирует в Markdown, сохраняет файл с именем из заголовка статьи.
|
||
|
||
---
|
||
|
||
## Управление
|
||
|
||
### Режимы
|
||
|
||
| Клавиша | Действие |
|
||
|---------|----------|
|
||
| `i` / `a` / `A` | INSERT: вставить / после курсора / в конец строки |
|
||
| `I` / `o` / `O` | INSERT: в начало / новая строка ниже / выше |
|
||
| `Esc` | вернуться в NORMAL |
|
||
| `:` | режим команд |
|
||
| `/` | поиск |
|
||
| `?` | справка |
|
||
|
||
### Навигация
|
||
|
||
| Клавиша | Действие |
|
||
|---------|----------|
|
||
| `h j k l` | ← ↓ ↑ → |
|
||
| `w` / `b` / `e` | слово вперёд / назад / конец слова |
|
||
| `0` / `^` / `$` | начало / первый символ / конец строки |
|
||
| `gg` / `G` | начало / конец файла |
|
||
| `42G` | перейти на строку 42 |
|
||
| `f{c}` / `F{c}` | найти символ вправо / влево |
|
||
| `t{c}` / `T{c}` | до символа вправо / влево |
|
||
| `;` / `,` | повторить f/t / в обратном направлении |
|
||
| `%` | парная скобка `()[]{}` |
|
||
|
||
В INSERT режиме работают стрелки, `Home`, `End`, `Delete`.
|
||
|
||
### Редактирование
|
||
|
||
| Клавиша | Действие |
|
||
|---------|----------|
|
||
| `x` | удалить символ |
|
||
| `dd` / `3dd` | удалить строку / 3 строки |
|
||
| `yy` / `p` / `P` | скопировать / вставить ниже / выше |
|
||
| `u` / `Ctrl+R` | undo / redo |
|
||
|
||
### Команды
|
||
|
||
| Команда | Действие |
|
||
|---------|----------|
|
||
| `:w` | сохранить |
|
||
| `:w path` | сохранить копию |
|
||
| `:saveas path` | сохранить как |
|
||
| `:q` / `:q!` / `:wq` | выйти |
|
||
| `:e path` | открыть файл |
|
||
| `:new path` | новый файл |
|
||
| `:N` | перейти на строку N |
|
||
| `:s/old/new/g` | замена во всём файле |
|
||
| `:fetch URL` | скачать статью |
|
||
| `:export pdf` | экспорт в PDF |
|
||
| `:export pdf path` | экспорт в указанный путь |
|
||
| `:help` / `?` | справка |
|
||
|
||
### Панели
|
||
|
||
| Клавиша / Команда | Действие |
|
||
|-------------------|----------|
|
||
| `Ctrl+B` | показать / скрыть файловое дерево |
|
||
| `Tab` | переключить фокус между панелями |
|
||
| `<` / `>` | уменьшить / увеличить ширину панели |
|
||
| Пробел | показать / скрыть preview (только .md) |
|
||
| `:treewidth 30` | установить ширину дерева |
|
||
| `:previewwidth 45` | установить ширину preview |
|
||
|
||
---
|
||
|
||
## Конфигурация
|
||
|
||
Конфиг ищется автоматически при запуске:
|
||
|
||
| ОС | Путь |
|
||
|----|------|
|
||
| Linux | `~/.config/grimoir/grimoir.conf` |
|
||
| macOS | `~/Library/Application Support/grimoir/grimoir.conf` |
|
||
| Windows | `%APPDATA%\grimoir\grimoir.conf` |
|
||
|
||
Также поддерживается локальный `./grimoir.conf` в текущей директории — имеет наивысший приоритет.
|
||
|
||
Создать конфиг с дефолтными настройками:
|
||
|
||
```bash
|
||
./grimoir --write-config
|
||
```
|
||
|
||
### Пример конфига
|
||
|
||
```ini
|
||
[settings]
|
||
tree_width = 28
|
||
preview_width = 42
|
||
line_numbers = true
|
||
tab_width = 4
|
||
autosave = 60
|
||
show_tree = false
|
||
show_preview = false
|
||
|
||
[keys]
|
||
quit = ctrl+c
|
||
toggle_tree = ctrl+b
|
||
focus_switch = tab
|
||
panel_shrink = <
|
||
panel_grow = >
|
||
toggle_preview = " "
|
||
redo = ctrl+r
|
||
```
|
||
|
||
### Управление конфигом
|
||
|
||
```
|
||
:config show — откуда загружен конфиг и текущие значения
|
||
:config paths — список путей поиска
|
||
:config write — записать дефолтный конфиг
|
||
:config reload — перезагрузить без перезапуска
|
||
```
|
||
|
||
Настройки можно менять и на лету:
|
||
|
||
```
|
||
:set number / nonumber — номера строк
|
||
:set tab_width=2 — ширина таба
|
||
:set autosave=30 — автосейв каждые 30 секунд
|
||
:set autosave=0 — выключить автосейв
|
||
```
|
||
|
||
---
|
||
|
||
## Флаги запуска
|
||
|
||
```
|
||
grimoir [флаги] [файл или URL]
|
||
|
||
-f path файл для редактирования
|
||
--config path явный путь к конфиг-файлу
|
||
--write-config записать дефолтный конфиг и выйти
|
||
```
|
||
|
||
---
|
||
|
||
## Сборка
|
||
|
||
Требования: **Go 1.21+**
|
||
|
||
```bash
|
||
go mod tidy
|
||
go build -ldflags="-s -w" -o grimoir
|
||
```
|
||
|
||
Зависимости:
|
||
|
||
| Пакет | Назначение |
|
||
|-------|------------|
|
||
| `charmbracelet/bubbletea` | TUI фреймворк (Elm-архитектура) |
|
||
| `charmbracelet/lipgloss` | стилизация вывода |
|
||
| `charmbracelet/bubbles` | компоненты (viewport) |
|
||
|
||
Вся остальная функциональность — подсветка синтаксиса, PDF генерация, TTF парсинг, INI парсер, HTML→Markdown конвертер — реализована без внешних зависимостей.
|