@@ -48,7 +48,7 @@ module readline |
| 48 | 48 | integer, parameter :: KEY_CTRL_C = 3 |
| 49 | 49 | integer, parameter :: KEY_CTRL_D = 4 |
| 50 | 50 | integer, parameter :: KEY_CTRL_V = 22 ! Paste from system clipboard / kill buffer |
| 51 | | - integer, parameter :: KEY_CTRL_X = 24 ! Process kill mode |
| 51 | + integer, parameter :: KEY_CTRL_X = 24 ! Cut selection / Process kill mode |
| 52 | 52 | integer, parameter :: KEY_CTRL_A = 1 ! Home (beginning of line) |
| 53 | 53 | integer, parameter :: KEY_CTRL_E = 5 ! End (end of line) |
| 54 | 54 | integer, parameter :: KEY_CTRL_K = 11 ! Kill to end of line |
@@ -1576,8 +1576,15 @@ contains |
| 1576 | 1576 | done = .true. |
| 1577 | 1577 | |
| 1578 | 1578 | case(KEY_CTRL_X) |
| 1579 | | - ! Ctrl+X - Enter process kill mode (no-op in search mode) |
| 1580 | | - if (.not. module_input_state%in_search .and. & |
| 1579 | + ! Ctrl+X — dual-mode (Sprint 5): |
| 1580 | + ! 1. If a selection is active, CUT (same as Ctrl+W on selection: |
| 1581 | + ! copy to kill buffer + system clipboard, then delete range). |
| 1582 | + ! 2. Otherwise, enter process kill mode (existing behavior). |
| 1583 | + if (module_input_state%selection_active) then |
| 1584 | + call copy_selection_to_kill_buffer(module_input_state) |
| 1585 | + call delete_selection(module_input_state) |
| 1586 | + call update_autosuggestion(module_input_state) |
| 1587 | + else if (.not. module_input_state%in_search .and. & |
| 1581 | 1588 | .not. module_input_state%in_process_kill_mode) then |
| 1582 | 1589 | call enter_process_kill_mode(module_input_state) |
| 1583 | 1590 | end if |