-
Notifications
You must be signed in to change notification settings - Fork 50
/
smenu.1
executable file
·2340 lines (2022 loc) · 85.6 KB
/
smenu.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
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
.\" ###################################################################
.\" Copyright 2015, Pierre Gentile ([email protected])
.\"
.\" This Source Code Form is subject to the terms of the Mozilla Public
.\" License, v. 2.0. If a copy of the MPL was not distributed with this
.\" file, You can obtain one at https://mozilla.org/MPL/2.0/.
.\" ###################################################################
.TH smenu 1
.SH NAME
smenu - filter that allows one to interactively select a word from stdin
and outputs the selection to stdout.
.SH SYNOPSIS
.nf
[\fB*-h\fP|\fB-help\fP]
[\fB*-H\fP|\fB-long_help\fP]
[\fB*-?\fP|\fB-u\fP|\fB-usage\fP]
[\fB*-V\fP|\fB-version\fP]
[\fB-n\fP|\fB-lines\fP|\fB-height\fP [\fIheight\fP]]
[\fB-i\fP|\fB-in\fP|\fB-inc\fP|\fB-incl\fP|\fB-include\fP... \fIregex\fP]
[\fB-e\fP|\fB-ex\fP|\fB-exc\fP|\fB-excl\fP|\fB-exclude\fP... \fIregex\fP]
[\fB-m\fP|\fB-msg\fP|\fB-message\fP|\fB-title\fP \fImessage\fP]
[\fB-!\fP|\fB-int\fP|\fB-int_string\fP [\fIstring\fP]]
[\fB-a\fP|\fB-attr\fP|\fB-attributes\fP \fIprefix:attr\fP...]
[\fB-1\fP|\fB-l1\fP|\fB-level1\fP \fIregex\fP [\fIattr\fP]]
[\fB-2\fP|\fB-l2\fP|\fB-level2\fP \fIregex\fP [\fIattr\fP]]
[\fB-3\fP|\fB-l3\fP|\fB-level3\fP \fIregex\fP [\fIattr\fP]]
[\fB-4\fP|\fB-l4\fP|\fB-level4\fP \fIregex\fP [\fIattr\fP]]
[\fB-5\fP|\fB-l5\fP|\fB-level5\fP \fIregex\fP [\fIattr\fP]]
[\fB-6\fP|\fB-l6\fP|\fB-level6\fP \fIregex\fP [\fIattr\fP]]
[\fB-7\fP|\fB-l7\fP|\fB-level7\fP \fIregex\fP [\fIattr\fP]]
[\fB-8\fP|\fB-l8\fP|\fB-level8\fP \fIregex\fP [\fIattr\fP]]
[\fB-9\fP|\fB-l9\fP|\fB-level9\fP \fIregex\fP [\fIattr\fP]]
[\fB-T\fP|\fB-tm\fP|\fB-tag\fP|\fB-tag_mode\fP [\fIdelim\fP]]
[\fB-z\fP|\fB-zap\fP|\fB-zap_glyphs\fP \fIbytes\fP]
[\fB-P\fP|\fB-pm\fP|\fB-pin\fP|\fB-pin_mode\fP [\fIdelim\fP]]
[\fB-0\fP|\fB-noat\fP|\fB-no_auto_tag\fP]
[\fB-p\fP|\fB-at\fP|\fB-auto_tag\fP]
[\fB-N\fP|\fB-number\fP... [\fIregex\fP...]]
[\fB-U\fP|\fB-unnumber\fP... [\fIregex\fP...]]
[\fB-F\fP|\fB-en\fP|\fB-embedded_number\fP]
[\fB-D\fP|\fB-data\fP|\fB-options\fP [\fIparameter\fP...]
[\fB-b\fP|\fB-blank\fP]
[\fB-M\fP|\fB-middle\fP|\fB-center\fP]
[\fB-d\fP|\fB-restore\fP|\fB-delete\fP|\fB-clean\fP|\
\fB-delete_window\fP|\fB-clean_window\fP]
[\fB-c\fP|\fB-col\fP|\fB-col_mode\fP|\fB-column\fP]
[\fB-l\fP|\fB-line\fP|\fB-line_mode\fP]
[\fB-t\fP|\fB-tab\fP|\fB-tab_mode\fP|\fB-tabulate_mode\fP [\fIcols\fP]]
[\fB-w\fP|\fB-wide\fP|\fB-wide_mode\fP]
[\fB-C\fP|\fB-cs\fP|\fB-cols\fP|\fB-cols_select\fP... \
[\fIdirective\fP][\fIselector\fP...]]
[\fB-R\fP|\fB-rs\fP|\fB-rows\fP|\fB-rows_select\fP... \
[\fIdirective\fP][\fIselector\fP...]]
[\fB-al\fP|\fB-align\fP... [\fIre_selectors\fP...]]
[\fB-A\fP|\fB-fc\fP|\fB-first_column\fP \fIregex\fP]
[\fB-Z\fP|\fB-lc\fP|\fB-last_column\fP \fIregex\fP]
[\fB-g\fP|\fB-gutter\fP [\fIstring\fP]]
[\fB-k\fP|\fB-ks\fP|\fB-keep_spaces\fP]
[\fB-W\fP|\fB-ws\fP|\fB-wd\fP|\fB-word_delimiters\fP|\
\fB-word_separators\fP \
\fIbytes\fP]
[\fB-L\fP|\fB-ls\fP|\fB-ld\fP|\fB-line-delimiters\fP|\
\fB-line_separators\fP \
\fIbytes\fP]
[\fB-q\fP|\fB-no_bar\fP|\fB-no_scroll_bar\fP]
[\fB-no_hbar\fP|\fB-no_hor_scroll_bar\fP]
[\fB-hbar\fP|\fB-hor_scroll_bar\fP]
[\fB-S\fP|\fB-subst\fP... \fI/regex/repl/opts\fP]
[\fB-I\fP|\fB-si\fP|\fB-subst_included\fP... \fI/regex/repl/opts\fP]
[\fB-E\fP|\fB-se\fP|\fB-subst_excluded\fP... \fI/regex/repl/opts\fP]
[\fB-ES\fP|\fB-early_subst\fP... \fI/regex/repl/opts\fP]
[\fB-/\fP|\fB-search_method\fP \fIprefix\fP|\fIsubstring\fP|\fIfuzzy\fP]
[\fB-s\fP|\fB-sp\fP|\fB-start\fP|\fB-start_pattern\fP \fIpattern\fP]
[\fB-x\fP|\fB-tmout\fP|\fB-timeout\fP \fItype\fP [\fIword\fP] \fIdelay\fP]
[\fB-X\fP|\fB-htmout\fP|\fB-hidden_timeout\fP \fItype\fP [\fIword\fP] \
\fIdelay\fP]
[\fB-r\fP|\fB-auto_validate\fP]
[\fB-is\fP|\fB-incremental_search\fP]
[\fB-v\fP|\fB-vb\fP|\fB-visual_bell\fP]
[\fB-Q\fP|\fB-ignore_quotes\fP]
[\fB-lim\fP|\fB-limits\fP \fIlimit:value\fP...]
[\fB-f\fP|\fB-forgotten_timeout\fP|\fB-global_timeout\fP \fItimeout\fP]
[\fB-nm\fP|\fB-no_mouse\fP]
[\fB-br\fP|\fB-buttons\fP|\fB-button_remapping\fP \fInew_button_1\fP \
\fInew_button_3\fP]
[\fB-dc\fP|\fB-dcd\fP|\fB-double_click\fP|\fB-double_click_delay\fP \
\fIdelay_in_ms\fP]
[\fB-sb\fP|\fB-sbw\fP|\fB-show_blank_words\fP [\fIblank_char\fP]]
selectors ::= See the \fB-C\fP|\fB-cs\fP|\fB-cols\fP description for \
more details.
re_selectors ::= \fIRE\fP,...
directive ::= \fIi\fP|\fII\fP|\fIe\fP|\fIE\fP|\
\fIl\fP|\fIL\fP|\fIr\fP|\fIR\fP|\fIc\fP|\fIC\fP
parameter ::= [l|r:<char>]|[a:left|right]|[p:included|all|[w:<num>]|
[f:yes|no]|[o:<num>[+]]|[n:<num>]|[i:<num>]|[d:<char>]|
[s:<num>]|[h:trim|cut|keep]
attr ::= [fg][/bg][,style]
RE ::= \fB<char>\fIregex\fB<char>\fR
selectors and RE can be freely mixed.
style can only contain a maximum of 6 characters.
<char> in RE is any non-blank ASCII character except ','.
.fi
Note that some parameters require that others have been previously
entered in the command line to be accepted.
.SH DESCRIPTION
This small utility acts as a filter when no input file is given
(reads from stdin and writes to stdout) or takes its inputs from that file.
All words read are presented in a scrolling window on the terminal \fBat
the current cursor position\fP, without clearing the screen first.
.PP
The selection cursor is initially positioned on the first selectable word
by default.
.PP
In this window, words can be displayed next to each other, with a fixed
size, or in rows or columns respecting the line ends as input.
In column mode, words can also be centred, left aligned or right aligned.
See the options \fB-C\fP|\fB-cs\fP|\fB-cols\fP|\fB-cols_select\fP,
\fB-R\fP|\fB-rs\fP|\fB-rows\fP|\fB-rows_select\fP and
\fB-al\fP|\fB-align\fP for more information.
.PP
There are options to explicitly or implicitly include/exclude or align words
using extended regular expressions.
Note that once certain words are explicitly excluded, they cannot be
re-included later.
.PP
Excluded words are skipped when the selection cursor is moved and cannot
be searched for.
.PP
The \fB-W\fP|\fB-ws\fP|\fB-wd\fP|\fB-word_delimiters\fP|\fB-word_separators\fP
option can be used to set the characters (or multibyte
sequences) which will be used to delimit the input words.
The default delimiters are: \fISPACE\fP, \fI\\t\fP and \fI\\n\fP.
.PP
The
\fB-L\fP|\fB-ls\fP|\fB-ld\fP|\fB-line-delimiters\fP|\fB-line_separators\fP
has a similar meaning for lines.
Special character sequences formed by a \fI\\\fP followed by one of the
characters \fIa\fP \fIb\fP \fIt\fP \fIn\fP \fIv\fP \fIf\fP \fIr\fP and
\fI\\\fP are understood and have their traditional meanings.
smenu strives to support UTF-8 encoding, both as input and output.
\fBUTF-8\fP sequences introduced by \fI\\u\fP and \fI\\U\fP are also
understood.
\fBWarning\fP, when used together, it is important to know that all
sequences beginning with \fI\\U\fP will be interpreted before the
beginning of the interpretation of sequences beginning with \fI\\u\fP.
\fI\\u\fP can be followed by 2,4,6 or 8 hexadecimal characters composing
an \fBUTF-8\fP bytestring.
Here is an example of using \fI\\u\fP to compose a \fBLatin Small Letter E
with Acute\fP: \fI\\uc3a9\fP.
\fI\\U\fP must be followed by exactly 6 hexadecimal digits, \fBincluding\fP
leading zeros, that represent a Unicode codepoint according to ISO
10646 UCS-4.
The \fBLatin Small Letter E with Acute\fP of the previous example
(codepoint \fBU+00E9\fP) can then be represented as \fI\\U0000e9\fP.
.PP
Note that with most shells, the \fI\\\fP before \fIu\fP and \fIU\fP
need to be protected or escaped.
.PP
Quotations (single and double) in the input stream can be used to ignore
the word separators so that a group of words are taken as a single entity.
.PP
Non printable characters in words that are not delimiters are
converted to their traditional form (\fI\\n\fP for end-of-line,
\fI\\t\fP for tabulation...) by default.
.PP
An invalid \fBUTF-8\fP sequence or other non-printable character will be
replaced by a dot (\fI.\fP) by default.
.PP
There is nevertheless a possibility to change this substitution character
with another \fBASCII\fP printable one with the help of the command line
option \fB-.\fP|\fB-dot\fP|\fB-invalid\fP.
.PP
\fBWarning\fP, \fBUTF-8\fP encoded codepoints are quietly converted
into the substitution character when the user locale is not \fBUTF-8\fP
aware like \fBPOSIX\fP or \fBC\fP by example.
.PP
Words containing only spaces, entered directly or resulting from a
substitution, are also rejected unless they are not selectable.
This allows special effects like creating blank lines for example.
These words are also kept in column mode, selectable or not.
.PP
smenu has an option to define a set of characters or \fBUTF-8\fP sequences
which should be ignored when reading words.
This can be very useful when dealing with inputs where the EOL sequence
consists in more than one character.
.PP
A typical example is DOS or Windows files with lines ending with
\fICRLF\fP.
In such a case one might decide to ignore all \fICR\fP characters from
the input.
.PP
.SS "Keyboard and mouse usage."
\fBkeyboard\fP:
.RS 2
The cursor can be moved in any direction using the arrow keys of the
keyboard: \fB\(<-\fP, \fB\(da\fP, \fB\(ua\fP, \fB\(->\fP
or the \fIvi\fP direction keys: \fBh\fP, \fBj\fP, \fBk\fP and \fBl\fP.
The \fBHOME\fP, \fBEND\fP, \fBPgDn\fP and \fBPgUp\fP keys can also be
used when available.
The meaning of the movement keys is as follows:
.TS
tab(@);
l l.
\fB\(<-\fP, \fBh\fP@Previous word
\fBSHIFT\ HOME\fP, \fBCTRL\ \(<-\fP, \fBH\fP@Start of line in column or line mode
\fB\(ua\fP, \fBk\fP@Previous line
\fBPgUp\fP, \fBK\fP@Previous page
\fBHOME\fP@First word of the window
\fBCTRL\ HOME\fP, \fBCTRL\ K\fP@First word
\fB<\fP@The window's content is shifted to the
@left while keeping the cursor visible
\fB\(->\fP, \fBl\fP@Next word
\fBSHIFT\ END\fP, \fBCTRL\ \(->\fP, \fBL\fP@End of line in column or line mode
\fB\(da\fP, \fBj\fP@Next line
\fBPgDn\fP, \fBJ\fP@Next page
\fBEND\fP@Last word of the window
\fBCTRL\ END\fP, \fBCTRL\ J\fP@Last word
\fB>\fP@The window's content is shifted to the
@right while keeping the cursor visible
.TE
\fBCTRL\ \(<-\fP/\fBH\fP (resp. \fBCTRL\ \(->\fP/\fBL\fP) places the cursor
so that a maximum number of words (selectable or not) are visible to
the left (reps. right) side of the window.
When the content of the window is shifted to the left or right using
\fB<\fP or \fB>\fP or the mouse, the cursor always highlights the same
word and remains visible.
This can prevent any further shifting operations.
.RE
.PP
\fBMouse:\fP
.RS 2
With many terminal emulators, it is possible to use the mouse to interact
with the screen content.
\fBWarning\fP, if groups of extended graphemes are present in the input,
mouse-based selection is only accurate if the terminal correctly displays
these graphemes.
An example of a non-functional terminal is xterm, an example of a
functional terminal is wezterm.
When the mouse is supported, the cursor can turn into an arrow (but
not always) and the mouse can then be used as a point and click device
as follows:
\fBFirst (usually left) mouse button (note that buttons can be remapped)\fP:
.RS 2
.IP \(bu 2
A click on a word selects it if it is selectable.
.IP \(bu 2
A click on a word while holding the CTRL key pressed when tagging/pinning
is activated marks/unmarks this word.
.IP \(bu 2
A Click at the ends of the vertical scroll bar (if present) is equivalent
to pressing the keyboard's up or down arrow.
A click anywhere else on the vertical scroll bar moves the cursor to
another word, depending on where you click.
The new current word will be positioned at the beginning of a line
if possible.
A click at the ends of the horizontal scroll bar (if present) is
equivalent to pressing the keyboard's left or right arrow.
A click anywhere else on the horizontal scroll bar moves the cursor left
of right on the line containing the cursor, but does not move it further
than the first or last word on that line.
.IP \(bu 2
A double-click on a word selects it, if selectable, and acts as if the
Enter key had been pressed, the double-click delay being configurable.
.IP \(bu 2
A click on the left or right horizontal arrow of each line (when visible)
shifts the content of the window to the left or right, one word at a time.
.br
Nothing happens if the cursor risks leaving the window.
Note that clicking on a left-facing arrow in an empty line means that
not all the words in that line could be displayed because of previous
shifts or moves.
In this case, smenu will try to display the last word of this line but
it is not always possible as the cursor must remain visible.
.br
The keyboard commands \fB<\fP and \fB>\fP can be used in such a case
because the cursor is already on the current line.
.RE
.P
\fBThird (usually right) mouse button\fP:
.RS 2
.IP \(bu 2
When tagging or pinning is enabled, a click on a word tags/untags it if
it is selectable.
.IP \(bu 2
When tagging or pinning is enabled, a click on a word while holding the
CTRL key pressed has the following actions:
.RS 2
.IP - 2
If the word clicked is selectable and no word is already marked then
marks it.
.IP - 2
If a word is marked and the clicked word is selectable and is not the
marked word, then:
.RS 2
.IP + 2
In column mode, if the marked word is in the same column/line as the
clicked word, tags all words bounded by those words in that column/line
as if \fBZ\fP the keyboard command were used.
.IP + 2
In line or column mode, if the marked word is in the same line as the
clicked word, tags all words bounded by those words in that line.
.IP + 2
Otherwise, tags all words bounded by the marked word and the
clicked one.
.IP + 2
In all cases, the mark is removed.
.RE
.RE
.RE
.P
\fBMouse wheel\fP:
.RS 2
.IP \(bu 2
Rotating the mouse wheel scrolls the contents of the window one line up
or down.
.IP \(bu 2
Rotating the mouse wheel while holding down the \fBCTRL\fP key scrolls
the contents of the window one page up or down.
.br
This feature may not work depending on the terminal and operating system.
.PP
Be sure to use the wheel when the mouse pointer is over the smenu
window, as some terminal emulators may otherwise zoom the screen in
and out instead.
.RE
.PP
Remember that mouse support does not disable the keyboard, so use the
keys instead if the mouse is not working properly.
.PP
Some terminals may not report clicks after the 223rd line or column due
to a limitation of the old X11 mouse tracking protocol, one example of
such a terminal emulator is screen < 4.7.0.
tmux as well as screen >= 4.7.0 are fine.
Keyboard and mouse can be used at the same time.
.TP 2
\fBRemark 1.\fP
Some X-Window terminal emulators may not support the
enable/disable bracketed pastes escape sequence, in such a case if
may be necessary to explicitly clear the content of the paste buffer
before running smenu so that the mouse buttons (especially for pasting)
do their job correctly.
.br
This action can easily be performed using the command \f(CRxsel -c\fP
for example.
.TP 2
\fBRemark 2.\fP
Some X-Windows terminal emulators intercept mouse input
when some modifiers are used, a typical example is xterm which displays
popup menus in these cases.
.br
For xterm (Patch #361 - 2020/10/14 or later) a working workaround
is to use the X resource \f(CRXTerm*omitTranslation:popup-menu\fP
either by adding it in your \f(CR.Xresources\fP file and register
it with \f(CRxrdb\fP or by launching xterm using the
\f(CR-xrm 'XTerm*omitTranslation:popup-menu'\fP command line option.
.TP 2
\fBRemark 3 for BSD systems.\fP
In order for the mouse to work properly under (virtualised?) FreeBSD
and perhaps other BSD variants, it may be necessary add the following
two lines to the file \fB~/.Xmodmap\fP:
.nf
\f(CR! Disable button 8 and 9.
pointer = 1 2 3 4 5 6 7 0 0 10 11 12\fP
.fi
And run the command: \f(CRxmodmap ~/.Xmodmap\fP
(ignore any warnings issued by this command).
This can also be done non-permanently by running the command:
.nf
\f(CRxmodmap -e "pointer = 1 2 3 4 5 6 7 0 0 10 11 12"\fP
.fi
If this is not enough, try to disable buttons 8 to 12.
.RE
.P
\fBDirect access:\fP
.RS 2
If \fB-N\fP|\fB-number\fP, \fB-U\fP|\fB-unnumber\fP or
\fB-F\fP|\fB-en\fP|\fB-embedded_number\fP are used, then it becomes
possible to directly access a word by entering its number.
The numbering created using these option is done \fBbefore\fP any words
substitution done using \fB-S\fP|\fB-subst\fP \fI/regex/repl/opts\fP,
\fB-I\fP|\fB-si\fP|\fB-subst_included\fP or
\fB-E\fP|\fB-se\fP|\fB-subst_excluded\fP.
Using a combination of these options, it is easy to control which words
will be numbered by adding a special symbol in it before using smenu and
removing it (substituted by nothing) afterward using
\fB-I\fP|\fB-si\fP|\fB-subst_included\fP by example.
\fB-E\fP|\fB-se\fP|\fB-subst_excluded\fP gives another way to do that,
see below or more.
.RE
.SS "Changing input words"
smenu offers the possibility to modify the input words in a sed-like way.
Words can be modified at two points: just after they have been read
and after other operations have been applied, such as enabling,
disabling or coloring.
The related options are \fB-ES\fP|\fB-subst\fP,
\fB-S\fP|\fB-subst\fP, \fB-I\fP|\fB-si\fP|\fB-subst_included\fP and
\fB-E\fP|\fB-se\fP|\fB-subst_excluded\fP their descriptions can be found
in the \fBOPTIONS\fP section.
.SS "Searching for words"
A word can be searched using different algorithms: \fIprefix\fP,
\fIsubstring\fP of \fIfuzzy\fP.
.TP
\fIprefix\fP (keys \fB^\fP or \fB=\fP):
The sequence of characters entered must match the beginning of a word.
.TP
\fIsubstring\fP (keys \fB"\fP or \fB'\fP):
The sequence of characters entered must match a substring in a word.
.TP
\fIfuzzy\fP (keys \fB~\fP or \fB*\fP):
All the characters in the entered sequence must appear in the same order
in a word, but need not be consecutive.
The case is also ignored.
Note that spaces and tabs at the beginning and end of words are ignored
when searching for substrings or fuzzy strings.
The cursor is placed, if possible, on the first matching word having the
minimum number of gaps between the first and last matching character,
see the difference between the actions of the \fBs\fP/\fBS\fP and
\fBn\fP/\fBN\fP keys below.
This method also tolerates intermediate symbols not appearing in the
words which will be ignored.
If this is the case, the attributes of the approximately matching
words are changed into an error versions of them to warn the user to
this situation.
The erroneous symbols will \fInot\fP be inserted in the search buffer.
For example: if the word \fBabcdef\fP is present in the standard input,
then entering \f(CBabxcdye\fP puts \fBabcdef\fP in the search buffer
and the word is added to the list of matching words and displayed with
an error attribute (in red by default).
This special state will persist until all the symbols following the first
erroneous one are deleted (using backspace) or if \fBESC\fP is pressed
to cancel the search session and clear the search buffer.
.PP
During a search session, the cursor changes and each character entered is
added in (or removed from) the search buffer.
The display is refreshed after each change in this buffer.
.PP
A 10 seconds timeout (by default) automatically ends the current
search session as if the \fBEnter\fP key had been pressed.
This timeout is reset each time a new key is hit in search mode.
This delay can be configured using the \fBsearch\fP entry in the
\fBtimers\fP section of the configuration file as shown in the example
in the configuration subsection.
.PP
The slash key (\fB/\fP) can also be used instead of any of these keys.
By default it is is programmed to do a \fIfuzzy\fP search but this can
be changed by using the command line option
(\fB-/\fP|\fB-search_method\fP) or by tuning a configuration file,
see below.
.PP
All the words matching the current search buffer are enhanced:
The characters present in the current search buffer are highlighted in
one way and the other characters in another way.
Both of these highlighting methods are configurable.
.PP
If the user has entered the search sequence: \fBo\fP, \fBs\fP, then the
matching word "words" will be displayed as \fBw\fP\fIo\fP\fBrd\fP\fIs\fP
when the \fIfuzzy\fP algorithm is in use depending of the display
attributes configured.
.PP
\fBENTER\fP and all cursor moves terminate the search session but do
not clear the list of the matching words and the search buffer.
.PP
The user can then use the \fBn\fP/\fBs\fP/\fBSPACE\fP keys (forward) and
the \fBN\fP/\fBS\fP keys (backward) to navigate in the list of matching
words,
In \fIfuzzy\fP search mode, the \fBs\fP/\fBS\fP keys attempt to move the
cursor to the next/previous word whose matching part forms a substring
of this word.
If no such matches exist, \fBs\fP/\fBS\fP and \fBn\fP/\fBN\fP do the
same things.
To move the cursor to the next/previous fuzzy match, use the
\fBn\fP/\fBN\fP/\fBSPACE\fP keys.
\fBs\fP means next \fPs\fPubstring match in this context while \fBn\fP
just means \fBn\fPext match.
.PP
If the user hits the \fBHOME\fP or \fBEND\fP key during a search session
then the list of matching words is reduced to the words starting
(respectively) ending with the current search pattern and the window
is refreshed.
For those who consider \fBHOME\fP and \fBEND\fP as non-intuitive,
the \fBCTRL\ A\fP and \fBCTRL\ Z\fP keys are also available in search mode
as an alternative.
This behavior is persistent until the user hit the \fBESC\fP or
\fBENTER\fP key.
For example, if the search pattern in substring mode is \f(CBsh\fP and
the user hits \fBEND\fP, then only the words \fIending\fP with \f(CBsh\fP
will be added in the searched word list and enhanced.
Note that when a matching word is selected, its enhanced characters only
show one of the multiple matching possibilities.
When not in a search session \fBESC\fP can be also used to clear the
list of matching words and to reset the search buffer.
.PP
Note that the search buffer is persistent as long as the same search
algorithm is used and \fBESC\fP has not been pressed.
.SS "Selection and Exit"
Pressing \fBq\fP gives the possibility to exit without selecting anything.
.PP
\fBCTRL\ C\fP (Abort) also exits the program immediately with a return
code equal to 128+SINGINT (by default) without selecting anything.
See the \fB-!\fP|\fB-int\fP|\fB-int_string\fP option for more information
about the customization of the \fBCTRL\ C\fP behavior.
.PP
By default, \fBENTER\fP or a double click with the first mouse button if
applicable writes the selected word to stdout when not in
search mode otherwise it exits from this mode and does nothing more.
If you want to be able to select a word \fIeven\fP when in search mode,
use the \fB-r\fP|\fB-auto_validate\fP option to change this behavior.
.SS "Tagging (multiple selections)"
When the tagging is activated by using the command line
\fB-T\fP|\fB-tm\fP|\fB-tag\fP|\fB-tag_mode\fP
or \fB-P\fP|\fB-pm\fP|\fB-pin\fP|\fB-pin_mode\fP option, then the
keys \fBt\fP, \fBu\fP, \fBINS\fP, \fBDEL\fP \fBc\fP, \fBr\fP,
\fBm\fP, \fBM\fP, \fBT\fP, \fBC\fP, \fBR\fP and \fBU\fP, can be
used to tag/untag some words.
These tagged words will then be sent to the standard output when
\fBENTER\fP is pressed.
Their meanings is as follows:
.TP
\fBt\fP
Tags/untags or Pin/unpin the word under the cursor (toggle).
.TP
\fBu\fP
Untags or unpins the word under the cursor.
.TP
\fBINS\fP
Tags or pins the word under the cursor.
.TP
\fBDEL\fP
Untags or unpins the word under the cursor.
.TP
\fBc\fP
Tags or pins all the selectable words in the current \fBcolumn\fP when
no word is marked, otherwise acts like \fBC\fP.
.TP
\fBr\fP
Tags or pins all the selectable words in the current \fBrow/line\fP
when no word is marked, otherwise acts like \fBR\fP.
.TP
\fBm\fP
Marks the current word, the cursor aspect will change until the word
is unmarked.
.TP
\fBM\fP or \fBESC\fP
Unmarks the current word, other actions will also automatically unmark
the word, see below.
.TP
\fBT\fP
If no word are marked and the result of a search is still displayed then
tags all words found in this search.
If no word has been searched and no word is marked, then the current
word is marked, just as if \fBm\fP has been used instead.
Otherwise all words between the marked word and the
current word are tagged.
.br
The marked word will no longer be marked after tagging is complete.
.TP
\fBZ\fP
Like \fBT\fP when not in search mode and when the marked words is not
on the same column or line as the cursor in column mode.
.br
When in column mode and if the marked word is in the same column or line
as the cursor, tags only the words in the same column (respectively line)
bounded by the marked word and the cursor.
.TP
\fBC\fP
As for \fBT\fP, \fBC\fP marks the current word if no word is currently
marked, just as if \fBm\fP had been used instead.
.br
If a word is already marked, \fBC\fP tags/pins the words between the
current and the marked words if they are the \fBsame column\fP.
.br
The marked word will no longer be marked after tagging is complete.
.TP
\fBR\fP
As for \fBT\fP, \fBR\fP marks the current word if no word is currently
marked, just as if \fBm\fP has been used instead.
.br
If a word is already marked, \fBR\fP tags/pins the words between the
current and the marked words if they are the \fBsame row/line\fP.
.br
The marked word will no longer be marked after tagging is complete.
.PP
Note that when you use \fBT\fP, \fBC\fP or \fBR\fP with pinning enabled,
the order of word selection depends on whether the marked word is before
or after the current word.
.br
When a word is marked, the pinning order using \fBc\fP and \fBr\fP
increases from the marked word to the current word.
.br
When no words are marked, the pinning order when using \fBc\fP and \fBr\fP
always increases from top to bottom and from left to right respectively.
.TP
\fBU\fP
Untags or unpins the last tagging action.
.TP
\fBCTRL T\fP
Untags all the previously tagged/pinned words.
.br
The marked word, if any, will no longer be marked after this action.
.PP
Also note that using some of these keys may be more easily achieved by
using the third mouse button (usually the right one) when the mouse
is available.
.br
See how to use the right mouse buttons in the "Keyboard and mouse
usage." at the beginning of this manual.
.SS Help
A small help message can be displayed when hitting the \fB?\fP key.
This message will last for 30s or until another key or \fBESC\fP is
pressed.
.br
If the help content is longer than the window, it can be scrolled up or
down using the vertical arrow keys or the vi direction keys (\fBj\fP
and \fBk\fP).
.SS "Scroll bars"
The vertical scroll bar is displayed at the right of the scrolling window.
Its appearance is meant to be classical but it has some particularities:
.IP \(bu 2
The vertical scroll bar is not displayed if all the input words fit on
only one line.
.IP \(bu 2
Otherwise, the vertical scroll bar is always displayed except when
the \fB-q\fP option is set.
This option completely disables the scroll display of all scroll bars.
.IP \(bu 2
When the scrolling window has only one line, the vertical scroll bar
has only 3 states:
.RS 2
.IP - 2
\fBv\fP when on all but the last line, indicating that you can go down
to see more.
.IP - 2
\fB^\fP when on the last line.
.IP - 2
\fB|\fP otherwise.
.RE
.IP \(bu 2
When there is more than one line to display, \fB/\fP means that the window
displays the first line, \fB\\\fP the last line.
\fB|\fP is used to fill the gap, see below the different possible
configurations.
.TS
tab(@);
l l l l l
l l l l l
l l l l .
\\@\\@^@^@\\ @Do not remove this trailing space!
|@|@|@|@/
/@v@/@v
.TE
.PP
A \fB+\fP can also appear in the scroll bar in lieu of the vertical bar,
giving the relative position of the cursor line in the bunch of input
words.
The horizontal scroll bar is only displayed below the window when the
current line is truncated in line of column mode.
If its appearance scrolls up the windows in the screen, the new position
of the window will unchanged even it this scroll bar is no more displayed
as the line containing the cursor is no more truncated.
.SS "Terminal resizing (also see BUGS/LIMITATIONS)"
The windows is redrawn if the terminal is resized.
The redrawing is actually done only 1s after the end of the resizing to
avoid artifacts on screen.
The cursor will remain on the current selected word but may be displayed
at another place in the window.
.SS "Unicode support"
This utility is Unicode aware and should be able to display correctly
any Unicode character (even double-width ones) as long as the current
encoding is \fBUTF-8\fP (\fBUTF-8\fP in the output of the \fIlocale\fP
command).
Note that smenu will not attempt to normalize words containing UTF-8 glyphs.
Thus \fI\\u61\\ucc88\fP (\fIä\fP) will not be considered equal to
\fI\\uc3a4\fP (canonical normalization of \fIä\fP).
It is nevertheless possible to use an external tool such as uconv from the
ICU project (https://icu.unicode.org) to do this work before using smenu.
For example: uconv can be used as a filter as in:
\f(CBcat ... | uconv -x any-nfc | smenu\fP
.SS "Optional configuration file"
If a file with adequate permissions and the same name as the executable
but prefixed with a dot is present in the current directory
or in the user's home directory, then it will be parsed as a
\fI.ini\fP file.
The values read from the file in the home directory will be overridden by
the ones read from the local directory (if it is present).
Missing and bad keywords are silently skipped.
The values read, if valid, override the default hard-coded ones.
If a value is invalid an error message is shown and the program terminates.
The values of the timers must be given in units of \fB1/10\fP of a second.
Here is an example giving the syntax and the names of the keywords
allowed:
.PP
.nf
\f(CR--8<------------------------------------------------------------------
[colors]
; The terminal must have at least 8 colors and/or have attributes
: like bold and reverse for this to be useful
; if not the following settings will be ignored.
method=ansi ; classic | ansi (default)
cursor=0/2 ; cursor attributes
cursor_on_tag=0/2,u ; cursor on tag attributes
shift=6,b ; shift symbol attributes
message=0/3 ; message (title) attributes
bar = 7/4,b ; scroll bars attributes
search_field = 0/6 ; search field attributes
search_text = 7,bu ; search text attributes
match_field = 1,b ; matching words field attributes
match_text = 7,bu ; matching words text attributes
search_err_field = 1 ; approximate search field attributes
search_err_text = 1,r ; approximate search text attributes
; match_err_field = 3 ; approximate matching words field attributes
match_err_text = 1 ; approximate matching words text attributes
; include = b ; selectable color attributes
exclude = 4/0,u ; non-selectable color attributes
tag = 0/5 ; tagged (selected) attributes
daccess = 3,b ; direct access tag attributes
special1 = 7/4,b ; attributes for the special level 1
special2 = bu ; attributes for the special level 2
special3 = /3,b ; attributes for the special level 3
special4 = 7/4 ; attributes for the special level 4
special5 = 7/2,b ; attributes for the special level 5
special9 = 2,rb ; attributes for the special level 9
[window]
lines = 7 ; default number of lines of the window
[limits]
word_length = 1024 ; arbitrary max length of input words (int)
words = 32767 ; arbitrary max number of allowed input
; words (int)
columns = 128 ; arbitrary max number of columns (int)
[timers]
search = 100 ; search timeout in 1/10 s
help = 150 ; duration of the help message in 1/10 s
window = 7 ; delay before redrawing if the size of the
; terminal's window change in 1/10 s
direct_access = 6 ; duration allowed to add a new digit to
; the direct word access number in 1/10 s
forgotten = 9000 ; An explicit delay (in 1/10 s) before smenu
; is forced to stop as if "q" had been pressed.
; Useful when one forgot to make a selection.
[misc]
default_search_method = substring
[mouse]
double_click_delay= 200 ; delay in milliseconds
--8<------------------------------------------------------------------
\fP
.fi
.IP \(bu 2
The \fBmethod\fP keyword can take the two possible values displayed
above and determines if you want to use the native method (limited to 8
colors) of the \fBansi\fP method (ISO 8613-6) if your terminal supports
more than 8 colors.
The default value corresponds to \fBansi\fP.
The attributes syntax is [fg][/bg][[,.+]toggles] where \fBfg\fP and
\fBbg\fP are numbers representing the foreground and background color
and \fBtoggles\fP is a strings which can contain the characters \fIb\fP,
\fId\fP, \fIr\fP, \fIs\fP, \fIu\fP, \fIi\fP, \fIn\fP and \fIl\fP
representing respectively \fIb\fPold, \fId\fPim, \fIr\fPeverse,
\fIs\fPtandout, \fIu\fPnderline, \fIi\fPtalic, i\fIn\fPvisible
and b\fIl\fPink.
.IP \(bu 2
Spaces are allowed anywhere in the lines and between them, even around
the \fB=\fP.
.IP \(bu 2
Everything following a \fB;\fP is ignored.
.IP \(bu 2
When undefined, the default limits are:
.TS
tab(@);
l l .
words@32767
word_length@512
columns@256
.TE
.SH OPTIONS
Not all options may be available, depending on the current context.
When smenu is called and before the first option is evaluated, it is in
the \fBMain\fP context.
Each option can switch to another context in which only a subset of the
options is usable.
For each parameter described below, the contexts in which the associated
option is defined as well as the context to which it leads, if any,
are given.
An option not defined in a context will force the end of the current
context and will be recursively evaluated in the previous contexts until
found (or not).
If not found, an error message is displayed and smenu is terminated.
The contexts defined in smenu are:
.IP \fBMain\fP 2
The default context
.IP \fBColumns\fP 2
After the \fB-c\fP|\fB-col\fP|\fB-col_mode\fP|\fB-column\fP parameter.
.IP \fBLines\fP 2
After the \fB-l\fP|\fB-line\fP|\fB-line_mode\fP parameter.
.IP \fBTabulations 2
After the \fB-t\fP|\fB-tab\fP|\fB-tab_mode\fP|\fB-tabulate_mode\fP parameter.
.IP \fBTagging\fP 2
After the \fB-T\fP|\fB-tm\fP|\fB-tag\fP|\fB-tag_mode\fP or
\fB-P\fP|\fB-pm\fP|\fB-pin\fP|\fB-pin_mode\fP parameter.
.PP
.IP \fBWARNING\fP 2
Here is a situation that may seem confusing at first glance.
Imagine the only parameter command line parameter is \fB-cols_select\fP.
Since this is a parameter of an option which is not valid when not in
the \fBColumns\fP context, it should have raised an error but it still
seems to be accepted.
The trick is: when not in column mode \fB-cols_select\fP is indeed not
accepted but its prefix (\fB-col\fP) is valid.
The options are thus understood as: \fB-col\fP \fB-s_select\fP.
The same mechanism occurs again as \fB-s\fP is also valid in column
mode so the final understanding of the command line is: \fB-col\fP
\fB-s\fP \fB_select\fP.
Another example that illustrates the fact that long parameters have
priority over short parameter combinations: \fB-is\fP will not select
only words containing a "\fBs\fP", but will act in the same way as its
alternative name (\fB-incremental_search\fP).
If you really want to select only words containing a "\fBs\fP", simply
add a space after the \fBi\fP as in \fB-i s\fP or use one of the other
\fB-i\fP names such as \fB-inc\fP for example.
In such cases, the user may set the \fBCTXOPT_DEBUG\fP environment
variable which any non-empty content.
If we reconsider the \fB-cols_select\fP example with \fBCTXOPT_DEBUG\fP set
the output is now:
.nf
CTXOPT_DEBUG: Parameter: -cols_select. Evaluation context: Main.
CTXOPT_DEBUG: Found a valid parameter as a prefix of -cols_select: -col.
CTXOPT_DEBUG: Parameter: -col. Evaluation context: Main.
CTXOPT_DEBUG: Switch to context Columns.
CTXOPT_DEBUG: Parameter: -s_select. Evaluation context: Columns.
CTXOPT_DEBUG: Found a valid parameter as a prefix of -s_select: -s.
CTXOPT_DEBUG: Parameter: -s. Evaluation context: Columns.
CTXOPT_DEBUG: Argument: _select.
.fi
In this case, adding a space in the command line: \fB-col\fP
\fB-cols_select\fP \fB1\fP also solves the issue and indicates that only
the first column should be selectable.
Note, however, that at least one argument for \fB-cols_select\fP is
now required:
.nf
CTXOPT_DEBUG: Parameter: -col. Evaluation context: Main.
CTXOPT_DEBUG: Switch to context Columns.
CTXOPT_DEBUG: Parameter: -cols_select. Evaluation context: Columns.
CTXOPT_DEBUG: Argument: 1.
.fi
.PP
The \fB-h\fP|\fB-help\fP and \fB-?\fP|\fB-u\fP|\fB-usage\fP options now
display the help and synopsis of the available options in the current
context.
.IP Example: 2
\f(CBsmenu -col -u\fP will only show the usage in the \fBColumns\fP
context
.PP
The contexts contain all the non-context-changing options so, in practice,
the usage should be intuitive.
You may nevertheless have to adjust some scripts using the old smenu
releases as I did in the lvm_menu example.
.PP
Some of the advantages of this new system of options are:
.IP \(bu 2
Long parameter names are allowed
One dash is enough, but two are also allowed for compatibility reasons.
.IP \(bu 2
An option can be referenced by any number of parameters with short or
long names.
.IP \(bu 2
Auto checking of missing mandatory options, duplicated option,...
.IP \(bu 2
Only options usable in the current context are allowed.
.PP
This option management system is explained in more detail at
https://github.com/p-gen/ctxopt.
.PP
The description of each command line parameter is as follows:
.IP "\fB-h\fP|\fB-help\fP"
(Allowed in all contexts.)
Display a context specific help messages and exits.
.IP "\fB-H\fP|\fB-long_help\fP"
(Allowed in the "Main" context.)
Display a long (non context specific) help messages and exits.
.IP "\fB-?\fP|\fB-u\fP|\fB-usage\fP"
(Allowed in all contexts.)
Displays a short help message and exits.
.IP "\fB-V\fP|\fB-version\fP"
(Allowed in the "Main" context.)
The \fB.smenu\fP files in the user's home directory and in the current
directory, if present, will be ignored when this option is used.
.IP "\fB-n\fP|\fB-lines\fP|\fB-height\fP [\fIheight\fP]"
(Allowed in all contexts.)
Gives the maximum number of lines in the scrolling selection window.
If \fB-n\fP|\fB-lines\fP|\fB-height\fP is not present the number of
lines will be set to \fI5\fP.
If \fB-n\fP|\fB-lines\fP|\fB-height\fP is present without argument, then
the height of the terminal will be used to determine the number of lines.
This remains true even if the terminal is resized.
If \fB-n\fP|\fB-lines\fP|\fB-height\fP is present with a numerical
argument, this value will be used to determine the number of lines.
.IP "\fB-i\fP|\fB-in\fP|\fB-inc\fP|\fB-incl\fP|\fB-include\fP... \fIregex\fP"
(Allowed in all contexts.)
Sets the \fBi\fPnclude filter to match the selectable words.
All the other words will become implicitly non-selectable (excluded)
\fB-i\fP|\fB-in\fP|\fB-inc\fP|\fB-incl\fP|\fB-include\fP can be used more
than once with cumulative effect.
\fI\\u\fP and \fI\\U\fP sequences can also be used in the regexp.
.IP "\fB-e\fP|\fB-ex\fP|\fB-exc\fP|\fB-excl\fP|\fB-exclude\fP... \fIregex\fP"
(Allowed in all contexts.)
Sets the \fBe\fPxclude filter to match the non-selectable words.
All the other selectable words will become implicitly selectable (included)
\fB-e\fP|\fB-ex\fP|\fB-exc\fP|\fB-excl\fP|\fB-exclude\fP can be used more
than once with cumulative effect.