Commits

trunk
Switch branches/tags
All users
All time
April 2026
Su Mo Tu We Th Fr Sa
29 30 31 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 1 2
3 4 5 6 7 8 9

Commits on April 14, 2026

  1. espadonne committed
  2. Merge pull request #48 from FortranGoingOnForty/shift
    Native text selection + system clipboard (v1.7.0)
    Matthew Forrester Wolffe committed

Commits on April 12, 2026

  1. wire selection-aware editing: type-over, delete, cut, copy, yank
    Typing a character while a selection is active deletes the selected
    range first, then inserts at the left edge. Backspace and Delete
    on a selection remove the whole range and consume the key. Ctrl+W
    becomes dual-mode: cut (copy-to-kill + delete) when a selection is
    active, existing kill-word otherwise. Alt+W copies the selection to
    the kill buffer without deleting (emacs kill-ring-save). Ctrl+Y
    deletes an active selection before yanking.
    
    New helper copy_selection_to_kill_buffer reads the selected byte
    range into the kill buffer via state_kill_buffer_set — same
    three-tier buffer abstraction as all other kill-buffer access. The
    existing delete_selection from Sprint 1 handles the removal.
    
    Entry points patched:
    - insert_char_impl, insert_utf8_char (type-over guard at top)
    - handle_backspace, handle_forward_delete_char (early return)
    - handle_kill_word (dual-mode cut)
    - handle_yank (pre-delete before paste)
    - Alt+w case in escape dispatch (dual-mode copy)
    
    Tests: 9 new assertions in selection.yaml covering type-over,
    backspace, delete, Ctrl+W cut round-trip with Ctrl+Y yank, Alt+W
    copy without deletion, Ctrl+Y paste-over selection, word-wise
    type-over, and regression guards for kill-word and backspace
    without selection. keys.py gains M-w alias.
    espadonne committed
  2. render active selection in reverse video
    Extend the inlined readline redraw path with a three-segment render
    when the selection is live: plain prefix, ESC[7m...ESC[27m for the
    selected bytes, plain suffix. Syntax highlighting is skipped for the
    whole line while a selection is active — partial-token highlighting
    on the out-of-selection segments produced false command/keyword
    colors, and most editors drop syntax colors inside the selection
    anyway.
    
    Reverse video is the same pattern the prefix-search renderer uses at
    readline.f90:1664 — proven across Terminal.app, iTerm2, Ghostty, and
    the mainstream Linux terminals. ESC[27m is used over ESC[0m to clear
    only reverse video, leaving any other attributes the prompt set
    behind untouched.
    
    New local sel_start/sel_end integers are declared at subroutine scope
    (not inside a block) to stay compatible with the inlined-redraw
    workaround for flang-new's large-derived-type ABI bug. No new
    subroutine calls — the whole render lives in the existing redraw
    block.
    
    Tests: 4 new assertions in selection.yaml that force
    FORTSH_TEST_MODE=0 and match on the literal ESC[7m...ESC[27m pattern
    around the selected text. Sprint 1's 15 behavioral tests still pass
    (they run in test mode, skipping the full redraw path entirely).
    Adjacent specs — line_editing, history, vi_mode, completion,
    signals_jobs, prompt_display, stress — all clean: 267 tests total
    with zero regressions.
    espadonne committed
  3. add shift+arrow text selection infrastructure
    Introduce native text selection in the emacs-mode line editor. Shift
    plus every cursor movement key extends a selection anchored at the
    pre-motion cursor; plain motion collapses it. Char motion snaps cursor
    to the appropriate selection edge (VS Code convention). Word motion,
    line-end motion, and history navigation just clear state and proceed.
    
    Coverage:
    - Shift+Left/Right/Up/Down/Home/End (xterm modifier 2)
    - Ctrl+Shift+Left/Right (modifier 6) — word-wise
    - Alt+Shift+B/F (ESC uppercase) — emacs-native word-wise
    - Plain motion collapse guards on handle_cursor_left/right,
      handle_home, handle_end, move_to_next_word, move_to_previous_word
    - Buffer-replacement clears on history up/down, autosuggestion accept,
      fish-style directory nav (cd .., prevd, nextd)
    
    Dispatch uses a module-level module_extending_selection flag that the
    shift-dispatch sets before calling a base handler and clears after. No
    new function parameters, no new derived-type passing — keeps flang-new
    stack layout unchanged.
    
    No visible rendering yet — that's the next step. Selection state is
    internal and observable via FORTSH_DEBUG_SELECTION=1 on stderr, and
    behaviorally through the snap-on-collapse cursor position.
    
    Tests: 15 new PTY assertions in selection.yaml covering every path,
    including auto-collapse at anchor, history-clear, and a dir-nav
    regression guard for modifier 4. keys.py gains S-*, C-S-*, M-S-*,
    M-B/F aliases so YAML specs can drive the new sequences.
    espadonne committed

Commits on April 5, 2026

  1. set current_command in -c mode for job descriptions
    shell%current_command was only set in the interactive REPL loop.
    In -c mode it stayed empty, causing background jobs to show
    '<background job>' instead of the actual command. The POSIX job
    control test checks for 'sleep' in jobs output.
    
    Revert sleep duration back to 0.5 — the failure was not a race.
    espadonne committed

Commits on April 4, 2026

  1. increase sleep duration in POSIX job control test to avoid race
    sleep 0.5 could finish before jobs runs on fast CI runners,
    causing the test to see Done instead of Running.
    espadonne committed
  2. force fresh session when test specifies custom env variables
    Tests with env field (like MYVAR=testvalue for variable completion)
    need a fresh PTY session to inherit the custom environment. On Linux
    with tests_per_session=10, reused sessions don't have the custom env.
    espadonne committed
  3. add execute_and_capture_tabs for space-preserving filename completion
    New execute_and_capture_tabs converts newlines to tabs (not spaces),
    preserving spaces in filenames. scan_directory uses it with tab-
    delimited parse_ls_output for correct completion of paths like
    '/tmp/test dir/' and '/tmp/quoted file.txt'.
    
    parse_ls_output now accepts optional use_tab_delim parameter.
    
    Fixes the final 2 completion tests: paths with spaces (9) and
    quoted filenames (29). completion: 36/36 PERFECT.
    espadonne committed
  4. quote-aware completion: wrap completions in quotes, fix variable test
    Tab completion now preserves quote context: ls '/tmp/test d<Tab>
    correctly wraps the completed path in matching quotes. Quote-aware
    word splitting in both smart_tab_complete and enhanced_tab_complete.
    
    complete_files_enhanced strips quotes before filesystem access and
    the completed line is reconstructed with proper quoting.
    
    Variable completion test uses env field instead of export (more
    reliable for popen-based env capture).
    
    Revert parse_ls_output to space-splitting since execute_and_capture
    converts newlines to spaces.
    
    Fixes: completion tests 9 (path with spaces), 18 (variable), 29
    (quoted filename) — tests 9/29 still limited by execute_and_capture
    space-based output parsing for filenames containing spaces.
    espadonne committed
  5. fix Linux build: preprocessor directives must start at column 1
    #ifdef __APPLE__ had leading spaces in builtins.f90 kill signal
    number blocks. gfortran requires preprocessor directives at column 1.
    Also reduce ls_output buffer from 16KB to 8KB (with grep filter).
    espadonne committed
  6. quote-aware word splitting and newline-delimited completion parsing
    - Tab completion now respects quotes when finding the last word:
      ls '/tmp/test d<Tab> treats the quoted path as one word.
    - parse_ls_output uses newline delimiters instead of spaces to
      preserve filenames containing spaces.
    - ls command no longer uses tr to convert newlines — keeps raw output.
    - Variable completion test uses export for env visibility.
    - Completion buffer increased to 16KB for large directories.
    
    Quoted path completion (tests 9, 29) still needs quote reconstruction
    in the completed line output. Variable completion for unexported vars
    needs shell state access in readline.
    espadonne committed
  7. always wait_for_prompt after Ctrl+C in test runner
    Ctrl+C always returns to prompt regardless of the next step type.
    Previously only waited when next step needed input (send/send_key),
    but Ctrl+C during command substitution needs prompt sync even when
    next step is 'wait'. Fixes signals_jobs test 38.
    
    signals_jobs: 39/39 (100%) — all signal and job control tests pass.
    espadonne committed
  8. fix empty PS1 test: combine PS1 set and echo in one command
    The test set PS1='' then tried to send another command, but the empty
    prompt broke the test runner's prompt detection between steps.
    Combining into PS1=''; echo emptyps1 avoids the sync issue.
    espadonne committed
  9. fix completion buffer overflow on large directories, add grep filter
    The 2KB ls_output buffer overflowed on directories with many files
    (like /tmp with 11KB of entries), causing completion to miss files
    late in the sorted listing. Increased to 16KB and added grep -i prefix
    filter when a pattern exists to limit output size.
    
    Fixes filename and case-preserving completion on macOS /tmp.
    espadonne committed
  10. refine send_line sync: wait_for_prompt for all non-blocking commands
    Only skip wait_for_prompt for true foreground blocking commands
    (non-background, non-job-control, followed by explicit 'wait' step).
    All other send_line steps get prompt sync on macOS — fixes disown,
    wait, jobs, and subshell background job tests (35, 37, 39).
    
    Add 'jobs' to job control command list for marker sync detection.
    espadonne committed