Commit graph

173 commits

Author SHA1 Message Date
huwwa
f71fc6f25b shell: improve shell mode
* add `BF_ERROR` to identify error source buffers and use it with `next-error`.
* show `HELP` and `ERROR` buffer flags in `describe-buffer`.

* add a dedicated compilation mode with the following bindings:
  * `next-error` on `n`, `M-n`
  * `previous-error` on `p`, `M-p`
  * `scroll-up` on `SPC`
  * `scroll-down` on `DEL`
  * `search-forward` on `/`

  and the following new commands:
  * `goto-error` on `RET`, `LF`
  * `kill-compilation` on `C-c C-k`

* use `compilation` mode instead of `pager` mode for
  `do-compile`, and switch interactive shell buffers to
  `compilation` mode when the shell exits (if `shell_buffer_read_only` is set)

* refine popup/sidepane closing in `next-error`:
  * remove unnecessary popup check, as the command cannot
    be invoked if a popup window is present.
  * use `do_delete_window` to close side pane to avoid
    screen gap bug with `edit_close`.
2026-06-23 09:12:37 +02:00
Charlie Gordon
be75d12772 Bindings: improve key binding handling
* fix dictionary sort to no longer ignore digits
* sort bindings in natural order
* improve `wall-chart` command: show overridden bindings with style
* add `describe-prefix-bindings` for a list of bindings with a common prefix
* add `describe-C-h`, `describe-C-c`, `describe-C-x`...
2026-06-20 11:06:11 +02:00
Charlie Gordon
8e3f3175a9 describe-screen: fix small issues in popup window
* fix layout and colors
* make hex values more explicit
2026-06-19 09:06:44 +02:00
Charlie Gordon
227c3dc5e8 Help: improve describe-xxx functions and help popups
* rename and pass flags to byte quoting functions:
  `byte_quote` -> `strquote_byte`
* add `eb_print_style` to output data to a buffer in a given style
* add `eb_print_field` to output a field name and value using styles
* use styles in describe commands
* improve byte stats and page layout output in `describe-buffer`
* add `wall-chart` command (sorted list of bindings)
* add `describe-help` command
2026-06-18 23:30:17 +02:00
Charlie Gordon
0dd79822e7 Variables: extend variable handling
* improve formating of variable values
* add `show-all-variables`
* add `long_format` in `eb_variable_print_entry`
* fix variable name completion
2026-06-15 13:53:34 +02:00
Charlie Gordon
18755e7e09 Popup handling: add generic approach to disable commands
* add `#` at the beginning of the comand argument description
  to disable command when current window is a popup or the minibuf
* update command definitions
2026-06-14 23:30:50 +02:00
Charlie Gordon
0cb68d2d74 Shell: improve current directory traking
* parse process output for shell prompts with current directory
* parse `make -w -C` output for temporary subdirectory excursions
* handle property type and flags separately
* add `QE_PROP_MARK` to prevent offset update at range boundary
* use `QE_PROP_DUP` to optimize buffer properties with single allocation
* use mask in `eb_delete_properties` to delete tags selectively
* fix `eb_find_property` range glitch
* fix offset tracking for CWD properties
* simplify default directory selection for shell commands
* fix compiler warnings on variable shadow definitions
* optimize `next_error()`: no lookback needed anymore
* display buffer properties in `describe-buffer`
* update TODO.md
2026-06-13 18:12:57 +02:00
huwwa
f8a0b51d20 shell: improve current directory handling
* track the shell's current working directory using OSC 7.
* add `QE_PROP_CWD` buffer property, associate it with shell's cwd.
2026-06-12 15:41:07 +02:00
Charlie Gordon
77e57d11c7 Colorization: improve colorization of diff and process output
* improve color combining code for diff/patch output: preserve code
  syntax coloring on red or green background.
* improve `curline_style` handling (needs more work)
* add `QETermStyle` transparent color handling in `apply_style`
* highlight trailing blanks in a single place
* transpose `qe_term_get_style()` arguments for consistency
* add `qe_term_style_string()` and `qe_styledef_string()`
* extend style string parser to accept missing foreground color
2026-06-09 14:19:28 -04:00
Charlie Gordon
d34d0680d5 compare-windows: improve resync on single line changes
* when subsequent lines match, try and skip changes on current line
2026-06-08 18:21:52 +02:00
Charlie Gordon
4d8fedb4c3 compare-windows: improve resync algorithm
* resync on current line if non trivial match at end of line
* try and find common block of identical lines by adding or deleting
  up to 60 lines
2026-06-04 13:22:34 +02:00
Charlie Gordon
c390f3fcfe block-navigation: refine methodology for comments and strings
* fix bug on character constants ('(' ...) when styles are disabled
* fix end of comment/regex detection when scanning strings
* handle double escapes: "\\\"" is a 2 character string
* stop scanning when reaching outer block boundary
* scan blocks of comments as a single entity
2026-06-04 13:22:10 +02:00
Charlie Gordon
7e2e2b5e7f improve colors and styles
* improve curline_style handling
* add completion for variable values
2026-06-04 13:21:46 +02:00
Charlie Gordon
7ccb4f4ae7 fixes in compare-windows and variable completion popup
* `compare-windows` used to toggle all ignore flags if invoked without
   an argument. This was bogus.
* when reading a variable name (eg: `eval-expression`), improve alignment
  of variable descriptions in popup window
2026-06-04 13:20:57 +02:00
Charlie Gordon
d852856f0d Fix compiler warning on ambiguous operator combination 2026-06-04 09:51:11 +02:00
huwwa
52417f1ec1 navigation: improve forward-block / backward-block
- ensure stopping at the precise boundary between adjacent strings/comments
separated by spaces.
- bypass bracket balancing inside strings or comments.
- prioritize bracket skipping inside comment/string when starting at a bracket.
- prioritize string skipping when starting at a quote.
2026-05-27 09:09:24 +02:00
huwwa
71963ca4c2 input: add select-input-method command 2026-05-20 20:35:56 +02:00
Charlie Gordon
e89e07e318 bufed/dired: fix layout for non printing characters
* add `eb_put_filename()` to encode buffer or file names with
  non-ASCII characters according to PF_xxx flags
* add `CF_SAVE_LIST` flag for completions to store the list
  of matches in `MinibufState`
* fix bufed and dired layout issues
* fix buffer and filename completion popup layout
* add commands to control display of Unicode and non printing
  charcaters in buffer or file names:
  - U toggles unicode display
  - \ cycles through 4 possible encodings: ? ^J \x10 \010
* use `(*fp)()` syntax for indirect function calls
2026-05-18 12:31:06 +02:00
Charlie Gordon
d6b37ca511 Sundries: bug fixes
* fix crash bug on `delete_equivalent()`: qe_free takes a double pointer
* remove unused ShellState variables
* initialize term structures
2026-05-18 01:15:21 +02:00
Charlie Gordon
e84394a8bb navigation: improve forward-block / backward-block
* improve block skipping:
  - if starting inside a string or a comment, skip to the end of the
    string or comment while balancing blocks
  - otherwise skip string and comments when balancing blocks
  - fix behavior on very long lines, eg: **highlight.pack.js**
* if a nesting error occurs, point and mark are set around the mismatched
  delimiters. use C-x C-x to skip between them
* simplify `get_colorized_line()`
* add `cp_get_line()` to factorize code
* add `eb_peek_prevc()` to get previous codepoint without end offset
* improve documentation conciseness
2026-05-14 16:13:16 +02:00
Charlie Gordon
5a37c1cbc3 occur: reuse the same buffer but clear contents
* use `BC_REUSE | BC_CLEAR` to avoid killing the `*occur*` buffer
* this ensures the `*occur*` buffer stays current in windows that show it
* modify the `BC_CLEAR` semantics to imply `BC_REUSE`
* simplify calls: remove redundant `BC_REUSE` flag
2026-05-11 19:16:05 +02:00
Charlie Gordon
74ed0a3806
windows: fix glitches in window size management (#109)
* fix bug on screen resize with default dired layout
* fix resize bug: vertical layout changed when screen width was adjusted
* rename `update_split_ratio` as `compute_virtual_window_size`
* remove `update_all_split_ratios` and `restore_coordinate_from_ratio`
* recompute window size in more necessary places
* use character sizes for minimum window width/height
* show virtual window size in `describe-window`
* add `C-x V` binding for `shrink-window`
2026-05-05 21:07:03 +02:00
4g4
de8bd02766
winlayout: use virtual coordinates to keep split ratio when changing screen dimensions (#93)
* add virtual window dimensions `xx1, xx2, yy1, yy2` in units of 1/1024
* update virtual coordinates when dragging vertical/horizontal split separator
* update window size using virtual coordinates on terminal resize
2026-05-04 10:24:50 +02:00
Charlie Gordon
93fe952ab8 fix clang 17 compilation warnings 2026-03-14 21:33:53 +01:00
Charlie Gordon
43b5851958 Update README.md, VERSION and copyrights
* VERSION bumped to 6.4.1
2025-02-10 07:51:29 +01:00
Charlie Gordon
0fcdc0f4c9 Add list-colors and list-styles commands 2025-02-10 00:00:14 +01:00
Charlie Gordon
54248e1a29 fix crash bug on fill-paragraph 2024-12-22 00:08:01 +01:00
Charlie Gordon
e0ba872d77
Improve error reporting (#50)
- rename `edit_new` as `qe_new_window`
- report error in `qe_new_buffer` and `qe_new_window` upon failure
- rename `qe_find_buffer_file` as `qe_find_buffer_filename`
- rename `read_charset` as `qe_parse_charset`
- reset yank buffer references in `eb_clear()`
- make `qe_init()` return error code and abort upon error
2024-12-08 19:43:26 +01:00
Charlie Gordon
f674419e75
Fix put_status/put_error behavior (#47)
* Fix `put_status`/`put_error` behavior

- use `put_error` instead of `put_status` for command errors
- prevent status message output to console during initialization
- use `put_error` for side effects in command errors
- add `&` prefix in status messages to force screen flush
- flush screen in `qe_display()`, remove redundant calls to `dpy_flush`
- fix gcc compilation errors and warnings
- remove most references to `global_screen`
- free font cache before closing the screen
- prevent mouse handling upon focus detection

* drop CI on macos-12
2024-12-03 22:52:55 +01:00
Charlie Gordon
e3c5bfd457
Remove references to global qe_state (#45)
* Remove references to global `qe_state`

Add `QEmacsState *qs` field in context and object structures:
- `QEditScreen`, `EditState` (renamed from `qe_state`), `QuitState`
- `WinWindow` (win32.c), `X11State` (x11.c), `QEArgs` (cmd line arguments)
- `CmdLineOptionDef::func_arg()`, `QEModeData`
- move `QEKeyContext` to `QEmacsState`

Pass `QEmacsState *qs` to configuration and state functions:
- all `module_xxx_init` and static `xxx_init` functions
- `QEDisplay::dpy_init()`, `qe_register_display()`, `screen_init()̀`
- `load_input_methods()`, `unload_input_methods()`
- `register_input_method()`, `find_input_method()`
- `find_resource_file()`, `open_resource_file()`
- `qe_find_current_binding()`, `qe_list_bindings()`
- `qe_register_mode()`, `qe_find_mode()`, `qe_find_mode_filename()`
- `qe_register_cmd_line_options()`, `set_user_option()`, `set_tty_charset()`
- `qe_register_commands()`, `qe_register_bindings()`, `qe_find_cmd()`
- `qe_register_completion()`, `qe_register_variables()`
- `eb_register_data_type()`, `parse_command_line()`
- `eb_trace_bytes()`, `qe_toggle_control_h()` (split from `do_toggle_control_h()`)
- `unget_key()`, `qe_grab_keys()`, `qe_ungrab_keys()`, `qe_key_process()`
- `eb_new()`, `eb_find()`, `eb_find_new()`, `eb_scratch()`, `eb_find_file()`
- `new_shell_buffer()` `macro_add_key()`, `clear_macro(), `stop_macro()`
- `check_window()`, `check_buffer()`, `qe_kill_buffer()`, `qe_get_history()`
- `qe_register_charset()`, `find_charset()`

Add error message handlers:
- add `QEDisplay::dpy_error()` method
- add `qe_cfg_error()`, use for all expression parsing errors
- pass opaque pointer to `css_error()`
- add `qe_put_error()` and `qe_dpy_error()`

Add context argument:
- always pass a non-null window pointer to `do_refresh()`, `new_help_buffer()`

Rename functions:
- `find_resource_file` -> `qe_find_resource_file`
- `open_resource_file` -> `qe_open_resource_file`
- `input_methods_init` -> `qe_input_methods_init`
- `load_input_methods` -> `qe_load_input_methods`
- `unload_input_methods` -> `qe_unload_input_methods`
- `find_input_methods` -> `qe_find_input_methods`
- `register_input_method` -> `qe_register_input_method`
- `parse_command_line` -> `qe_parse_command_line`
- `eb_trace_bytes` -> `qe_trace_bytes`
- `eb_init` -> `qe_data_init`
- `eb_count_buffers` -> `qe_count_buffers`
- `eb_get_buffer_from_index` -> `qe_get_buffer_from_index`
- `init_all_modules` -> `qe_init_all_modules`
- `exit_all_modules` -> `qe_exit_all_modules`
- `load_all_modules` -> `qe_load_all_modules`
- `maybe_set_mark` -> `do_maybe_set_mark`
- `unget_key` -> `qe_unget_key`
- `minibuffer_init` -> `qe_minibuffer_init`
- `edit_display` -> `qe_display`
- `new_yank_buffer` -> `qe_new_yank_buffer`
- `new_shell_buffer` -> `qe_new_shell_buffer`
- `shell_find_mode` -> `qe_shell_find_mode`
- `save_selection` -> `qe_save_selection`
- `register_emulation_bindings` -> `qe_register_emulation_bindings`
- `macro_add_key` -> `qe_macro_add_key`
- `clear_macro` -> `qe_clear_macro`
- `stop_macro` -> `qe_stop_macro`
- `eb_format_message` -> `qe_format_message`
- `screen_init` -> `qe_screen_init`
- `charset_jis_init` -> `qe_charset_jis_init`
- `charset_more_init` -> `qe_charset_more_init`
- `check_window` -> `qe_check_window`
- `check_buffer` -> `qe_check_buffer`
- `eb_find_file` -> `qe_find_buffer_file`
- `eb_find` -> `qe_find_buffer_name`
- `eb_new` -> `qe_new_buffer`
- `eb_find_new` -> `qe_new_buffer` with `BC_REUSE`
- `eb_scratch` -> `qe_new_buffer` with `BC_REUSE | BC_CLEAR`
- `find_charset` -> `qe_find_charset`

Add asan, msan and ubsan targets
Fix `qe_encode64` buffer length computation.
Add `qe_new_shell_buffer` flags `SF_REUSE_BUFFER` and `SF_ERASE_BUFFER`
Bumped version to 6.3.3
fix redundant typedef
fix compilation errors
2024-12-01 23:34:00 +01:00
Charlie Gordon
ea7665dee9 New indenting commands
- rename `indent_size` window field as `indent_width` for consistency
- handle negative argval in `do_tabulate`
- fix reverse region in `indent-rigidly`
- only indent lines that start in the region, ie: lines whose beginning
  offset >= start and < end
- fix `do_backspace` to delete a TAB worth of white space after TAB.
  no longer use `undo` for this.
- fix `find_window` to locate window according to top-left corner of current
- add `unindent-region` on `M-C-|` to unindent current region
- add `unindent-buffer`
- redirect `S-RET` and `S-DEL` to their unshifted versions
- rename `c-indent-command` command as `c-indent-line-or-region`
2024-10-11 09:14:16 +02:00
Charlie Gordon
7739320220 fix colorize_states display in describe-window 2024-10-11 09:14:16 +02:00
Charlie Gordon
af1215ba24 Miscellaneous improvements
- add some missing emacs color names
- use `M-C-` prefix instead of `C-M-` in bindings, source and documentation
  but support both in `strtokey`
2024-09-25 01:02:14 +02:00
Charlie Gordon
288eeb450e Improve modern terminal support
- improve ANSI tty and shell buffer escape sequence parser
- detect backspace/delete input setting from termios structure
- renumber special keys, remove redundant definitions
- handle shift state modifiers generically
- support tty `modifyOtherKeys` key encoding
- support tty `CSI u` key encoding
- simplify x11 key handling
- simplify haiku key handling (untested)
- bump VERSION to 6.3.1
- rename `insert-color` as `read-color`, insert code on `C-u C-c #`
- simplify string to key conversions
- improve CSI and OSC sequence support (ESC ] ... ^G or ST)
- `do_toggle_control_h()` should just toggle `ts->term_flags & KBS_CONTROL_H`
2024-09-25 01:02:14 +02:00
Charlie Gordon
a09f1adf9f Add missing initializers
This fixes compiler warnings for `-Wmissing-field-initializers`
2024-09-08 01:55:38 +02:00
Charlie Gordon
e566f23064 Fixed color handling
- bumped VERSION to 6.2.1
- add `css_get_color_name()` to get the name or hex spec for a color
- display style details in style completion window
- add `insert-color` command on `C-c #` to convert color names to hex strings
- fix missing intializers in `scale_cube6[]`
- improve grey/gray aliasing
- add color parser for XParseColor hex syntax rgb:rrrr/gggg/bbbb
- add `tests/reset-term-palette.sh` to reset the terminal color palette to
  default values.
2024-09-08 01:06:17 +02:00
Charlie Gordon
9f2d282aa3 Improve color handling
- document style bits in 16, 32 and 64-bit style models
- add `color_y(QEColor)` to compute the weighted light value
- publish `color_dist()`
- add `colors_init()` to initialize color support structures
- improve list of named colors:
  * use CSS color names
  * add X11 color names
  * make grey a generic synonym for gray
- improve `qe_color_map` using ramp lookup arrays
- fix `qe_unmap_color()` bug on 4K color cube
- add custom palette to store extra named user defined colors
- improve `css_lookup_color()` and `css_get_color()`
- enumerate palette entries on `p` and `#`
- improve color scripts in `tests/`
- add `tests/getpalette.sh` to dump the current terminal palette colors
- add `tests/term-palette.sh` to compare palette colors and rgb colors
2024-09-07 18:40:44 +02:00
Charlie Gordon
9e10de752e Improve color selection and completion
- add `set-style-color(string style, string color)` command
- display color and style samples in completion window
- display style names in `what-cursor-position` on `C-x =`
- remove duplicates in completion lists
2024-09-07 18:40:44 +02:00
Charlie Gordon
4dd72d26e1 Improve apropos display
* list extra commands separately (commands with matches in description only)
* colorize variable names
* fix tab-width computation to keep bindings aligned
2024-09-07 18:40:44 +02:00
oguillaumin
8dbc6df413 Add paragraph and sentence commands
* add buffer functions:
  int eb_skip_whitespace(EditBuffer *b, int offset, int dir);
  int eb_skip_blank_lines(EditBuffer *b, int offset, int dir);
  int eb_skip_paragraphs(EditBuffer *b, int offset, int n);
  int eb_next_sentence(EditBuffer *b, int offset);
  int eb_prev_sentence(EditBuffer *b, int offset);
  int eb_skip_sentences(EditBuffer *b, int offset, int n);
* modify paragraph selection method.
* improve paragraph commands
* add paragraph commands:
  - `fill-region`, `fill-buffer`, `fill-region-as-paragraph`
  - `backward-kill-paragraph`
* add sentence commands
  - `backward-kill-sentence`, `backward-sentence`, `forward-sentence`,
  - `kill-sentence`, `mark-end-of-sentence`
* add transpose commands:
  - `transpose-paragraphs` and `transpose-sentences`
2024-08-31 13:49:00 +02:00
oguillaumin
f05215c22c Add space deleting commands
* `delete-leading-space`: Delete any leading whitespace on the current line
* `delete-trailing-space`: Delete any trailing whitespace on the current line
* `delete-trailing-whitespace` Delete all the trailing whitespace across the current buffer.
These commands handle the region if highlighted
2024-08-31 13:49:00 +02:00
oguillaumin
5bef7b771f Add state and buffer fields
* add `b->ref_count`
* add `b->qs` pointer
* add `qs->first_hidden_window`
* handle both window lists in `edit_detach()`
2024-08-31 13:49:00 +02:00
oguillaumin
d427acc62a Comments, ideas 2024-08-31 13:49:00 +02:00
oguillaumin
1d3cabeaa2 Improve indentation commands
* add `find_indent` and `make_indent` ancillary functions
* add `untabulate` on `S-TAB` to remove one indentation level
* rename `do_tab` as `do_tabulate` for consistency
* `tabulate` indents the region one level if visible
* add `indent-rigidly` commands: indent block interactively
2024-08-31 13:49:00 +02:00
oguillaumin
e77e21bffd Select region on shifted cursor movement keys 2024-08-31 13:49:00 +02:00
oguillaumin
ee2e3c767b Colorize lines up to 16 MB
- add `eb_get_line_length()`
- move `buf` and `sbuf` to `QEColorizeContext`
- reallocate line and style buffers on long lines
2024-08-31 13:49:00 +02:00
Charlie Gordon
7b803ace0e Improve syntax coloring APIs
* pass const `char32_t` array and `QETermStyle` array to `ColorizeFunc`
* add `cp_colorize_line()` wrapper to call colorizer function on null
  terminated buffer.
* remove unused `EditBuffer` colorize fields
* remove `EditState` field `colorize_func`: rely on `colorize_mode` only
* no longer combine style into codepoint buffer.
* remove `STYLE_BITS`, `STYLE_SHIFT`, `CHAR_MASK`
* rename `set_colorize_func` as `set_colorize_mode`
* rename `SET_COLOR` and `SET_COLOR1` as `SET_STYLE` and `SET_STYLE1`
* add documentation for buffer API functions
2024-07-28 00:00:03 +02:00
Charlie Gordon
e0d9a641d3
Add repeat-mode (#34)
- add `repeat` command on `C-x z`
- add `repeat-mode`, always enabled
- cycle all matching tags in current file on `goto-tag` and `find-tag`
- set up `repeat-mode` for these commands:
  - `undo` on `C-x u` (`u` repeats `undo`, `r` performs `redo`)
  - `undo` on `C-x r` (`r` repeats `redo`, `u` performs `undo`)
  - `find-window-left`, `find-window-right`, `find-window-up`, `find-window-dow`
    repeat navigation on `up`, `down`, `left`, `right`
  - `next-error`, `previous-error`: `M-n` and `M-p` repeat in corresponding direction
  - `next-buffer`, `previous-buffer: repeat buffers nagivation with `left` and `right`
  - `enlarge-window` / `shrink-window`: repeat resizing on `^`, `v`, `{`, `}`
     and cursor movement keys
  - `goto-tag` on `C-x ,` goto next tag with `,` and `.`
  - `call-last-kbd-macro` on `C-x e`: repeat macro on `e`
- add `eb_count_buffers` and `eb_get_buffer_from_index` for safe buffer navigation
- add transient bindings, known as repeat maps in GNU emacs
- pass `KeyDef **lp` (aka key maps) instead of mode for binding commands
- replace `do_next_buffer` and `do_prevous_buffer` with repeatable command
  `do_buffer_navigation`
- fix `bufed_select` crash bug when selecting buffer from a regular window
2024-05-25 23:37:05 +02:00
Charlie Gordon
7955a5aebb
Add window resizing commands (#32)
- add `enlarge-window` on `C-x ^`: Enlarge window vertically
- add `shrink-window` on `C-x v`: Shrink window vertically
- add `enlarge-window-horizontally` on `C-x }`: Enlarge window horizontally
- add `shrink-window-horizontally` on `C-x {`: Shrink window horizontally
- add `resize-window` on `C-x +`: Resize window interactively using the cursor keys
closes issue #21
2024-05-21 01:49:13 +02:00
Charlie Gordon
ceb6b3370f
Add *equivalents* for compare-windows (#27)
*equivalents* are strings that should compare equal in a `compare-windows`
session. You can define such strings in a **.qerc** file in the directory of
one of the files being compared.  This helps ignoring known changes such as
type of function renaming... Here is an example to help compare files between
the `bellard/quickjs` and the `quickjs-ng/quickjs` repositories:
```
define_equivalent("JS_DupValue(ctx, ", "js_dup(");
define_equivalent("JSValue", "JSValueConst");
define_equivalent("JS_NewInt32(ctx, ", "js_int32(");
define_equivalent("JS_NewInt32(ctx,\n", "js_int32(");
define_equivalent("JS_NewUint32(ctx, ", "js_uint32(");
define_equivalent("JS_NewUint32(ctx,\n", "js_uint32(");
define_equivalent("JS_NewBool(ctx, ", "js_bool(");
define_equivalent("JS_NewFloat64(ctx, ", "js_float64(");
define_equivalent("JS_EXTERN ", "");
define_equivalent("JS_EXTERN JS", "JS");
define_equivalent("JS_EXTERN JS_", "JS_");
ignore_equivalent = 1;
```
Other changes were necessary for proper utf8 skipping:
- add `utf8_prefix_len(str1, str2)` to compute the length of a common initial
  prefix not falling inside UTF-8 encoded codepoints.
- add `utf8_decode_prev` to get the previous codepoint
- add `eb_match_str_utf8_reverse`
2024-05-19 21:16:37 +02:00