-
Notifications
You must be signed in to change notification settings - Fork 1
/
hedgehog.1
514 lines (512 loc) · 36.2 KB
/
hedgehog.1
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
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
.\" generated with Ronn-NG/v0.9.1
.\" http://github.com/apjanke/ronn-ng/tree/0.9.1
.TH "HEDGEHOG" "1" "July 2022" ""
.SH "NAME"
\fBhedgehog\fR \- podcast player and organizer
.SH "SYNOPSIS"
\fBhedgehog\fR [\fB\-\-h\fR|\fB\-\-help\fR] [\fB\-\-no\-mouse\fR] [\fB\-\-no\-pidfile\fR] [\fB\-\-no\-mpris\fR] [\fB\-V*\fR|\fB*\-\-version\fR] [\fB\-\-config\-path\fR \fIpath\fR] [\fB\-\-data\-path\fR \fIpaths\fR] [\fIsubcommand\fR \fIarguments\fR\|\.\|\.\|\.]
.SH "DESCRIPTION"
Hedgehog is a podcasts player and subscriptions management software that works within a terminal\. Its features include:
.IP "\[bu]" 2
subscribing to RSS feeds and managing subscriptions;
.IP "\[bu]" 2
viewing and automatically updating the list of episodes from each feed;
.IP "\[bu]" 2
keeping track of the episodes\' state: whether you played an episode, did you finish listening to it or not, remembering when the playback stopped;
.IP "\[bu]" 2
playing episodes and controlling its playback: play/pause, seek, control volume, etc\.;
.IP "\[bu]" 2
searching for feeds online and subscribing to them;
.IP "\[bu]" 2
importing and exporting the list of feeds from/to other podcast management software via OPML documents\.
.IP "" 0
.P
The main interface of Hedgehog contains two panes: the list of feeds you are subscribed to (along with two special feeds with all episodes and with only new episodes) and the list of episodes within the selected feed\. You can navigate between different panes using arrow and Tab keys or using a mouse cursor if your terminal emulator supports it\. To start the playback of an episode, you can either select it and press \fBEnter\fR or double\-click with a left mouse button\.
.P
See \fIKEY MAPPING\fR section of this manual for the list of default keybinding which can be reconfigured, and \fIcommands\fR section for the list of all commands that Hedgehog supports\.
.SH "OPTIONS"
.TP
\fB\-\-no\-mouse\fR
Disables the capacity of Hedgehog to read and handle mouse input\. If not present, you can select list items, start and control playback, change the cursor position in the command entry field, etc\., but you won\'t be able to select text in the terminal window\.
.TP
\fB\-\-no\-pidfile\fR
By default, Hedgehog prevents two or more instances of the program from running at the same time to prevent inconsistencies in the displayed data\. This flag prevents this behavior\. Note that multiple instances are allowed to be executed for different data directories\.
.TP
\fB\-\-no\-mpris\fR
Disables Hedgehog\'s support for MPRIS protocol\. This protocol allows third\-party software to observe the state of playback and control it by sending messages through DBus\. Note, that not all platforms support this functionality Hedgehog may be compiled without it\. In such cases, this option won\'t be present\.
.TP
\fB\-\-data\-path\fR
Specifies the path from where episodes database, commands history and some other files will be read\. The default is \fB~/\.local/share/hedgehog/\fR on UNIX\-compatible platforms and \fB%APPDATA%/hedgehog\fR on Windows\. This location can be backed\-up and copied to another system\.
.TP
\fB\-\-config\-path\fR
Specifies a path or a set of paths where Hedgehog will search for the configuration files: \fBrc\fR files and themes\. These paths extend the set of default paths\. For more information on configuration, see the \fICONFIGURATION\fR section of this manual\.
.TP
\fBexport\fR \fIfile\fR
A sub\-command for exporting the list of podcast feeds managed by Hedgehog in OPML format\. This can be later imported into nother podcast management programs\. \fIfile\fR is a path to an XML file where the exported data will be written or a dash (\fB\-\fR) in which case the exported data will be written to standard output\.
.TP
\fBimport\fR \fIfile\fR
Adds the set of the podcast feeds to the database\. Episodes from these feeds will be fetched on the next launch\. Duplicate feeds will be ignored\. \fIfile\fR is a path to an XML file in OPML format that will be read or a dash (\fB\-\fR) in which case the data will be read from the standard input\.
.SH "COMMANDS"
You control Hedgehog TUI by issuing commands either directly (by pressing \fB:\fR, entering the name of a command and its arguments, and submitting it with the \fBEnter\fR key) or indirectly, by pressing a key combination mapped to a specific command\. There are few exceptions, such as actions performed with a mouse or through the MPRIS interface\.
.P
When entering commands manually, some keys have a special meaning\. Hedgehog tries to follow established conventions\. These keys cannot be remapped, and you can find their list in the \fICOMMAND ENTRY KEY MAPPING\fR subsection\.
.P
The remaining of this section lists the supported commands and their description\.
.SS "NAVIGATION"
.TP
\fBline first\fR
Selects the first line in the current list\.
.TP
\fBline last\fR
Selects the last line in the current list\.
.TP
\fBline page\-up\fR
Moves the selection up by an entire screen\.
.TP
\fBline page\-down\fR
Moves the selection down by an entire screen\.
.TP
\fBline move\-by\fR \fInumber\fR
Moves the selection down (if \fInumber\fR is positive) or up (if \fInumber\fR is negative) by the specific number of rows\.
.TP
\fBline scroll\-by\fR \fInumber\fR
Scrolls the current list down (if \fInumber\fR is positive) or up (if \fInumber\fR is negative) by the specific number of rows and keeps the selected row\. If after scrolling, the selection is not visible, the closest visible row will be selected (with some margin from the edge of a screen)\.
.TP
\fBfocus\fR \fIpane\-name\fR
Sets the currently selected pane\. The selected pane is highlighted in the UI and all line commands listed above affect the list contained in this pane\. Possible values for \fIpane\-name\fR are listed below\.
.TP
\fBlog\fR
Opens the list of errors\. This command is a shorthand for \fBfocus log\fR\.
.TP
\fBrepeat\-command\fR
Executes the last manually entered command again\. This does not affect commands that Hedgehog couldn\'t parse or the \fBrepeat\-command\fR itself\.
.TP
\fBquit\fR or \fBq\fR
Exits Hedgehog\.
.P
\fIpane\-name\fR is an argument used by some commands and it names the section of the UI that is currently selected and is ready to handle users\' interaction\. The possible values for \fIpane\-name\fR are:
.IP "\[bu]" 2
\fBfeeds\fR: the list of feeds located on the right\-hand side of the library view
.IP "\[bu]" 2
\fBepisodes\fR: the list of the episodes in a feed;
.IP "\[bu]" 2
\fBsearch\fR: the list of search results\. Search can be initiated using the \fBsearch\fR command\. When this pane is selected manually, Hedgehog shows results from the previous search;
.IP "\[bu]" 2
\fBlog\fR: the list of errors that occurred during the current session, these errors include networking errors, configuration issues, etc\.;
.IP "" 0
.SS "PLAYBACK"
.TP
\fBplay\-current\fR
Starts playback of the currently selected episode from the position when the playback stopped before\. If this episode was never played or if it was finished, the playback starts from the beginning\.
.TP
\fBstop\fR
Immediately terminates playback\. Playback then can be restarted only by selecting the episode again\.
.TP
\fBfinish\fR
Immediately terminates playback and marks the previously playing episode as finished\.
.TP
\fBpause\fR
Pauses the playback\. It can be then resumed using \fBresume\fR or \fBtoggle\-pause\fR commands\.
.TP
\fBresume\fR
Resumes the playback from the current position\.
.TP
\fBtoggle\-pause\fR
Toggles between playing and paused states\. This command is equivalent to either \fBpause\fR or \fBresume\fR depending on the current state of the playback\.
.TP
\fIduration\fR
If the playback is active, changes the current position in the stream to the specified \fIduration\fR\. This action may cause a temporary break in the playback due to buffering\. The paused status of the playback won\'t be changed by this command\.
.IP
\fIduration\fR is specified in seconds, minutes, and hours separated by a colon\. Only seconds are required\. For example \fB160\fR, \fB2:40\fR, and \fB0:02:40\fR are equivalent\. Leading zeros are allowed\.
.TP
\fBseek\fR \fIsigned\-duration\fR
If the playback is active, changes the current position in the stream by the specified duration relative to the current position\. The \fIsigned\-duration\fR may be preceded by either \fB+\fR or \fB\-\fR characters, which indicate whether the seek operation will be performed forwards or backwards\.
.TP
\fBrate\fR \fIreal\-number\fR
Changes the playback rate of the current stream\. If the argument equals 1\.0, the episode will be played at normal speed, any value less than 1\.0 will cause the playback will be slowed down, and if the value is greater than 1\.0, the playback will be sped up\.
.TP
\fBmute\fR, \fBunmute\fR, \fBtoggle\-mute\fR
Changes the muted status for the playback\. The muted status does not affect the current volume, when unmuting, the playback volume will be restored to the previous value\. \fBtoggle\-mute\fR variant of this command toggles between muted and unmuted states\.
.TP
\fBvol\-set\fR \fIvolume\fR
Sets the volume to the specified value\. \fIvolume\fR must be a number between 0 and 100\.
.TP
\fBvol\-adjust\fR \fIsigned\-volume\fR
Changes the current volume by a specified amount\. \fBsigned volume\fR has the same unit as in the \fBvol\-set\fR command: the range is \-100 to 100\.
.SS "SUBSCRIPTIONS MANAGEMENT"
.IP "\[bu]" 2
\fBadd\fR \fIrss\-url\fR: Adds a new subscription\. Hedgehog will try to fetch the feed metadata and episodes list immediately after it finishes\. Note, that \fIrss\-url\fR must point to the RSS feed, Hedgehog will not try to determine the URL of the RSS feed from the HTML page\'s metadata\.
.IP "\[bu]" 2
\fBdelete\fR: Removes the feed and all its episodes or a group depending on the item currently selected in the feed list sidebar\. In cases when a group is deleted no feeds in this group are deleted, instead their group is unassigned\. This action cannot be undone\.
.IP "\[bu]" 2
\fBupdate\fR [\fB\-\-this\fR]: Updates the feed metadata and the episodes list\. If new episodes are found in the feed, they will appear in the library marked "new"\. If \fB\-\-this\fR attribute is specified, then only the currently selected feed will be updated\. Otherwise, all feeds that haven\'t been disabled will be updated\.
.IP "\[bu]" 2
\fBadd\-archive\fR \fIrss\-url\fR: Loades episodes from the RSS feed located at \fIrss\-url\fR and adds them to the current feed\. It\'s useful with some podcasts that offer two types of feeds: the one with a few recent episodes which can be fetched quickly and another with all episodes that may take some time to update\.
.IP "\[bu]" 2
\fBenable\fR, \fBdisable\fR: Enables or disables the feed\. If you disable the feed, then it won\'t be scheduled to be updated by neither the \fBupdate\fR command nor automatically on launch\.
.IP "\[bu]" 2
\fBopen\-link feed\fR, \fBopen\-link episode\fR: Opens the WWW URL specified in the feed or episode metadata respectively in the default browser\.
.IP "\[bu]" 2
\fBhide\fR: Hides the currently selected episode from the episodes list\. Note, that it won\'t be deleted from the database\. The hidden episodes aren\'t shown in the library by default\. This can be enabled by issuing the command \fBset hidden true\fR\.
.IP "\[bu]" 2
\fBunhide\fR: Removed the hidden status from the currently selected episode\. To issue this command, Hedgehog needs to be configured to show hidden episodes (using command \fIset hidden true\fR; it can be reverted by issuing \fBset hidden false\fR)
.IP "\[bu]" 2
\fBmark\fR \fIstatus\fR [\fB\-\-all\fR] [\fB\-\-if\fR \fIstatus\-conditiol\fR]: Changes the status of the episode\. The \fIstatus\fR can be either \fBnew\fR, \fBseen\fR, or \fBfinished\fR\. By default, only the currently selected episode will be affected\. If \fB\-\-all\fR attribute is specified, then all episodes in the currently selected feed will be altered\. In this case, it can be useful to update only a subset of episodes, for example, you may want to mark all new episodes in the new feed as seen\. \fB\-\-if\fR attribute specifies a precondition for such update\. \fBstatus\-condition\fR can be either \fBnew\fR, \fBseen\fR, \fBfinished\fR, \fBstarted\fR, or \fBerror\fR\.
.IP "\[bu]" 2
\fBreverse\fR: Changes the order of episodes in the selected feed\. By default, episodes are displayed in reverse chronological order (starting with the newest)\. This command changes this order for a single feed\. This preference is saved in the database and will remain after the restart\.
.IP "\[bu]" 2
\fBrename <new name>\fR: Changes the name of a group or feed displayed in the sidebar that is currently selected\. If the feed\'s name declared in the RSS feed changes, this change doesn\'t override the title set using rename command\.
.IP "\[bu]" 2
\fBsearch\fR \fIquery\fR or \fBs\fR \fIquery\fR: Starts the search session\. When this command is issued, Hedgehog performs a search for podcast feeds online and \fBsearch\fR pane comes into focus\.
.IP "\[bu]" 2
\fBsearch\-add\fR: Subscribes to the currently selected feed in the search pane\.
.IP "\[bu]" 2
\fBadd\-group\fR \fIgroup\-name\fR: Creates a new group and places it at the bottom of the feeds lists\. Group names must be unique, meaning there cannot be more then one group with a given name\.
.IP "\[bu]" 2
\fBset\-group\fR \fIgroup\-name\fR: Adds the currently selected feed into a group identified by \fIgroup\-name\fR\.
.IP "\[bu]" 2
\fBunset\-group\fR Removes the currently selected feed from a group\.
.IP "\[bu]" 2
\fBplace\-group\fR \fIposition\fR: Changes the position of the currently selected group\. \fIposition\fR is a non\-negative integer indicating the place of a group in the list\. \fBplace\-group 1\fR will position the group at the very top immediately after the last feed which has no group assigned\. \fBplace\-group 2\fR will place the group immediately after\. It\'s not possible to change the position of the feed without an assigned group\.
.IP "" 0
.SS "CONFIGURATION"
.TP
\fBconfirm\fR \fIprompt\fR \fIcommand\fR [\fB\-\-default\fR \fIbool\fR]
Displays confirmation prompt and askes the user for confirmation\. The \fIcommand\fR will be executed only on an affirmative response\. \fB\-\-default\fR attribute specifies the default behavior, whether the command will be executed (if \fBtrue\fR) or not (\fBfalse\fR) when the \fBEnter\fR key is pressed\.
.TP
\fBexec\fR \fIpath\fR
Reads the file at path and executes commands in it\. Each command must be specified on a separate line; empty lines or lines containing only comments (starting with \fB#\fR) are ignored\. All commands will be executed until the first failure or until the end of the file is reached\.
.IP
\fIpath\fR can be either absolute or relative\. If \fIpath\fR is relative, Hedgehog will try to find a file in any of the paths specified in the list of data directories\. See details in the \fICONFIGURATION\fR section of the manual\.
.TP
\fBset\fR \fIoption\-name\fR \fIvalue\fR
Updates the property controlling how Hedgehog looks like and behaves\. The list of properties is described in the \fICONFIGURATION\fR section of this manual\.
.TP
\fBmsg\fR \fImessage\fR [\fB\-\-info\fR|\fB\-\-warn\fR|\fB\-\-error\fR]
Displays a \fImessage\fR in the status bar\. It\'s displayed in a different color depending on the specified attribute\. If the \fB\-\-error\fR attribute is provided the message will also appear in the errors log (available using \fBlog\fR command)\.
.TP
\fBmap\fR \fIkey\fR \fIcommand\fR
Maps \fIcommand\fR to a specific key combination \fIkey\fR so that this command is executed when the key combination is pressed\. You can have different commands executed depending on the state of Hedgehog using conditional commands described below\.
.TP
\fBunmap\fR \fIkey\fR
Removes the key mapping crated using the \fBmap\fR command\.
.P
\fBmap\fR and \fBunmap\fR commands accept \fIkey\fR argument specified in the format similar to the one used by \fBvim\fR and some other software\. Key specification consists of zero or more modifiers followed by the key\'s name\. Allowed modifier are:
.IP "\[bu]" 2
\fBS\fR or \fBShift\fR for the shift key,
.IP "\[bu]" 2
\fBC\fR, \fBCtrl\fR, or \fBControl\fR for the control key,
.IP "\[bu]" 2
\fBA\fR, \fBAlt\fR, \fBM\fR, or \fBMeta\fR for the alt key\.
.IP "" 0
.P
Most keys can be specified with a single character (such as numbers, Latin letters, etc\.)\. The rest have aliases:
.IP "\[bu]" 2
\fBLeft\fR, \fBUp\fR, \fBRight\fR, \fBDown\fR for arrow keys,
.IP "\[bu]" 2
\fBEnter\fR, \fBReturn\fR, \fBCR\fR for the enter key,
.IP "\[bu]" 2
\fBBS\fR, \fBBackspace\fR for the backspace key,
.IP "\[bu]" 2
\fBHome\fR, \fBEnd\fR, \fBPageUp\fR, \fBPageDown\fR for common cursor position manipulation keys,
.IP "\[bu]" 2
\fBTab\fR for the tab key,
.IP "\[bu]" 2
\fBDel\fR, \fBDelete\fR for the delete key,
.IP "\[bu]" 2
\fBEsc\fR for the escape key,
.IP "\[bu]" 2
\fBSpace\fR for the space key,
.IP "\[bu]" 2
\fBBar\fR for the \fB|\fR key,
.IP "\[bu]" 2
\fBMinus\fR for the \fB\-\fR key,
.IP "\[bu]" 2
\fBInsert\fR for the insert key,
.IP "\[bu]" 2
\fBNul\fR for the character with code 0,
.IP "\[bu]" 2
\fBF1\fR, \fBF2\fR, \|\.\|\.\|\. for functional keys\.
.IP "" 0
.P
Modifiers and keys and separated by dashes (\fB\-\fR), for example, \fBC\-c\fR for \fBControl+C\fR, \fBA\-S\-W\fR for \fBAlt+Shift+W\fR\. Please note that keys are case\-sensitive: if you include the Shift modifier, then the key should be uppercase if applicable (\fBS\-A\fR is correct while \fBS\-a\fR won\'t work)\.
.SS "CONDITIONAL COMMANDS"
.IP "\[bu]" 2
\fBchain\fR \fIcommand\fR [\fIcommand\fR\|\.\|\.\|\.]: Executes multiple commands in a sequence\. The execution stops after the first command whose execution fails, the \fBchain\fR command automatically fails afterward\.
.IP "\[bu]" 2
\fBif\fR \fIcondition\fR \fIcommand 1\fR [\fB\-\-else\fR \fIcommand 2\fR] Evaluates the \fIcondition\fR and execute one of two commands: \fIcommand 1\fR if the condition is true and \fIcommand 2\fR otherwise\. If the \fB\-\-else\fR attribute is not specified, and the \fIcondition\fR evaluates to false, then the \fBif\fR command has no effect\.
.IP "" 0
.P
The conditions used as arguments for the \fBif\fR command can check the Hedgehog UI\'s state\. Currently you can check the currently focused pane and the type of a selected item:
.IP "\[bu]" 2
\fBfocused\fR (\fBfeeds\fR|\fBepisodes\fR|\fBsearch\fR|\fBlog\fR): Evaluates to true if the currently focused pane matches the specified argument\. The selected pane can be either the list of feeds (\fBfeeds\fR), the list of episodes in the currently selected list (\fBepisodes\fR), the search results or the search progress screen (\fBsearch\fR), or the list of errors (\fBlog\fR)\.
.IP "\[bu]" 2
\fBselected\fR (\fBnothing\fR|\fBspecial\-feed\fR|\fBfeed\fR|\fBgroup\fR|\fBepisode\fR|\fBlog\-entry\fR|\fBsearch\-result\fR) Evaluates to true if an item in the selected pane is a special feed: all episodes or new episodes, a regular feed, a group, an episode, a log entry, or a search result\. \fBnothing\fR case is applicable in situations when the list in the currently selected pane is empty\.
.IP "" 0
.P
You can combine multiple conditions using \fBboth\fR or \fBeither\fR command such that \fBboth <condition> [<condition> \|\.\|\.\|\.]\fR evaluates to true if and only if all conditions evaluate to true\. Similarly, \fBeither <condition> [<condition> \|\.\|\.\|\.]\fR evaluates to true if at least one of the conditions is true\.
.SH "CONFIGURATION"
Hedgehog is configured by executing the commands described in the \fICOMMANDS\fR section of this manual\. The effect of these commands lasts until Hedgehog restarts\. In order for the configuration to be persistent across restarts, they should be inserted in the \fBrc\fR file in the config directory\.
.P
Hedgehog considers multiple directories when loading its configuration: command lists and themes, in a way that is similar to how \fIPATH\fR environment variable is used by the operating system\. The configuration path can be configured via \fB\-\-data\-path\fR CLI argument for Hedgehog executable or \fBHEDGEHOG_DATA\fR environment variables\. Both these options append the set of directories to the default paths\. The default paths are:
.IP "\[bu]" 2
\fB/usr/share/hedgehog\fR and \fB\./usr/share/hedgehog\fR (only on UNIX\-based OSes);
.IP "\[bu]" 2
the parent directory of the Hedgehog\'s executable (only on Windows); * user\'s config directory: \fB~/\.config/hedgehog\fR on UNIX\-based OSes and \fB\eUsers\e<user>\eAppData\eRoaming\fR on Windows\.
.IP "" 0
.P
When looking for a file to load (using \fBexec\fR or \fBtheme load\fR command) Hedgehog searches for the existing file by iterating through data directories from the last one to the first one, meaning the directory specified by the user has the highest priority, and global configuration has the lowest\.
.P
An exception to this rule is loading the startup commands\. There is a special file named \fBrc\fR in the data directory\. Hedgehog will execute commands in such files in all data directories in the opposite order: starting with the system\-wide configuration followed by user\-defined configuration files\.
.P
Each configuration file (both \fBrc\fR file and themes) contains a series of commands, each located on a separate line\. The interpreter ignores empty lines and comments (sections starting with \fB#\fR)\.
.SS "CONFIGURATION OPTIONS"
This section list options that can be set using the \fIset\fR command\.
.TP
\fBdate\-format\fR
The format of the publication date following the syntax of \fIstrftime(3)\fR function\.
.TP
\fBlabel\-playback\-status\-playing\fR
The label displaying in the player status bar in the playing state\.
.TP
\fBlabel\-playback\-status\-paused\fR
The label displaying in the player status bar in the paused state\.
.TP
\fBlabel\-playback\-status\-bufffering\fR
The label displaying in the player status bar when the audio stream is buffering\.
.TP
\fBlabel\-playback\-status\-none\fR
The label displaying in the player status bar when no episode is playing\.
.TP
\fBlabel\-playback\-status\-none\fR
The label displaying in the player status bar when no episode is playing\.
.TP
\fBlabel\-episode\-new\fR
The label displaying in the library when the episode is new\.
.TP
\fBlabel\-episode\-seen\fR
Label displaying in the library when the episode is not new but hasn\'t been played\. An episode can reach this status using \fBmark\fR command\.
.TP
\fBlabel\-episode\-playing\fR
The label displaying in the library when the episode is currently being played\.
.TP
\fBlabel\-episode\-started\fR
The label displaying in the library when the episode was started but not completed and is not currently playing\.
.TP
\fBlabel\-episode\-finished\fR
The label displaying in the library when the episode was completed\.
.TP
\fBlabel\-episode\-finished\fR
The label displaying in the library when the previous playback attempt has failed with an error\.
.TP
\fBlabel\-feed\-error\fR
The label displaying in the library list for feeds that could not be updated due to an error\.
.TP
\fBfeed\-updating\-chars\fR
The set of characters used for the episode loading indicator\. The characters will be displayed one\-by\-one looped\.
.TP
\fBanimation\-tick\-duration\fR
The duration of the animation frame for the loading indicator expressed in milliseconds\.
.TP
\fBupdate\-on\-start\fR
The flag indicating whether enabled feeds should be updated on startup\.
.TP
\fBshow\-episode\-number\fR
The flag indicating whether episode and season number should be displayed for episodes in the library\.
.TP
\fBhidden\fR
The flag indicating whether the episodes that are hidden using the \fIhide\fR command should be visible in the library\.
.TP
\fBprogress\-bar\-width\fR
The number of characters allocated to the progress indicator in the player state bar\.
.TP
\fBprogress\-bar\-chars\fR
The string, characters of which are used for the progress indicator\.
.SH "THEMING"
Hedgehog allows extensive customization of colors and text styles for any component of its user interface\. As with any other customization option, changing the visual style of the program is performed via issuing commands\. Hedgehog supports a separate category of theming commands\. They can be issued us subcommands of \fBtheme\fR or loaded from a separate file via \fBtheme load\fR (the \fBtheme\fR prefix isn\'t used for commands in the theme file)\.
.SS "THEMING COMMANDS"
.TP
\fBreset\fR
Clears all styles\. After this command is executed, all styling assigned to any component in any state will be cleared\.
.TP
\fBload\fR \fIfile\fR [\fB\-\-extend\fR]
Reads a file and executes all theming commands from it\. Note that \fIfile\fR can be either an absolute or relative path\. In case of a relative path, Hedgehog applies the same logic as for searching the configuration files but with a small difference\. The theme file may have a \fB\.theme\fR extension\.
.IP
Hedgehog will try to locate a file both with and without it, all existing styling is cleared before a theme file is loaded\. Inclusion of \fB\-\-extend\fR flag prevents this\.
.TP
\fBset\fR \fIselector\fR \fIstyle\-modifiers\fR
Applies the styling to a component identified by the \fIselector\fR\. The syntax of each argument is specified further\.
.SS "STYLE SYNTAX"
Styles are specified using a special syntax where multiple modifiers separated by single or multiple whitespace characters\.
.TP
\fBfg:\fR\fIcolor\fR, \fBbg:\fR\fIcolor\fR
Sets the foreground or background color of a component, respectively\. The color itself can be specified using any of three ways: a 24\-bit RGB color in hexadecimal form preceded by a percentage sign (\fB%FFFFFF\fR for white), an 8\-bit xterm color preceded by a dollar sign (\fB$231\fR for \fBWhite/Grey100\fR) or using a color\'s name (either \fBblack\fR, \fBblue\fR, \fBcyan\fR, \fBdarkgray\fR, \fBgray\fR, \fBgreen\fR, \fBlightblue\fR, \fBlightcyan\fR, \fBlightgreen\fR, \fBlightmagenta\fR, \fBlightred\fR, \fBlightyellow\fR, \fBmagenta\fR, \fBred\fR, \fBwhite\fR, or \fByellow\fR)\. There is a special color identified by the keyword *reset` which corresponds to the terminal\'s default background or foreground color\. Please note that not all color modes may be supported by your terminal emulator\. Named colors may also be overridden by the terminal\'s configuration\.
.TP
.TP
\fB+\fR\fImodifier\fR, \fB\-\fR\fImodifier\fR:
Adds or removes a modifier\. A modifier is a special attribute of a terminal cell that changes some of its visual characteristics\. Removing a modifier is useful when you want to override the existing styling of a component with modifiers already applied\. Note, that different terminal emulators may interpret some modifiers differently or not support them at all\.
.P
The modifiers list include:
.IP "\[bu]" 2
\fBbold\fR increases the text intensity,
.IP "\[bu]" 2
\fBcrossedout\fR crosses the text,
.IP "\[bu]" 2
\fBdim\fR decreases the text intensity,
.IP "\[bu]" 2
\fBhidden\fR hides the text,
.IP "\[bu]" 2
\fBitalic\fR emphasizes the text,
.IP "\[bu]" 2
\fBrapidblink\fR makes the text blinking (\(>= 150 times per minute),
.IP "\[bu]" 2
\fBreversed\fR swaps background and foreground color,
.IP "\[bu]" 2
\fBslowblink\fR makes the text blinking (\(<= 150 times per minute),
.IP "\[bu]" 2
\fBunderlined\fR underlines the text\.
.IP "" 0
.SS "SELECTOR SYNTAX"
A selector is a string that identifies a UI element in a specific state\. Selectors follow any of the following forms:
.TP
\fBstatusbar\.empty\fR
The status bar (the bottom row of the screen) when it doesn\'t display any content\.
.TP
\fBstatusbar\.command\fR[\fB\.prompt\fR]
The status bar when it\'s used for command entry\. \fB\.prompt\fR is used for the command\'s prompt (colon at the beginning) only\.
.TP
\fBstatusbar\.confirmation\fR
The status bar when it\'s used for prompting the user to confirm some action\.
.TP
\fBstatusbar\.status\fR[\fB:error\fR|\fB:warning\fR|\fB:information\fR][\fB\.label\fR]
The status bar when it\'s used for displaying the status message\. The status can be of different severities (\fBerror\fR, \fBwarning\fR or \fBinformation\fR)\. The \fBlabel\fR is a short string placed before some messages (mostly errors)\.
.TP
\fBlist\.divider\fR
The divider between two columns or rows in the library\.
.TP
\fBlist\.item\fR(\fIitem\-state\fR)*[\fIitem\-component\fR]
where
.br
\fIitem\-state\fR=\fB:focused\fR|\fB:selected\fR|\fB:playing\fR|\fB:hidden\fR|\fB:missing\-title\fR|\fB:feed\fR|\fB:feed\-updating\fR|\fB:feed\-error\fR|\fB:feed\-special\fR|\fB:episode\fR|\fB:episode\-error\fR|\fB:episode\-new\fR|\fB:episode\-started\fR|\fB:episode\-finished\fR|\fB:search\fR|\fB:log\-entry\fR
.br
\fIitem\-component\fR=\fB\.state\fR|\fB\.title\fR|\fB\.feed\-title\fR|\fB\.episode\-number\fR|\fB\.duration\fR|\fB\.date\fR|\fB\.loading\fR|\fB\.author\fR|\fB\.genre\fR|\fB\.episodes\-count\fR|\fB\.new\-count\fR|\fB\.details\fR
.br
.br
.IP
The list item or its component\. The list item can be in multiple states: It can belong to a list that is focused (\fB:focused\fR), it can be selected (\fB:selected\fR), it can describe an episode that is currently being played (\fB:playing\fR), an episode that was hidden from the feed but is visible due to value of \fBhidden\fR option, an episode or feed for which there is no title (for example, it wasn\'t specified by the podcast\'s creator, or it wasn\'t loaded yet, \fB:missing\-title\fR)\.
.IP
The rest of the state options define an entry in a specific list and in a context\-specific state\. Options starting with \fB:feed\fR describe list entries in the list of feeds the user is subscribed to\. More specific states allow restricting styling for certain situations only: feeds that are in the process of being updated (\fB:feed\-updating\fR), if the previous attempt to update it failed (\fB:feed\-error\fR), and if the feed is special: either the list of all episodes from all subscriptions or all new episodes (\fB:feed\-special\fR)\.
.IP
Episode list entries (\fB:episodes\fR) can be selected by their state also: episodes can be either new, meaning never played (\fB:episode\-new\fR), started meaning that playback was started but stopped before the entirety of the episode was listened to (\fB:episode\-started\fR), finished when the episode was listened to until the end (\fB:episode\-finished\fR), or playback failed due to an error (\fB:episode\-error\fR)\.
.IP
The search results entries and message log entries can be specified via \fB:search\fR and \fB:log\-entry\fR respectingly\.
.IP
Styling can be applied to the whole row or a specific part of it\. For a later case, you may extend this selector with the name of such part\. Some of these are used by many lists\. These include the name of the feed or episode (\fB\.name\fR), a state indicator usually displayed on the right (\fB\.state\fR), and an ellipsis that are displayed when the data is being loaded from the database for more time than usual\. Most though are list specific\. The episodes list includes an episode and season number (\fB\.episode\-number\fR), the name of a feed where this episode is located (\fB\.feed\-title\fR), the duration of the episode (\fB\.duration\fR), the date when it was published (\fB\.date\fR)\. Search result entries include the name of the autor who publishes the podcast (\fB\.author\fR), its genre (\fB\.genre\fR), the number of episodes in the feed (\fB\.episodes\-count\fR)\. The list of feeds along with the title includes a number of new episodes (\fB\.new\-count\fR)\. The log entry details are selected as \fB\.details\fR\.
.IP
This selector is also used for empty parts of the list\.
.TP
\fBempty\fR[\fB:focused\fR][\fB\.title\fR|\fB\.subtitle\fR]
The list with no entries\. It usually contains a title (\fB\.title\fR) and a text describing why the list is empty and what can be done to change that (\fB\.subtitle\fR)\. As is a regular list, the empty list can be in the focused state (\fB:focused\fR)\. It\'s recommended that styling for lists and empty lists match in regard to the focused state\.
.TP
\fBplayer\fR[\fIplayer\-status\fR][\fIplayer\-element\fR]
where
.br
\fIplayer\-status\fR=\fB:buffering\fR|\fB:paused\fR|\fB:playing\fR|\fB:stopped\fR
.br
\fIplayer\-element\fR=\fB\.episode\fR|\fB\.feed\fR|\fB\.progress\fR|\fB\.status\fR|\fB\.timing\fR
.br
.br
.IP
The playback status bar on the second from the bottom line of the screen\. It consists of some parts which are (from left to right): status indicating the current playback status (buffering, paused, etc\., \fB\.status\fR), the name of the episode (\fB\.episode\fR), the name of a feed containing the currently playing episode (\fB\.feed\fR), the progress bar (\fB\.progress\fR), and the current position within the stream along with its total duration (\fB\.timing\fR)\.
.IP
The remaining options allow you to specify different styles depending on the current state of the playback\.
.P
Above, \fB[\|\.\|\.\|\.]\fR denotes an optional part, \fB\|\.\|\.\|\.|\|\.\|\.\|\.\fR denotes that either of two or more options can be used, \fB(\|\.\|\.\|\.)*\fR denotes the part that can repeat or not be present\.
.P
Selectors can be specific, describing a single UI element in a specific state or be general, specifying many elements or not specifying a state\. When the style is applied using a selector, it is applied to all components that can be described by it in the order the styling is set\. For example styles for \fBplayer\.status\fR will override \fBplayer:playing\.status\fR, so more specific styles should be specified later than more general ones\.
.SH "KEY MAPPING"
This section describes the default key mapping of Hedgehog\. Note that any key mapping can be changed by custom configuration via \fIman\fR and \fIunmap\fR commands\.
.IP "\[bu]" 2
\fBUp\fR, \fBk\fR moves the selection one row up,
.IP "\[bu]" 2
\fBDown\fR, \fBj\fR moves the selection one row down,
.IP "\[bu]" 2
\fBHome\fR moves to the first row in the list,
.IP "\[bu]" 2
\fBEnd\fR moves to the last row in the list,
.IP "\[bu]" 2
\fBPageUp\fR moves to the item one screen up,
.IP "\[bu]" 2
\fBPageDown\fR moves to the item one screen down,
.IP "\[bu]" 2
\fBTab\fR toggles between feeds and episodes lists,
.IP "\[bu]" 2
\fBEnter\fR either focuses on the episodes list, starts playing the episode, or subscribes to the search result depending on the context,
.IP "\[bu]" 2
\fBEsc\fR returns to the library from either the error log or search results,
.IP "\[bu]" 2
\fBC\-c\fR, \fBq\fR quits Hedgehog (includes confirmation),
.IP "\[bu]" 2
\fBDelete\fR deletes the currently selected feed (includes confirmation),
.IP "\[bu]" 2
\fBo\fR opens either podcast\'s or episode\'s Web URL,
.IP "\[bu]" 2
\fBf\fR stops playback and marks the episode as finished,
.IP "\[bu]" 2
\fBRight\fR moves forward by 5 seconds,
.IP "\[bu]" 2
\fBLeft\fR moves backwards by 5 seconds,
.IP "\[bu]" 2
\fBc\fR toggles between paused and playing states,
.IP "\[bu]" 2
\fBm\fR toggles between muted and unmuted states,
.IP "\[bu]" 2
\fBMinus\fR decreases volume by 10%,
.IP "\[bu]" 2
\fB=\fR, \fB+\fR, \fBS\-+\fR increases volume by 10%,
.IP "\[bu]" 2
\fB\.\fR repeats the last command,
.IP "\[bu]" 2
\fB:\fR begins command entry (cannot be remapped)\.
.IP "" 0
.SS "COMMAND ENTRY KEY MAPPING"
The following are key combinations available in the command entry mode\. These cannot be remapped\.
.IP "\[bu]" 2
\fBC\-c\fR, \fBEsc\fR stops entry, discards the input,
.IP "\[bu]" 2
\fBBackspace\fR, \fBC\-h\fR removes character before the cursor,
.IP "\[bu]" 2
\fBDelete\fR removes character after the cursor,
.IP "\[bu]" 2
\fBUp\fR, \fBDown\fR navigates through commands history,
.IP "\[bu]" 2
\fBEnter\fR stops entry, accepts and executes the command,
.IP "\[bu]" 2
\fBTab\fR performs completion,
.IP "\[bu]" 2
\fBLeft\fR moves the cursor one character to the left,
.IP "\[bu]" 2
\fBRight\fR moves the cursor one character to the right,
.IP "\[bu]" 2
\fBC\-Left\fR moves the cursor one word to the left,
.IP "\[bu]" 2
\fBC\-Right\fR moves the cursor one word to the right,
.IP "\[bu]" 2
\fBHome\fR moves the cursor to the first character,
.IP "\[bu]" 2
\fBEnd\fR moves the cursor to the last character,
.IP "\[bu]" 2
\fBBackspace\fR, \fBC\-h\fR removes character before the cursor,
.IP "\[bu]" 2
\fBDelete\fR removes character after the cursor,
.IP "\[bu]" 2
\fBS\-Backspace\fR removes all characters before the cursor,
.IP "\[bu]" 2
\fBS\-Delete\fR removes all characters after the cursor,
.IP "\[bu]" 2
\fBA\-Backspace\fR, \fBC\-w\fR removes a word after the cursor,
.IP "\[bu]" 2
\fBC\-Delete\fR removes a word before the cursor\.
.IP "" 0
.SH "BUGS"
If you find a bug, you have a recommendation or suggestions for Hedgehog, please file an issue at \fIhttps://github\.com/poletaevvlad/Hedgehog/issues\fR\. If you wish to contribute to Hedgehog, you are welcome to participate in the development at \fIhttps://github\.com/poletaevvlad/Hedgehog\fR