1define rline_beep () 2{ 3 () = fputs ("\007", stdout); 4 () = fflush (stdout); 5} 6 7define rline_bol () 8{ 9 rline_call ("bol"); 10} 11 12define rline_eol () 13{ 14 rline_call ("eol"); 15} 16 17define rline_delete_line () 18{ 19 rline_set_line (""); 20} 21 22define rline_deleol () 23{ 24 rline_call ("deleol"); 25} 26 27define rline_left () 28{ 29 rline_call ("left"); 30} 31 32define rline_right () 33{ 34 rline_call ("right"); 35} 36 37define rline_bdel () 38{ 39 rline_call ("bdel"); 40} 41 42private define skip_non_word_chars (line, p) 43{ 44 variable p1 = p, ch; 45 do 46 { 47 p = p1; 48 (p1, ch) = strskipchar (line, p, 1); 49 } 50 while (ch && not isalnum(ch)); 51 return p; 52} 53 54private define skip_word_chars (line, p) 55{ 56 variable p1 = p, ch; 57 do 58 { 59 p = p1; 60 (p1, ch) = strskipchar (line, p, 1); 61 } 62 while (isalnum(ch)); 63 return p; 64} 65 66private define bskip_non_word_chars (line, p) 67{ 68 variable p1 = p, ch; 69 do 70 { 71 p = p1; 72 (p1, ch) = strbskipchar (line, p, 1); 73 } 74 while (ch && not isalnum(ch)); 75 return p; 76} 77 78private define bskip_word_chars (line, p) 79{ 80 variable p1 = p, ch; 81 do 82 { 83 p = p1; 84 (p1, ch) = strbskipchar (line, p, 1); 85 } 86 while (isalnum(ch)); 87 return p; 88} 89 90define rline_bskip_word () 91{ 92 variable line = rline_get_line (), p = rline_get_point (); 93 rline_set_point (bskip_word_chars (line, bskip_non_word_chars(line, p))); 94} 95 96define rline_skip_word () 97{ 98 variable line = rline_get_line (), p = rline_get_point (); 99 rline_set_point (skip_word_chars (line, skip_non_word_chars(line, p))); 100} 101 102private variable Mark = NULL; 103private variable Paste_Buffer = ""; 104 105define rline_set_mark () 106{ 107 Mark = rline_get_point (); 108} 109 110private define get_mark (mp) 111{ 112 if (Mark == NULL) 113 { 114 rline_beep (); 115 return -1; 116 } 117 @mp = Mark; 118 Mark = NULL; 119 return 0; 120} 121 122private define get_region (mp, pp) 123{ 124 variable m; 125 if (-1 == get_mark (&m)) 126 return -1; 127 128 variable p = rline_get_point (); 129 if (p < m) 130 (p, m) = (m, p); 131 @mp = m; 132 @pp = p; 133 return 0; 134} 135 136private define copy_region_to_pastebuffer (m, p) 137{ 138 variable line = rline_get_line (); 139 Paste_Buffer = substrbytes (line, m+1, (p-m)); 140} 141 142define rline_copy_region () 143{ 144 variable m, p; 145 if (-1 == get_region (&m, &p)) 146 return; 147 copy_region_to_pastebuffer (m, p); 148} 149 150define rline_kill_region () 151{ 152 variable m, p; 153 if (-1 == get_region (&m, &p)) 154 return; 155 156 copy_region_to_pastebuffer (m, p); 157 rline_set_point (m); 158 rline_del (p-m); 159} 160 161define rline_kill_eol () 162{ 163 rline_set_mark (); 164 rline_eol (); 165 rline_kill_region (); 166} 167 168define rline_kill_bol () 169{ 170 rline_set_mark (); 171 rline_bol (); 172 rline_kill_region (); 173} 174 175define rline_yank () 176{ 177 rline_ins (Paste_Buffer); 178} 179