kill: use platform-specific signal numbers for SIGCHLD, SIGCONT,
SIGTSTP instead of hardcoded Linux values. When kill -CONT is sent
to a job spec (%N), update the job state to JOB_RUNNING.
test runner: skip marker sync for job control commands (bg, fg, kill,
disown, wait) whose output interacts with background processes.
Fixes kill -CONT %1 test (33) and bg tests (24, 25).
Job control commands interact with background processes whose output
can swallow the sync marker echo, causing 10s timeout. Use
wait_for_prompt instead. Fixes bg/bg %1 tests (24, 25).
Also increase last-step delay to 300ms on macOS for flang-new I/O
flush time.
Shell: check HISTFILE env var before loading history file. Previously
always loaded ~/.fortsh_history regardless of HISTFILE setting.
Tests: set HISTFILE=/dev/null in PTY environment to prevent history
file from polluting per-test history. Fixes history test 5 (up arrow
at boundary recalled commands from previous sessions).
Also restore clear_buffer in non-marker sync path to fix history
tests 8, 11, 12.
Without clear_buffer, stale command output polluted the pexpect buffer
for tests using Ctrl+R search and history navigation. Restoring it
fixes history tests 8, 11, 12 without regressing signals_jobs (job
status output comes from the last step which has no sync).
Detect $ prefix in tab completion and match against environment
variable names. Completes exported/env vars using env command output.
Full shell variable completion requires readline access to shell state
(future enhancement).
The AST executor tried to reconstruct command text from the AST but
only handled CMD_SIMPLE nodes. Pipeline and subshell background jobs
showed '<background job>' instead of the actual command. Now uses
shell%current_command which has the full command text.
Removes a job from the shell's job table. Supports job specs (%n)
or defaults to the current job. The process continues running but
is no longer tracked by the shell.
The AST executor was passing empty string as original_input to the
legacy executor's execute_pipeline. Background and stopped jobs had
blank command text in 'jobs' output. Now passes shell%current_command
so job descriptions show the actual command (e.g. 'sleep 10').
add_job defaults state to JOB_RUNNING. The executor's waitpid consumes
the stopped status, so update_job_status can't detect it later. Now
both the legacy and AST executors explicitly set JOB_STOPPED in the
job table after add_job for WIFSTOPPED processes.
Fixes 'jobs' showing Running instead of Stopped after Ctrl+Z.
ast_executor: waitpid now passes WUNTRACED so stopped processes
(Ctrl+Z/SIGTSTP) are detected. Added WIFSTOPPED handling in pipeline
wait loop. Added WSTOPSIG helper to system_interface.
test runner: skip marker sync for background commands (ending with &)
to prevent 10s timeout from letting jobs complete before 'jobs' runs.
Remove clear_buffer after signal key prompt wait to preserve job status
output. Detect background commands to use appropriate sync strategy.
Shell: use named signal constants (SIGCHLD, SIGINT, SIGTSTP) instead
of hardcoded Linux numbers in setup_signal_handlers. Add #ifdef
__APPLE__ for signal constants 17-22 in signal_handling.f90.
Test runner: after Ctrl+C/Z signal keys, wait for prompt before sending
more input. The shell needs time to process the signal, reap children,
and enter readline. Only wait when more input steps follow — if the
signal is the last step, let expect_output find the signal message.
Fixes signals_jobs tests 1, 3, 5, 9, 10 (Ctrl+C interrupt, Ctrl+Z
suspend).
signals.f90: use named SIGCHLD/SIGINT/SIGTSTP/SIGTTIN/SIGTTOU constants
from system_interface instead of hardcoded Linux numbers in
setup_signal_handlers(). Also fix get_signal_number() for SIGTSTP/SIGCONT.
signal_handling.f90: add #ifdef __APPLE__ for signal constants 17-22
which differ between Linux and macOS (SIGCHLD=20, SIGTSTP=18, etc).
readline.f90: Ctrl+R Enter now executes the found command (bash behavior).
Ctrl+L works on empty prompt.
test runner: clear buffer after wait_for_prompt sync to prevent stale
output from polluting subsequent expect calls. Prefix sync markers with
leading space to exclude from command history.
Shell: Enter during Ctrl+R search now executes the found command
immediately (bash behavior). Previously it only accepted the search
result into the buffer without executing.
Test runner: clear pexpect buffer after wait_for_prompt in non-marker
sync path. Stale command output (e.g. 'echo other') was polluting the
expect buffer for subsequent steps. Also prefix sync marker echos with
space to exclude from command history.
Tab completion now uses prefix-only matching by default (like bash/zsh).
Fuzzy subsequence matching (where 'fort' matches 'install_intel_fortran')
is available via: set -o fuzzy-complete
Short patterns (≤3 chars) always require prefix match regardless of
the setting, to prevent noise like 'ls' matching 'false'.
Ctrl+L was gated on buffer length > 0 as a workaround for a phantom
form-feed from Fortran I/O flush. The root cause was fixed by explicit
flush(output_unit) after command execution, so the guard is no longer
needed. Now Ctrl+L works like bash/fish on empty prompts.
Ctrl+P (previous-history) and Ctrl+N (next-history) are standard emacs
readline bindings that were missing. Only arrow keys worked for history
navigation. Fixes history tests 5-8 on all platforms.
On macOS ARM64 both flags are defined. Accessor functions for search
strings, vi command buffer, menu prefix, and original buffer checked
USE_MEMORY_POOL first, dereferencing uninitialized pool refs → SIGSEGV
in Ctrl+R search, vi-mode commands, tab completion, and undo.
Fix 29 accessor guards (not init/cleanup) to avoid flang-new codegen
butterfly effect. Also sync editing_mode from global on each readline
call so set -o vi / set -o emacs takes effect immediately.
Three changes to fix 135 of 158 macOS PTY test failures:
1. tests_per_session=1 on macOS: fresh PTY per test eliminates cursor
tracking corruption from readline state leaking across sessions.
2. Marker-based sync for send_line→send_line steps: echo a unique
marker after setup commands, wait for it. Replaces unreliable 50ms
fixed delay and avoids greedy '> ' prompt matching.
3. wait_for_prompt for send_line→interactive steps: ensures quick
commands (set -o vi) complete before key sequences arrive. Skipped
for long-running commands (sleep) where next step is 'wait'.
Linux unchanged (50ms delay, tests_per_session=10).
On macOS ARM64 both flags are defined. Accessor functions for search
strings, vi command buffer, menu prefix, and original buffer checked
USE_MEMORY_POOL first, dereferencing uninitialized pool refs → SIGSEGV
in Ctrl+R search, vi-mode commands, tab completion, and undo.
Fix accessor guards only (not init/cleanup) to avoid flang-new codegen
butterfly effect that silently breaks echo output when init blocks are
restructured.
Also sync editing_mode from global_editing_mode on each readline call
so set -o vi / set -o emacs takes effect immediately.
Root cause: in raw mode, bare LF moves cursor down without returning to
column 0. Multi-line prompts and Enter key sent bare LF, causing cursor
to drift right. Fix: replace all LF with CR+LF in prompt printing, Enter
handler, and redraw code. Also keep raw mode across continuation calls.