[TxMt] Re: Re: Insert hard wraps
Steve King
steve at narbat.com
Mon Apr 16 19:07:21 UTC 2007
On Mon, 16 Apr 2007, Robert W. Kuhn wrote:
> Allan Odgaard:
>
>> Hard wrap is not a built-in feature.
Will it be in 2.0? Pretty please?
>> You can fake it by overloading
>> space with a macro that reflows the current paragraph, maybe
>> conditionally only when TM_COLUMN_NUMBER is above 80 (i.e. use a
>> command instead -- there is a scope for paragraphs in text, making it
>> possible to have the command take meta.paragraph as input).
>
> ..and do not forget to post the script ;-)
You can't really do it with a macro. I tried making a macro that inserts
a space then reformats the paragraph. This doesn't work if the cursor's
at the end of a line (as it will be probably 95% of the time when this
macro is triggered) because the reformat function deletes trailing
whitespace. So the paragraph gets reformatted, but you lose the space you
just inserted!
So I tried reversing the operations. I made a macro that reformats the
paragraph, then inserts the space. That's better, but not perfect. Say
you're wrapping at column 80. You end a word exactly at column 80 and
type a space. The reformat occurs, but of course the line doesn't change
(since it hasn't gone beyond the wrap margin). Then a space is entered,
and you start typing the next word. This word is now hanging off the
right-hand side of the screen in columns 81+. But all will be right again
after you finish the word and hit space, right? Well, yeah, unless the
word is the last one in the paragraph and you end it with a newline.
This method also fails in that you can't add multiple spaces at the end of
a line. Reformat, add a space. Reformat again. The space you just added
is eaten. Add a space. Net result: No change.
Entering multiple spaces within a line is even worse. The reformatter
merges multiple spaces into a single space anywhere within the paragraph.
This leads to the reformatter shifting the paragraph around, but the
cursor doesn't move. It stays in the same column, regardless of how the
words move around it. So you've got a double-space somewhere, and the
cursor is just to the left of a word. Hit space. The reformatter removes
the double-space, shifting the line one character to the left. Now your
cursor is just *after* the first character of the word, not just before
it. Insert a space. You've just turned 'word' into 'w ord'.
(And if you're old enough to have learned to type on a manual typewriter,
the habit of adding two spaces at the end of a sentence is just too deeply
ingrained to change. As you can see in the above paragraphs!)
You'd need to write a command to do this, and that's adding more overhead
to the space character than I'm willing to do.
Allan, a question about that: When a command runs, does it spawn a new OS
process or does it run in a thread within the TextMate process? It seems
that if you're running any command that starts with a shebang (#!) line
you'd have to fork a new process to load the specified command
interpreter. If that's so, then it's *way* too much CPU and disk overhead
to do every time you hit space!
--
Steve King, <steve at narbat.com>
More information about the textmate
mailing list