# Selecting a string beginning with $and ending with$

The LaTeX editor I use, TeXStudio, allows for custom script-macros. I have little experience with JAVASCRIPT, but I do have one script I managed to create after reading the TeXstudio : user manual providing me with a list of JAVASCRIPT commands.

My example (primitive) script using only the commands in the user manual

%SCRIPT
txt = cursor.selectedText()
editor.write("{")
ln = cursor.lineNumber()
cn = cursor.columnNumber()
editor.write(txt+"}")
cursor.moveTo(ln,cn);
cursor.movePosition(1,cursorEnums.Left)


The above script presupposes the cursor selected some string. Then it surrounds it with "{" "}", and leaves the cursor in the desired location.

I am interested in a similar (inverse) script where the cursor is between , and is able to select everything in between $and$.

Much like how Ctrl+W selects an entire word, I want to create a script (which will be mapped to some shortcut) that selects an entire math environment between $and$.

This script assumes (i) your cursor is lying inside the math environment $..$ already, and that (ii) the whole $...$ content lies within a single line (this condition can be relaxed, but would make for a more fragile code, I think).

NOTE: It fails (doesn't check for) the following situation:

There are $x$ apples| and $y$ oranges.


where your cursor sits on |, the result is apples and being selected. This could be improved upon, but would take a little bit more work. Last I checked, there is no function to 'check if the cursor is within a math environment'. So one probably needs to count the number of $ from the beginning of the line, check if the count is even/odd etc.etc. (But even this is not foolproof..) %SCRIPT // grab the line the cursor is on var ln = cursor.lineNumber(); var tl = editor.text(ln); // get text before and after cursor var beforeText = tl.substr(0, cursor.columnNumber()); var afterText = tl.substr(cursor.columnNumber(), tl.length); // search for last$ before cursor, and first $after cursor var op = beforeText.lastIndexOf('\$');
var cl = afterText.indexOf('\$'); if (op>=0 && cl>=0){ // match found, select everything between the $$cursor.selectColumns(op+1, cl+cursor.columnNumber()) }  In the gif, I am activating the macro with the default Shift+F1 when I'm letting the cursor sit for a while. Test case: % Test 1: Standard test There are x apples and y oranges. A longer expression might be \alpha + \beta = \gamma % Test 2:$$ across lines (fails) -- condition can be relaxed$
x + y = \sqrt{2}
\$


• I noticed (and expected) that you used commands not listed in the usermanual. Do you have a recommended beginnner / intermediate / advanced reference for learning what commands are predefined? I am quite amazed by the gif you posted. – Alberto Takase Sep 22 '18 at 22:03
• @AlbertoTakase Only cursor.selectColumns() is not listed in the user manual. The rest are either ecmascript standard functions (string manipulation) or already present in the user manual. As for reference, I don't have one, sorry. (read the source code of Texstudio?) – Troy Sep 22 '18 at 22:06