1 1.1.1.2 mrg Xedit is a simple text editor for X. 2 1.1.1.2 mrg 3 1.1.1.2 mrg Please check xedit(1) for information about resources and configurable 4 1.1.1.2 mrg options. 5 1.1.1.2 mrg 6 1.1.1.2 mrg The authors file should list the original authors of all files, but 7 1.1.1.2 mrg unfortunately most collaborators and people that changed portions of the 8 1.1.1.2 mrg code is not listed. 9 1.1.1.2 mrg 10 1.1.1.2 mrg 11 1.1.1.2 mrg List of default keyboard commands. 12 1.1.1.2 mrg Uppercase letters means both, uppercase and lowercase. 13 1.1.1.2 mrg Lowercase letter usually means Shift key is not pressed. 14 1.1.1.2 mrg C- Means Control key. 15 1.1.1.2 mrg M- Means Meta key. 16 1.1.1.2 mrg Usually Alt key has the same effect. 17 1.1.1.2 mrg S- Means Shift key. 18 1.1.1.2 mrg 19 1.1.1.2 mrg C-A Move cursor to beginning of line. 20 1.1.1.2 mrg C-B or Left 21 1.1.1.2 mrg Move cursor backwards one character. 22 1.1.1.2 mrg C-C Insert CUT_BUFFER0 selection at cursor position. 23 1.1.1.2 mrg C-D Delete next character. 24 1.1.1.2 mrg C-E Move cursor to end of line. 25 1.1.1.2 mrg C-F or Right 26 1.1.1.2 mrg Move cursor forwards one character. 27 1.1.1.2 mrg C-G Keyboard reset. 28 1.1.1.2 mrg Use it to switch direction in the Undo stack, i.e. switch between 29 1.1.1.2 mrg Undo and Redo. 30 1.1.1.2 mrg It can also be used to stop the lisp interpreter if it is executing 31 1.1.1.2 mrg code. 32 1.1.1.2 mrg C-H Deletes character before cursor. 33 1.1.1.2 mrg C-J Adds a newline and indent. 34 1.1.1.2 mrg If the current buffer is the *scratch* buffer, it will work 35 1.1.1.2 mrg like C-X,C-E, but print the lisp output directly to the scratch 36 1.1.1.2 mrg buffer. Examples: 37 1.1.1.2 mrg (list 1 2 3) C-J will print (1 2 3) and move the cursor to 38 1.1.1.2 mrg the next line. 39 1.1.1.2 mrg C-K Deletes text from cursor position to end of line. 40 1.1.1.2 mrg C-L Redraw text window. 41 1.1.1.2 mrg C-M Adds a newline. 42 1.1.1.2 mrg C-N or Down 43 1.1.1.2 mrg Move cursor to next line. 44 1.1.1.2 mrg C-O Adds one newline at cursor position without moving cursor. 45 1.1.1.2 mrg C-P or Up 46 1.1.1.2 mrg Move cursor to previous line. 47 1.1.1.2 mrg C-R Opens search dialog, searching backwards. 48 1.1.1.2 mrg C-S Opens search dialog, searching forwards. 49 1.1.1.2 mrg C-T Transpose characters. 50 1.1.1.2 mrg C-U Starts multiply mode. 51 1.1.1.2 mrg Multiply mode means that most keyboard commands will be repeated 52 1.1.1.2 mrg by its parameter. After pressing C-U type a number, that can be 53 1.1.1.2 mrg negative. Examples: 54 1.1.1.2 mrg C-U 10 C-F will move the cursor 10 characters forwards 55 1.1.1.2 mrg C-U -10 C-F will move the cursor 10 characters backwards 56 1.1.1.2 mrg If no number is specified, or if the number zero is specified, 57 1.1.1.2 mrg the default value is 4. 58 1.1.1.2 mrg C-V or PageDown 59 1.1.1.2 mrg Move cursor to next page. 60 1.1.1.2 mrg C-W Kills current selection. 61 1.1.1.2 mrg C-W is also useful when there is no active selection, to return to 62 1.1.1.2 mrg the previous position the left mouse was clicked in the text window. 63 1.1.1.2 mrg C-Y Inserts SECONDARY selection. 64 1.1.1.2 mrg This usually means text delete with commands other than by just 65 1.1.1.2 mrg pressing Backspace or Delete (that can be multiplied) 66 1.1.1.2 mrg C-Z Scroll one line up. 67 1.1.1.2 mrg M-B or C-Left 68 1.1.1.2 mrg Move cursor backwards one word. 69 1.1.1.2 mrg C-Left only moves over alphabetic or numeric characters 70 1.1.1.2 mrg M-C Capitalize word under cursor position, or next word. 71 1.1.1.2 mrg M-F or C-Right 72 1.1.1.2 mrg Move cursor forwards one word. 73 1.1.1.2 mrg C-Right only moves over alphabetic or numeric characters. 74 1.1.1.2 mrg M-I Opens a dialog prompting for a file name to be inserted at the 75 1.1.1.2 mrg cursor position. 76 1.1.1.2 mrg (This isn't very user friendly, this is a cavemen interface, you will 77 1.1.1.2 mrg love it, you will never use it). 78 1.1.1.2 mrg M-K Kills text from cursor position to end of paragraph. 79 1.1.1.2 mrg M-L Downcase word at cursor position or next word. 80 1.1.1.2 mrg M-Q Format paragraph. 81 1.1.1.2 mrg Xedit interfaces Xaw code that allows several types of text 82 1.1.1.2 mrg formatting. To use it, you need to Select "Auto Fill" in the 83 1.1.1.2 mrg "Edit Menu" and select values for "Break Columns". After that, 84 1.1.1.2 mrg Select "Edit Menu"->"Justification" for the available options. 85 1.1.1.2 mrg Text typed will usually be automatically corrected, but if you 86 1.1.1.2 mrg need to change text in the middle of a previous line, use M-Q 87 1.1.1.2 mrg to reformat, and C-_ to undo if required. 88 1.1.1.2 mrg Examples of text: 89 1.1.1.2 mrg 90 1.1.1.2 mrg This text with align 91 1.1.1.2 mrg left and break 92 1.1.1.2 mrg columns at 20 and 93 1.1.1.2 mrg 40. 94 1.1.1.2 mrg 95 1.1.1.2 mrg This text with align 96 1.1.1.2 mrg right and break 97 1.1.1.2 mrg columns at 25 and 98 1.1.1.2 mrg 45. Remember that 99 1.1.1.2 mrg Auto Fill must be 100 1.1.1.2 mrg selected. And it may 101 1.1.1.2 mrg be required to press 102 1.1.1.2 mrg M-Q when going back 103 1.1.1.2 mrg to edit previous 104 1.1.1.2 mrg lines. 105 1.1.1.2 mrg 106 1.1.1.2 mrg This text with align center 107 1.1.1.2 mrg and break columns at 40 and 108 1.1.1.2 mrg 70. A good tip is to make sure 109 1.1.1.2 mrg there are empty lines before 110 1.1.1.2 mrg and after the aligned text, so 111 1.1.1.2 mrg that M-Q will not format more 112 1.1.1.2 mrg text than it should. 113 1.1.1.2 mrg 114 1.1.1.2 mrg This text with full align, 115 1.1.1.2 mrg note that it will spread the 116 1.1.1.2 mrg words to fully fill the 117 1.1.1.2 mrg configured break columns, in 118 1.1.1.2 mrg this case 15 and 45. Also note 119 1.1.1.2 mrg that it doesn't remove any 120 1.1.1.2 mrg extra indentation from the 121 1.1.1.2 mrg first line. This may be 122 1.1.1.2 mrg considered a bug or feature, 123 1.1.1.2 mrg but it doesn't respect 2 124 1.1.1.2 mrg spaces after an '.' dot. And 125 1.1.1.2 mrg it doesn't align the last line 126 1.1.1.2 mrg of text. 127 1.1.1.2 mrg 128 1.1.1.2 mrg This text with Auto Fill disabled. When Auto Fill is disabled, tabs are 129 1.1.1.2 mrg usually preserved, like this, and this. But it 130 1.1.1.2 mrg will basically format the text to not be larger than the text widget screen 131 1.1.1.2 mrg width and. But it the screen is scrolled horizontally, it will not work as 132 1.1.1.2 mrg expected, the advantage over the above interface is that is considers font 133 1.1.1.2 mrg characters width, while the other interface assumes fixed width characters. 134 1.1.1.2 mrg 135 1.1.1.2 mrg Notice that "auto formatting" with Auto Fill mode is done when 136 1.1.1.2 mrg pressing enter, but information isn't saved per paragraph, so 137 1.1.1.2 mrg if values of align or break columns are changed, trying to edit 138 1.1.1.2 mrg a text block with different configuration will not give the expected 139 1.1.1.2 mrg results. 140 1.1.1.2 mrg Also notice that lines starting with non printable characters aren't 141 1.1.1.2 mrg automatically formatted. This is helpful for some editing modes 142 1.1.1.2 mrg where symbols can be used before lines in a paragraph. If you don't 143 1.1.1.2 mrg need this feature, usually pressing Space or Tab is enough to put the 144 1.1.1.2 mrg cursor at the proper position. 145 1.1.1.2 mrg M-U Upcase word at cursor position or next word. 146 1.1.1.2 mrg M-V or PageUp 147 1.1.1.2 mrg Move cursor to previous page. 148 1.1.1.2 mrg M-Y Kill ring yank feature. Basically it will circulate over all 149 1.1.1.2 mrg text that has been cut in the current session. Keep pressing it 150 1.1.1.2 mrg until happy :-) 151 1.1.1.2 mrg M-Z Scrolls one line down. 152 1.1.1.2 mrg M-D Kill word at cursor position or next word. 153 1.1.1.2 mrg S-M-D Delete word at cursor position or next word. 154 1.1.1.2 mrg Does not go to the kill ring. 155 1.1.1.2 mrg M-H or M-Delete or M-Backspace. 156 1.1.1.2 mrg Kill word at cursor position or previous word. 157 1.1.1.2 mrg S-M-H or S-M-Delete or S-M-Backspace 158 1.1.1.2 mrg Delete word at cursor position or previous word. 159 1.1.1.2 mrg Does not go to the kill ring. 160 1.1.1.2 mrg M-. Find definition/declaration of symbol string of selected text, and/or 161 1.1.1.2 mrg finds next tag when more than one definition exists for the symbol. 162 1.1.1.2 mrg M-< or Home 163 1.1.1.2 mrg Move cursor to beginning of file. 164 1.1.1.2 mrg M-> or End 165 1.1.1.2 mrg Move cursor to end of file. 166 1.1.1.2 mrg M-] or C-Down 167 1.1.1.2 mrg Move cursor to next paragraph. 168 1.1.1.2 mrg M-[ or C-Up 169 1.1.1.2 mrg Move cursor to previous paragraph. 170 1.1.1.2 mrg C-_ or C-X,U 171 1.1.1.2 mrg Undo. 172 1.1.1.2 mrg If enabled in the given textwidget. Not enabled by default in the 173 1.1.1.2 mrg message window and filename window, or any of the other text widgets 174 1.1.1.2 mrg in the several available dialogs. 175 1.1.1.2 mrg C-\ or C-Kanji 176 1.1.1.2 mrg Reconnect Input Method. 177 1.1.1.2 mrg In international mode (probably broken interface). 178 1.1.1.2 mrg S-Insert 179 1.1.1.2 mrg Insert PRIMARY selection from CUT_BUFFER0. 180 1.1.1.2 mrg C-Q 181 1.1.1.2 mrg Followed by any character, will insert the next typed character 182 1.1.1.2 mrg useful to insert control characters. For example C-Q,C-L will 183 1.1.1.2 mrg insert ^L at the cursor position. 184 1.1.1.2 mrg LeftMouseButton 185 1.1.1.2 mrg When pressed marks the start of a PRIMARY selection at CUTBUFFER0 186 1.1.1.2 mrg When moved while pressed extends the selection. 187 1.1.1.2 mrg MiddleMouseButton 188 1.1.1.2 mrg When pressed, inserts the PRIMARY selection at CUTBUFFER0 at 189 1.1.1.2 mrg the cursor position. 190 1.1.1.2 mrg RightMouseButton 191 1.1.1.2 mrg Can be used to adjust a selection done with LeftMouseButton. 192 1.1.1.2 mrg C-A,Tab 193 1.1.1.2 mrg If the loaded file has a indentation rules file, C or Lisp, xedit 194 1.1.1.2 mrg will reindent the line. Also, entering a fresh character on a 195 1.1.1.2 mrg newline should be enough to move the cursor to the proper position. 196 1.1.1.2 mrg To override it, you may need to use the C-U to multiply the action, 197 1.1.1.2 mrg as it will only indent if only one character was added. 198 1.1.1.2 mrg C-X,C-C or (Pressing the Quit button) 199 1.1.1.2 mrg Exits xedit. 200 1.1.1.2 mrg If there are unsaved files, a message will be printed asking to 201 1.1.1.2 mrg "exit" again, or save the files. 202 1.1.1.2 mrg C-X,C-E 203 1.1.1.2 mrg Execute lisp expression before the cursor position. 204 1.1.1.2 mrg C-X,C-F 205 1.1.1.2 mrg Changes keyboard input focus to the filename text input window. 206 1.1.1.2 mrg In this mode, pressing Tab will try to complete the filename 207 1.1.1.2 mrg being typed. 208 1.1.1.2 mrg When more than one match exists, pressing Tab again will display 209 1.1.1.2 mrg the directory navigation window. 210 1.1.1.2 mrg The initial search path usually is the basename of the file loaded 211 1.1.1.2 mrg in the current textwindow, or currently directory from where 212 1.1.1.2 mrg xedit was started if the *scratch* is the current "buffer". 213 1.1.1.2 mrg The character ~ can be used as a shortcut for the home directory 214 1.1.1.2 mrg and ~username will be replaced by the home directory of "username" 215 1.1.1.2 mrg if it exists. 216 1.1.1.2 mrg C-X,C-S or (Pressing the Save button) 217 1.1.1.2 mrg Saves the file in the current text window. 218 1.1.1.2 mrg C-X,Tab 219 1.1.1.2 mrg Indents the current paragraph. 220 1.1.1.2 mrg Use the C-U modifier to specify the number of spaces to insert 221 1.1.1.2 mrg or remove if the C-U parameter is negative. 222 1.1.1.2 mrg C-X,0 223 1.1.1.2 mrg Deletes the current window. 224 1.1.1.2 mrg The file being edited is not unloaded. 225 1.1.1.2 mrg C-X,1 226 1.1.1.2 mrg Deletes the other window. 227 1.1.1.2 mrg The file being edited is not unloaded. 228 1.1.1.2 mrg C-X,2 229 1.1.1.2 mrg Splits vertically the current window. 230 1.1.1.2 mrg C-X,3 231 1.1.1.2 mrg Splits vertically the current window. 232 1.1.1.2 mrg C-X,b 233 1.1.1.2 mrg Switch the contents of the current window to the next file in 234 1.1.1.2 mrg the list of loaded files. 235 1.1.1.2 mrg C-X,d 236 1.1.1.2 mrg Displays the directory listing window. 237 1.1.1.2 mrg In this window, it is possible to navigate in the file system 238 1.1.1.2 mrg to choose a file to edit. 239 1.1.1.2 mrg Usually, this is the same as pressing C-X,C-F,Tab 240 1.1.1.2 mrg See C-X,C-F for more information. 241 1.1.1.2 mrg C-X,k 242 1.1.1.2 mrg Unloads the file being edited. 243 1.1.1.2 mrg If the file has not been saved, a message will be displayed, 244 1.1.1.2 mrg asking to either press C-X,k again, or save the file 245 1.1.1.2 mrg The *scratch* buffer cannot be killed and will always 246 1.1.1.2 mrg prints a warning when exiting xedit. This is the expected behavior. 247 1.1.1.2 mrg C-X,o 248 1.1.1.2 mrg Switch input focus to the other window, making it the current one 249 1.1.1.2 mrg If the editor doesn't have splited windows, this command is ignored. 250 1.1.1.2 mrg Insert 251 1.1.1.2 mrg Switches between insert and overwrite mode. 252 1.1.1.2 mrg In overwrite mode text is typed over existing file contents, 253 1.1.1.2 mrg only extending the file contents when typing at the end of 254 1.1.1.2 mrg a line (or file). 255 1.1.1.2 mrg Escape 256 1.1.1.2 mrg Enters the line edit mode. 257 1.1.1.2 mrg In this mode it is possible to use regex expressions to search and 258 1.1.1.2 mrg replace the contents of the file loaded in the current text window. 259 1.1.1.2 mrg Refer to the xedit(1) manpage for more information of the regex 260 1.1.1.2 mrg expression format. 261 1.1.1.2 mrg Note that the regex used by xedit isn't IEEE Std 1003.2 compliant, 262 1.1.1.2 mrg and not compliant with most regex implementations in that it doesn't 263 1.1.1.2 mrg support some complex search patterns, usually involving patterns 264 1.1.1.2 mrg like ((.*)+)? that may require too much restarts or have several 265 1.1.1.2 mrg correct interpretations for multiple matches. Also, it always does 266 1.1.1.2 mrg minimal matching, and it is not configurable like in pcre, example: 267 1.1.1.2 mrg searching "a1a1a1" with the pattern "(.*)\d" will find "a1" and 268 1.1.1.2 mrg not "a1a1a1" as could be expected. 269 1.1.1.2 mrg Please refer to lisp/re/README for more information on the supported 270 1.1.1.2 mrg regex expressions. 271 1.1.1.2 mrg C-LeftMouseButton 272 1.1.1.2 mrg Displays the "File Menu" from where it is possible to select a 273 1.1.1.2 mrg new file to be edited in the current window. 274 1.1.1.2 mrg C-MiddleMouseButton 275 1.1.1.2 mrg Displays the "Edit Menu" that usually has the following options: 276 1.1.1.2 mrg +------------------+-------------+ 277 1.1.1.2 mrg | Wrapping -> | Never | 278 1.1.1.2 mrg | | Line | 279 1.1.1.2 mrg | | Word | 280 1.1.1.2 mrg | Auto Fill +-------------+ 281 1.1.1.2 mrg | +-------------+ 282 1.1.1.2 mrg | Justification -> | Left | 283 1.1.1.2 mrg | | Right | 284 1.1.1.2 mrg | | Center | 285 1.1.1.2 mrg | | Full | 286 1.1.1.2 mrg | +-------------+ 287 1.1.1.2 mrg | Break Columns... | 288 1.1.1.2 mrg | +-------------+ 289 1.1.1.2 mrg | Scrollbars -> | Vertical | 290 1.1.1.2 mrg | | Horizontal | 291 1.1.1.2 mrg | +-------------+ 292 1.1.1.2 mrg | +-------------+ 293 1.1.1.2 mrg | Edit Mode -> | Plain/None | 294 1.1.1.2 mrg | | C/C++ | 295 1.1.1.2 mrg | | Lisp/Scheme | 296 1.1.1.2 mrg | | X imake | 297 1.1.1.2 mrg | | Makefile | 298 1.1.1.2 mrg | | Unix shell | 299 1.1.1.2 mrg | | SGML | 300 1.1.1.2 mrg | | HTML | 301 1.1.1.2 mrg | | Man page | 302 1.1.1.2 mrg | | X resource | 303 1.1.1.2 mrg | | XF86Config | 304 1.1.1.2 mrg | | RPM spec | 305 1.1.1.2 mrg | | XFree86 log | 306 1.1.1.2 mrg | | Patch file | 307 1.1.1.2 mrg +------------------+-------------+ 308 1.1.1.2 mrg "Wrapping" is disabled if "Auto Fill" is enabled. 309 1.1.1.2 mrg "Justification" and "Break Columns..." are enabled if "Auto Fill" 310 1.1.1.2 mrg is also enabled. 311 1.1.1.2 mrg "Edit Mode" lists the available syntax highlight and indentation 312 1.1.1.2 mrg rules defined. 313 1.1.1.2 mrg Note that most of these options don't work in "international" mode. 314 1.1.1.2 mrg Several xedit interfaces works only with 8 bits encodings, and 315 1.1.1.2 mrg doesn't properly handle UTF-8. 316 1.1.1.2 mrg C-RightMouseButton 317 1.1.1.2 mrg Displays the "Option Menu". 318 1.1.1.2 mrg Currently the only option is an Ispell frontend. 319 1.1.1.2 mrg FourthMouseButton (usually also moving up the mouse wheel) 320 1.1.1.2 mrg Scroll one line down 321 1.1.1.2 mrg FifthMouseButton (usually also moving down the mouse wheel) 322 1.1.1.2 mrg Scroll one line up 323 1.1.1.2 mrg 324 1.1.1.2 mrg 325 1.1.1.2 mrg 326 1.1.1.2 mrg There is also some documentation in lisp/README, lisp/TODO, 327 1.1.1.2 mrg lisp/re/README, lisp/re/tests.txt, and comments/justifications/wishlists for 328 1.1.1.2 mrg the cases the interpreter fail to give the proper result for a given test. 329 1.1.1.2 mrg 330 1.1.1.2 mrg The lisp interpreter implements most of a standard COMMON LISP 331 1.1.1.2 mrg environment, but the compiler generates only byte code and not everything 332 1.1.1.2 mrg can be compiled, in those cases the interpreter does the work. Examples are 333 1.1.1.2 mrg constructs involving UNWIND-PROTECT or any kind of jump outside of the 334 1.1.1.2 mrg current function body. 335 1.1.1.2 mrg 336 1.1.1.2 mrg For more information please consult any COMMON LISP documentation or 337 1.1.1.2 mrg tutorial. 338 1.1.1.2 mrg 339 1.1.1.2 mrg 340 1.1.1.2 mrg 341 1.1.1.2 mrg Simple tutorial on writing a "foolang" syntax highlight mode for xedit. 342 1.1.1.2 mrg 343 1.1.1.2 mrg Create a file called foolang.lsp 344 1.1.1.2 mrg Add: 345 1.1.1.2 mrg -- 346 1.1.1.2 mrg (require "syntax") 347 1.1.1.2 mrg (require "indent") 348 1.1.1.2 mrg (in-package "XEDIT") 349 1.1.1.2 mrg -- 350 1.1.1.2 mrg to foolang.lsp 351 1.1.1.2 mrg Check the available files if you want a custom property, or to know about 352 1.1.1.2 mrg the available ones. One example is: 353 1.1.1.2 mrg -- 354 1.1.1.2 mrg (defsynprop *prop-foolang* 355 1.1.1.2 mrg "foolang" 356 1.1.1.2 mrg :font "fixed" 357 1.1.1.2 mrg :foreground "rgb:a/b/c" 358 1.1.1.2 mrg :background "rgb:1/2/3" 359 1.1.1.2 mrg :underline t 360 1.1.1.2 mrg :overstrike t) 361 1.1.1.2 mrg -- 362 1.1.1.2 mrg Check lisp/modules/xedit.lsp for the other options, like subscript, 363 1.1.1.2 mrg superscript and/or combining XLFD properties. 364 1.1.1.2 mrg Create a syntax definition for foolang. Check the definition of defsyntax in 365 1.1.1.2 mrg lisp/modules/syntax.lsp for more details. One example for foolang is: 366 1.1.1.2 mrg -- 367 1.1.1.2 mrg (defsyntax *foolang-mode* :foolang nil nil nil 368 1.1.1.2 mrg ;; use the sample property created for foolang whenever the string 369 1.1.1.2 mrg ;; foolang is found at the toplevel 370 1.1.1.2 mrg (syntoken "\\<foolang\\>" :property *prop-foolang*) 371 1.1.1.2 mrg 372 1.1.1.2 mrg ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 373 1.1.1.2 mrg ;; process C style comments 374 1.1.1.2 mrg (syntoken "/*" :nospec t :begin :comment :contained t) 375 1.1.1.2 mrg ;; contained is an option to not "export" this definition to child 376 1.1.1.2 mrg ;; tables 377 1.1.1.2 mrg 378 1.1.1.2 mrg (syntable :comment *prop-comment* #'default-indent 379 1.1.1.2 mrg ;; #'default-indent means a very simple indent that follows indentation 380 1.1.1.2 mrg ;; of previous line. Use nil for no indentation 381 1.1.1.2 mrg 382 1.1.1.2 mrg ;; Don't start a new table, instead flag as an error if nested 383 1.1.1.2 mrg (syntoken "/*" :nospec t :property *prop-error*) 384 1.1.1.2 mrg ;; :nospec t sets the RE_NOSPEC flag for the regex, i.e. searches 385 1.1.1.2 mrg ;; a literal string, and * will not be a special character 386 1.1.1.2 mrg 387 1.1.1.2 mrg (syntoken "XXX|TODO|FIXME" :property *prop-annotation*) 388 1.1.1.2 mrg ;; just to make it easier to flag some important comment 389 1.1.1.2 mrg 390 1.1.1.2 mrg (syntoken "*/" :nospec t :switch -1) 391 1.1.1.2 mrg ;; The :switch argument is the number of tables to "pop", in 392 1.1.1.2 mrg ;; this case, we are at table :comment, and :switch -1 returns 393 1.1.1.2 mrg ;; to table :foolang, that is the "root" table 394 1.1.1.2 mrg ) 395 1.1.1.2 mrg 396 1.1.1.2 mrg ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 397 1.1.1.2 mrg ;; Process lisp comments that can nest 398 1.1.1.2 mrg (syntable :lisp-comment *prop-comment* nil 399 1.1.1.2 mrg 400 1.1.1.2 mrg ;; Start a comment, possibly nested 401 1.1.1.2 mrg (syntoken "#|" :nospec t :begin :lisp-comment) 402 1.1.1.2 mrg 403 1.1.1.2 mrg ;; Returns to previous comment in stack or to main :foolang table 404 1.1.1.2 mrg (syntoken "|#" :nospec t :switch -1) 405 1.1.1.2 mrg 406 1.1.1.2 mrg ;; For easier flagging important comments 407 1.1.1.2 mrg (syntoken "XXX|FIXME|TODO" :property *prop-annotation*) 408 1.1.1.2 mrg ) 409 1.1.1.2 mrg 410 1.1.1.2 mrg ;; This is usually in the end of the list, but can be anywhere, 411 1.1.1.2 mrg ;; just that if it isn't at the end, conflicting rules are resolved 412 1.1.1.2 mrg ;; by declaration order 413 1.1.1.2 mrg (synaugment :lisp-comment) 414 1.1.1.2 mrg ;; Adds the :lisp-comment table to :foolang table 415 1.1.1.2 mrg 416 1.1.1.2 mrg ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 417 1.1.1.2 mrg ;; Lisp like strings that don't need a \ at the end of the line 418 1.1.1.2 mrg (syntable :lisp-string *prop-string* nil 419 1.1.1.2 mrg ;; ignore a escaped " in the middle of the string 420 1.1.1.2 mrg (syntoken "\\\\.") 421 1.1.1.2 mrg ;; Note that no options are used, just keep using the current 422 1.1.1.2 mrg ;; property. Unfortunately, backslashes must be escaped twice. 423 1.1.1.2 mrg ;; Once for the lisp reader and once for the regex compiler. 424 1.1.1.2 mrg 425 1.1.1.2 mrg (syntoken "\"" :nospec: t :switch -1) 426 1.1.1.2 mrg ;; :nospec is used just to create a faster regex. switch -1 427 1.1.1.2 mrg ;; returns to the previous syntax table. It isn't an error to 428 1.1.1.2 mrg ;; try to go down the "root" table, but if that happens, it 429 1.1.1.2 mrg ;; probably means either wrong syntax definition of malformed input. 430 1.1.1.2 mrg ) 431 1.1.1.2 mrg 432 1.1.1.2 mrg (synaugment :lisp-string) 433 1.1.1.2 mrg ;; Adds the :lisp-string table to :foolang table 434 1.1.1.2 mrg ;; Note that since there isn't a rule to start a string in the 435 1.1.1.2 mrg ;; :lisp-string table, it cannot nest, maybe because the ending 436 1.1.1.2 mrg ;; character is the starting character ? :-)) 437 1.1.1.2 mrg 438 1.1.1.2 mrg ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 439 1.1.1.2 mrg ;; C style string rules 440 1.1.1.2 mrg (syntable :string *prop-string* nil 441 1.1.1.2 mrg ;; Ignore escaped characters 442 1.1.1.2 mrg (syntoken "\\\\.") 443 1.1.1.2 mrg 444 1.1.1.2 mrg ;; Match, most, printf arguments. 445 1.1.1.2 mrg (syntoken "%%|%([+-]?\\d+)?(l?[deEfgiouxX]|[cdeEfgiopsuxX])" 446 1.1.1.2 mrg :property *prop-format*) 447 1.1.1.2 mrg ;; Just for fun. This makes easier to see printf formats in strings 448 1.1.1.2 mrg ;; *prop-format* is *prop-string* with the :underline option 449 1.1.1.2 mrg 450 1.1.1.2 mrg (syntoken "\\\\$") 451 1.1.1.2 mrg ;; a backslash extends the string to the next line 452 1.1.1.2 mrg 453 1.1.1.2 mrg ;; A nonscaped " inside a string finishes it, since this table doesn't 454 1.1.1.2 mrg ;; have sub tables, and cannot nest, should return to :foolang table 455 1.1.1.2 mrg ;; from here 456 1.1.1.2 mrg (syntoken "\"" :nospec t :switch -1) 457 1.1.1.2 mrg 458 1.1.1.2 mrg ;; This token rule starts a new table called :error because end of line 459 1.1.1.2 mrg ;; has been matched. Note that it is defined last, so that a line 460 1.1.1.2 mrg ;; ending with " or \ will be processed first. 461 1.1.1.2 mrg (syntoken ".?$" :begin :error) 462 1.1.1.2 mrg 463 1.1.1.2 mrg (synaugment :string) 464 1.1.1.2 mrg ;; Adds the :string table to :foolang table 465 1.1.1.2 mrg 466 1.1.1.2 mrg ;; This table is used by :string, but could be shared for other patterns 467 1.1.1.2 mrg ;; like characters constants, etc. 468 1.1.1.2 mrg ;; It uses :switch -2 because it is started inside the :string table, 469 1.1.1.2 mrg ;; but it is also a table, so, pops two tables from the table stack 470 1.1.1.2 mrg (syntable :error *prop-error* nil 471 1.1.1.2 mrg (syntoken "^.*$" :switch -2) 472 1.1.1.2 mrg ) 473 1.1.1.2 mrg ) 474 1.1.1.2 mrg -- 475 1.1.1.2 mrg 476 1.1.1.2 mrg Indentation rules are significantly more complex. I suggest looking at 477 1.1.1.2 mrg lisp/modules/indent.lsp for the macros and function definitions; 478 1.1.1.2 mrg and lisp/modules/progmodes/lisp.lsp and lisp/modules/progmodes/c.lsp for two 479 1.1.1.2 mrg sample implementations of indentation for Lisp/Scheme and C/C++ 480 1.1.1.2 mrg respectively. 481 1.1.1.2 mrg 482 1.1.1.2 mrg Note also that indentation is parsed backwards, what can cause some 483 1.1.1.2 mrg confusion, and make "visualization" of order or precedence of evaluation for 484 1.1.1.2 mrg rules harder to understand. 485 1.1.1.2 mrg 486 1.1.1.2 mrg A simple indentation rules definition for foolang could be: 487 1.1.1.2 mrg 488 1.1.1.2 mrg -- 489 1.1.1.2 mrg (defindent *foolang-mode-indent* :foolang 490 1.1.1.2 mrg ;; This must be the first token and usually the only token matching 491 1.1.1.2 mrg ;; BOL (Beginning of Line) 492 1.1.1.2 mrg (indtoken "^\\s*" :indent 493 1.1.1.2 mrg :code (or *offset* (setq *offset* (+ *ind-offset* *ind-length*)))) 494 1.1.1.2 mrg ;; the keyword :indent is a pattern put on a list when there is 495 1.1.1.2 mrg ;; a match, so that later patterns can be "reduced" by some other 496 1.1.1.2 mrg ;; rule, i.e.: (:indent :indent) could be reduced to (:indent) 497 1.1.1.2 mrg 498 1.1.1.2 mrg (indtoken "//.*$" nil) 499 1.1.1.2 mrg ;; C++ style comment. Returning nil instead of a token basically 500 1.1.1.2 mrg ;; ignores the token, as it should not enter the reduction pattern 501 1.1.1.2 mrg ;; list 502 1.1.1.2 mrg 503 1.1.1.2 mrg ;; Sample C comment pattern 504 1.1.1.2 mrg (indtoken "*/" :ccomment :nospec t :begin :comment) 505 1.1.1.2 mrg ;; Note that the indaugment macro doesn't need to be used, and actually 506 1.1.1.2 mrg ;; would be an error. In this example, the indentation compiler checks 507 1.1.1.2 mrg ;; the :begin :comment and handles it internally, as it already needs 508 1.1.1.2 mrg ;; to check for things like typos, unreachable labels, detectable 509 1.1.1.2 mrg ;; non resolving rules, etc. There is runtime check also, so it should 510 1.1.1.2 mrg ;; never enter an infinite loop when trying to resolve reduction rules. 511 1.1.1.2 mrg ;; Check lisp/modules/indent.lsp:(compile-indent-table) for the 512 1.1.1.2 mrg ;; implementation and more comments. 513 1.1.1.2 mrg 514 1.1.1.2 mrg ;; Indentation rules also have stacked tables 515 1.1.1.2 mrg (indtable :comment 516 1.1.1.2 mrg (indtoken "/*" :ocomment :nospec t :switch -1)) 517 1.1.1.2 mrg ;; Note that the name is :ocomment (open comment), but that the 518 1.1.1.2 mrg ;; the table is finished when matching the open comment pattern 519 1.1.1.2 mrg 520 1.1.1.2 mrg ;; A simple initialization of a variable used by the indentation rules 521 1.1.1.2 mrg (indinit (parens 0)) 522 1.1.1.2 mrg ;; This variable can be declared anywhere in the body of defindent, 523 1.1.1.2 mrg ;; It will be properly moved to a "variables declaration section" 524 1.1.1.2 mrg ;; when expanding and compiling the table. 525 1.1.1.2 mrg 526 1.1.1.2 mrg (indtoken "(" :oparen :nospec t :code (incf parens)) 527 1.1.1.2 mrg (indtoken ")" :cparen :nospec t :code (decf parens)) 528 1.1.1.2 mrg ;; These two tokes add the patterns :oparen and :cparen to the 529 1.1.1.2 mrg ;; "pattern list", and also have code to remember the balancing 530 1.1.1.2 mrg ;; of parenthesis. 531 1.1.1.2 mrg 532 1.1.1.2 mrg 533 1.1.1.2 mrg ;; One of the simplest reduction rules :-) 534 1.1.1.2 mrg (indreduce nil 535 1.1.1.2 mrg t 536 1.1.1.2 mrg ((:comment))) 537 1.1.1.2 mrg ;; Once the boundings of a comment are found, just ignore it, like 538 1.1.1.2 mrg ;; what was done with the // pattern, but in that case, the boundings 539 1.1.1.2 mrg ;; were readily available. 540 1.1.1.2 mrg ;; The t (True) parameter means that this rule is always evaluated, 541 1.1.1.2 mrg ;; but conditional code may be used, and implicit code may be added 542 1.1.1.2 mrg ;; to the end of the indreduce macro. 543 1.1.1.2 mrg ;; Since it is a macro, code can be compiled to optimized bytecode 544 1.1.1.2 mrg ;; after the macro is expanded. 545 1.1.1.2 mrg 546 1.1.1.2 mrg (indinit (indent 0)) 547 1.1.1.2 mrg ;; Note that there is a special *indent* variable that should hold the 548 1.1.1.2 mrg ;; proper indentation value, but it may be required to "overwrite" 549 1.1.1.2 mrg ;; without forgetting that value, for things like: 550 1.1.1.2 mrg ;; 551 1.1.1.2 mrg ;; foo(bar(baz(blah 552 1.1.1.2 mrg ;; ^ ^ 553 1.1.1.2 mrg ;; | | 554 1.1.1.2 mrg ;; indent | 555 1.1.1.2 mrg ;; effective indentation to be used 556 1.1.1.2 mrg ;; 557 1.1.1.2 mrg ;; where it is desirable to align the code in the next line with the 558 1.1.1.2 mrg ;; last open parenthesis. 559 1.1.1.2 mrg 560 1.1.1.2 mrg 561 1.1.1.2 mrg Since the interface is, unfortunately, complex enough to not expect 562 1.1.1.2 mrg casual users to have something like a $HOME/.xedit file, if you want to add 563 1.1.1.2 mrg new modes, please check lisp/modules/xedit.lsp:*auto-modes* 564 1.1.1.2 mrg 565 1.1.1.2 mrg There is some documentation about the variable. It should be possible to 566 1.1.1.2 mrg change/update the variable from the lisp interface in the *scratch* buffer, 567 1.1.1.2 mrg but for safety, it is suggested that if you add new rules, you should 568 1.1.1.2 mrg restart xedit after it. Also note that there is compiled code in 569 1.1.1.2 mrg lisp/xedit.c that expects that variable to follow an specific format. 570 1.1.1.2 mrg 571 1.1.1.2 mrg You may notice that several .lsp files aren't "properly indented"; this 572 1.1.1.2 mrg is because the lisp indentation rules file was made long after most of the 573 1.1.1.2 mrg other files were done, and it was considered a bad practice to gratuitously 574 1.1.1.2 mrg reindent all files. 575 1.1.1.2 mrg 576 1.1.1.2 mrg 577 1.1.1.2 mrg 578 1.1.1.2 mrg At the time of this writing, the ispell interface should be again 579 1.1.1.2 mrg functional, but it may be required to use some old ispell program to handle 580 1.1.1.2 mrg non utf8 text. But it should work properly for the english language, and in 581 1.1.1.2 mrg international mode, should work with any language. But there are problems in 582 1.1.1.2 mrg international mode not fixed. 583 1.1.1.2 mrg 584 1.1.1.2 mrg I (Paulo Cesar) considered several times to extend the normal 585 1.1.1.2 mrg textwidget to handle utf8, but this is probably a lot of work/time badly 586 1.1.1.2 mrg spent and I prefer to work on other personal projects, but still xedit is 587 1.1.1.2 mrg the editor I use for programming. The XPRINT support unfortunately is broken 588 1.1.1.2 mrg due to it. Note that xedit, like pretty much any other Xaw application can 589 1.1.1.2 mrg be linked against Xaw with XPRINT support. In the case of xedit, a flag 590 1.1.1.2 mrg could be used, like the "international" variable to, at runtime, disable all 591 1.1.1.2 mrg the related code, if required. 592 1.1.1.2 mrg 593 1.1.1.2 mrg Also at the time of this writing, the tags interface was added, as well 594 1.1.1.2 mrg as several other bug fixes. The tags interface is documented in the manpage, 595 1.1.1.2 mrg but the action shortcut may not be clear. The default shortcut is M-. . 596 1.1.1.2 mrg There is no support for more than one tags file, or changing the tags file 597 1.1.1.2 mrg at runtime. But the code should be easy to adapt for this case, as all 598 1.1.1.2 mrg related functions receive pointers to the appropriate structures. One option 599 1.1.1.2 mrg could be to descend from the directory of the loaded file searching for a 600 1.1.1.2 mrg tags file, and then associate the file with the tags definition, if it isn't 601 1.1.1.2 mrg already loaded. Shouldn't be hard to implement. For "inter project" files, 602 1.1.1.2 mrg it should be better to have one xedit window per "project", i.e. searching 603 1.1.1.2 mrg the definition of something like a libc symbol should probably be done in 604 1.1.1.2 mrg another xedit window. 605