Commit graph

110 commits

Author SHA1 Message Date
Charlie Gordon
dc4eb3efb6 man: ensure full manual page is formatted and uses hightlighting
- set `MAN_KEEP_FORMATTING=1` and `MANPAGER=cat` for the man
  command and handle overstriking in the terminal emulation.
- this approach works on macOS, linux, FreeBSD and OpenBSD
2026-05-17 16:12:36 +02:00
huwwa
cbeb5d4acd Shell: prevent man command from paging
- apply infinite-height prior to winsize initialization.
- use `LESS_LINES` environment variable.
- use `PAGER=less -F` to make less quit at the end of the man page
2026-05-17 12:49:56 +02:00
huwwa
053871bec7 Pager: verify existance of last buffer on abort 2026-05-17 00:03:01 +02:00
huwwa
34488a2ed4 Shell: use window width and height fields directly 2026-05-17 00:03:01 +02:00
huwwa
eefc007d60 Pager: add pager-abort command 2026-05-16 22:32:06 +02:00
huwwa
c654f504e5 Shell: refine target window selection logic
The behavior follows this priority order:

1. reuse an existing window already displaying the buffer,
2. if shell-command-other-window is not set, use the current
   window, otherwise
3. select the largest available non-active window.
4. split a new window if no sutiable window is found.
5. fall back to the current window if splitting fails.
2026-05-16 22:32:06 +02:00
huwwa
a927d093ab Shell: improve shell_close/shell_read_cb
- add check when process is signaled.
- put appropriate status message when non-interactive.
- follow output stream when non-interactive.
2026-05-16 22:32:06 +02:00
huwwa
ec1aee59a4 Shell: cosmetic changes
- add interactive shell process caption.
- rearrange lines.
2026-05-16 22:32:06 +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
7f3b31d8d4 Shell: add optional shell modes
- `shell_buffer_read_only` controls if the shell buffer should become
  read-only and use pager-mode when not interactive
- `shell_mode_auto_interactive` controls if the shell interactive mode is
  switched to and from automatically based on cursor movement commands
- disable auto interactive if region is highlighted
- fix crash bug in qe_register_emulation_bindings for "emacs" emulation
2026-05-11 00:21:56 +02:00
huwwa
880aa115cd shell: sync interactive state between windows sharing the same shell buffer 2026-05-11 00:21:56 +02:00
huwwa
7d7a7d0fac shell: update toggle input status message 2026-05-11 00:21:56 +02:00
huwwa
2af3c40706 shell: split interactive and non-interactive shell commands 2026-05-11 00:21:56 +02:00
huwwa
5b87d2e4ff shell: manage interactive mode and readonly state
* decouple interactive mode from cursor position.
* clear readonly when entering interactive mode and
  restore when leaving it.
* simplify navigation logic by removing offset-based toggling.
* set pager mode on interactive shell exit.
2026-05-11 00:21:56 +02:00
Charlie Gordon
582a6ee384 Modes: Add MDX mode for markdown/JSX mixed contents
* preliminary support for [MDX](https://mdxjs.com/) mode
* uses only markdown for now, will detect and colorize JSX parts later
2026-05-10 17:34:48 +02:00
huwwa
8a9c4412ed shell: check process termination before closing 2026-05-06 14:23:14 +02:00
huwwa
668a4be142 shell: avoid leaving stray processes when reusing a shell buffer
* check for active processes in shell buffers before reusing them,
  and prompt the user to kill the running process to avoid leaving
  it detached and unreachable.
2026-05-06 14:23:14 +02:00
huwwa
640ad15e4d shell: try to split window for shell commands 2026-05-06 14:23:14 +02:00
huwwa
db2bbc4c71 remove extra new line with caption
* `ctime` format ends with a new line.
2026-05-06 14:23:14 +02:00
huwwa
4d3e1e0810 shell: encapsulate error variables in a global ShellError structure 2026-05-06 14:23:14 +02:00
huwwa
b3f37b7b23 check for active process associated with the buffer before killing it
* killing a shell buffer while its process is still running can leave the
  process alive but no longer accessible.
2026-05-06 14:23:14 +02:00
huwwa
42c88b10ca default exit status to -1 if not launched 2026-05-06 14:23:14 +02:00
huwwa
aeb0767a3c fix: defer pty closure until buffer is fully drained
fixes a race condition where pty data was lost on process exit.
The pid callback now flags the exit status, while `shell_read_cb`
handles the final teardown. This prevents truncation for
high-throughput processes.
2026-05-06 14:23:14 +02:00
huwwa
adc72a8b0a set readonly flag for compilation buffer 2026-05-06 14:23:14 +02:00
huwwa
9502e20d52 fix: use appropriate buffer flag 2026-05-06 14:23:14 +02:00
Charlie Gordon
58174a7247 use FALLTHROUGH instead of fallthrough to avoid clash with x11 2026-03-14 21:55:25 +01:00
Charlie Gordon
93fe952ab8 fix clang 17 compilation warnings 2026-03-14 21:33:53 +01:00
Charlie Gordon
d2db97217c disable transient bindings on next-error and previous-error 2026-02-06 13:02:09 +01:00
huwwa
9186032c64 use S_IXUSR instead of S_IEXEC 2026-02-06 12:45:28 +01:00
huwwa
93539ead18 replace depricated getdtablesize with sysconf 2026-02-06 12:45:28 +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
4964b9fded Fix memory leaks
* fix bug in `eb_free` where log and style buffers were not freed
* free minibuffer history list
* free css symbols when finalizing the graphics html viewer
2025-02-05 17:47:32 +01:00
Charlie Gordon
e4fb8c8428
Improve language colorizers (#54)
* fix detection of javascript partial comments in diff output
* colorize python annotations
* add simplistic yaml colorizer
* colorize .gitignore files
* improve shell buffer diff output colorization
2024-12-14 23:56:54 +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
d447da9ce0 Improve mouse support
Mouse:
- add `shift` state in all mouse events
- pass `QEmacsState *qs` to `qe_mouse_event`
- support non drag mouse events with `-m:2` command line option
- dragging beyond window borders generates scrolling events
  (should autorepeat, should have menu line at the top for scrolling up)
- cancel active search on mouse_goto
- do not mouse activate window if current active window is modal (popup or
  minibuf)
- handle double and triple click: select by words or lines
- handle shift click: extend selection
- add `EditState::mouse_down_offset` for initial dragging buffer offset
- pass `QEEvent *ev` to `mouse_goto()` handlers

events:
- add synthetic key events: QUIT CLOSE EXIT
- use synthetic events for GUI interaction (no longer simulate keystrokes)

tty:
- fix large OSC sequence support for terminal clipboard retrieval

Multicursor:
- use new `QECursor` for multicursor local states
- reallocate `multi_cursor` array in chunks

misc:
- add `eb_peekc(EditBuffer *b, int offset)`
- boolean cmdline options no longer require an argument, true if none provided
- int cmdline options either require an argument (CMD_LINE_INT_ARG) or take an
  optional argument, value is incremented if argument is not provided.
2024-11-10 00:44:20 +01:00
Charlie Gordon
4bccb6f2d9 drop capitalized bufed bindings 2024-11-10 00:44:20 +01:00
Charlie Gordon
788d537ba9 disable non-ASCII binary character display to fix alignment in screen sessions 2024-11-10 00:44:20 +01:00
Charlie Gordon
07164c95b9 redirect S-RET, S-DEL and C-RET if not bound explicitly
- remove explicit bindings for `S-DEL` and `S-RET`
- add bindings for `C-RET` in org-mode and markdown-mode
2024-10-11 09:14:16 +02:00
Charlie Gordon
ab86598e29 Automate modifyOtherKeys, mouse and clipboard support detection
- intialize `tty_mk`, `tty_mouse` and `tty_clipboard` to `-1` for automatic
- command line options force setting
- otherwise, configure support from environment variables (for now)
2024-10-11 09:14:16 +02:00
Charlie Gordon
36b8eac509 fix dired invoked from an actual file: enumerate file directory 2024-10-11 09:14:16 +02:00
Charlie Gordon
26c3d3a9b1 Improve buffer list
* sort normal, system, log and style buffers separately
* add `bufed-summary` command to display list of bufed commands
* cycle 3 filter levels with `.`: normal, system, log/style
* `bufed` requires extra `C-u` prefix to display log/style buffers
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
9815df4c68 Fix shell buffer CSI parameter parsing 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
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
oguillaumin
d2aa2a8c13 colorize grep -[ABC] output in shell buffers 2024-08-31 13:49:00 +02:00
oguillaumin
2d9800662a Substantial dired rewrite
* add hierarchical view in dired left panel:
  - left on closed dir or file moves to parent dir
  - left on closed dir or file with no parent inserts the open parent dir at the top
  - right on closed dir opens the directory
  - right on open dir goes down to last visited item in this list or first if none
  - right on file skips to the right window in preview mode
  - space on directory expands or collapses it
* add `do_dired_path()`
* fix `qe_load_file()` for directories specified as relative paths
* fix `qe_load_file()` loading a directory into the dired left panel
* add dired sorting by fullname
* fix directory grouping for non alpha sort
* use direct array of `DiredItem` instead of `StringArray`
* add `dired_ignore_extensions[]`
* add `classify_fullnames()` to help with tree sorting
* add completion on `dired-sort` prompt
* add `dired-summary` on `?`
2024-08-31 13:49:00 +02:00