- 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
*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`
* eb_get_region_contents and eb_get_contents take an extra argument
encode_null to encode embedded null bytes as "\xC0\x80"
* use steps instead of flags for isearch state array:
max 256 code points, 512 steps and 768 search bytes
* add remove_string() to remove a string from a StringArray and pack the array
* rename get_history() as qe_get_history() and make it public
* prevent multiple registration of command tables in qe_register_commands()
* silence compiler warning on array size in charname_complete()
* remove last_search_u32 data, use search history list instead
* restrict search commands to the current region if highlighted
* bump version to 5.4.1b
* add search modes:
copy-matching-lines, kill-matching-lines, list-matching-lines
- add enum for search modes
* add search flag support in all search functions:
search_forward, search_backward, count-matches, delete-matching-lines,
delete-non-matching-lines, copy-matching-lines, kill-matching-lines,
list-matching-lines, query-replace, replace-string
- highlight matches during search string input
- add search flag toggle functions in minibuffer_edit
same code and bindings as for incremental search
- add handlers in CompletionDef for minibuffer_edit session start and end
- use generic search tag system to store flags in search string
* misc improvements and bug fixes:
- test and set append-next-kill on kill-region
- split `do_copy_region` from `do_kill_region`
- remove argument in `do_kill_region` for `kill-region`
- change immediate string argument code letter from 'S' to '@'
- exit popup with do_popup_exit() in do_keyboard_quit
remove popup_mode binding
- add ESiii and ESsii command calling conventions
- pass key and argval to:
minibuffer_complete, do_minibuffer_complete_space,
do_minibuffer_electric_key
* add default bindings:
`next-error` on `M-g n`, `M-g M-n`
`previous-error` on `M-g p`, `M-g M-p`
`goto-line` on `M-g g`, `M-g M-g`, `C-x g`
`goto-char` on `M-g c`
* bump version to 5.4.1a
* add wctoupper() and wctolower()
* add qe_unaccent(c);
* use ligature functions for the above
* handle accents in qe_toupper() and qe_tolower()
* add convert_entry() method in CompletionDef
* pass CompletionDef pointer to minibuffer_edit callback
- char32_t is defined in cutils.h but may conflict with <uchar.h>
- all qe_isxxx functions take a char32_t
- add etf8x encoding for full range of char32_t type
- add utf8_decode_strict()
- add ustr_match_keyword()
- utf8_encode() / utf8_decode() handle up to 32 bits
- improve detect_charset():
- detect utf8 and utf8x
- avoid failure on partial utf8 sequence at end of buffer
- detect overlong utf8 sequences
- fix display bugs for code points beyond MAX_UNICODE_DISPLAY
- simplify do_compare_windows(), avoid magic char values.
- rename functions:
eb_encode_uchar -> eb_encode_char32
eb_insert_uchar -> eb_insert_char32
eb_insert_uchars -> eb_insert_char32_n
eb_match_uchar -> eb_match_char32
eb_delete_uchar -> eb_delete_char32
eb_replace_uchar -> eb_replace_char32
utf8_to_unicode -> utf8_to_char32
- use char32_t for all variables and arrays holding code-points
- fix some language syntax parsers.
- fix detect_eol_type_32bit(), used uint16_t instead of uint32_t
- bump VERSION to 5.4.0
- rename unicode_tty_glyph_width() as qe_wcwidth()
- compute tables for qe_wcwidth() with tools/unicode_gen.c
from the latest Unicode version
- add qe_wcwidth_variant() to determine if terminal may use
incorrect width for a given glyph.
- reposition TTY cursor for glyphs with ambiguous width
- remove unicode_width.h
- add wcwidth.h and wcwidth.c generated by tools/unicode_gen.c
- update tools/unicode_gen.c and tools/unitable.c
- determine Unicode version support at start time
displayed by describe-screen command
- display code point width and variant in what-cursor-position command (C-x ?)
- bumped VERSION to 5.3.4x
- add charset.h
- add tools/unitable.c to compute unicode_width.h
- add tools/unicode_gen.c to compute more unicode tables
- use Unicode 15.0.0
- add rules to compute width tables from Unicode tables and TTY
- move basic definitions from util.h to cutils.h
- use CONFIG_SESSION for session support (undefined if CONFIG_TINY)
- define CompleteFunc and CT_xxx flags for completion functions
- pass CompleteFunc to xxx_complete() functions
this allows more generic implemetation, without including qe.h
- rename fill_border() as fill_window_slack() for readability
- add QELEVEL environment variable to detect recursive invocation
- use stricter parser for load_ligatures()
- bump VERSION to 5.3.4u
- fix prefix argument handling for describe-key
- echo prefix keys after "Describe key: " prompt
- move session commands to qe.c, remove them from tqe
- use byte_quote() in do_describe_buffer()
- use b->offset to track insertions in describe-xxx commands
- eb_putc(), eb_puts() and eb_printf() insert at `b->offset` instead of `b->total_size`
- do not use eb_write() in eb_trace_bytes()
- bump VERSION to 5.3.4p
Change the settings controlling the display of line and column numbers
to mimic the behavior of emacs linum-mode:
- add global states:
- line-number-mode: control the display of line number in mode lines
- column-number-mode: control the display of column number in mode lines
- global-linum-mode: control the display of line numbers in the gutter
space for all regular buffers.
- add a buffer state:
- linum-mode: control the display of line numbers in the gutter space for
this buffer (overrides global-linum-mode when set).
- add commands to toggle or set these states:
- line-number-mode
- column-number-mode
- global-linum-mode
- linum-mode
- rename filter-matching-lines as delete-non-matching-lines (emacs name)
- bump VERSION to 5.3.4n
- improve operator lexer: produce token and precedence on 1 step
- merge parser.c and qescript.c
Fix other bugs
- close display before freeing memory in --free-all
- free TTYState in tty_dpy_close()
- free VarDef memory in --free-all
- fix crash bug on --free-all due to duplicating ModeDef structures
Improve variable handling:
- move do_describe_variable() to variable.c
- add var_alloc and str_alloc flags in VarDef to fix `end` hack
- remove ugly kludge to detect allocated strings
- type variables retrieved from environment
- free variable data on --free-all
- bump VERSION to 5.3.4m
- add byte_guote() to encode a single byte
- encode non ASCII bytes in strquote()
- split function call parse and evaluation into qe_cfg_call() in tqe's parser.c
- use has_token() in full parser
- fix bogus function name in config file parsing errors
- bump VERSION to 5.3.4i
Extend command dispatch system:
- add CMD_ARG_OPAQUE argument type
- add ISS and ISSi command signatures for ISearchState
- add CMDx() macro for disabled and future commands
- restrict command set in parsers
- add opaque argument for exec_command()
- add sort-region command, same as sort-lines
Extend binding system:
- move do_unset_key() from extras.c to qe.c
- accept bindings lists in unset-key commands
- add exact argument for qe_find_binding()
- reorder xxx_bindings arrays
Improve emulation functions:
- improve set-emulation command:
- add xxx_bindings arrays for emulations
- add register_emulation_bindings()
Search system:
- use exec_command to dispatch isearch functions
this allows easy redefinition of bindings, especially
useful for emacs flavor emulations
- add isearch_commands[] with bindings and command descriptions
- bumped version to 5.3.4g
- rename s->insert as s->overwrite with opposite semantics
- fix overwrite mode behavior:
TABs are filled, then removed
TABs and newlines are always inserted
backspace removes TABS and newlines
backspace overwrite previous glyph with 1 or 2 spaces except at EOL
backspace only replaces with spaces before a TAB to preserve layout
quoted-insert always inserts
- quoted-insert inserts special key as escape sequences
- make KEY_UNKNOWN and KEY_NONE special keys matched by KEY_IS_SPECIAL()
- eb_replace() returns the number of bytes written
- add text_screen_width() to compute the actual screen column
- add convenient bindings for laptops with limited special keys:
- overwrite-mode: C-c o
- insert-mode: C-c i
- toggle-read-only: C-c %
- not-modified: C-c ~
- document set-visited-file-name
- remove filename if set-visited-file-name with an empty string
- simplify eb_insert_uchars()
- bumped version to 5.3.4e
- add qe_iswide()
- add eb_next_glyph() / eb_prev_glyph()
- use a larger unicode_glyph_range_index[] array
- add s->cur_offset_hack to track when current position is in
the middle of a wide glyph
- pass w to qe_term_overwrite(): erasing 1 or 2 positions
- erase partially overwritten wide glyphs
- remove qe_term_put_char()
- bumped version to 5.3.4d
improve command and bindings registration:
- simplify command and binding registration APIs
- add bindings member in ModeDef structures
- rename qe_register_cmd_table() as qe_register_commands(), change API
- add qe_register_bindings() taking mode, command-name and bindings string
- rename qe_mode_set_key() as qe_register_command_binding()
improve buffer listing:
- add BF_SHELL buffer flag for shell buffers
- show current directory of shell buffers in bufed
improve dired:
- add dired-hide-details-mode on "("
- use details_mask to control long listing
improve trace doctor:
- add EB_TRACE_DEBUG trace flag for debugging traces
- add do_set_trace_flags()
- change do_start_trace_mode() to do_toggle_trace_mode() with arg
misc:
- fix make_user_path() for pathnames without a trailing slash
- use separate commands for prefix_argument handling
- improve strstart(), strend(), pstrcpy(), pstrncpy(), get_dirname()
- add strmatchword() like strstart with check for word boundary
- bumped version to 5.3.3d
- use code characters from emacs (interactive) function
- 'd' for numeric point value
- 'p' for numeric prefix argument
- 'P' for raw prefix argument
- 'q' for negated numeric prefix argument
- handle synthetic and default arguments in parser.c
- add describe-function, bound to C-h f, need more work
- add sort-columns, sort-numbers, sort-paragraphs
- rename sort-region as sort-lines
- remove reverse-sort-buffer and reverse-sort-region
passing C-u argument does reverse on all sort commands
- update TODO list
- bumped version to 5.3.3a
- pass description as 3rd argument to CMDx() macros
- normalize argument specifications
- 'p' means point
- 'a' means argval
- 'A' means argval premultiplied by value
- pass argval before value to do_split_window(),
do_isearch(), do_sort_span(), do_sort_region(), do_sort_buffer()
- add SF_SILENT flag to suppress messages in eb_sort_span()
- bumped version to 5.3.3
- split eb_command_print_entry from command_print_entry
- split eb_variable_print_entry from variable_print_entry
- fix eb_sort_span to handle static styles
- match description strings in apropos
- use eb_xxx_print_entry in apropos to share code and colorization
- bumped version to 5.3.2d
- add description strings to all commands in extra.c
- add ignore-case for compare-windows
- pass region to do_indent_region()
- add indent-buffer using do_indent_region()
- use standard bindings string to all CMDx() definitions
- remove CMDx() key and alt_key
- remove compact key macros: KEY_CTRLX, KEY_CTRLXRET,
KEY_CTRLH, KEY_CTRLC
- removed qe_register_binding2,
- qe_register_cmd_table() takes array length
- remove CMD_DEF_END and CmdDef chaining
- add CmdDefArray to store commands in const arrays
- strtokeys() takes end pointer
- add C-@ as name for null control key
- removed many hacks in CmdDef handling
- merge electric key commands
- fix ~ minibuffer behavior
- bumped version to 5.3.2
- use `n` instead of `dir` or `delta` when passing premultiplied argval
- describe-xxx commands take `argval` to avoid repetition
- move paragraph functions to extras.c
- bumped version to 5.3.1k
- simplify do_delete_blank_lines(), fix case of non blank line
- remove eb_start_paragraph()
- do_mark_paragraph() takes ARG_VAL, make emacs compatible
- simplify eb_prev_paragraph(), make emacs compatible
- improve fill_paragraph():
compute actual indent size (handle TABs)
compute actual word sizes (handle accents and double width glyphs)
- bumped version to 5.3.1j
- word_right() and word_left() return s->offset
- minimize buffer changes in do_fill_paragraph()
- eb_changecase() takes input and output offset arguments
- bumped version to 5.3.1i
- made some local objects static
- fix many const cast issues
- fix comma operator warnings
- add const correct strtol_c(), strtoll_c(), strtold_c()
- add unconst(t) to override const removal warnings
- comment VLAs and flexible arrays
- use get_basename_offset() to enable const correct
get_basename() and get_basename_nc()
- use get_extension_offset() to enable const correct
get_extension() and get_extension_nc()
- always include config.h
- use size_t for some size arguments:
umemmove(), umemcpy(), umemcmp(), qe_memicmp()
- add qe-doc.info and qe-doc.pdf targets
- fix shadowing bug in buf_write: used tor return 0 instead of byte count
- bumped version to 5.3.1e
- be more careful about snprintf target arrays
- fix bug in qe_load_file(): was testing local array instead of argument
- remove unused indent variable in clang.c
- pass pointer to CSSFile in css_close()
* add progress indicator every 8K comparisons
* add 2 byte cache on line contents
* add chunk offset to skip columns and ignored bytes
also used for SF_BASENAME
* add filter-matching-lines
* prevent man-mode on .doc files
* allow ^Z bytes in text files
* add extra column syntaxes for compilers error messages
- rename qe_skip_spaces() as eb_skip_spaces() and take EditBuffer
- rename skip_spaces() as qe_skip_spaces()
- use qe_skip_spaces() return value to simplify loops
- `C-g` invokes keyboard-quit
- bind `ESC ESC ESC` to keyboard-quit
- prevent ESC key combination in `combine_keys()` if not first
- rename `abort` as `keyboard-quit` and do_break() as do_keyboard_quit()
- rename do_combine_char() as do_combine_accent()
- rename do_word_right() as do_word_left_right()
- pass numeric argument to do_scroll_left_right()
- pass numeric argument to do_minibuffer_history()
- add description placeholders to all CMDx definitions
- swap arguments to qe_split_window() and do_split_window()
- pass iteration count based on universal argument to
do_up_down(), do_left_right(), do_word_right(), do_kill_word(),
do_forward_paragraph(), do_kill_paragraph(), do_c_forward_conditional(),
do_forward_block(), do_kill_block(),
- remove do_backward_paragraph()
- add int eb_prev_paragraph(EditBuffer *b, int offset);
- dont call command on 0 universal prefix
- add CmdArgSpec structure for parse_arg()
- add argument type prefixes for defautl values:
'm' prefix for CMD_ARG_USE_MARK, 'p' for CMD_ARG_USE_POINT
'z' for CMD_ARG_USE_ZERO and 'e' for CMD_ARG_USE_BSIZE,
- rename parse_args as parse_arguments to avoid confusion with parse_arg
- make tabify-region and tabify-buffer call do_tabify()
- make untabify-region and untabify-buffer call do_untabify()
- move command argument specification to CmdDef:spec, followed by description string
- fix completion bug where highlighted region was not removed upon enter
- add file_print_entry() in dired.c to display file size in file completion popup
- add buffer_print_entry() to display filename in buffer completion popup
- small fixes
- rename many C functions to match corresponding command name:
do_return -> do_newline, do_quote -> do_quoted_insert,
do_start_macro -> do_start_kbd_macro, do_end_macro -> do_end_kbd_macro,
do_call_macro -> do_call_last_kbd_macro,
minibuf_complete_scroll_up_down -> do_minibuffer_scroll_up_down,
do_shell_return -> do_shell_newline, do_compile_error -> do_next_error,
do_incr_width -> do_increase_width
- add do_open_line as a separate function
- simplify hex and binary mode navigation functions
- do_overwrite_mode(arg) disables overwrite mode if arg <= 0
- fix universal argument parsing for M-0 to M-9 and other subtle details
- add command and variable description field
- add fuzzy completion on repeated TAB in minibuffer
- remove fuzzy_search variable
- add CompletionDef flags:
- CF_FILENAME to use `/` as separator
- CF_NO_FUZZY to prevent fuzzy matching on second TAB
- CF_SPACE_OK to prevent SPC from completing entry
- CF_NO_AUTO_SUBMIT to insert current match on ENTER
- fix invalid free on CommandDef structures
- improve symbol completion in eval-expression
- use symbol completion in apropos
- fix post increment and decrement evaluation
- add SF_PARAGRAPH to sort multiline paragraphs
- sort commands and variables in print_bindings(), apropos(), about_qemacs()
- split buffer sorting code from do_sort_span() to eb_sort_span()