mdv 4.1.0

Terminal Markdown Viewer
Documentation
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
<p align="center">
  <img src="docs/images/icon.svg" height="128" alt="Иконка mdv" />
</p>

<p align="center">
  <a href="https://github.com/WhoSowSee/mdv/graphs/contributors"><img src="https://img.shields.io/github/contributors/WhoSowSee/mdv?style=for-the-badge&color=CBA6F7&labelColor=302D41&logo=data:image/svg%2Bxml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNCAyNCI+PHBhdGggZmlsbD0iI2NkZDZmNCIgZD0iTTkgMTFhNCA0IDAgMSAwIDAtOCA0IDQgMCAwIDAgMCA4Wm0wIDJjLTMuOSAwLTcgMi03IDQuNVYyMGgxNHYtMi41QzE2IDE1IDEyLjkgMTMgOSAxM1ptOC41LTEuNWEzLjI1IDMuMjUgMCAxIDAgMC02LjUgMy4yNSAzLjI1IDAgMCAwIDAgNi41Wm0wIDEuOGMtLjkgMC0xLjc1LjE1LTIuNS40MiAxLjcgMS4wNSAyLjcgMi40NSAyLjcgMy45OFYyMEgyMnYtMi4zYzAtMi40LTItNC40LTQuNS00LjRaIi8+PC9zdmc+" alt="CONTRIBUTORS"></a>
  <a href="https://github.com/WhoSowSee/mdv/forks"><img src="https://img.shields.io/github/forks/WhoSowSee/mdv?style=for-the-badge&color=89B4FA&labelColor=302D41&logo=data:image/svg%2Bxml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNCAyNCI%2BPGcgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMTIgMTIpIHNjYWxlKDEuMDgpIHRyYW5zbGF0ZSgtMTIgLTEyKSI%2BPHBhdGggZmlsbD0iI2NkZDZmNCIgZD0iTTYgM2EzIDMgMCAxIDAgMCA2IDMgMyAwIDAgMCAwLTZabTEyIDBhMyAzIDAgMSAwIDAgNiAzIDMgMCAwIDAgMC02Wk0xMiAxNWEzIDMgMCAxIDAgMCA2IDMgMyAwIDAgMCAwLTZaIi8%2BPHBhdGggZmlsbD0iI2NkZDZmNCIgZD0iTTUgOGgydjIuNGMwIC4zMy4yNy42LjYuNmg4LjhjLjMzIDAgLjYtLjI3LjYtLjZWOGgydjIuNGEyLjYgMi42IDAgMCAxLTIuNiAyLjZIMTN2MmgtMnYtMkg3LjZBMi42IDIuNiAwIDAgMSA1IDEwLjRWOFoiLz48L2c%2BPC9zdmc%2B" alt="FORKS"></a>
  <a href="https://github.com/WhoSowSee/mdv/stargazers"><img src="https://img.shields.io/github/stars/WhoSowSee/mdv?style=for-the-badge&color=F9E2AF&labelColor=302D41&logo=data:image/svg%2Bxml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAyNCAyNCI%2BPGcgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMCAtMS42KSI%2BPHBhdGggZmlsbD0iI2NkZDZmNCIgZD0iTTEyIDIuNSAxNC45IDguNGw2LjUgMWEuOC44IDAgMCAxIC40NSAxLjM2bC00LjcgNC41OCAxLjEgNi40NWEuOC44IDAgMCAxLTEuMTYuODRMMTIgMTkuOTUgNi4yIDIyLjYzYS44LjggMCAwIDEtMS4xNi0uODRsMS4xLTYuNDUtNC43LTQuNThBLjguOCAwIDAgMSAxLjkgOS40bDYuNS0xTDEyIDIuNVoiLz48L2c%2BPC9zdmc%2B" alt="STARS"></a>
</p>

<p align="center">
  <a href="https://crates.io/crates/mdv"><img src="https://img.shields.io/crates/v/mdv?style=for-the-badge&color=FAB387&logo=data:image/svg%2Bxml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAxNiAxNiI%2BCjxwYXRoIGZpbGw9IiNjZGQ2ZjQiIGQ9Ik0xLjUgNi45ODRWMTFsNi41MDMgMy41TDE0LjUgMTFWM0wxMSAxLjVsLTYuNSAzdjF6Ii8%2BCjxnIGZpbGw9Im5vbmUiIHN0cm9rZT0iIzMwMkQ0MSIgc3Ryb2tlLXdpZHRoPSIuOSIgc3Ryb2tlLWxpbmVqb2luPSJyb3VuZCIgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIj4KPHBhdGggZD0iTTEuNSA3TDggMTAuNUwxNC41IDdtLTEwLTIuNWwzLjUwMyAyTDE0LjQ5OCAzTTQuNSA1LjV2N20zLjUtNlYxNCIvPgo8cGF0aCBkPSJNOC4wMDMgM0wxMS41IDQuNXY4Ii8%2BCjwvZz4KPC9zdmc%2B&labelColor=302D41" alt="CRATES.IO"></a>
  <a href="https://crates.io/crates/mdv"><img src="https://img.shields.io/crates/d/mdv?style=for-the-badge&color=A6E3A1&logo=data:image/svg%2Bxml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAxNiAxNiI%2BCjxwYXRoIGZpbGw9IiNjZGQ2ZjQiIGQ9Ik0xLjUgNi45ODRWMTFsNi41MDMgMy41TDE0LjUgMTFWM0wxMSAxLjVsLTYuNSAzdjF6Ii8%2BCjxnIGZpbGw9Im5vbmUiIHN0cm9rZT0iIzMwMkQ0MSIgc3Ryb2tlLXdpZHRoPSIuOSIgc3Ryb2tlLWxpbmVqb2luPSJyb3VuZCIgc3Ryb2tlLWxpbmVjYXA9InJvdW5kIj4KPHBhdGggZD0iTTEuNSA3TDggMTAuNUwxNC41IDdtLTEwLTIuNWwzLjUwMyAyTDE0LjQ5OCAzTTQuNSA1LjV2N20zLjUtNlYxNCIvPgo8cGF0aCBkPSJNOC4wMDMgM0wxMS41IDQuNXY4Ii8%2BCjwvZz4KPC9zdmc%2B&labelColor=302D41" alt="DOWNLOADS"></a>
</p>

<h2 align="center">Быстрый и настраиваемый просмотрщик Markdown для терминала</h2>

<p align="center">
  <img src="docs/images/overview.webp" width="750" alt="Обзор" />
</p>

> [!TIP]
> **English version:** [README.md](README.md)

> [!NOTE]
> mdv — терминальная утилита для точного рендеринга Markdown в ANSI-совместимых терминалах. В её арсенале:
>
> - **Рендеринг для терминала** — Подсветка синтаксиса, опциональный HTML-вывод и аккуратная работа с инлайновым форматированием.
> - **Гибкие схемы верстки** — Управляйте шириной, стратегией переноса, отступами заголовков и поведением таблиц под ваш терминал.
> - **Контроль ссылок** — Переключайтесь между кликабельными, инлайн- и табличными ссылками, выбирайте правила обрезки длинных URL.
> - **Расширенное тематизирование** — Встроенные палитры и моментальные переопределения цветов интерфейса и подсветки кода.
> - **Живой мониторинг** — Следите за файлами с `--monitor`, чтобы видеть обновления сразу после сохранения.
> - **CLI, удобный для скриптов** — Чтение из stdin, прыжки к разделам через `--from`, перенос конфигурации между машинами.

> [!IMPORTANT]
>
> ### Требования
>
> - Установленный Rust
> - Терминал с поддержкой ANSI-цветов для полноценного отображения

## Установка

### Установка с crates.io

```bash
cargo install mdv
```

Так вы установите последнюю опубликованную версию из crates.io в каталог бинарников Cargo.

### Установка через Nix (Flake)

```bash
nix run github:WhoSowSee/mdv
nix profile install github:WhoSowSee/mdv
```

Nix-пакет собирает mdv из `flake.nix` и устанавливает бинарник `mdv` в Nix-профиль. `nix run` запускает без установки, `nix profile install` — для постоянной установки.

### Установка из исходников

```bash
git clone https://github.com/WhoSowSee/mdv.git
cd mdv
cargo install --path .
```

Команда соберёт mdv и установит бинарник в каталог Cargo (обычно `~/.cargo/bin`).

### Запуск без установки

```bash
cargo build --release
./target/release/mdv README.md
```

Можно запускать бинарник из `target/release` напрямую или добавить путь к нему в `PATH`.

## Использование

```text
mdv [OPTIONS] [FILE]
```

Также, mdv поддерживает чтение из стандартного ввода (stdin) и работу в конвейерах (pipe)

```text
mdv [OPTIONS] -
cat <FILE> | mdv
```

### Вывод и рабочий процесс

- `-H, --html` — печать HTML вместо терминального форматирования.
- `-A, --no-colors` — удаление ANSI-стилей независимо от выбранной темы.
- `-C, --hide-comments` — скрытие Markdown-комментариев в итоговом выводе.
- `-i, --theme-info [FILE]` — показ активной палитры; при указании `FILE` рендерит документ вместе со сведениями о теме.
- `-f, --from <TEXT>` — рендер начиная с первой строки, содержащей `<TEXT>`. Добавление `:<lines>` ограничит число строк (например, `--from "Install:20"`).
- `-r, --reverse` — рендер документа с конца, сохраняя форматирование блоков.
- `-p, --pager` — открыть результат во встроенном пейджере `minus`. Клавиши `E`|`e` или `У`|`у` открывают текущий файл в настроенном редакторе; сохранённые изменения перерисовываются автоматически.
- `-m, --monitor` — наблюдение за файлом и автоматический перерендер при изменениях.
- `-F, --config-file <CONFIG_DIR>` — чтение настроек из указанного каталога.
- `-n, --no-config` — игнорирование конфигурационных файлов (используются только параметры CLI и значения по умолчанию).
- `-G, --init-config [CONFIG_DIR]` — создание конфигурационного файла по умолчанию. Используется указанный каталог, `--config-file`, `MDV_CONFIG_PATH` или каталог по умолчанию.

### Темы

- `-t, --theme <NAME>` — выбор встроенной темы (по умолчанию `terminal`).
- `-T, --code-theme <NAME>` — выбор палитры подсветки кода (по умолчанию `terminal`).
- `-s, --code-block-style <simple|pretty>[:show-icons;icon-only]` — стиль оформления блоков кода: одинарная граница или рамка. `show-icons` добавляет иконку языка к подписи, `icon-only` показывает только иконку, скрывая текст языка (по умолчанию `pretty`).
- `-y, --custom-theme <key=value;...>` — переопределение цветов интерфейса поверх выбранной темы.
- `-Y, --custom-code-theme <key=value;...>` — переопределение цветов подсветки кода в том же формате, что и `--custom-theme`.
- `-J, --custom-code-block <lang:icon=...,label=...,aliases=...|...>` — переопределение иконки, подписи и псевдонимов для конкретных языков блоков кода. Несколько языков разделяются `;`, опции внутри одного языка — `,`, а псевдонимы — `|` (например, `python:icon=*,label=Python,aliases=py|py3;rust:icon=`). Работает для любого указанного языка, даже если его нет во встроенной карте иконок. Подсветка синтаксиса применяется только к языкам, которые поддерживает текущая логика подсветки mdv. Используйте `default:icon=...`, чтобы задать fallback-иконку для неизвестных языков.

### Callout-блоки

- `--callout-style <pretty|simple>[:show-icons;fold-icons;label-inside;uppercase]` — стиль callout-блоков и правила отображения подписи. Для корректного отображения иконок нужны шрифты Nerd Fonts в терминале.
  `label-inside` поддерживается только с `pretty`, `fold-icons` требует `show-icons`.
- `--custom-callout <name:icon=...,color=...;...>` — переопределение или добавление подписей callout.
  `icon` и `color` можно указывать по отдельности; формат цвета как в `--custom-theme`.

### Чекбоксы

- `-P, --pretty-checkbox <square|circle>` — рендерит чекбоксы task-list как иконки Nerd Font вместо стандартных `[ ]` / `[x]`. Требует шрифт Nerd Font в терминале.
- `-B, --custom-checkbox <char>:<icon>[:<color>];...` — переопределяет встроенные иконки чекбоксов или добавляет новые состояния (только с `--pretty-checkbox`). `<char>` — символ чекбокса (`, `, `x`, `*`, `?`, `!` и т.д.); `<icon>` — новая иконка; `<color>` — опциональный цвет. Цвета принимают именованные, hex, rgb и `ansi(N)`.
  - Переопределение:  `-B ' :icon'`         заменить иконку неотмеченного
  - Добавление:       `-B '*:icon'`         добавить состояние `[*]`
  - Цвет:             `-B ' :icon:yellow'`  или `#ff0000`, `128,1,1`, `ansi(200)`
  - Без иконки:       `-B '?:red'`          оставить иконку `[?]`, применить красный

### Списки

- `-D, --pretty-list` — заменяет стандартные маркеры `-` неупорядоченных списков на иконки Nerd Font для каждого уровня вложенности. Требует шрифт Nerd Font в терминале.
- `-Q, --custom-list <уровень>:<иконка>[:<цвет>];...` — переопределяет иконку и/или цвет маркера для конкретных уровней вложенности (только с `--pretty-list`). Уровень — 1-based; иконка — глиф маркера. Цвета принимают именованные (`red`), hex (`#ff0000`), rgb (`255,0,0`) и `ansi(N)`.
  - Иконка + цвет:  `--custom-list '1:*:yellow'`   маркер `*` жёлтого цвета
  - Только иконка:   `--custom-list '1:>'`          маркер `>` в цвете темы
  - Только цвет:     `--custom-list '1:red'`        встроенная иконка, красный цвет

### Разметка и переносы

- `-c, --cols <N>` — фиксированная ширина вывода. Если не задана, mdv использует ширину терминала или запасное значение 80.
- `-b, --tab-length <N>` — замена символов табуляции на `N` пробелов (по умолчанию `4`).
- `-W, --wrap <char|word|none>` — режим переноса текста (по умолчанию `char`).
- `-R, --reflow` — склеивает внутриабзацные мягкие переносы строк (soft breaks) и заново заполняет каждую строку до ширины переноса, так что жёстко разбитый исходник перетекает под узкие экраны. Требует включённого переноса; жёсткие переносы сохраняются.
- `-w, --table-wrap <fit|wrap|none>` — логика отображения широких таблиц (по умолчанию `fit`).
- `-S, --table-smart-indent` — автоматический подбор отступа таблицы в зависимости от доступной ширины.
- `-d, --heading-layout <level|center|flat|none>` — схема выравнивания заголовков (по умолчанию `level`).
- `-I, --smart-indent` — сглаживание скачков отступов между уровнями заголовков в режиме `level`.
- `-K, --code-wrap-indent <none|base|double>` — управляет «висячим» отступом при переносе строк внутри блоков кода (по умолчанию `double`).

### Видимость элементов

- `-L, --no-code-language` — скрытие подписи языка над блоками кода, если она доступна.
- `-e, --show-empty-elements` — отображение пустых списков, цитат и блоков кода, которые обычно скрываются.
- `-g, --no-code-guessing` — отключение эвристики определения языка; неизвестные блоки остаются текстом.

### Ссылки

- `-u, --link-style <clickable|fclickable|inline|inlinetable|endtable|hide>` — способ отображения ссылок (по умолчанию `clickable`).
- `-l, --link-truncation <wrap|cut|tablecut|none>` — стратегия укорочения длинных ссылок (по умолчанию `wrap`).

### Сноски

- `--footnote-style <endnotes|attached>` — размещение сносок в конце документа или после каждого абзаца.
- `--missing-footnote-style <show|hide>` — поведение для отсутствующих, некорректных или пустых определений сносок.
  `show` выводит сообщение-заглушку в блоке сносок
  `hide` полностью скрывает такие записи.

### Справочная информация

- `-h, --help` — вывод справки.
- `-V, --version` — отображение текущей версии.

## Конфигурация

mdv объединяет настройки из нескольких источников в порядке уменьшения приоритета:

1. Параметры командной строки (максимальный приоритет).
2. Переменная окружения `MDV_CONFIG_PATH` или флаг `--config-file`.
3. Пользовательские файлы в `~/.config/mdv/` (`~\.config\mdv\` в Windows).

Создать конфиг по умолчанию можно командой `mdv --init-config` или `mdv -G`. Укажите каталог (`mdv -G custom/dir`), используйте `--config-file <CONFIG_DIR>` или задайте `MDV_CONFIG_PATH`, чтобы записать его в другой путь.

Файлы конфигурации поддерживают YAML (`.yaml` или `.yml`). В каталоге `docs/examples/config.yaml` расположен полный шаблон с комментариями:

```yaml
# docs/examples/config.yaml
theme: "terminal"
code_theme: null
wrap: "char"
table_wrap: "fit"
heading_layout: "level"
smart_indent: false
code_wrap_indent: "double"
link_style: "clickable"
link_truncation: "wrap"
```

## Переменные окружения

- `MDV_CONFIG_PATH` — кастомный путь к каталогу с конфигурацией; также используется `mdv --init-config`, если каталог не указан.
- `MDV_EDITOR` — редактор, открываемый из режима pager; имеет приоритет над `EDITOR`. Известные GUI-редакторы запускаются асинхронно, а терминальные блокируют pager до выхода; режим Emacs и Vim определяется по аргументам CLI. Неизвестные команды считаются терминальными редакторами.
- `MDV_EDITOR_MODE` — необязательный режим запуска редактора: `tui` ожидает его завершения, а `gui` запускает асинхронно. Если переменная не задана, режим определяется автоматически. Явный `tui` можно использовать с GUI-launcher, чтобы приостановить pager; явный `gui` переопределяет режим неизвестных команд, но отклоняется для известных терминальных редакторов, чтобы два процесса не управляли одним терминалом. Некорректные значения и конфликты показываются в pager, редактор при этом не запускается.
- `MDV_NO_COLOR` — принимает `True` или `False` и принудительно включает или отключает цвета независимо от темы и параметров CLI.

## Темы

Доступны встроенные темы:

<details>
  <summary><code>terminal</code></summary>

  <div style="text-align: center;">
    <img src="docs/images/theme_terminal_1.webp" alt="Theme Terminal preview" width="900px">
  </div>
  <div style="text-align: center;">
    <img src="docs/images/theme_terminal_2.webp" alt="Theme Terminal preview" width="900px">
  </div>
  <div style="text-align: center;">
    <img src="docs/images/theme_terminal_3.webp" alt="Theme Terminal preview" width="900px">
  </div>
</details>

<details>
  <summary><code>monokai</code></summary>

  <div style="text-align: center;">
    <img src="docs/images/theme_monokai_1.webp" alt="Theme Monokai preview" width="900px">
  </div>
  <div style="text-align: center;">
    <img src="docs/images/theme_monokai_2.webp" alt="Theme Monokai preview" width="900px">
  </div>
  <div style="text-align: center;">
    <img src="docs/images/theme_monokai_3.webp" alt="Theme Monokai preview" width="900px">
  </div>
</details>

<details>
  <summary><code>solarized-dark</code></summary>

  <div style="text-align: center;">
    <img src="docs/images/theme_solarized-dark_1.webp" alt="Theme Solarized Dark preview" width="900px">
  </div>
  <div style="text-align: center;">
    <img src="docs/images/theme_solarized-dark_2.webp" alt="Theme Solarized Dark preview" width="900px">
  </div>
  <div style="text-align: center;">
    <img src="docs/images/theme_solarized-dark_3.webp" alt="Theme Solarized Dark preview" width="900px">
  </div>
</details>

<details>
  <summary><code>nord</code></summary>

  <div style="text-align: center;">
    <img src="docs/images/theme_nord_1.webp" alt="Theme Nord preview" width="900px">
  </div>
  <div style="text-align: center;">
    <img src="docs/images/theme_nord_2.webp" alt="Theme Nord preview" width="900px">
  </div>
  <div style="text-align: center;">
    <img src="docs/images/theme_nord_3.webp" alt="Theme Nord preview" width="900px">
  </div>
</details>

<details>
  <summary><code>tokyonight</code></summary>

  <div style="text-align: center;">
    <img src="docs/images/theme_tokyonight_1.webp" alt="Theme Tokyonight preview" width="900px">
  </div>
  <div style="text-align: center;">
    <img src="docs/images/theme_tokyonight_2.webp" alt="Theme Tokyonight preview" width="900px">
  </div>
  <div style="text-align: center;">
    <img src="docs/images/theme_tokyonight_3.webp" alt="Theme Tokyonight preview" width="900px">
  </div>
</details>

<details>
  <summary><code>kanagawa</code></summary>

  <div style="text-align: center;">
    <img src="docs/images/theme_kanagawa_1.webp" alt="Theme Kanagawa preview" width="900px">
  </div>
  <div style="text-align: center;">
    <img src="docs/images/theme_kanagawa_2.webp" alt="Theme Kanagawa preview" width="900px">
  </div>
  <div style="text-align: center;">
    <img src="docs/images/theme_kanagawa_3.webp" alt="Theme Kanagawa preview" width="900px">
  </div>
</details>

<details>
  <summary><code>gruvbox</code></summary>

  <div style="text-align: center;">
    <img src="docs/images/theme_gruvbox_1.webp" alt="Theme Gruvbox preview" width="900px">
  </div>
  <div style="text-align: center;">
    <img src="docs/images/theme_gruvbox_2.webp" alt="Theme Gruvbox preview" width="900px">
  </div>
  <div style="text-align: center;">
    <img src="docs/images/theme_gruvbox_3.webp" alt="Theme Gruvbox preview" width="900px">
  </div>
</details>

<details>
  <summary><code>material-ocean</code></summary>

  <div style="text-align: center;">
    <img src="docs/images/theme_material-ocean_1.webp" alt="Theme Material Ocean preview" width="900px">
  </div>
  <div style="text-align: center;">
    <img src="docs/images/theme_material-ocean_2.webp" alt="Theme Material Ocean preview" width="900px">
  </div>
  <div style="text-align: center;">
    <img src="docs/images/theme_material-ocean_3.webp" alt="Theme Material Ocean preview" width="900px">
  </div>
</details>

<details>
  <summary><code>catppuccin</code></summary>

  <div style="text-align: center;">
    <img src="docs/images/theme_catppuccin_1.webp" alt="Theme Catppuccin preview" width="900px">
  </div>
  <div style="text-align: center;">
    <img src="docs/images/theme_catppuccin_2.webp" alt="Theme Catppuccin preview" width="900px">
  </div>
  <div style="text-align: center;">
    <img src="docs/images/theme_catppuccin_3.webp" alt="Theme Catppuccin preview" width="900px">
  </div>
</details>

Выбирайте их параметром `--theme` или задавайте по умолчанию в конфигурации.

Для точной настройки используйте `--custom-theme` и `--custom-code-theme`. Переопределения передаются в формате `ключ=значение`, пары разделяются точкой с запятой. Ключи соответствуют полям палитры (`text`, `h1`, `border`, `keyword`, `function` и т.д.). Значения поддерживают форматы `#rrggbb`, `r,g,b`, именованные цвета ANSI (`red`, `darkgrey`) и индексы 256-цветной палитры (`ansi(42)`).

Команда `mdv --theme-info` отображает выбранную палитру; добавление пути (`mdv --theme-info README.md`) позволяет посмотреть, как цвета применяются к документу. Используйте `examples/config.yaml` как отправную точку для своих тем и храните настройки в системе контроля версий.

### Пользовательские темы

Положите один или несколько файлов `*.yaml`/`*.yml` в каталог `<config_dir>/themes/`, чтобы зарегистрировать собственные темы. Каталог ищется в том же порядке, что и `config.yaml` (флаг `--config-file`, переменная `MDV_CONFIG_PATH`, затем `~/.config/mdv/`). В репозитории есть два готовых примера:

- [`docs/examples/themes/theme-warm.yaml`](docs/examples/themes/theme-warm.yaml) — использует `extends: monokai` и переопределяет лишь несколько полей.
- [`docs/examples/themes/theme-custom.yaml`](docs/examples/themes/theme-custom.yaml) — полностью самостоятельная палитра, в которой перечислены все доступные поля.

```yaml
# <config_dir>/themes/warm.yaml
name: warm
description: Тёплый красный акцент поверх monokai.
extends: monokai

h1: "#ff5577"
link: "#66ccff"
background: "#1c1c1c"

syntax:
  keyword: "#ff5577"
```

Описание полей:

- `name` (обязательно) — значение, принимаемое параметром `--theme`.
- `description` (необязательно) — отображается в `mdv --theme-info`; если не задано, берётся описание базовой темы.
- `extends` (необязательно) — имя встроенной темы или другой темы, загруженной раньше в этом же каталоге (в алфавитном порядке). Если не указано, недостающие поля подставляются из встроенной темы `terminal`.
- Любое цветовое поле необязательно и наследуется от базовой темы. Доступны UI-поля: `text`, `text_light`, `h1`..`h6`, `code`, `code_block`, `quote`, `link`, `emphasis`, `strong`, `strikethrough`, `highlight_background`, `background`, `border`, `list_marker`, `table_header`, `table_border`, `error`, `warning`.
- `syntax:` (необязательно) — переопределение палитры подсветки синтаксиса; каждое поле необязательно и мерджится поверх базовой. Поля: `keyword`, `string`, `comment`, `number`, `operator`, `function`, `variable`, `type_name`.
- Значения цвета используют тот же синтаксис, что и `--custom-theme`: именованные (`red`, `darkgrey`, `dark_grey`), hex (`#ff5577`), rgb (`187,154,247`) или 256-цветные (`ansi(42)` или просто `42`).

Пользовательская тема с тем же именем, что и встроенная, имеет приоритет и полностью её заменяет — это поддерживаемый способ сделать форк встроенной темы, не копируя все 33 поля. Нечитаемые или повреждённые файлы пропускаются с предупреждением, поэтому одна битая тема не ломает остальные.

## История звёзд

<p align="center">
  <a href="https://starchart.cc/WhoSowSee/mdv">
    <picture>
      <source
        media="(prefers-color-scheme: dark)"
        srcset="https://starchart.cc/WhoSowSee/mdv.svg?variant=custom&background=%230d1117&axis=%238b949e&line=%232f81f7"
      />
      <source
        media="(prefers-color-scheme: light)"
        srcset="https://starchart.cc/WhoSowSee/mdv.svg?variant=custom&background=%23ffffff&axis=%2357606a&line=%230969da"
      />
      <img
        alt="История звёзд"
        src="https://starchart.cc/WhoSowSee/mdv.svg?variant=custom&background=%23ffffff&axis=%2357606a&line=%230969da"
      />
    </picture>
  </a>
</p>

<p align="center">
  <img src="https://raw.githubusercontent.com/catppuccin/catppuccin/main/assets/footers/gray0_ctp_on_line.svg?sanitize=true" alt="catppuccin" />
</p>

<p align="center">
  <i><code>&copy 2026-present <a href="https://github.com/WhoSowSee">WhoSowSee</a></code></i>
</p>

<p align="center">
  <a href="https://github.com/WhoSowSee/mdv/blob/main/LICENSE"><img src="https://img.shields.io/github/license/WhoSowSee/mdv?style=for-the-badge&color=CBA6F7&logoColor=cdd6f4&labelColor=302D41" alt="LICENSE"></a>
</p>