[TxMt] TMTOOLS plugin

Hans-Joerg Bibiko bibiko at eva.mpg.de
Thu Sep 20 07:43:29 UTC 2007


Hi,

Over the past years I wrote some very tiny code snippets in order to  
save time while using TM. I copy&pasted it from one code to a new  
command etc. Then I had the idea to put everything together in a  
plugin to use my code snippets more flexible.
Ok, I did this. I took the idea of tm_dialog, Joachim Mårtensson's  
completion menu, and me tiny code snippets. The result is the TMTOOLS  
plugin.

usage:
"$TMTOOLS" -[fsgiem] -p PLIST
f --extended-popup
s --set
g --get
i --insert
e --execute
m --play macro

Each of the following commands can be used within any tmCommand/ 
script written in bash, ruby, perl, etc.

(tentative) LIST OF COMMANDS:
-----------------------------------------------
Show as completion menu:
-TM's internal word list completion
-Word completion with Cocoa's spellchecker dictionaries of different  
languages
  (TM's internal word completion list is added before the  
spellchecker's list :)
-File/Path Completion

-Insert text
-Insert text as snippet

Set: (also as batch)
-set word characters
-place the caret to
-select something within the document
-set tab size
-set soft tabs
-set soft wrap
-set the language/grammar by its name
-set show line numbers
-set font size
-set font name
-set bookmarks for lines
-set userdefault for a key

-play a dynamic generated macro

Get:
-get the _current_ text from the document
-get the XML representation of the document
-get the XML representation of the selection
-get the position under the caret
-get all bookmarks out the current document
-get all symbols
-is document edited?
-get font size
-get font name
-get current stylesheet
-get all opened files in a project
-get the default for a key
-get the head of the current line according to the caret
-get the tail of the current line according to the caret
-get the head of the current word according to the caret
-get the tail of the current word according to the caret

Execute: (also as batch)
-reloadBundles
-select current scope
-run any macro, command, template, or snippet by its name
-open saveAs panel
-open open Panel
-open web preview
-open bundle editor
-open print panel
-center selection in window
-delete all bookmarks
-go to next/previous snippet field

-convert a text according to unicode's mapping [(de)compose]


and some more...


One can do very nice things with TMTOOLS.
E.g., by myself I'm using very often
-go to next snippet field and show suggestions according the selected  
text, select a suggestion, and go to the next snippet field
(It was always annoying to see only 'NSStringEncoding'. Now, if the  
snippet field is 'NSStringEncoding' it shows me 'NSUTF8Encoding,  
NSASCIIStringEncoding, NSJapaneseEUCStringEncoding, ...'. Or if the  
snippet field is something like uft8|ascii|utf16, it gives me these  
items as inline menu. )
-create an HTML page out of my document, change the  font size, and  
open the web preview
-get all bookmarks, show a inline menu, and go to the selected bookmark
-open a text document *.txt, set my grammar to a language which  
highlights consonat clusters, hide line numbers
-open a text document *_jp.txt, set the font name to ForMateKonaVe  
and size to 14pt, to input Japanese
-the chance to execute dynamic generated macros - very helpful ;)
-if you have a long text you can set bookmarks to line  
50,100,150,200,...

To illustrate the syntax of such commands here some examples:

play a macro:
"$TMTOOLS" -m -p '{
     commands = (
         {command = "moveWordRight:"; },
         {command = "moveWordLeftAndModifySelection:"; },
         {command = "moveWordLeftAndModifySelection:"; },
         {command = "moveWordLeftAndModifySelection:"; }
     );
}' $val

set a grammar:
"$TMTOOLS" --set -p '{grammar;to="Objective-C++";}'

set as batch:
"$TMTOOLS" -s -p '{
   batch=(
     {grammar;to=Perl;},
     {wordchars;to="_$";},  <= this is very useful ;)
     {caret;toLine=2;toColumn=2;},
     {selection;toColumn=end;}
   );
}'

execute as batch:
"$TMTOOLS" -e -p '{
   batch=(
     {command;name="Add Line Numbers to Document / Selection";},
     {command;name="Duplicate Line / Selection";},
     {macro;name="Move to EOL and Insert “.”";}
   );
}'

go to next snippet field and show according to its selection a inline  
menu with suggestions:
"$TMTOOLS" -e -p '{nextsnippetfield;}'
"$TMTOOLS" -e -p '{command;name="ShowAsList";}'

prepare a coloured print version of my document:
"$TMTOOLS" -e -p '{command;name="Create HTML From Document /  
Selection";}'
"$TMTOOLS" -m -p '<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http:// 
www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
	<key>commands</key>
	<array>
		<dict>
			<key>argument</key>
			<dict>
				<key>action</key>
				<string>replaceAll</string>
				<key>findInProjectIgnoreCase</key>
				<false/>
				<key>findString</key>
				<string>font-size: .*?px</string>
				<key>ignoreCase</key>
				<true/>
				<key>regularExpression</key>
				<true/>
				<key>replaceAllScope</key>
				<string>document</string>
				<key>replaceString</key>
				<string>font-size: 8px</string>
				<key>wrapAround</key>
				<true/>
			</dict>
			<key>command</key>
			<string>findWithOptions:</string>
		</dict>
	</array>
</dict>
</plist>
'
"$TMTOOLS" -e -p '{showwebpreview;}'



convert the unicode mapping of the entire document:
IN=$(cat)
PLIST="{convert;what=\"$IN\";using="nfd";}"
"$TMTOOLS" -g -p "$PLIST"

#  allowed parameters for key 'using'
#
#   nfd   =  decompose according to canonical mapping
#   nfc   =  compose according to canonical mapping
#   kd    =  decompose according to canonical compatibility mapping
#   kc    =  compose according to canonical compatibility mapping
#
#  see more at http://www.unicode.org/reports/tr15/



set the selection from the caret 4 chars back:
"$TMTOOLS" --set -p '{selection;length=-4;}'



one has the line "This is rub|bish and" [| = caret]:
"$TMTOOLS" -g -p '{wordaftercaret;}'
gives you "bish"


Up to now this plugin is more or less a collection. I have to fixed  
some error handlings, unify the output, etc.

So, my question whether it would be worth to clean the code and  
publish it. In other words: Is someone interested in such a plugin?
One has to mention that TMTOOLS depends on Allan's code. If he  
changes the code maybe one has to adjust TMTOOLS' code as well. Then  
Allan plans to include some of these commands in TM2.

Any feedback?

Cheers,

Hans





More information about the textmate mailing list