fortrangoingonforty/fortsh / 3feed7f

Browse files

make Ctrl+X dual-mode: cut selection or enter process-kill

Authored by espadonne
SHA
3feed7fc8e26d2847b5fafcfc93473ff199e6eef
Parents
853c41e
Tree
4d6df57

2 changed files

StatusFile+-
M src/io/readline.f90 10 3
M tests/interactive/utils/keys.py 3 2
src/io/readline.f90modified
@@ -48,7 +48,7 @@ module readline
48
   integer, parameter :: KEY_CTRL_C = 3
48
   integer, parameter :: KEY_CTRL_C = 3
49
   integer, parameter :: KEY_CTRL_D = 4
49
   integer, parameter :: KEY_CTRL_D = 4
50
   integer, parameter :: KEY_CTRL_V = 22   ! Paste from system clipboard / kill buffer
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
   integer, parameter :: KEY_CTRL_A = 1    ! Home (beginning of line)
52
   integer, parameter :: KEY_CTRL_A = 1    ! Home (beginning of line)
53
   integer, parameter :: KEY_CTRL_E = 5    ! End (end of line)
53
   integer, parameter :: KEY_CTRL_E = 5    ! End (end of line)
54
   integer, parameter :: KEY_CTRL_K = 11   ! Kill to end of line
54
   integer, parameter :: KEY_CTRL_K = 11   ! Kill to end of line
@@ -1576,8 +1576,15 @@ contains
1576
           done = .true.
1576
           done = .true.
1577
 
1577
 
1578
         case(KEY_CTRL_X)
1578
         case(KEY_CTRL_X)
1579
-          ! Ctrl+X - Enter process kill mode (no-op in search mode)
1579
+          ! Ctrl+X — dual-mode (Sprint 5):
1580
-          if (.not. module_input_state%in_search .and. &
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
               .not. module_input_state%in_process_kill_mode) then
1588
               .not. module_input_state%in_process_kill_mode) then
1582
             call enter_process_kill_mode(module_input_state)
1589
             call enter_process_kill_mode(module_input_state)
1583
           end if
1590
           end if
tests/interactive/utils/keys.pymodified
@@ -56,8 +56,8 @@ CTRL_S = "\x13" # Forward search / Suspend output
56
 CTRL_T = "\x14"  # Transpose characters
56
 CTRL_T = "\x14"  # Transpose characters
57
 CTRL_U = "\x15"  # Kill to beginning of line
57
 CTRL_U = "\x15"  # Kill to beginning of line
58
 CTRL_V = "\x16"  # Paste from clipboard / kill buffer
58
 CTRL_V = "\x16"  # Paste from clipboard / kill buffer
59
-CTRL_W = "\x17"  # Kill word backward
59
+CTRL_W = "\x17"  # Kill word backward / cut selection
60
-CTRL_X = "\x18"  # Prefix
60
+CTRL_X = "\x18"  # Cut selection / process kill mode
61
 CTRL_Y = "\x19"  # Yank
61
 CTRL_Y = "\x19"  # Yank
62
 CTRL_Z = "\x1a"  # Suspend (SIGTSTP)
62
 CTRL_Z = "\x1a"  # Suspend (SIGTSTP)
63
 
63
 
@@ -156,6 +156,7 @@ KEYS = {
156
     "C-u": CTRL_U,
156
     "C-u": CTRL_U,
157
     "C-v": CTRL_V,
157
     "C-v": CTRL_V,
158
     "C-w": CTRL_W,
158
     "C-w": CTRL_W,
159
+    "C-x": CTRL_X,
159
     "C-y": CTRL_Y,
160
     "C-y": CTRL_Y,
160
     "C-z": CTRL_Z,
161
     "C-z": CTRL_Z,
161
 
162