|
|
1.1 ! root 1: From gbergman@UCBBRAHMS Mon Jul 25 16:21:43 1983 ! 2: Date: 25 Jul 83 16:16:52 PDT (Mon) ! 3: From: gbergman@UCBBRAHMS (George Mark Bergman) ! 4: Subject: Re: editor bugs etc. ! 5: Message-Id: <[email protected]> ! 6: Received: by UCBBRAHMS.ARPA (3.342/3.7) ! 7: id AA22776; 25 Jul 83 16:16:52 PDT (Mon) ! 8: Received: from UCBBRAHMS.ARPA by UCBERNIE.ARPA (3.336/3.7) ! 9: id AA13678; 25 Jul 83 16:21:17 PDT (Mon) ! 10: To: mckusick@UCBERNIE ! 11: Status: R ! 12: ! 13: The following are (i) a short note from Mark Horton ! 14: in reply to a note of mine saying I'd been keeping notes ! 15: on editor bugs, had heard he had a new version, was ! 16: interested in hearing about it and perhaps sending ! 17: him notes on bugs not mentioned as corrected; (ii) ! 18: a long letter from me in which I do list bugs, features ! 19: I think would be desirable etc., (iii) an addendum I ! 20: sent the next day, (iv) brief jottings not yet sent. ! 21: ! 22: - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ! 23: >From [email protected] Thu Jul 21 12:31:55 1983 ! 24: ! 25: The new version of vi isn't very different to the user. ! 26: The internals use terminfo instead of termcap, but the ! 27: user interface isn't affected by this (except that it ! 28: starts up faster). The major new features are ! 29: set showmode ! 30: will cause an indication on the status line when ! 31: you are in input mode ! 32: vedit ! 33: is a new invocation of vi for novices ! 34: more function keys now work ! 35: function keys work in both command and input mode ! 36: Of course, there are a few bug fixes too. ! 37: ! 38: There is a binary in ~mark/bin/vi on ucbarpa. It requires the ! 39: /etc/term heirarchy (there is no file called /etc/terminfo) which ! 40: was on ucbarpa once but might be gone now. If you want to grab ! 41: them from whereever they still exist, please feel free to try them. ! 42: Mark ! 43: - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ! 44: Sent to Mark Horton 23/7/83, about 11AM ! 45: ! 46: Dear Mark, ! 47: ! 48: Well, your note didn't say you wanted me to send my comments ! 49: on editor bugs and suggestions, but you didn't say I shouldn't, ! 50: so I decided to do so. I've tried to organize it into some sort ! 51: of sections. I'd be interested to know which of the bugs mentioned ! 52: here you have already found and corrected. (I may soon find out for ! 53: myself; the person in charge of this machine says he'll try to get a ! 54: copy of version 3.9 from UCBARPA if they still have it, and get it ! 55: running for me. If you have any helpful information for him, he ! 56: is robert@brahms, Robert Gross.) ! 57: Vedit sounds like a great idea. ! 58: I should mention that throughout this letter, I have ! 59: avoided using actual control-characters, but faked them, ! 60: e.g. used ^ and H to get the appearance of ^H, since files with ! 61: real control-characters can be confusing when looked at in mail, ! 62: more, etc. But this means that if you want to try any commands I ! 63: refer to that use them, you won't be able to yank and source them, ! 64: unless you replace my fakes with real control characters. ! 65: The version I am using is 3.7. ! 66: ! 67: ! 68: PROBLEMS WITH COUNTS ! 69: ! 70: Some vi operations that logically ought to be able to take ! 71: counts do not, while others misbehave with counts. In this section, ! 72: ``N'' will always denote a positive integer placed as a count before ! 73: a vi operation. ! 74: The most gross case of misbehavior is that of N^B! ! 75: The effect is to redraw the screen 23N-44 lines further advanced. ! 76: (Probably the numbers depend on the screen-size of the terminal; ! 77: this is on a Z19, using termcap h19u.) When N=1, this does indeed ! 78: move you a screenful backward, but for higher N it moves the window ! 79: forward some amount! Further, whatever controls are supposed to ! 80: monitor whether the command would land one at an acceptable line- ! 81: number seem to have a different idea of what it is doing: If you ! 82: aren't already familiar with these weird effects, try setting the ! 83: cursor near the end of a file that is more than 4 screenfuls long, ! 84: and hitting 3^B. (You might then try an insert at the place you get ! 85: to, and a :f^] .) ! 86: N/pattern/ would be useful, but is not allowed. ! 87: ND would be a natural synonym for dN$, by analogy with NC for cN$, ! 88: but it doesn't work that way; it just ignores the N. ! 89: Finally, if N is precisely the number of lines ! 90: from the current line to the end of the file, N$ will still correctly ! 91: carry one to the last character of the file, but cN$, NC, dN$ and yN$ ! 92: refuse to do anything! (NY does work, not being a synonym for yN$.) ! 93: The failure of NC is particularly annoying; often when I am composing ! 94: something, I go back to somewhere in the middle of the next-to- ! 95: last line, say, and want to rewrite the rest of the sentence; ! 96: 2cc would kill not only the part I want to rewrite but also the OK ! 97: beginning of the line, and 2C or 2c$ won't work. I realize that I ! 98: could get around this by keeping an empty line at the end of the file, ! 99: but that should not be necessary. ! 100: ! 101: ! 102: PROBLEMS REGARDING SOURCE, MACROS, MAPPINGS ! 103: These are enormously useful, but seem to have all kinds of hidden ! 104: restrictions. ! 105: ! 106: The Appendix to the Ex Reference Manual, "List of Changes from ! 107: Version 3.5 to Version 3.6" says ``A bug which prevented the source ! 108: command from working...from visual has been fixed''. It is true that ! 109: one can now use :so from vi, but it still has a bug: When ! 110: the scriptfile invoked contains a global command ! 111: and some other command(s) after it, everything after the first global ! 112: command is ignored. The same appears to be true of scripts in named ! 113: buffers invoked from vi-bottom-line by @x. ! 114: ! 115: (It is, perhaps, unexpected that one can invoke scripts with ! 116: multiline commands using @x from vi's bottom-line at all, since such ! 117: commands will not work if typed on vi's bottom line directly. ! 118: A script like ! 119: s/$/a\ ! 120: b ! 121: invoked as @x will indeed work. But strangely, if one tries to ! 122: invoke from the regular mode of vi the script ! 123: :s/$/a\ ! 124: b ! 125: by putting it in buffer x and doing @x, only the first line ! 126: will take effect.) ! 127: ! 128: Another serious restriction is that the command ``vi'' appears to ! 129: be ignored in sourced ex-scripts, and though the command Q in macros of ! 130: various flavors in vi (mapped characters, map!ed characters that contain ! 131: ``...^V^[...Q...''; @x scripts) does take one into ex, any ex ! 132: commands after it are ignored. ! 133: ! 134: I assume you are aware of whatever restrictions lead to the ! 135: error-message ``Cannot yank inside global/macro'', since you must ! 136: have written it, though ``inside'' seems to here have the peculiar ! 137: meaning ``after a text-changing operation of the macro.'' ! 138: The error-message ``Can't undo in global commands'' is more ! 139: mysterious, since I get it when I have a global command after ! 140: a text-changing command in an @x script (though not in a sourced file). ! 141: Anyway, the fewer such restrictions these operations were subject ! 142: to, the more useful they would be! ! 143: ! 144: Although nested source commands are allowed (and I find them ! 145: useful), they leave the editor in a ``noprompt'' state. This ! 146: can be gotten around by including ``se prompt'' as a line in the ! 147: outermost scriptfile, but I would hope the problem causing it could ! 148: be cured. ! 149: ! 150: When one tries to ``:unmap!'' a ``:map!'' command whose ! 151: right-hand-side begins with ^H (entered as ^V^H, of course), one ! 152: gets the message ``That macro wasn't mapped''. (One can get around ! 153: this by using :unmap! ^V[character].) ! 154: ! 155: Certain termcaps apparently produce automatic mappings, which ! 156: unfortunately may interfere with useful vi commands. In particular, ! 157: on a tvi, ^L gets mapped to a movement command, which makes it ! 158: unavailable for redrawing the screen, unless unmapped. ! 159: ! 160: ! 161: PROBLEMS WITH DIAGNOSTICS ! 162: ! 163: "Hit return to continue" -- It took me a long time to realize that ! 164: when I got this diagnostic there was an alternative to hitting ! 165: return. I suggest it be reworded ! 166: "Hit Return or :" ! 167: However, the behavior of the editor when this diagnostic is given ! 168: seems to be inconsistent. In particular, when the last of a serious ! 169: of commands is ! 170: :e otherfile ! 171: and I get "Hit return to continue", then hitting : usually ! 172: has no different effect from hitting return (or any other ! 173: key), namely the screen is redrawn; yet I think that sometimes ! 174: in this situation it has brought me directly to the bottom line ! 175: as desired. Very confusing. ! 176: Would it be possible to have other alternatives than : and return ! 177: available, such as /pattern ? Or, more simply, when one would presently ! 178: be given the diagnostic "Hit return to continue", why not just put the ! 179: editor into the state it would have if one then hit :, since one would ! 180: then still have the option of hitting return and getting into vi ! 181: proper, but it would not require the extra keystroke : to ! 182: begin a bottom-line command, nor would one go through the frequent ! 183: frustrating experience of absentmindedly starting to write a ! 184: bottom-line command, or a pattern-search, and then having to wait ! 185: while the screen was redrawn because one had hit a key other than :. ! 186: ! 187: "Using open mode" ! 188: Again, it took me a long time to learn that when I tried to enter ! 189: vi and got this diagnostic, it meant that the system had somehow ! 190: lost the termcap for the terminal I was on, and that I would have ! 191: to do something to get the correct termcap into the environment. ! 192: Till I realized this, I generally ended up either struggling along ! 193: frustrated in open mode, or logging out and logging back in. I suggest ! 194: that when someone calls for vi and the termcap is not appropriate, ! 195: the editor should not be invoked in any form, but instead, a message ! 196: be given such as: ! 197: ``Your environment does not show a termcap entry permitting ! 198: the use of the visual editor. If you are working on a terminal not ! 199: supporting vi (in particular, a device with no addressable cursor), ! 200: you may enter one of the other modes of the editor with the command ! 201: "open filename" or "ex filename". If you are working on a terminal ! 202: that should support vi, your environment entries are incorrect and ! 203: should be corrected. They presently show: ! 204: TERM=.... ! 205: TERMCAP=.... ! 206: If you know the correct name or abbreviation for your terminal- ! 207: type, type it at the end of the next line; if not hit return: ! 208: % setenv TERM '' ! 209: If the user typed an acceptable terminal-name, the message would ! 210: continue, telling how to get the appropriate termcap. If the user ! 211: instead typed return, the message would ask him or her to type the ! 212: name of the manufacturer shown on the terminal, not ! 213: worrying about upper/lower-case distinctions, and a list of possible ! 214: terminal names and abbreviations would be given... . This whole ! 215: program would not be part of the editor, so there would ! 216: be no problem of space within the existing crowded confines of ! 217: the editor code. ! 218: ! 219: "No such file or directory" -- I think there should be a distinction ! 220: between these two cases, because of the important distinction in the ! 221: consequences when the user tries to quit the editor: ! 222: If the directory exists, the file is created, but ! 223: if not, the results are more complicated -- I seem to recall on one ! 224: occasion simply losing what I had written on my second try ! 225: at quitting; though I just now did an experiment and this time ! 226: repeated ZZ's and :x's simply gave repeated error messages. ! 227: ! 228: "File already exists..." -- The ``List of changes from 3.5 to 3.6'' says ! 229: ``If you get I/O errors, the file is considered "not edited"... .'' ! 230: I presume that this correction is somehow the cause of the fact that ! 231: I frequently get the above message when trying to leave the editor ! 232: on a machine with version 3.7, and have to use ! 233: :w! %|q ! 234: to exit. But I've never seen any evidence that there were I/O errors; ! 235: it mainly seems to happen when I've written some lines to another ! 236: file in the process of editing. So the criteria the editor is using ! 237: to decide when there have been ``I/O errors'' should be rechecked. ! 238: ! 239: "no such command from open/visual" -- This confused me in my first ! 240: few days of using the editor, when I didn't understand that one ! 241: couldn't use i and a (in either their vi or ex senses) from the bottom ! 242: line of vi. A message "i -- no such command from open/visual" ! 243: was perplexing because I knew that "i" was indeed a vi command. ! 244: Perhaps it should say "no such command from open/visual bottom line". ! 245: ! 246: MISCELLANEOUS PROBLEMS ! 247: ! 248: In ex search and replacement patterns, \\ is supposed to represent ! 249: a real \-character, but something goes wrong when this occurs ! 250: at the end of a global command. E.g., though ! 251: :s/^/\\ ! 252: works OK (in vi or ex), the variant ! 253: :.g/^/s//\\ ! 254: definitely does not. In vi it turns everything off, in ex it seems to ! 255: behave as though there were just a single \, and in a scriptfile, ! 256: it -- does something still different, which you can discover if you ! 257: don't know! ! 258: ! 259: The Ex Reference Manual says, ``For sanity with use from within ! 260: visual mode, ex ignores a ":" preceding any command.'' But it ! 261: ignores it in the wrong place! -- not at the beginning of the ! 262: command line, but just before the command letter itself. I.e., ! 263: it accepts 1,3:s/^/ /, but not :1,3s/^/ /. ! 264: ! 265: SUGGESTIONS FOR MINOR ADDED CAPABILITIES ! 266: ! 267: In a multiline substitute command with the "c" option, when ! 268: each line is displayed one has three choices: y, n or break. There ! 269: are some further options that would be useful. One would be "p" -- ! 270: at present, "p" can only be included on the command line, which ! 271: means that one has a choice between seeing the result of every ! 272: substitution or none. In practice, one would generally like to see ! 273: the results of the first few cases to make sure that the command one has ! 274: written does what one meant it to, and maybe a few tricky cases that ! 275: come up; but not every case! Another might be "u" -- to undo the last ! 276: case for which one gave a "y". Still another might be an option that ! 277: would mean ``undo the "c" option -- I see that the substitute command ! 278: is doing what I wanted, go ahead and finish it without me.'' ! 279: In a command g/pattern/p, the pattern in question is occasionally ! 280: such that it takes a while to figure out where on the line it occurs. ! 281: For this purpose, an option that ``pointed out'' the instance of the ! 282: pattern, in the same manner that the pattern to be replaced is pointed ! 283: out in substitute command with option c, would be desirable. ! 284: When g/pattern/p gives more than a screenful of lines, it would ! 285: be nice to have it piped through the equivalent of ``more''. ! 286: ! 287: ex has the command line option "-", which ``is useful in processing ! 288: editor scripts''. But if one wants to use a script in the course of ! 289: an otherwise interactive editing session, it would be desirable to have ! 290: a corresponding resettable option ``:se -'' (or ``:se nofb''). ! 291: ! 292: In strings in pattern-searches, it would be useful to have ! 293: ^ and $ retain their ``magic'', so that /x[a$]/ could ! 294: search for all occurrences of x before an a or a newline. ! 295: (Of course, one would then have to decide whether /x[^y]/ should ! 296: include the case of x followed by a newline or not.) ! 297: ! 298: Just as ex allows the command :vi, so I think that vi should ! 299: have some bottom-line command equivalent to the regular-mode ! 300: command Q. When one has done some text-changing bottom-line ! 301: commands, and realizes one wants to go into ex, it can be time- ! 302: consuming to hit return and then Q, and wait for the screen to be ! 303: redrawn for vi before one gets the ex prompt. ! 304: ! 305: The option of putting several commands on one line, separated ! 306: by, "|" is particularly useful in the vi bottom-line mode, because ! 307: it avoids having the screen redrawn several times. It would be ! 308: useful to be able sometimes do the same thing with non-bottom-line ! 309: commands, e.g. in editing a troff file at a low baud rate on a dumb ! 310: terminal one might like to be able to do i\fI^]3Ea\fR^] without ! 311: watching the line get redrawn twice. Perhaps some key that would ! 312: cause any sequence of commands to be ``held'' until some complementary ! 313: key was hit would be useful. ! 314: It would also be desirable to have a sequence of commands that had ! 315: been given in this way available as one unit to be repeated by ``.'', ! 316: if desired. ! 317: ! 318: The parenthesis-matching facility with % might be extended ! 319: to match ` with ' and < with >. ! 320: ! 321: I will mention one facility that I discovered by surprize is ! 322: possessed by ed but not ex -- sequences such as \1 can be used ! 323: within ed search-patterns. E.g. (for the most trivial case) ! 324: /\(.\)\1/ ! 325: will search for doubled letters. ! 326: ! 327: ! 328: DEBATABLE SUGGESTIONS ! 329: I will mention here some possible changes which have the ! 330: difficulty that they would change the meaning of existing commands, ! 331: so that it could be argued that the disadvantage of users having ! 332: to change their habits might outweigh the advantages. ! 333: ! 334: First, one might try to resolve, one way or another, the ! 335: contradiction between the count arguments taken by the join commands ! 336: in vi and ex: In ex, jN joins N+1 lines; in vi, NJ joins N lines ! 337: (except if N=1). ! 338: ! 339: Second, the movement commands tx and Tx of vi (x any character) ! 340: seem poorly defined. Just as fx will ignore the character on which ! 341: the cursor is presently sitting, even if it is an x, and move to the ! 342: next occurrence, so I would think that tx should ignore the character ! 343: immediately after the cursor, and Tx the character immediately before ! 344: the cursor. The point is that when one does Nfx, and finds that one ! 345: had failed to count one occurrence of x and fallen short of where one ! 346: wanted to go, one can hit ; and get there. Likewise, on doing Ntx ! 347: and finding one has fallen short, one should be able to hit ; and get ! 348: to the the next occurrence; but at present, hitting ; leaves ! 349: the cursor in the same position; one must hit ``2;'' to get any ! 350: further. In effect, Ntx is presently defined as Nfxh; I am ! 351: suggesting that it be defined as lNfxh. ! 352: ! 353: The sequences cw, dw and yw are presently violations of the ! 354: principle that c[movement], d[movement] and y[movement] change, ! 355: delete, or yank everything from the current cursor position through ! 356: the endpoint of the movement command. cw does what one would expect of ! 357: ce (in fact, they seem to be synonyms), while there is no way to get ! 358: the effect which cw would have if it were treated ``consistently''. ! 359: (E.g., if I have a line beginning ``And if'', and I want to change it ! 360: to ``If'', I cannot just put the cursor on the A and hit cwI^].) dw ! 361: and yw delete up to the character immediately before the point to ! 362: which ``w'' would take the cursor. I would have to agree that this ! 363: behavior of dw and yw is more useful than that which a literal ! 364: interpretation of the movement rule would lead to; but perhaps it ! 365: would become still more useful if when applied to the last word on ! 366: a line, it deleted or yanked the space immediately before the word ! 367: along with the word... . On the other hand, one could argue for ! 368: making a distinction between cw and ce. ! 369: ! 370: Though I see the motivation for the above definitions, ! 371: I see no sensible reason why Y should be equivalent to yy, when ! 372: C and D are equivalent to c$ and d$. I would vote for changing ! 373: Y to mean y$. ! 374: ! 375: RADICAL SUGGESTIONS ! 376: ! 377: Is there any reason for maintaining the distinction between ! 378: the ``:'' state of vi, and ex itself? At present, there are ! 379: relative advantages that lead one to choose to go into one or the ! 380: other for a given operation: From the vi-: state, it is easier ! 381: to return to the regular vi state; from ex, one has a more powerful ! 382: range of commands; and it is easier to give a series of commands ! 383: because each carriage-return gives one a new prompt. My suggestion ! 384: is that from vi, ``:'' should carry you directly to ex, and when you ! 385: are in ex, carriage-return (^M) after a command should give you a new ! 386: prompt, while ^] should put you into vi. Conceivably, things might be ! 387: simplified even further, and carriage return rather than : could ! 388: be the key that would carry one from the regular mode of vi into ex: ! 389: ! 390: .-------. .-------. ! 391: .-------. a,i... | basic | ^M | | ! 392: | vi |<------ | |----->| ex |<---. ! 393: | insert| | vi | | | |^M ! 394: | mode | ------>| |<-----| mode | ---' ! 395: `-------' ^] | mode | ^] | | ! 396: `-------' `-------' ! 397: ! 398: (Of course, ^M presently has a meaning in vi, but ! 399: it has a synonym +.) Clearly, there would also be no need for a ! 400: special "Hit return to continue" state. ! 401: I have not distinguished vi and open in the above diagram. ! 402: My idea here is that ^] would actually return you to either vi ! 403: or open, whichever you had last been in, and that to switch ! 404: to the other, you could enter ex and type vi^] or o^] respectively. ! 405: (Or you could type vi^M, respectively o^M, and further ex commands, ! 406: and the mode would be saved for the next time you hit a ^].) Or ! 407: alternatively, these could be made settable options: se visual ! 408: respectively se novisual. ! 409: Having gotten used to the editor as it now exists, I admit that ! 410: I feel uneasy about the above idea -- the sense of knowing that ! 411: I am ``still in vi'' when I hit :, and not that ``other land'' of ex, ! 412: represents a kind of of orientation that it is disconcerting ! 413: to abandon. But I can't see any logical disadvantage in making ! 414: such a change. Can you? Certainly, there would be things that ! 415: would have to be thought out, such as what happens to bottom-line ! 416: vi pattern-searches. My thought would be that ``/'' from vi should ! 417: give :/ (i.e., put one in ex at the start of a pattern-search), ! 418: and ^] after a pattern-search should put one into vi at the appropriate ! 419: character on the line, in contrast to ^M after a pattern search, ! 420: which would leave one in ex at the appropriate line. In general, ! 421: I think such changes would lead to greater simplicity and learnability ! 422: of the editor. ! 423: I would also hope that excursions between vi and ex and back ! 424: could be allowed in scriptfiles. It might also be desirable for ! 425: ex to have, in addition to a concept of ``current line'', one of ! 426: ``current cursor position''... . ! 427: ! 428: Well, on to another subject. One of the inconveniences I ! 429: found very vexing when first learning to use the editor was that ! 430: when in either vi insert mode, or ex/vi-bottom-line, it was very hard ! 431: to edit what I was doing. Within insert mode the only ``editing'' ! 432: I could do, without escaping, was with the three operations ^H, ! 433: ^W and the kill character. And on a slow line with a dumb terminal, ! 434: escaping to make changes could be very time-consuming because large ! 435: parts of the screen would insist on being redrawn. Perhaps some ! 436: other control-character could serve as ! 437: a modified escape, that allowed one to edit what one had entered ! 438: in the current insertion without having everything below it redrawn, ! 439: and then return to it. Obviously, if carried to its logical ! 440: limit this idea could lead to ridiculous nests of ! 441: editing operations; but there would be no need to carry it to its ! 442: logical limit. ! 443: Anyway, the problem of editing ex-style commands ! 444: was even worse, because there was no way to ``escape and ! 445: revise''. I eventually learned enough to realize that the solution ! 446: was to edit complicated commands in another file and source it. ! 447: But it is sometimes very useful to have the text on which the ! 448: commands are to act in front of you when composing them (e.g., you can ! 449: yank and modify various pieces), which led to the variant of writing ! 450: command lines within the file I was editing, and then writing ! 451: those lines into another file and sourcing that, without ever leaving ! 452: the current file. But this is distracting to deal with ! 453: when concentrating on the editing task itself, which led me ! 454: to divise a scriptfile which would handle the writing-to-another-file- ! 455: and-sourcing for me. Or actually, several such files: One for ! 456: single-line commands to be used essentially once; one for single-line ! 457: commands that I would want to use on the same file during various ! 458: editing sessions, and so would want to keep available in that ! 459: file, and one for multi-line commands (to be used once). When ! 460: I first got the idea, I thought one scriptfile would be enough, and ! 461: I would call it ``do'', so that the command to execute a script I ! 462: had written in a file I was editing would be ``:so do''. The ! 463: file it would write to and source would be ``do.again'', so that ! 464: if I wanted to reuse it, I could ``:so do.again''. When I realized ! 465: the need for several versions, ``do'' became a directory. Here, ! 466: for your amusement, are the three files. (Re the lines ``se prompt'', ! 467: cf. my comment on that under PROBLEMS WITH SOURCE etc.): ! 468: ! 469: do/1 (for 1-time use of 1-line commands) ! 470: .w! ~/do/again ! 471: d ! 472: so # ! 473: se prompt ! 474: ! 475: do/1+ (like above, without deleting the command) ! 476: .w! ~/do/again ! 477: so # ! 478: se prompt ! 479: ! 480: do/: (to use this, write a multi-line command script, put : at ! 481: the beginning of the first line, put the cursor on the last ! 482: line of the script, and then source the following:) ! 483: ?^:?s/:/ ! 484: ,''w! ~/do/again ! 485: ,''d ! 486: so # ! 487: se prompt ! 488: ! 489: (I also created another version to use in case the script had ! 490: to have an internal line beginning with ``:'', so that this couldn't ! 491: unambiguously mark the beginning of the script. This used ! 492: a line which explicitly specified the address-range of the script. ! 493: But I have never had a need for it, so I will not bother you with it.) ! 494: Finally, having gotten an account on a machine with a version 3 ! 495: editor recently, I have divised still another way of doing this. I ! 496: have put in my EXINIT the command ! 497: ! 498: 'map ^A "ayy:@a^M' ! 499: ! 500: and now, gratifyingly, the single stroke ^A has essentially the effect ! 501: of ``:so do/1+'' -- except for the restrictions to which vi ``map'' ! 502: commands are subject. But I've only been using this for a ! 503: couple of weeks; so I have yet to learn how chafing those restrictions ! 504: will or won't be. ! 505: Anyway, it might be worth thinking about whether some of these ! 506: things that I've done with macros should be incorporated in some form ! 507: into the editor itself; or else whether these macros might be written ! 508: up in the documentation (or some tutorials) on the editor. ! 509: ! 510: Next subject: Complicated pattern-searches in long files ! 511: can be time-consuming. I have seen the point mentioned ! 512: that if a pattern-description can be begun with "^", ! 513: this can speed up the search -- since the pattern-comparisons need ! 514: only be begun at beginnings of lines. In some cases, this might ! 515: not be possible, but the user might be aware of some other ! 516: character or character-sequence in the search-pattern ! 517: that will occur relatively rarely in the file. In such cases it would ! 518: be desirable if the user could specify one spot from which the pattern ! 519: search should start, working forward and backward from there, to ! 520: minimize false starts. E.g., if for some reason one wants to ! 521: delete every word containing the letter m, the script ! 522: %s/[^ ]*m[^ ]*// ! 523: would become much less time-consuming if one could mark the point ! 524: at which to begin, say writing ! 525: %s/[^ ]*\!m[^ ]*// ! 526: so as to instruct the editor to search for m's, and each time ! 527: one was found, to find the longest possible strings of non-space ! 528: characters before and after it, and delete these. (This is a silly ! 529: example, but I think the idea is clear.) ! 530: ! 531: Something that I've seriously felt the need for is the ! 532: capability of searching for lines that satisfy more than one ! 533: condition. If one just wants to locate such lines, one can ! 534: of course leave the editor and do a pipeline of two or ! 535: more greps; but it would be nice to be able to perform global ! 536: commands on such lines. ! 537: ! 538: Finally, any possibility of introducing the capability of searching ! 539: for patterns including embedded newlines, a la sed? Multiple windows, ! 540: a la emacs? ! 541: ! 542: ADDENDA ! 543: I logged in this morning on an adm3a at 300 baud to go over this ! 544: letter once more before sending it, and ran into another bug! I had ! 545: done 15^D to get a large scroll despite the low speed, and at one point ! 546: I saw a line with a typo scrolling up. So I noted its line-number, 402 ! 547: and without waiting for the screen to stop moving typed something like ! 548: 402Gfsrd. What happened was that the change was made on line 407 rather ! 549: than 402 -- presumably the cursor was sent to where 402 had been when ! 550: the command was received... . ! 551: Editing this letter this morning reminded me of another feature I ! 552: have thought would be desirable for editing on dumb terminals at low ! 553: speeds: An option that would cause lines read from a file or typed ! 554: in at the bottom of the screen to appear double spaced, with @ signs ! 555: @ ! 556: between them, such as one gets when one deletes a line on such a ! 557: @ ! 558: terminal. (I have faked this effect here, though the fake will not be ! 559: @ ! 560: very successful if you have se nu or se list on.) The point is that ! 561: @ ! 562: editing operations that presently cause painfully slow screen-redrawings ! 563: would simply put material in in place of these fillers -- as happens ! 564: now when one is lucky enough to be adding material just above a place ! 565: where material was previously deleted. ! 566: ! 567: - * - * - * - * - * - ! 568: ! 569: I hope you've found some things of interest in this hodgepodge. ! 570: ! 571: Yours, ! 572: George (gbergman@brahms) ! 573: ! 574: - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ! 575: 23/7/83, about 8PM ! 576: ! 577: Maybe thinking about the editor while writing my previous ! 578: ``note'' to you has made me more conscious of these things, ! 579: but for some reason, I've discovered several more peculiarities of ! 580: the the Version 3.7 editor today! ! 581: ! 582: First, the abbreviation feature has a strange bug (feature?) ! 583: involving the backslash: If some string X is the abbreviation ! 584: for a string Y, and if X is typed (following a space etc) ! 585: immediately followed by a \ and another character c, the ! 586: result is not Y\c by cY\. The case where I discovered this ! 587: was a doubly complicated one: I had an abbreviation of ! 588: the form ! 589: :ab x x\yZ ! 590: where x and y were characters and Z was a string of characters. ! 591: So when I typed x, it presumably first expanded it as x\yZ, ! 592: then performed the transformation I just described on the x\y ! 593: turning it into yx\yZ\, and thus giving the result yx\yZ\Z. ! 594: This turns out to be one of the cases that can't be unmapped ! 595: without doing :una ^Vx. Further, I just tried a similar case ! 596: with x replaced by a string of more than one character ! 597: (namely, :ab if if\pq) and I find I can't unmap that at all. ! 598: I also find that an abbreviated string containing | (which ! 599: must be inserted using ^V|, of course) is difficult to unmap. ! 600: ! 601: Second, some peculiarities about where the cursor ends ! 602: up after a yank. If the yank involved a forward movement, ! 603: the cursor stays where it is, which is the beginning ! 604: of the yanked segment. If the yank involves a backwards ! 605: movement, the place where the cursor originally was is not ! 606: the same as the beginning of the yanked segment, and there ! 607: seems to be some confusion as to which principle is followed: ! 608: y- or yk moves the cursor up, while yb leaves it fixed. ! 609: Unfortunately, there is a snake in the grass with yb: If ! 610: you hit p after it, the yanked word will not appear after ! 611: the position where the cursor has remained, but ! 612: after the position to which it would have gone if it had moved ! 613: to the beginning of the yanked segment! Likewise if you ! 614: you hit an x... . ! 615: (You have no idea how much trouble I'm ! 616: having with those "if"'s. Of course, I could quit the editor ! 617: and come back in, and I would lose that crazy abbreviation ! 618: that way.) ! 619: ! 620: I also notice that if the cursor is at the end of a word ! 621: or between words, 2e behaves the same as e! ! 622: ! 623: Finally, I note that d^, when the cursor is before the first ! 624: nonwhite character, is another exception to the principle that ! 625: d[motion] deletes everything through the endpoint of [motion]. ! 626: Similarly with c^ and y^. ! 627: ! 628: - *- *- *- *- *- *- *- *- *- *- *- *- *- *- *- *- *- *- *- *- *- *- *- * ! 629: discovered next day (not yet sent): ! 630: ! 631: error with yb does not just concern p and x: any command is ! 632: executed as though cursor is at destination of backward in-line ! 633: yank. ! 634: ! 635: N^B does not work consistently? (Not on a medium-length file in Kim) ! 636: ! 637: Can get endless-loop mapping if abbreviation forms word within ! 638: abbreviated. E.g. :ab x ( x ) ! 639: ``word'' must be delimited on left by space, tab, ! 640: newline, start-of-insert; on right by any punctuation. Why ! 641: special ``no tail recursion'' rule? ! 642: Things like that ``if'' abbreviation can be undone using ! 643: :una i^Vf! ! 644: ! 645: Mention desirability of Np ! 646: ! 647: copies sent to ralph@ucbarpa, lindahl@topaz 25/7/83 ! 648: ! 649: From gbergman@UCBCARTAN Mon Aug 1 14:19:27 1983 ! 650: Date: 1 Aug 83 14:14:06 PDT (Mon) ! 651: From: gbergman@UCBCARTAN (George Mark Bergman) ! 652: Subject: Re: editor ! 653: Message-Id: <[email protected]> ! 654: Received: by UCBCARTAN.ARPA (3.342/3.7) ! 655: id AA00627; 1 Aug 83 14:14:06 PDT (Mon) ! 656: Received: from UCBCARTAN.ARPA by UCBERNIE.ARPA (3.336/3.7) ! 657: id AA19324; 1 Aug 83 14:19:12 PDT (Mon) ! 658: To: mckusick@UCBERNIE ! 659: Status: R ! 660: ! 661: Here's Mark Horton's reply to my letter on bugs ! 662: ! 663: >From [email protected] Thu Jul 28 14:38:55 1983 ! 664: ! 665: Sorry this has taken so long, but your note was too long to digest ! 666: in the cracks between the other stuff I do. Anyway, you've clearly ! 667: put a great deal of thought into this, and I appreciate your input. ! 668: I'll reply individually to your thoughts, and keep them on file ! 669: for use (someday) when vi gets rewritten. Some of them are just ! 670: plain bugs that ought to be fixed soon anyway. ! 671: ! 672: PROBLEMS WITH COUNTS ! 673: ! 674: The most gross case of misbehavior is that of N^B! ! 675: The effect is to redraw the screen 23N-44 lines further advanced. ! 676: (Probably the numbers depend on the screen-size of the terminal; ! 677: this is on a Z19, using termcap h19u.) When N=1, this does indeed ! 678: move you a screenful backward, but for higher N it moves the window ! 679: forward some amount! Further, whatever controls are supposed to ! 680: monitor whether the command would land one at an acceptable line- ! 681: number seem to have a different idea of what it is doing: If you ! 682: aren't already familiar with these weird effects, try setting the ! 683: cursor near the end of a file that is more than 4 screenfuls long, ! 684: and hitting 3^B. (You might then try an insert at the place you get ! 685: to, and a :f^] .) ! 686: This is a known bug, and was fixed in 3.8. The count is supposed to subtract ! 687: (LINES-1)*N from the line number, but there's + that should be a -, so it ! 688: goes forward instead. The check is correct, so it's possible to go off ! 689: the end of the buffer. ! 690: N/pattern/ would be useful, but is not allowed. ! 691: N/pattern/ resets the window size (silly but true) to N. ! 692: ND would be a natural synonym for dN$, by analogy with NC for cN$, ! 693: but it doesn't work that way; it just ignores the N. ! 694: Finally, if N is precisely the number of lines ! 695: from the current line to the end of the file, N$ will still correctly ! 696: carry one to the last character of the file, but cN$, NC, dN$ and yN$ ! 697: refuse to do anything! (NY does work, not being a synonym for yN$.) ! 698: The failure of NC is particularly annoying; often when I am composing ! 699: something, I go back to somewhere in the middle of the next-to- ! 700: last line, say, and want to rewrite the rest of the sentence; ! 701: 2cc would kill not only the part I want to rewrite but also the OK ! 702: beginning of the line, and 2C or 2c$ won't work. I realize that I ! 703: could get around this by keeping an empty line at the end of the file, ! 704: but that should not be necessary. ! 705: While you're making valid observations here, are you aware that you can delete ! 706: the current sentence with d} ? I think that's what you really want. ! 707: ! 708: ! 709: PROBLEMS REGARDING SOURCE, MACROS, MAPPINGS ! 710: These are enormously useful, but seem to have all kinds of hidden ! 711: restrictions. ! 712: ! 713: The Appendix to the Ex Reference Manual, "List of Changes from ! 714: Version 3.5 to Version 3.6" says ``A bug which prevented the source ! 715: command from working...from visual has been fixed''. It is true that ! 716: one can now use :so from vi, but it still has a bug: When ! 717: the scriptfile invoked contains a global command ! 718: and some other command(s) after it, everything after the first global ! 719: command is ignored. The same appears to be true of scripts in named ! 720: buffers invoked from vi-bottom-line by @x. ! 721: Sounds like a bug. ! 722: ! 723: (It is, perhaps, unexpected that one can invoke scripts with ! 724: multiline commands using @x from vi's bottom-line at all, since such ! 725: commands will not work if typed on vi's bottom line directly. ! 726: A script like ! 727: s/$/a\ ! 728: b ! 729: invoked as @x will indeed work. But strangely, if one tries to ! 730: invoke from the regular mode of vi the script ! 731: :s/$/a\ ! 732: b ! 733: by putting it in buffer x and doing @x, only the first line ! 734: will take effect.) ! 735: In 3.7 (or 3.8, I'm not sure), you can say ! 736: :s/$/a^V^Mb ! 737: to get a newline on the RHS. Of course, this doesn't mean there isn't ! 738: a bug in scripts. ! 739: ! 740: Another serious restriction is that the command ``vi'' appears to ! 741: be ignored in sourced ex-scripts, and though the command Q in macros of ! 742: various flavors in vi (mapped characters, map!ed characters that contain ! 743: ``...^V^[...Q...''; @x scripts) does take one into ex, any ex ! 744: commands after it are ignored. ! 745: The internals of getting a character from the tty are completely different ! 746: in ex and vi. Pushing input for one doesn't affect the other. So there ! 747: isn't much hope of changing this situation. ! 748: ! 749: I assume you are aware of whatever restrictions lead to the ! 750: error-message ``Cannot yank inside global/macro'', since you must ! 751: have written it, though ``inside'' seems to here have the peculiar ! 752: meaning ``after a text-changing operation of the macro.'' ! 753: The error-message ``Can't undo in global commands'' is more ! 754: mysterious, since I get it when I have a global command after ! 755: a text-changing command in an @x script (though not in a sourced file). ! 756: Anyway, the fewer such restrictions these operations were subject ! 757: to, the more useful they would be! ! 758: It's the way undo is done - the text for undo is saved in the "last deleted" ! 759: buffer, and yank puts text there too. Couple this with the fact that globals ! 760: and macros can be undone as a unit (they save their state before the first change) ! 761: and you'll see that the two notions can't coexist. Of course, you can always ! 762: yank into a named buffer, even inside a macro. ! 763: ! 764: Although nested source commands are allowed (and I find them ! 765: useful), they leave the editor in a ``noprompt'' state. This ! 766: can be gotten around by including ``se prompt'' as a line in the ! 767: outermost scriptfile, but I would hope the problem causing it could ! 768: be cured. ! 769: Bug, I guess. ! 770: ! 771: When one tries to ``:unmap!'' a ``:map!'' command whose ! 772: right-hand-side begins with ^H (entered as ^V^H, of course), one ! 773: gets the message ``That macro wasn't mapped''. (One can get around ! 774: this by using :unmap! ^V[character].) ! 775: Bug, I guess. ! 776: ! 777: Certain termcaps apparently produce automatic mappings, which ! 778: unfortunately may interfere with useful vi commands. In particular, ! 779: on a tvi, ^L gets mapped to a movement command, which makes it ! 780: unavailable for redrawing the screen, unless unmapped. ! 781: Well, there's no way for vi to tell the difference between ^L that the ! 782: user typed as ^L and ^L that the user typed as right arrow. However, there ! 783: are a number of terminals that are upward compatible with the adm3a and use ! 784: ^L for right arrow. Vi has a special case for these built in - if the ! 785: terminal has insert/delete line, and ^L is right arrow, then ^R will redraw ! 786: the screen. ! 787: ! 788: ! 789: PROBLEMS WITH DIAGNOSTICS ! 790: ! 791: "Hit return to continue" -- It took me a long time to realize that ! 792: when I got this diagnostic there was an alternative to hitting ! 793: return. I suggest it be reworded ! 794: "Hit Return or :" ! 795: However, the behavior of the editor when this diagnostic is given ! 796: seems to be inconsistent. In particular, when the last of a serious ! 797: of commands is ! 798: :e otherfile ! 799: and I get "Hit return to continue", then hitting : usually ! 800: has no different effect from hitting return (or any other ! 801: key), namely the screen is redrawn; yet I think that sometimes ! 802: in this situation it has brought me directly to the bottom line ! 803: as desired. Very confusing. ! 804: Would it be possible to have other alternatives than : and return ! 805: available, such as /pattern ? Or, more simply, when one would presently ! 806: be given the diagnostic "Hit return to continue", why not just put the ! 807: editor into the state it would have if one then hit :, since one would ! 808: then still have the option of hitting return and getting into vi ! 809: proper, but it would not require the extra keystroke : to ! 810: begin a bottom-line command, nor would one go through the frequent ! 811: frustrating experience of absentmindedly starting to write a ! 812: bottom-line command, or a pattern-search, and then having to wait ! 813: while the screen was redrawn because one had hit a key other than :. ! 814: There is an internal difference between "ex mode" (where it doesn't keep a ! 815: screen image) and "vi mode" (where it does). Any : command that outputs more ! 816: than 1 line puts you into "ex mode", requiring "hit return to continue" ! 817: before clearing the screen and redrawing it with known stuff. There is no ! 818: hope of this changing - the code is too spaghetti-ized already. In the worst ! 819: case, the ! command scribbles on the screen and there's nothing vi can do ! 820: to know what the command did. ! 821: ! 822: What you really want is for vi to check for typeahead and avert the refresh ! 823: when it's going to have to redo it anyway. My curses does this, but I simply ! 824: don't have time to rewrite vi to use it. This would also solve the other ! 825: problem you mention where macros ought to redraw the screen only once. ! 826: If you saw the insides of the code, you'd see it needs a rewrite to do this. ! 827: Each command knows the screen things to do to fix the screen. ! 828: ! 829: What most of us do is hit DEL when the screen is being drawn with something ! 830: we don't want to see. This aborts the update and leaves junk on the screen. ! 831: Then you move the cursor where you want it, and if the screen is still ! 832: garbaged, hit ^L. Ugly but effective. ! 833: ! 834: "Using open mode" ! 835: Again, it took me a long time to learn that when I tried to enter ! 836: vi and got this diagnostic, it meant that the system had somehow ! 837: lost the termcap for the terminal I was on, and that I would have ! 838: to do something to get the correct termcap into the environment. ! 839: Till I realized this, I generally ended up either struggling along ! 840: frustrated in open mode, or logging out and logging back in. I suggest ! 841: that when someone calls for vi and the termcap is not appropriate, ! 842: the editor should not be invoked in any form, but instead, a message ! 843: be given such as: ! 844: ``Your environment does not show a termcap entry permitting ! 845: the use of the visual editor. If you are working on a terminal not ! 846: supporting vi (in particular, a device with no addressable cursor), ! 847: you may enter one of the other modes of the editor with the command ! 848: "open filename" or "ex filename". If you are working on a terminal ! 849: that should support vi, your environment entries are incorrect and ! 850: should be corrected. They presently show: ! 851: TERM=.... ! 852: TERMCAP=.... ! 853: If you know the correct name or abbreviation for your terminal- ! 854: type, type it at the end of the next line; if not hit return: ! 855: % setenv TERM '' ! 856: If the user typed an acceptable terminal-name, the message would ! 857: continue, telling how to get the appropriate termcap. If the user ! 858: instead typed return, the message would ask him or her to type the ! 859: name of the manufacturer shown on the terminal, not ! 860: worrying about upper/lower-case distinctions, and a list of possible ! 861: terminal names and abbreviations would be given... . This whole ! 862: program would not be part of the editor, so there would ! 863: be no problem of space within the existing crowded confines of ! 864: the editor code. ! 865: This, of course, doesn't belong in vi, but in login or tset. In fact, ! 866: tset is much friendlier these days. Vi will print a better diagnostic ! 867: if it knows you're on a "generic" terminal type such as "dialup" - in ! 868: terminfo there's a capability to indicate this, so it can print ! 869: I don't know what kind of terminal you have - all I have is "patchboard" ! 870: 3.7 can't do this because it can't tell the difference between a generic ! 871: terminal and a hardcopy terminal. ! 872: ! 873: "No such file or directory" -- I think there should be a distinction ! 874: between these two cases, because of the important distinction in the ! 875: consequences when the user tries to quit the editor: ! 876: The kernel doesn't distinguish, so it's hard for vi to. This is just a perror ! 877: string. ! 878: If the directory exists, the file is created, but ! 879: if not, the results are more complicated -- I seem to recall on one ! 880: occasion simply losing what I had written on my second try ! 881: at quitting; though I just now did an experiment and this time ! 882: repeated ZZ's and :x's simply gave repeated error messages. ! 883: Well, if it can't be reproduced, it doesn't stand much chance of getting fixed. ! 884: (Not that it would if you could reproduce it, of course.) ! 885: ! 886: "File already exists..." -- The ``List of changes from 3.5 to 3.6'' says ! 887: ``If you get I/O errors, the file is considered "not edited"... .'' ! 888: I presume that this correction is somehow the cause of the fact that ! 889: I frequently get the above message when trying to leave the editor ! 890: on a machine with version 3.7, and have to use ! 891: :w! %|q ! 892: Ick! Most of us just type ! 893: :wq! ! 894: which is equivalent and much shorter. ! 895: to exit. But I've never seen any evidence that there were I/O errors; ! 896: it mainly seems to happen when I've written some lines to another ! 897: file in the process of editing. So the criteria the editor is using ! 898: to decide when there have been ``I/O errors'' should be rechecked. ! 899: Actually, if you get ANY error (e.g. :foo<cr>) it resets the "buffer modified" ! 900: condition. I have finally been convinced this is not right. For a while, I ! 901: considered it a necessary evil in case your /tmp/Ex* file got an I/O error. ! 902: ! 903: "no such command from open/visual" -- This confused me in my first ! 904: few days of using the editor, when I didn't understand that one ! 905: couldn't use i and a (in either their vi or ex senses) from the bottom ! 906: line of vi. A message "i -- no such command from open/visual" ! 907: was perplexing because I knew that "i" was indeed a vi command. ! 908: Perhaps it should say "no such command from open/visual bottom line". ! 909: OK. ! 910: ! 911: MISCELLANEOUS PROBLEMS ! 912: ! 913: In ex search and replacement patterns, \\ is supposed to represent ! 914: a real \-character, but something goes wrong when this occurs ! 915: at the end of a global command. E.g., though ! 916: :s/^/\\ ! 917: works OK (in vi or ex), the variant ! 918: :.g/^/s//\\ ! 919: definitely does not. In vi it turns everything off, in ex it seems to ! 920: behave as though there were just a single \, and in a scriptfile, ! 921: it -- does something still different, which you can discover if you ! 922: don't know! ! 923: Backslash is special at the end of a line in global. You need more \\'s. ! 924: ! 925: The Ex Reference Manual says, ``For sanity with use from within ! 926: visual mode, ex ignores a ":" preceding any command.'' But it ! 927: ignores it in the wrong place! -- not at the beginning of the ! 928: command line, but just before the command letter itself. I.e., ! 929: it accepts 1,3:s/^/ /, but not :1,3s/^/ /. ! 930: Hmm. ! 931: ! 932: SUGGESTIONS FOR MINOR ADDED CAPABILITIES ! 933: ! 934: In a multiline substitute command with the "c" option, when ! 935: each line is displayed one has three choices: y, n or break. There ! 936: are some further options that would be useful. One would be "p" -- ! 937: at present, "p" can only be included on the command line, which ! 938: means that one has a choice between seeing the result of every ! 939: substitution or none. In practice, one would generally like to see ! 940: the results of the first few cases to make sure that the command one has ! 941: written does what one meant it to, and maybe a few tricky cases that ! 942: come up; but not every case! Another might be "u" -- to undo the last ! 943: case for which one gave a "y". Still another might be an option that ! 944: would mean ``undo the "c" option -- I see that the substitute command ! 945: is doing what I wanted, go ahead and finish it without me.'' ! 946: If I were going to do something this involved (I didn't know anybody used the ! 947: c option anymore - most people use "n" and "." in vi) I would do query-replace ! 948: ala EMACS right. ! 949: In a command g/pattern/p, the pattern in question is occasionally ! 950: such that it takes a while to figure out where on the line it occurs. ! 951: For this purpose, an option that ``pointed out'' the instance of the ! 952: pattern, in the same manner that the pattern to be replaced is pointed ! 953: out in substitute command with option c, would be desirable. ! 954: When g/pattern/p gives more than a screenful of lines, it would ! 955: be nice to have it piped through the equivalent of ``more''. ! 956: Nice but unlikely. Unless, of course, you have page mode in your tty driver, ! 957: like we do, in which case you get it for free. ! 958: ! 959: ex has the command line option "-", which ``is useful in processing ! 960: editor scripts''. But if one wants to use a script in the course of ! 961: an otherwise interactive editing session, it would be desirable to have ! 962: a corresponding resettable option ``:se -'' (or ``:se nofb''). ! 963: Seems like a good idea. ! 964: ! 965: In strings in pattern-searches, it would be useful to have ! 966: ^ and $ retain their ``magic'', so that /x[a$]/ could ! 967: search for all occurrences of x before an a or a newline. ! 968: (Of course, one would then have to decide whether /x[^y]/ should ! 969: include the case of x followed by a newline or not.) ! 970: This sounds pretty hard to do. ! 971: ! 972: Just as ex allows the command :vi, so I think that vi should ! 973: have some bottom-line command equivalent to the regular-mode ! 974: command Q. When one has done some text-changing bottom-line ! 975: commands, and realizes one wants to go into ex, it can be time- ! 976: consuming to hit return and then Q, and wait for the screen to be ! 977: redrawn for vi before one gets the ex prompt. ! 978: This would be ugly, since the ex command routine would have to return an ! 979: indication to the vi routine to exit back to the top level ex command. ! 980: But I suppose it could be done. ! 981: ! 982: The option of putting several commands on one line, separated ! 983: by, "|" is particularly useful in the vi bottom-line mode, because ! 984: it avoids having the screen redrawn several times. It would be ! 985: useful to be able sometimes do the same thing with non-bottom-line ! 986: commands, e.g. in editing a troff file at a low baud rate on a dumb ! 987: terminal one might like to be able to do i\fI^]3Ea\fR^] without ! 988: watching the line get redrawn twice. Perhaps some key that would ! 989: cause any sequence of commands to be ``held'' until some complementary ! 990: key was hit would be useful. ! 991: It would also be desirable to have a sequence of commands that had ! 992: been given in this way available as one unit to be repeated by ``.'', ! 993: if desired. ! 994: See above. And get yourself a terminal with insert/delete char! ! 995: ! 996: The parenthesis-matching facility with % might be extended ! 997: to match ` with ' and < with >. ! 998: OK. ! 999: ! 1000: I will mention one facility that I discovered by surprize is ! 1001: possessed by ed but not ex -- sequences such as \1 can be used ! 1002: within ed search-patterns. E.g. (for the most trivial case) ! 1003: /\(.\)\1/ ! 1004: will search for doubled letters. ! 1005: This surprises me. ! 1006: ! 1007: ! 1008: DEBATABLE SUGGESTIONS ! 1009: I will mention here some possible changes which have the ! 1010: difficulty that they would change the meaning of existing commands, ! 1011: so that it could be argued that the disadvantage of users having ! 1012: to change their habits might outweigh the advantages. ! 1013: ! 1014: First, one might try to resolve, one way or another, the ! 1015: contradiction between the count arguments taken by the join commands ! 1016: in vi and ex: In ex, jN joins N+1 lines; in vi, NJ joins N lines ! 1017: (except if N=1). ! 1018: Yeah, ex should be N, not N+1. ! 1019: ! 1020: Second, the movement commands tx and Tx of vi (x any character) ! 1021: seem poorly defined. Just as fx will ignore the character on which ! 1022: the cursor is presently sitting, even if it is an x, and move to the ! 1023: next occurrence, so I would think that tx should ignore the character ! 1024: immediately after the cursor, and Tx the character immediately before ! 1025: the cursor. The point is that when one does Nfx, and finds that one ! 1026: had failed to count one occurrence of x and fallen short of where one ! 1027: wanted to go, one can hit ; and get there. Likewise, on doing Ntx ! 1028: and finding one has fallen short, one should be able to hit ; and get ! 1029: to the the next occurrence; but at present, hitting ; leaves ! 1030: the cursor in the same position; one must hit ``2;'' to get any ! 1031: further. In effect, Ntx is presently defined as Nfxh; I am ! 1032: suggesting that it be defined as lNfxh. ! 1033: Agreed. ! 1034: ! 1035: The sequences cw, dw and yw are presently violations of the ! 1036: principle that c[movement], d[movement] and y[movement] change, ! 1037: delete, or yank everything from the current cursor position through ! 1038: the endpoint of the movement command. cw does what one would expect of ! 1039: ce (in fact, they seem to be synonyms), while there is no way to get ! 1040: the effect which cw would have if it were treated ``consistently''. ! 1041: (E.g., if I have a line beginning ``And if'', and I want to change it ! 1042: to ``If'', I cannot just put the cursor on the A and hit cwI^].) dw ! 1043: and yw delete up to the character immediately before the point to ! 1044: which ``w'' would take the cursor. I would have to agree that this ! 1045: behavior of dw and yw is more useful than that which a literal ! 1046: interpretation of the movement rule would lead to; but perhaps it ! 1047: would become still more useful if when applied to the last word on ! 1048: a line, it deleted or yanked the space immediately before the word ! 1049: along with the word... . On the other hand, one could argue for ! 1050: making a distinction between cw and ce. ! 1051: This is to make the user interface friendlier, and is a fact of life. ! 1052: If I wanted to change "And if" to "If", I'd type "dw~". ! 1053: ! 1054: Though I see the motivation for the above definitions, ! 1055: I see no sensible reason why Y should be equivalent to yy, when ! 1056: C and D are equivalent to c$ and d$. I would vote for changing ! 1057: Y to mean y$. ! 1058: The users wouldn't stand for such a change. Too many are used to it like it is. ! 1059: But you could always map it. ! 1060: ! 1061: RADICAL SUGGESTIONS ! 1062: ! 1063: Is there any reason for maintaining the distinction between ! 1064: the ``:'' state of vi, and ex itself? At present, there are ! 1065: relative advantages that lead one to choose to go into one or the ! 1066: other for a given operation: From the vi-: state, it is easier ! 1067: to return to the regular vi state; from ex, one has a more powerful ! 1068: range of commands; and it is easier to give a series of commands ! 1069: because each carriage-return gives one a new prompt. My suggestion ! 1070: is that from vi, ``:'' should carry you directly to ex, and when you ! 1071: are in ex, carriage-return (^M) after a command should give you a new ! 1072: prompt, while ^] should put you into vi. Conceivably, things might be ! 1073: simplified even further, and carriage return rather than : could ! 1074: be the key that would carry one from the regular mode of vi into ex: ! 1075: The basic problem here is that if : put you into ex mode, you'd have to redraw ! 1076: the screen when you hit return. The motivation for : commands is that you ! 1077: don't have to go through a conceptually hard mode change and wait for a ! 1078: screen redraw. ! 1079: ! 1080: .-------. .-------. ! 1081: .-------. a,i... | basic | ^M | | ! 1082: | vi |<------ | |----->| ex |<---. ! 1083: | insert| | vi | | | |^M ! 1084: | mode | ------>| |<-----| mode | ---' ! 1085: `-------' ^] | mode | ^] | | ! 1086: `-------' `-------' ! 1087: ! 1088: (Of course, ^M presently has a meaning in vi, but ! 1089: it has a synonym +.) Clearly, there would also be no need for a ! 1090: special "Hit return to continue" state. ! 1091: I have not distinguished vi and open in the above diagram. ! 1092: My idea here is that ^] would actually return you to either vi ! 1093: or open, whichever you had last been in, and that to switch ! 1094: to the other, you could enter ex and type vi^] or o^] respectively. ! 1095: (Or you could type vi^M, respectively o^M, and further ex commands, ! 1096: and the mode would be saved for the next time you hit a ^].) Or ! 1097: alternatively, these could be made settable options: se visual ! 1098: respectively se novisual. ! 1099: Having gotten used to the editor as it now exists, I admit that ! 1100: I feel uneasy about the above idea -- the sense of knowing that ! 1101: I am ``still in vi'' when I hit :, and not that ``other land'' of ex, ! 1102: represents a kind of of orientation that it is disconcerting ! 1103: to abandon. But I can't see any logical disadvantage in making ! 1104: such a change. Can you? Certainly, there would be things that ! 1105: would have to be thought out, such as what happens to bottom-line ! 1106: vi pattern-searches. My thought would be that ``/'' from vi should ! 1107: give :/ (i.e., put one in ex at the start of a pattern-search), ! 1108: and ^] after a pattern-search should put one into vi at the appropriate ! 1109: character on the line, in contrast to ^M after a pattern search, ! 1110: which would leave one in ex at the appropriate line. In general, ! 1111: I think such changes would lead to greater simplicity and learnability ! 1112: of the editor. ! 1113: I would also hope that excursions between vi and ex and back ! 1114: could be allowed in scriptfiles. It might also be desirable for ! 1115: ex to have, in addition to a concept of ``current line'', one of ! 1116: ``current cursor position''... . ! 1117: ! 1118: Well, on to another subject. One of the inconveniences I ! 1119: found very vexing when first learning to use the editor was that ! 1120: when in either vi insert mode, or ex/vi-bottom-line, it was very hard ! 1121: to edit what I was doing. Within insert mode the only ``editing'' ! 1122: I could do, without escaping, was with the three operations ^H, ! 1123: ^W and the kill character. And on a slow line with a dumb terminal, ! 1124: escaping to make changes could be very time-consuming because large ! 1125: parts of the screen would insist on being redrawn. Perhaps some ! 1126: other control-character could serve as ! 1127: a modified escape, that allowed one to edit what one had entered ! 1128: in the current insertion without having everything below it redrawn, ! 1129: and then return to it. Obviously, if carried to its logical ! 1130: limit this idea could lead to ridiculous nests of ! 1131: editing operations; but there would be no need to carry it to its ! 1132: logical limit. ! 1133: Why not just get a terminal with insert char? You're paying in performance ! 1134: for having an obsolete terminal. ! 1135: Anyway, the problem of editing ex-style commands ! 1136: was even worse, because there was no way to ``escape and ! 1137: revise''. I eventually learned enough to realize that the solution ! 1138: was to edit complicated commands in another file and source it. ! 1139: This is a standard complaint about a moded editor. It couldn't be fixed ! 1140: without taking away the property of ESC ending command lines. Besides, ! 1141: allowing editing on the bottom line would really break a lot of code. ! 1142: But it is sometimes very useful to have the text on which the ! 1143: commands are to act in front of you when composing them (e.g., you can ! 1144: yank and modify various pieces), which led to the variant of writing ! 1145: command lines within the file I was editing, and then writing ! 1146: those lines into another file and sourcing that, without ever leaving ! 1147: the current file. But this is distracting to deal with ! 1148: when concentrating on the editing task itself, which led me ! 1149: to divise a scriptfile which would handle the writing-to-another-file- ! 1150: and-sourcing for me. Or actually, several such files: One for ! 1151: single-line commands to be used essentially once; one for single-line ! 1152: commands that I would want to use on the same file during various ! 1153: editing sessions, and so would want to keep available in that ! 1154: file, and one for multi-line commands (to be used once). When ! 1155: I first got the idea, I thought one scriptfile would be enough, and ! 1156: I would call it ``do'', so that the command to execute a script I ! 1157: had written in a file I was editing would be ``:so do''. The ! 1158: file it would write to and source would be ``do.again'', so that ! 1159: if I wanted to reuse it, I could ``:so do.again''. When I realized ! 1160: the need for several versions, ``do'' became a directory. Here, ! 1161: for your amusement, are the three files. (Re the lines ``se prompt'', ! 1162: cf. my comment on that under PROBLEMS WITH SOURCE etc.): ! 1163: ! 1164: do/1 (for 1-time use of 1-line commands) ! 1165: .w! ~/do/again ! 1166: d ! 1167: so # ! 1168: se prompt ! 1169: ! 1170: do/1+ (like above, without deleting the command) ! 1171: .w! ~/do/again ! 1172: so # ! 1173: se prompt ! 1174: ! 1175: do/: (to use this, write a multi-line command script, put : at ! 1176: the beginning of the first line, put the cursor on the last ! 1177: line of the script, and then source the following:) ! 1178: ?^:?s/:/ ! 1179: ,''w! ~/do/again ! 1180: ,''d ! 1181: so # ! 1182: se prompt ! 1183: ! 1184: (I also created another version to use in case the script had ! 1185: to have an internal line beginning with ``:'', so that this couldn't ! 1186: unambiguously mark the beginning of the script. This used ! 1187: a line which explicitly specified the address-range of the script. ! 1188: But I have never had a need for it, so I will not bother you with it.) ! 1189: Finally, having gotten an account on a machine with a version 3 ! 1190: editor recently, I have divised still another way of doing this. I ! 1191: have put in my EXINIT the command ! 1192: ! 1193: 'map ^A "ayy:@a^M' ! 1194: ! 1195: and now, gratifyingly, the single stroke ^A has essentially the effect ! 1196: of ``:so do/1+'' -- except for the restrictions to which vi ``map'' ! 1197: commands are subject. But I've only been using this for a ! 1198: couple of weeks; so I have yet to learn how chafing those restrictions ! 1199: will or won't be. ! 1200: Anyway, it might be worth thinking about whether some of these ! 1201: things that I've done with macros should be incorporated in some form ! 1202: into the editor itself; or else whether these macros might be written ! 1203: up in the documentation (or some tutorials) on the editor. ! 1204: ! 1205: Next subject: Complicated pattern-searches in long files ! 1206: can be time-consuming. I have seen the point mentioned ! 1207: that if a pattern-description can be begun with "^", ! 1208: this can speed up the search -- since the pattern-comparisons need ! 1209: only be begun at beginnings of lines. In some cases, this might ! 1210: not be possible, but the user might be aware of some other ! 1211: character or character-sequence in the search-pattern ! 1212: that will occur relatively rarely in the file. In such cases it would ! 1213: be desirable if the user could specify one spot from which the pattern ! 1214: search should start, working forward and backward from there, to ! 1215: minimize false starts. E.g., if for some reason one wants to ! 1216: delete every word containing the letter m, the script ! 1217: %s/[^ ]*m[^ ]*// ! 1218: would become much less time-consuming if one could mark the point ! 1219: at which to begin, say writing ! 1220: %s/[^ ]*\!m[^ ]*// ! 1221: so as to instruct the editor to search for m's, and each time ! 1222: one was found, to find the longest possible strings of non-space ! 1223: characters before and after it, and delete these. (This is a silly ! 1224: example, but I think the idea is clear.) ! 1225: Isn't worth doing - this is fast enough for most people in most cases. ! 1226: ! 1227: Something that I've seriously felt the need for is the ! 1228: capability of searching for lines that satisfy more than one ! 1229: condition. If one just wants to locate such lines, one can ! 1230: of course leave the editor and do a pipeline of two or ! 1231: more greps; but it would be nice to be able to perform global ! 1232: commands on such lines. ! 1233: You want the PWB "or" operator. This is hard to put in - their code ! 1234: is really convoluted. ! 1235: ! 1236: Finally, any possibility of introducing the capability of searching ! 1237: for patterns including embedded newlines, a la sed? ! 1238: Newlines aren't stored - the data structure is an array of lines. ! 1239: So this is nearly impossible. ! 1240: Multiple windows, a la emacs? ! 1241: Would be easy after a rewrite, but impossible with current code. ! 1242: What you really want is a window manager, anyway, most of the time. ! 1243: ! 1244: ADDENDA ! 1245: I logged in this morning on an adm3a at 300 baud to go over this ! 1246: letter once more before sending it, and ran into another bug! I had ! 1247: done 15^D to get a large scroll despite the low speed, and at one point ! 1248: I saw a line with a typo scrolling up. So I noted its line-number, 402 ! 1249: and without waiting for the screen to stop moving typed something like ! 1250: 402Gfsrd. What happened was that the change was made on line 407 rather ! 1251: than 402 -- presumably the cursor was sent to where 402 had been when ! 1252: the command was received... . ! 1253: Knowing the internals of vi, I'd say this is impossible. It probably just ! 1254: screwed up your screen from line noise (or your terminal isn't truly full ! 1255: duplex), or you got the wrong line number. ! 1256: Editing this letter this morning reminded me of another feature I ! 1257: have thought would be desirable for editing on dumb terminals at low ! 1258: speeds: An option that would cause lines read from a file or typed ! 1259: in at the bottom of the screen to appear double spaced, with @ signs ! 1260: @ ! 1261: between them, such as one gets when one deletes a line on such a ! 1262: @ ! 1263: terminal. (I have faked this effect here, though the fake will not be ! 1264: @ ! 1265: very successful if you have se nu or se list on.) The point is that ! 1266: @ ! 1267: editing operations that presently cause painfully slow screen-redrawings ! 1268: would simply put material in in place of these fillers -- as happens ! 1269: now when one is lucky enough to be adding material just above a place ! 1270: where material was previously deleted. ! 1271: Again, it would cost less to buy a real terminal. You can get one for $500 ! 1272: or so now from Falco or Liberty or Zenith. ! 1273: ! 1274: Thanks again for the input. ! 1275: ! 1276: Mark ! 1277: ! 1278: ! 1279: From gbergman@UCBCARTAN Fri Jul 29 16:07:10 1983 ! 1280: Date: 29 Jul 83 16:02:06 PDT (Fri) ! 1281: From: gbergman@UCBCARTAN (George Mark Bergman) ! 1282: Subject: editor ! 1283: Message-Id: <[email protected]> ! 1284: Received: by UCBCARTAN.ARPA (3.342/3.7) ! 1285: id AA09635; 29 Jul 83 16:02:06 PDT (Fri) ! 1286: Received: from UCBCARTAN.ARPA by UCBERNIE.ARPA (3.336/3.7) ! 1287: id AA06658; 29 Jul 83 16:07:04 PDT (Fri) ! 1288: To: cc-03@ucbcory, danh@kim, lindahl@topaz, mckusick@ernie, ralph@ucbarpa ! 1289: Status: RO ! 1290: ! 1291: 29/7/83 ! 1292: I got a reply from Horton: a copy of my (first) letter, ! 1293: annotated with comments that this should indeed be fixed, that ! 1294: would be impossible, etc.. I'll send a copy to anyone who'd ! 1295: like (or a copy of his comment on some specific bug they're ! 1296: interested in). Meanwhile, I'll send you my reply to him, since ! 1297: it discusses still more bugs and possible improvements. ! 1298: ! 1299: Dear Mark, ! 1300: Got your comments on my first letter! Did you get the second, ! 1301: shorter one? Glad to see that some things, at least, can be fixed. ! 1302: Robert has put version 3.9 on this machine and I'm using it. ! 1303: Using movement arrows within insert mode is amusing; though when there ! 1304: is documentation, there should be a warning to the user that these ! 1305: prevent ``u'' from undoing anything before those commands. But ! 1306: the first thing there needs to be documentation for is vedit! Is ! 1307: any being written? ! 1308: In your comment on ``Can't yank inside global/macro'' you said ! 1309: that one can, of course, always yank to a named buffer. I checked, ! 1310: in the case of @a scripts, and the answer is yes and no: The yank ! 1311: works, but one still gets that diagnostic, and anything else in the ! 1312: sequence of commands is aborted. ! 1313: And concerning the diagnostic ``Can't undo in global commands'' -- ! 1314: I understand what you say about why one can't, but it still seems an ! 1315: unenlightening and perhaps inappropriate diagnostic to get when one has ! 1316: done @a and buffer a contains say ! 1317: x:g/foo/s//bar ! 1318: Here the initial ``x'', deleting the character the cursor was on when ! 1319: the command was given, creates the text-modified condition which, ! 1320: as I mention, seems to cause globals in @-scripts to give this ! 1321: diagnostic. I've just tested the above script -- several times, ! 1322: because I found it hard to believe what was happening -- and it did ! 1323: indeed give the diagnostic in question, but instead of replacing foo's ! 1324: with bar's, it replaced the first line containing a foo with a copy of ! 1325: the last line of the file! I leave it to you to figure that one out! ! 1326: (This is on version 3.9. Incidentally, I've used a true ^M in that ! 1327: script, so it is ready for you to try.) ! 1328: ! 1329: Further observations on some of the bugs I mentioned in my ! 1330: second letter: The business with yb is both more general and more ! 1331: complicated than I realized. The general fact seems to be that when ! 1332: one does a yank to a position earlier on the same line, the cursor does ! 1333: not move, but the editor thinks it has, so that any subsequent command, ! 1334: e.g. a movement, a delete, etc., has the effect that it would if it had ! 1335: been done with the cursor starting from the new position. The ! 1336: complication is that yanks to named buffers don't behave the same as ! 1337: simple yanks: They also leave the cursor unmoved, but what they actually ! 1338: yank into the buffer is the text from the cursor location to the end of ! 1339: the line; and whether they cause the editor to consider the cursor to ! 1340: be in a different location from where it really is seems to depend on ! 1341: the movement in question: with "ayNb, no, with "ayN|, yes (where N ! 1342: again stands for a positive integer). So what I called a snake in the ! 1343: grass seems to be a can of worms! ! 1344: In experimenting with this, incidentally, I've found that, while a ! 1345: put from a named buffer can be undone with u, if one attempts the ! 1346: command U, ``undo all changes made since coming onto this line'', only ! 1347: changes made since the last named-buffer-put are undone. ! 1348: ! 1349: I mentioned various abbreviations that were hard to unabbreviate, ! 1350: but could be done with the help of ^V -- but that I had found no way ! 1351: to undo ! 1352: :ab if if\pq ! 1353: To be precise, I had found that :una ^Vif, :una ^V^Vif, and ! 1354: :una ^Vif where each ^V represents two ^V's typed in, didn't work. ! 1355: I've finally found something that does: :una i^Vf. ! 1356: ! 1357: I find the diagnostic ``No tail recursion'' strange, ! 1358: since the occurrence of an abbreviation at the end of the item ! 1359: abbreviated shouldn't cause a recursive loop; while circumstances that ! 1360: do cause such a loop, namely the occurrence of the abbreviation within ! 1361: the item abbreviated, preceded by a space and followed by punctuation, ! 1362: are not censored, e.g. :ab x ( x ), or with more subtle effect, ! 1363: :ab x x sup 2. ! 1364: It seems that if one has :ab x word, then the abbreviation works ! 1365: when x is preceded by a beginning-of-insert, a space, a tab, or a ! 1366: newline, and followed by most any nonalphabetic character. For ! 1367: word-processing use, it would be natural to allow it to also be ! 1368: preceeded by (, ", `, [, perhaps even a user-specified set of ! 1369: characters. ! 1370: ! 1371: To my list of vi commands which I think should be able to take ! 1372: counts, add p and P. I often want to put in a large number of copies of ! 1373: one or more lines, as ``forms'' in which I will enter various kinds of ! 1374: additional data, and it would be convenient to be able to do compose ! 1375: such a line and then duplicate it the desired number of times all at ! 1376: once. What I currently do is produce a copy and then go ! 1377: yypk2yypk4yyp... till I have enough. ! 1378: ! 1379: Two more commands I think would be useful: (1) One which "puts" to ! 1380: the screen (in the sense of g/pattern/p, i.e. without affecting the ! 1381: buffer) the contents, or the first lines in cases that are longer than ! 1382: one line, of all nonempty buffers, named or numbered, with an ! 1383: indication, of course, of which each was. (Ideally one would like to ! 1384: be able to specify some subset of the buffers, whether one wants the ! 1385: first line, or everything, or some specified number of lines, etc..) ! 1386: (2) One which would show the script of the command stored to be used as ! 1387: ``.''. (And perhaps ditto with the last search pattern.) ! 1388: Oh, yes: it would also be nice to have a way to give commands ! 1389: without having them displace the one specified to be repeated by ``.'', ! 1390: e.g. if one wants to do a certain change time after time at various ! 1391: points in the file (using ``n'' and ``.'') but occasionally sees other ! 1392: changes to be made along the way. An alternative to the above would be ! 1393: a way to read the command stored to be used as ``.'' into a named ! 1394: buffer, so that one can give other commands and then return to ! 1395: that one. This would also allow one to reread the text of the command: ! 1396: useful if it isn't behaving as one meant it to. ! 1397: ! 1398: You might as well send any future mail to me here as ! 1399: gbergman@cartan -- I was using brahms while cartan's terminals were ! 1400: being moved but I'll probably be using cartan more from now on. But ! 1401: I'll check mail on both. (However, I'll be on vacation in New York ! 1402: State from the 3d to the 16th of August.) ! 1403: Best regards, ! 1404: George ! 1405: ! 1406: From gbergman@ucbcartan Fri Sep 23 13:57:06 1983 ! 1407: Date: Fri, 23 Sep 83 13:53:36 PDT ! 1408: From: gbergman@ucbcartan (George Mark Bergman) ! 1409: Message-Id: <[email protected]> ! 1410: Received: by ucbcartan.ARPA (4.6/3.7) ! 1411: id AA02960; Fri, 23 Sep 83 13:53:36 PDT ! 1412: Received: from ucbcartan.ARPA by UCBERNIE.ARPA (3.336/3.7) ! 1413: id AA20684; 23 Sep 83 13:57:01 PDT (Fri) ! 1414: To: cc-03@ucbcory, danh@kim, lindahl@topaz, mckusick@ucbernie, ralph@ucbarpa ! 1415: Status: RO ! 1416: ! 1417: Latest letter on ex~vi to Horton: ! 1418: ! 1419: Dear Mark, ! 1420: ! 1421: I hope I can assume that after my long letter to which you ! 1422: replied, you did get my two shorter notes (one sent the same day, ! 1423: the other about a week later); and that you've simply been to busy ! 1424: to think about them or reply. ! 1425: However, since I have had bad experiences with Mail, I am worried ! 1426: that either you may never have gotten them or that you may have replied ! 1427: and your replies not reached me. I hope you can send me a one-liner to ! 1428: relieve my doubts. ! 1429: ! 1430: Not many bugs to report this time, but I will modify or discuss ! 1431: a few of the suggestions I've made before. ! 1432: ! 1433: One that I want to modify is my suggestion that % should also ! 1434: match < with > and ` with '. All right in itself, but terrible if it ! 1435: would also mean that with :set match, every time one typed a > or a ' ! 1436: the cursor would look for the last occurrence of < or `, since <, >, and ! 1437: ' can occur in ways that have nothing to do with matching. So I think ! 1438: that making matchable pairs user-specifiable would be much more useful. ! 1439: Faith Fich (who send her regards -- she and Mike were our neighbors till ! 1440: a month ago, but have left for their new jobs at U. Seattle) suggested ! 1441: that user-settable matches would be particularly useful for those ! 1442: like herself who use distinct opening and closing delimiters with eqn. ! 1443: Actually, on further thought this isn't quite right, since eqn ! 1444: delimiters behave differently from parentheses -- if I want to use = ! 1445: as my delimiter to enter equation mode, and & as my delimiter to leave ! 1446: it, then eqn will not give any special treatment to &'s in text mode or ! 1447: ='s in equation mode; so perhaps a different kind of matching for ! 1448: that kind of use might be desirable; one would set :set dmatch =& ! 1449: for the delimiters suggested above; or :set dmatch $$ if one uses $ ! 1450: for both delimiters as in the eqn tutorials. I know checkeq is ! 1451: supposed to serve this function; but it would certainly be convenient ! 1452: to have it in the editor; and anyway, my experience was that checkeq ! 1453: didn't understand that one could have distinct opening and closing ! 1454: delimiters. (But this is a disinterested suggestion; I haven't used ! 1455: eqn for a long time; I put in my equations in raw troff.) ! 1456: ! 1457: The suggestion in my long original letter about an alternative to ! 1458: the diagnostic "using open mode" was based on a misunderstanding -- but ! 1459: one that might be worth making a reality. I had been assuming, ! 1460: since tutorials referred to the "three states" ex, vi, and open, and ! 1461: since I knew one could enter the editor by typing % ex filename or ! 1462: % vi filename, that a third way to enter the editor was by typing ! 1463: % open filename, and that this is what one should do when editing ! 1464: with a device not having an addressable cursor (which I had never done). ! 1465: So I supposed that the diagnostic "using open mode" would only be ! 1466: received if one were trying to use the wrong mode of the editor for the ! 1467: tty type shown in one's environment. Perhaps one should indeed have ! 1468: special way to enter the editor when one intended to edit in "open ! 1469: mode". (If "open" has other uses as a command, the command might be ! 1470: "vo" or "op".) Then if a user gave the command vi and his ! 1471: environment did not indicate a device with an addressable cursor, it ! 1472: would indeed be appropriate to give a diagnostic informing him that his ! 1473: environment was not compatible with this command. I suggest this ! 1474: because of the frustrating experiences I had as a beginner, of ! 1475: being put into open mode (because my tty type had somehow been lost) ! 1476: and not knowing what I could do about it. ! 1477: ! 1478: I am somewhat confused by your explanation that editor scripts ! 1479: that would go back and forth between ex and vi modes (using the :vi ! 1480: and Q commands) are impossible because "The internals of getting a ! 1481: character from the tty are completely different in ex and vi. Pushing ! 1482: input for one doesn't affect the other." A vi "script" (i.e. a mapping ! 1483: or a macro called by @x) can presently include bottom-line commands ! 1484: called with ":". I would suppose that the way such commands get ! 1485: characters from the terminal is about the same as the way ex does. ! 1486: You also write that "Any : command that outputs more than 1 line puts ! 1487: you into "ex mode"," -- is this a different sense of "ex mode"? If ! 1488: not, what happens when a vi script does this? ! 1489: I mentioned that the :so command from vi ignored anything after ! 1490: any global command in the sourced file. I also find that it will not ! 1491: accept the ex commands i and a; I realize that a prohibition against ! 1492: these is part of the way vi's bottom line differs from genuine ex. ! 1493: I've just done some experimenting, and I find that a script sourced ! 1494: from the bottom line of vi also interprets the command vi as a command ! 1495: to edit another file. Do we really want script files to be interpreted ! 1496: so differently when sourced from ex mode and from the bottom line of vi? ! 1497: Or if these differences are inevitable, can't the vi version at least ! 1498: have the positive difference of being able to go to visual mode with ! 1499: ^M^M or something, and continue following the script, interpreting ! 1500: characters as screen mode commands, just as a mapping or @x macro will ! 1501: if it has gone down to the bottom line with ":" and come back again? ! 1502: I am also still reluctant to give up the idea of a version of the ! 1503: editor in which there is no difference between the line-oriented mode ! 1504: and the bottom line of the visual mode. Suppose you took the editor as ! 1505: it exists now, and modified it so that in visual mode, ":" was ! 1506: interpreted as "Q", and in ex mode, ^[ was interpreted as ^Mvi. The one ! 1507: obvious disadvantage would be that it would insist on redrawing the ! 1508: screen after minor editing operations in ex mode. So suppose you made ! 1509: it remember the previous state of the screen every time it entered ex ! 1510: mode, and make the necessary adjustments on return to visual mode if the ! 1511: editing done was fairly trivial -- using the same criteria it now uses ! 1512: after bottom-line commands. What would be the problem? ! 1513: Of course, I know I am quite ignorant of what is involved, and what ! 1514: I am suggesting as possible may be quite impossible, or may have to wait ! 1515: for that far-off day when you rewrite the editor. ! 1516: ! 1517: You write that some of the restrictions on global commands are due ! 1518: to the fact that the state of the buffer before the command is stored in ! 1519: the "last deleted" buffer. But couldn't this situation be modified? ! 1520: Let's call the "last deleted" buffer buffer 0, since material from it ! 1521: seems to progress up to 1, 2, etc. with successive changes made. ! 1522: Suppose things were set up so that during the operation of a global or ! 1523: macro, deleted material, yanked material, etc. went by default into ! 1524: buffer 1 instead of 0...? Or alternatively, that the state before the ! 1525: global were saved in buffer 9, and this was then set outside of the ! 1526: chain of buffers into which material got pushed with successive ! 1527: deletions, during the operation of the global? Would this eliminate ! 1528: the objection to nested globals as well? Presumably, in a global within ! 1529: a global, the previous state would be stored in buffer 1, and new yanks ! 1530: put by default in buffer 2 (if the first of the above suggestions were ! 1531: followed). ! 1532: You mention in your comments to my letter that the difficulty of ! 1533: editing command lines "is a standard complaint about a moded editor" ! 1534: that would be hard to fix. But I point out in that same letter how ! 1535: appropriate macros or script-files can overcome that difficulty. (My ! 1536: files "do/1", "do/:" and the "map ^A ..." in my EXINIT.) It should be ! 1537: possible to introduce commands that would have the ! 1538: same effects as those macros. (Or at least, to describe such macros ! 1539: in the documentation. I have realized, by the way, that ^A was a poor ! 1540: choice of character for me to map, because it occurs in the output of ! 1541: function keys on a lot of terminals.) ! 1542: ! 1543: It would be nice to extend the kinds of "regular expressions" ! 1544: allowed in searches, e.g. a la egrep. Sometimes I also want to indicate ! 1545: something like "a substring of precisely 40 characters". This can be ! 1546: rendered as "........................................" at present, ! 1547: but things like that can easily lead to commands that ! 1548: exceed length limits. (Suppose one wants to look for a string of ! 1549: 40 successive characters other than whitespace. [^ ][^ ][^ ] ... is ! 1550: too long.) Have you checked out what I mentioned in my first long ! 1551: letter, that ed allows you to search for (e.g.) successive ! 1552: identical characters as \(.\)\1? ! 1553: ! 1554: Let me pass on a suggestion made recently in a system message by ! 1555: someone named nye. He was worried about what would happen ! 1556: if while one person was editing a file, someone else with write ! 1557: permission for that file also began editing it. Presumably, whoever ! 1558: did a "write" last would overwrite the other person's work. He ! 1559: suggested that there be a diagnostic "file has been changed since last ! 1560: write" for such a situation. (In particular, he wondered what would ! 1561: happen if he got his mail by editing /usr/spool/mail/name, rather than ! 1562: by using Mail -- which is certainly tempting if one is more comfortable ! 1563: with the editor than with Mail -- and if unbeknownst to him new mail ! 1564: arrived while he was editing.) ! 1565: ! 1566: I have discovered the hard way that when one has done a ! 1567: vi -r filename and decided one was satisfied with the version that ! 1568: was saved, ZZ or :x are n o t the same as :wq -- the first two ! 1569: discard the saved file, and only the last one writes it over the ! 1570: previous version. (I actually haven't checked this out on version 3.9. ! 1571: I tried to, and found that robert hadn't brought ! 1572: /usr/lib/ex3.9{preserve,recover}, if that's what they're still ! 1573: called, from arpa along with the rest of 3.9. But he's getting them for ! 1574: me.) If you don't want to make ZZ and :x actually equivalent to ! 1575: :wq, you might at least make them give error messages forcing the ! 1576: user to make the explicit choice of :wq to keep the saved version, or :q ! 1577: to discard it. ! 1578: ! 1579: I've been having fun using recursive "map" commands from time to ! 1580: time. For example, a file of mailing addresses of Math Departments is ! 1581: being prepared, for use with a new Computer Services command "label". ! 1582: This requires that each address constitute one line of the file, with ! 1583: the intended lines of each label separated by ! 1584: semicolons rather than newlines, each being no longer than 34 ! 1585: characters. At present, the lines in the file are of the form ! 1586: [university-name];[city-state-zip] ! 1587: and I wanted to find cases where the university name the secretaries ! 1588: had typed in was over 34 characters long. So I did ! 1589: :map ^A +36^V|F;^A0 ! 1590: Then, when I hit ^A, the cursor went bopping down the file, passing ! 1591: through each line at which it could find a ";" before the 36th position, ! 1592: but stopping when it hit a line where it could not. When I had ! 1593: corrected such a line, by abbreviating a long word or whatever, I could ! 1594: hit ^A again and find the next case. The "0" at the end of the map ! 1595: command is to prevent the "No tail recursion" rule from aborting my ! 1596: mapping. It has no other effect, because it is never reached. ! 1597: Of course, the above example of a recursive mapping is guaranteed ! 1598: to stop eventually, if only by reaching the end of the file. But I find ! 1599: that mappings that can go on indefinitely are very hard to stop. E.g. ! 1600: :map q ax^[q0 ! 1601: I've tried some like that, and sometimes hitting <break> or whatever ! 1602: enough times successfully stops them (often leaving a bit of a mess -- ! 1603: characters that ought to have come after the string of x's embedded ! 1604: among them), while other times the only thing I can do is to go to ! 1605: another terminal and kill the editing process. Maybe it is to prevent ! 1606: things like that that you put in the "No tail recursion" rule -- ! 1607: though clearly it can be gotten around. Might it not be better to ! 1608: somehow make the editor not quite so deaf to <break>s during such a ! 1609: process? ! 1610: ! 1611: I will mention one curious experience which I have not been able to ! 1612: reproduce. I use :set nu. After a delete near the beginning of a file, ! 1613: I found myself looking at a screen with line-numbers beginning around ! 1614: -2! The lines with nonpositive numbers were blank, if I recall; lines ! 1615: 1, 2, etc. were as they should be. I mentioned this to someone ! 1616: who said he'd had the same thing had happened at times, but had ! 1617: never been able to figure out what conditions caused it. ! 1618: ! 1619: Best regards, ! 1620: George ! 1621: ! 1622: From gbergman@ucbcartan Thu Nov 3 22:32:01 1983 ! 1623: Received: from ucbcartan.ARPA by ucbernie.ARPA (4.17/4.13) ! 1624: id AA25163; Thu, 3 Nov 83 22:31:44 pst ! 1625: Date: Thu, 3 Nov 83 22:28:11 PST ! 1626: From: gbergman@ucbcartan (George Mark Bergman) ! 1627: Message-Id: <[email protected]> ! 1628: Received: by ucbcartan.ARPA (4.6/3.7) ! 1629: id AA06097; Thu, 3 Nov 83 22:28:11 PST ! 1630: To: cc-03@BERKELEY, danh@kim, lindahl@topaz, mckusick@ucbernie, ralph@ucbarpa ! 1631: Status: R ! 1632: ! 1633: Latest letter to Mark Horton re editor bugs etc.: ! 1634: ! 1635: copies sent to ! 1636: cc-03@ucbcory ! 1637: ralph@ucbarpa, lindahl@topaz, mckusick@ucbernie 25/7/83 ! 1638: danh@kim 26/7 ! 1639: Mark Horton's reply: anderson@kim 30/7/83 ! 1640: ! 1641: Dear Mark, ! 1642: I got your reply to my last letter, but you don't say ! 1643: whether you got the two preceding ones -- in particular, I'm ! 1644: curious as to what you'd say about the peculiar behavior of ! 1645: abbreviations terminated by \[character]. (E.g., suppose ! 1646: someone did :ab ac artistic, and then, supposing the file was for ! 1647: troffing, typed ac\fP. -- Try it!) And likewise, about what ! 1648: happens if you hit @x, when register "x contains ! 1649: x:g/foo/s//bar ! 1650: (To see this wierd effect, you have to have a file with ! 1651: an occurrence of ``foo'', and a distinctive l a s t line.) ! 1652: ! 1653: In an earlier letter I commented that the mapping that ! 1654: the editor sets up to enable the tvi's right-arrow key makes ! 1655: ^L unavailable for refreshing the screen. You replied that, ! 1656: of course, the editor could not distinguish a ^L generated by ! 1657: the arrow key from one typed as <ctrl>-L by the user. True, ! 1658: but some users, such as myself, are quite happy using hjkl ! 1659: to move around the screen (I use them completely by reflex) ! 1660: and so have no wish to enable special arrow keys, but do ! 1661: want to have ^L available to redraw the screen when ! 1662: a message or something messes it up. ! 1663: The problem with ^L occurred in using a tvi; now, using ! 1664: a Z29 (in h19 mode), another version of the problem arises. ! 1665: It has arrow keys that transmit things like ^]A, ^]B, etc., ! 1666: and version 3.9 not only maps these sequences, but also ! 1667: map!s them. What I found happening is that if in typing ! 1668: I made a change somewhere in the body of a line and then ! 1669: wanted to add something at the end of the line, I would often ! 1670: type a ^] to end the first change and then an A to ! 1671: begin the second, with less than a second between them, and ! 1672: this sequence would then be map!ed into ^]ka or ! 1673: something, landing me in a different place from the one ! 1674: I wanted. Aside from this major problem, there is the minor ! 1675: inconvenience that the map! mechanism apparently waits ! 1676: a second every time I type an ^] from insert mode to see ! 1677: whether this is going to be one of the map!ed sequences, and ! 1678: this makes exiting from insert mode sluggish. My temporary ! 1679: solution has been to write a file of the form ! 1680: unmap ^]A| unmap ^]B| ...|unmap! ^]A| unmap! ^]B| ! 1681: which I source every time I go into vi on the Z29. I ! 1682: guess what I should do is create simplified termcaps that ! 1683: leave out the arrow keys for my own use when in version 3.7. ! 1684: Kevin Layer tells me that when he puts 3.9 on all systems here, ! 1685: there will be documentation on how to create terminfo files; ! 1686: so I will be able to avoid these inconveniences in 3.9 as well. ! 1687: What would be better, for these two-or-more character sequences, ! 1688: though, would be if the "timeout" feature on mappings ! 1689: could involve a variable interval, which could be set in the ! 1690: millisecond range for terminal-generated sequences (I suppose ! 1691: it would have to depend on the baud rate), and longer ! 1692: for user-mapped sequences. The likelihood of the user ! 1693: accidentally typing in one of the special sequences so fast ! 1694: is negligible. ! 1695: Incidentally, I notice that when I type :map to look ! 1696: at the automatic mappings, these are labeled "up", "down" etc., ! 1697: though for mappings that I create the corresponding position ! 1698: just shows a repeat of the mapped sequence. Is there ! 1699: any way the user can put mnemonics in with his own mappings? ! 1700: ! 1701: Two other minor points: ! 1702: ! 1703: In your reply to my first letter, where I suggested that ! 1704: N/pattern should take one to the Nth occurrence of /pattern, ! 1705: you said that N/pattern actually resets the window size to N ! 1706: while carrying one to /pattern. The tutorial says the same, ! 1707: I believe, but nonetheless, it doesn't work! ! 1708: When one has pulled a command into a buffer, ! 1709: say "x, and invoked it with @x, if one then tries to get ! 1710: a copy of this command by doing "xp, it doesn't seem to work. ! 1711: The way I've found to make it work is to do any other ! 1712: yank-and-put (using, say, the last-deleted ! 1713: buffer). This somehow unfreezes the mechanism, and (after undoing ! 1714: this last put, unless one wanted it), one can then successfully ! 1715: do "xp. ! 1716: Yours, ! 1717: George ! 1718: ! 1719: (Message inbox:32) ! 1720: Date: Sun, 10 Jun 84 16:29:50 pdt ! 1721: From: gbergman@ucbcartan (George Mark Bergman) ! 1722: To: cc-03@ucbcory, danh@kim, decvax!tarsa, gbergman@ucbcartan, ! 1723: hplabs!intelca!omsvax!isosvax!root, ihnp4!burl!we13!ltuxa!jab, ! 1724: leblanc@ucbdali, lindahl@topaz, mckusick@ucbernie, [email protected], ! 1725: ralph@ucbarpa, reiser@ruby, [email protected], unisoft!eryk, ! 1726: uw-beaver!ubc-vision!mprvaxa!sonnens ! 1727: Subject: more editor bugs & ideas ! 1728: ! 1729: Here's another letter of comments on the editor that I'm ! 1730: sending to Mark Horton (mark@cbosgd). ! 1731: If any of you to whom I'm sending this aren't interested in ! 1732: staying on this mailing list, just let me know. ! 1733: Horton replied to an earlier letter by saying he had no idea ! 1734: when he'd have any time to work on the editor again, so I don't ! 1735: expect replies from him to this and further such letters in the near ! 1736: future. ! 1737: For those who are not familiar with the subject of item "A." ! 1738: below, modeline is a feature that he added without publicizing it much, ! 1739: whereby if any line in the vicinity of the top or bottom of the file ! 1740: (top and bottom 10 lines? I don't remember) contains the string ! 1741: vi: or ex: and then another :, everything between these is ! 1742: interpreted as a command and executed when this file is read by the ! 1743: editor. There was a big squall in net.news when someone discovered ! 1744: it by chance (an accidental string of this sort occurred in their ! 1745: /etc/password; fortunately the "command" was meaningless, and evoked ! 1746: a diagnostic from the editor). Some serious dangers of this ! 1747: feature were pointed out by various contributors, one of whom described ! 1748: for all who were interested how to eliminate it from the source file. ! 1749: ! 1750: Dear Mark, ! 1751: Here's another few month's collection of comments... ! 1752: ! 1753: A. Modeline ! 1754: I presume that in following the net.news discussion of the ! 1755: ``MAJOR BUG (modeline)'' you saw my two contributions; but I'll ! 1756: summarize the relevant points (not in the order I made them): ! 1757: ! 1758: 1) One possible feature that would be about as convenient as ! 1759: the modeline, and would avoid the dangers that people have pointed ! 1760: out, would be `enhanced tags', in which the 3d entry of a line of the ! 1761: tags file could be not merely a pattern search, but an arbitrary ! 1762: command line. ! 1763: ! 1764: 2) I described (both in net.news and in an earlier letter to you) a ! 1765: mapping in my EXINIT which makes one keystroke yank the current line ! 1766: (or the next N lines if preceded by a count) to a named buffer ! 1767: and then execute that buffer. If one keeps a set of initializing ! 1768: commands within a file to which they are to apply, one can then ! 1769: easily execute them on beginning an editing session, which gives ! 1770: almost the convenience of the modeline feature, without the dangers, ! 1771: and has an enormous range of other uses. So I think the modeline ! 1772: feature could be dropped. ! 1773: ! 1774: Let me add to those points: ! 1775: ! 1776: 3) A modeline ! 1777: vi:r %: ! 1778: leads to an infinite recursion! Fortunately, ^C cuts it off. ! 1779: ! 1780: 4) I agree with others' comments in net.news that if the modeline ! 1781: feature is not dropped altogether, it should be a settable option ! 1782: with default ``nomodeline''. ! 1783: ! 1784: 5) It should certainly be off when ``novice'' is set! ! 1785: ! 1786: B. Tags ! 1787: Having mentioned these in point A(1), I will give some other ! 1788: comments I have: One of your update documents mentions the fixing ! 1789: of a bug that left ``nomagic'' set if the file named in the tags ! 1790: file did not exist. Very good, but one still ends up with ``nomagic'' ! 1791: if the file exists but the pattern-search is unsuccessful! ! 1792: It would also be nice if the tags file could include file addresses ! 1793: of the form ~user/filename, in particular ~/filename, and if the ! 1794: command :set tags= recognized the same. (I suppose this makes no ! 1795: difference to people who get their tags from ctags, but for me, the ! 1796: tags file is maintained as a collection of items I have been working on ! 1797: recently, or mean to soon, and entries are put in or removed by ! 1798: hand regularly.) ! 1799: ! 1800: C. Reversal of n and N ! 1801: I also mentioned in one of my net.news comments a peculiar behavior ! 1802: that often seems to occur after I've been using my yank-and-execute ! 1803: mapping a lot, in which, after a command-line pattern-search :/pattern ! 1804: (rather than simply /pattern), the screen-mode commands n and N give ! 1805: searches in the reverse of the expected direction, with ? and / ! 1806: respectively instead of vice versa. Perhaps you can figure out what ! 1807: causes this; if not, would it help for me to do something like make ! 1808: a core dump of the editor when it is happening and send it to you? ! 1809: (I don't know how to send a nonascii file, though... .) ! 1810: A few more observations on this behavior: Though I commonly ! 1811: discover it when I am using my yank-and-execute mapping, it has ! 1812: happened on at least one occasion when I hadn't use that at all, ! 1813: so far as I could recall. It may actually happen quite frequently, ! 1814: but people just don't notice it because they usually use /pattern ! 1815: instead of :/pattern. (My mapping makes it more convenient for ! 1816: me to use the latter when the pattern is complicated, or I want to ! 1817: store it for repeated use.) ! 1818: ! 1819: D. Update on dangerous recursions ! 1820: Discovering that ^C interrupted the recursive modeline led me ! 1821: to test it out on a recursive mapping, :ab x ( x ). It interrupts ! 1822: it OK. Problem solved courtesy of 4.2BSD, I guess. ! 1823: ! 1824: I will collect under the next heading my usual list of: ! 1825: ! 1826: E. Minor bugs and modest suggestions ! 1827: ! 1828: ye and yE yank one character less than they should. ! 1829: ! 1830: If the command Ne (N a count) would land one on a 1-letter ! 1831: word, one generally lands at the end of the next word instead ! 1832: (even if it is also a 1-letter word. Exception: if one starts ! 1833: at or after the end of the preceding word, e behaves as it should.) ! 1834: ! 1835: Note also that in the line ! 1836: Sentence... . Sentence ! 1837: if the cursor is on the second S, the command ( causes no motion ! 1838: at all. ! 1839: ! 1840: I suggest that the motion commands { and } should accept indented ! 1841: lines as paragraph-starts, or at least that there should be some ! 1842: way of requesting this in the ":set para=" command. After all, these ! 1843: motions shouldn't be useful only to people writing troff files! ! 1844: ! 1845: In general, the command NC (where N is a count) changes material ! 1846: from the cursor position to the end of the Nth line, leaving material ! 1847: before the cursor on the current line unchanged. But if the line ! 1848: is indented, and the cursor is on or before the first nonwhite ! 1849: character, the preceding white text (spaces and tabs) is lost. ! 1850: ! 1851: It should be possible to use ! 1852: :unmap #1 :unmap! #1 :unab #1 ! 1853: when function-keys have been mapped. ! 1854: ! 1855: Sometimes a noisy phone-line, termcap padding errors, etc. ! 1856: cause just one or two lines of the screen to be messed up, and one ! 1857: may only wish to refresh those lines. Could a command be introduced ! 1858: which would do this? Ironically, on a dumb terminal one can generally ! 1859: do this by moving the cursor over the line, but not on a smart terminal. ! 1860: Another way one can do it is ddP, but I would sometimes feel uneasy ! 1861: about unnecessarily modifying the text. I would ! 1862: suggest that the form of the command be 1^L (2^L for 2 lines, etc.). ! 1863: Currently, ^L apparently ignores counts. (Actually, I'm writing at ! 1864: the moment on a tvi, so I've verified this for ^R rather than ^L.) ! 1865: ! 1866: If one uses the source command, and the file sourced contains ! 1867: a command ! 1868: :e newfile ! 1869: where newfile does not already exist, the diagnostic ``No such file ! 1870: or directory'' aborts the sourcing process. One ought to be able to ! 1871: use such commands in a sourced file. ! 1872: ! 1873: In vi screen command mode, ^[ is supposed to ``cancel partially ! 1874: formed commands'' and generally does so without protesting, but if the ! 1875: partially formed command is a count (e.g., if one has typed 110 instead ! 1876: of 10 and wishes to start over) it feeps, which depending on one's ! 1877: terminal can be a minor or a major annoyance. (Also depending on ! 1878: whether someone is trying to sleep in the next room.) ! 1879: ! 1880: The diagnostic, ``First address exceeds second'' should not be ! 1881: needed with one-address commands! The case where a series of addresses ! 1882: before a command, of which the first may exceed the second, is most ! 1883: useful is when the last address is a pattern-search preceded ! 1884: by a ";", e.g. ! 1885: :$;?^\.PP?-r otherfile ! 1886: but let me give simpler examples; of the two commands ! 1887: :3,1,2ka :1,3,2ka ! 1888: the first correctly marks line 2, but the second is aborted by the ! 1889: diagnostic quoted. ! 1890: ! 1891: F. A feature that would be very desirable, and might or might not ! 1892: be easy to implement. ! 1893: ! 1894: In general, when one is inserting text on a smart terminal in vi, ! 1895: the context below the text being added is pushed downward, line by line, ! 1896: till none is left on the screen. I would like a settable option that ! 1897: kept a certain number of lines of following context on the screen ! 1898: during additions. The point is that one should see the material that ! 1899: what one is writing will have to mesh with. What would be involved in ! 1900: implementing this would, of course, depend on terminal capabilities. ! 1901: If it would be difficult to keep an arbitrary number of lines, ! 1902: would it at least be possible to have an option that would keep one ! 1903: line, using the special bottom-line feature of some terminals? ! 1904: ! 1905: G. More radical suggestions (wishlist). ! 1906: ! 1907: 1) Editing text with _u_n_d_e_r_l_i_n_i_n_g. ! 1908: Although one of the valuable features of vi is the explicitness ! 1909: with which most nonprinting characters are shown, this can be annoying ! 1910: when one wants to deal with text in which many characters ! 1911: are ``emphasized'' using the sequence _^H; e.g. nroff output. I ! 1912: suggest a settable option under which such sequences would be shown as ! 1913: with ul. ! 1914: I realize that this would involve working out a great number ! 1915: of details, e.g. would motion commands treat _^Hx as one ! 1916: character or as three? How would the nth column be defined? How ! 1917: would one place the cursor on one of the elements of the string ! 1918: _^Hx for editing purposes? What would be done with _^H^A or _^H_^H....? ! 1919: I think the best solution would be to treat _^Hx as a single ! 1920: character for the purposes of motion commands, definition of nth ! 1921: column, deletions, etc. when this option was set. In terms of placing ! 1922: the cursor, two possibilities occur to me. One would be to only allow ! 1923: the cursor to sit on the underlined character ``as a whole'', and to ! 1924: have changes in underlining done by special commands: perhaps ^E as a ! 1925: toggle to turn emphasis on and off in insert mode, _ to change ! 1926: underlining in screen command mode as ~ changes capitalization ! 1927: ("_" is at present a synonym to "^", except ! 1928: that it takes counts. ^ could be modified to take ! 1929: counts, and _ then used as suggested above), and \e in replacement ! 1930: patterns. The other would be to consider a cursor sitting ``on'' ! 1931: a sequence _^Hx to actually be on the x, and to set things up so that ! 1932: if the cursor is on any of the other members of this sequence, the ! 1933: sequence is ``expanded'' on the screen, i.e. shown as it is in the ! 1934: present vi. Then define a single vi command so as not to skip over ! 1935: the _ and ^H in such a sequence; namely ^H. (This would mean ! 1936: making a distinction between h and ^H in screen command mode.) ! 1937: This one motion would allow one to edit parts of such a sequence. ! 1938: ! 1939: 2) Editing several files at once. ! 1940: When I have to do work that involves more than one file, the ! 1941: repeated use of :w|e#, yanking text to named buffers to move it, losing ! 1942: marked lines when I return to a previous file, etc. becomes ! 1943: annoying. I think it would be desirable if one could make a group ! 1944: of files behave like one file during an editing session, and move ! 1945: around within that file as comfortably as one move within one file. ! 1946: I suggest that visually, each file be separated from the next ! 1947: by a pattern ! 1948: ::::::::::::::::::: ! 1949: as when ``more'' is applied to a group of files. ! 1950: For ``Go to file 3, line 20'' I suggest a screen command syntax ! 1951: *3*20G. *-1* and *+2* could mean ``the preceding file'' and ``the ! 1952: file after next'' in such commands. (The initial * could be optional ! 1953: if there is no preceding + or -, as in the first example.) In a ! 1954: command such as :w, the default address range would be all of the file ! 1955: to which the current line belongs (i.e., ! 1956: it would be a synonym for :*.*w) To write all files, I suggest :**w. ! 1957: :q, :x and ZZ would quit the editing session entirely, while :*1*q ! 1958: would remove the buffer of file 1 from the object being edited. ! 1959: On the other hand, relative motions such as 10j, H, etc. would work ! 1960: within the ``visible object'', the union of the files. ! 1961: %s/pattern/repl/ would apply to the file containing the current line, ! 1962: and would have the synonym *.*s/pattern/repl/, while ! 1963: *1,2,4*s/pattern/repl/ would affect the 3 indicated files, and ! 1964: **s/pattern/repl/ would affect all files. ! 1965: ! 1966: 3) Input and output of shell escapes. ! 1967: The various commands involving shell escapes that you have ! 1968: set up allow four possible relations between the text being edited ! 1969: and the input and output of the commands: none (:!command); ! 1970: specified line-range as input with output not affecting text ! 1971: (:address-range w !command); no input from text but output inserted at ! 1972: specified line (:address r !command); and specified input from text ! 1973: with output replacing input (:address-range !command). ! 1974: It would be nice to have more flexibility; in particular, to ! 1975: be able to include input from the file and place the output somewhere ! 1976: else in the file without destroying the input text, and to input ! 1977: more than one segment of text, e.g. ! 1978: !egrep -f[addr.range] [other.addr.range] > [place of insertion] ! 1979: Obviously, there would be a problem of setting up a syntax that would ! 1980: avoid confusion with strings that look like address-ranges in the ! 1981: shell command. Perhaps \[...\] could enclose address-ranges where ! 1982: I have used [...] above. ! 1983: ! 1984: 4) ; ! 1985: The ; syntax, allowing one to do a pattern-search starting ! 1986: from a specified line is useful, but in setting up 2-address commands, ! 1987: one does not necessarily want the point from which one starts the ! 1988: search for the second address to be the first address. If this business ! 1989: were being set up now, I would suggest that ! 1990: address;/pattern/ ! 1991: should simply be a way of specifying the result of doing the indicated ! 1992: pattern-search relative to the indicated address, so that ! 1993: :address1,address2;/pattern/d ! 1994: would delete from address1 to the location found by the pattern-search ! 1995: relative to address2. Since people are used to the existing ! 1996: syntax of ;, I suggest that some other symbol be used in the above ! 1997: way, e.g. ], so that ! 1998: :address1,address2]/pattern/d ! 1999: could be interpreted as described. ! 2000: ! 2001: 5) Insertions into long lines on smart terminals at low or medium ! 2002: baud rate (e.g. 1200). ! 2003: This is annoying because the material coming after the point ! 2004: of insertion begins to wrap around, and the cursor must jump back and ! 2005: forth, inserting characters at the beginning of the ! 2006: continuation line, then going back to the point of insertion, and so ! 2007: on. (At least, this is my experience on my Z29. I haven't done ! 2008: editing by phone connection on any other smart terminal.) It's ! 2009: actually nicer on a dumb terminal, where the editor just overwrites, ! 2010: and shows you the result after you escape. I suppose that the need ! 2011: for the cursor to jump back and forth is due to the deficiency of the ! 2012: terminals -- has anyone suggested to terminal manufacturers that along ! 2013: with the wraparound feature, they add a feature which ``remembers'' ! 2014: when a line is a continuation of the preceding line, and automatically ! 2015: pushes material from the preceding line into the continuation line ! 2016: when characters are added to the former, eliminating the need to send ! 2017: all these instructions in over a slow line? (Do terminal manufacturers ! 2018: listen to editor-software specialists?) If not, it might just ! 2019: be best to not show the pushed-over earlier material till the insertion ! 2020: is complete. ! 2021: ! 2022: 6) Filename convention ! 2023: This is really a suggestion for UNIX generally, but it could be ! 2024: implemented on the editor separately. It is that for any file, ! 2025: filename/.. denote the directory in which the file lies. (This ! 2026: does not mean that every file should be treated as a directory, or ! 2027: that the ls command should show filename/..; it would just ! 2028: be a convenient way to refer to the directory containing a given ! 2029: nondirectory file, consistent with the existing convention for ! 2030: directories.) Within the editor, the important cases would be ! 2031: %/.. and #/.., allowing commands such as: ! 2032: :1,10w %/../othername ! 2033: ! 2034: All for now! Yours, ! 2035: George ! 2036:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.