On Dec 26, 2007, at 10:28 PM, Allan Odgaard wrote:
On 26 Dec 2007, at 14:28, Сергей Яковлев wrote:
[...] Suggestion 1. It would be useful if TextMate had variables like $TM_SELECTION_START and $TM_SELECTION_END which would return the corresponding offsets in the file (or the cursor offset, if nothing is selected).
It does in the form of a line/column position of the start position.
Maybe I am simply misunderstanding you, but are you saying that TextMate returns line and column position of the start position of selection?
I'm asking because the $TM_LINE_NUMBER and $TM_COLUMN_NUMBER variables don't quite work this way.
To illustrate what I mean, let's add a 'Show Position' command that displays position as a tooltip:
echo "$TM_LINE_NUMBER:$TM_COLUMN_NUMBER"
and type 'TextMate' into an empty document. Now, if we select 'TextMate' with mouse from left to right, the command returns 1:9. If we select 'TextMate' with mouse from right to left, the command returns 1:1. Finally, if we select 'TextMate' by double-clicking between 't' and 'M', the command returns 1:5.
So, these variables actually return the cursor position, not the starting position of selection and it is impossible to calculate the starting and ending positions of selection from $TM_LINE_NUMBER and $TM_COLUMN_NUMBER variables (without knowing how the selection was made).
The only way to do this (that is known to me) is to write a macro that first calls a command that replaces selection with itself wrapped in U+FFFC characters:
echo -n $'\357\277\274'$TM_SELECTED_TEXT$'\357\277\274'
and then calls another command that receives the whole document as an input and can "find" the selection looking for U+FFFC characters.
It would certainly be easier for the average user (and somewhat more flexible) if TextMate had something like $TM_SELECTED_TEXT_START_LINE_NUMBER and $TM_SELECTED_TEXT_START_COLUMN_NUMBER variables, or, alternatively, slightly changed semantics of $TM_LINE_NUMBER and $TM_COLUMN_NUMBER variables so that they always return the starting position of selection (no matter how the selection was made).
The reason it does not use a byte offset is that internally TM would have to "calculate" this (by adding the length of each line preceding the selection) and I am generally wary of exporting shell variables that need to be calculated and have an unknown running time (i.e. in practice the user could have a million lines and each command execution would then always require a million numbers to be added together).
I assumed that these calculations were already being performed, after I had a look at:
$ class-dump -C OakTextView TextMate | grep selectedRange - (struct _NSRange)selectedRange; - (void)setMarkedText:(id)fp8 selectedRange:(struct _NSRange)fp12;
and saw 'selectedRange'. But, evidently, something much more complicated is going on, and I certainly would not ask you questions about TextMate internal workings :-)
The only remaining question is what symbol to use as a mark. I decided to use √ (221A, SQUARE ROOT character, which you can type with Option-V), but I'm not sure this is the best choice. Maybe it's better to use some character from Private Use Area (E000--F8FF)?
We generally use U+FFFC, OBJECT REPLACEMENT CHARACTER.
I've attached a new version of macros using U+FFFC to the original ticket.
Happy New Year!
-- Sergei Yakovlev
On 30.12.2007, at 20:13, Sergei Yakovlev wrote:
It would certainly be easier for the average user (and somewhat more flexible) if TextMate had something like $TM_SELECTED_TEXT_START_LINE_NUMBER and $TM_SELECTED_TEXT_START_COLUMN_NUMBER variables, or, alternatively, slightly changed semantics of $TM_LINE_NUMBER and $TM_COLUMN_NUMBER variables so that they always return the starting position of selection (no matter how the selection was made).
Do you know these variables? $TM_INPUT_START_LINE $TM_INPUT_START_LINE_INDEX
Try this tiny attached tmcommand.
in BASH:
echo "start line : $TM_INPUT_START_LINE" echo "start index: $TM_INPUT_START_LINE_INDEX" echo "length : ${#TM_SELECTED_TEXT}"
--Hans