Add command to convert 1.8 hash syntax into new alternate (hashrocket-free) syntax #19

merged 2 commits into from Oct 11, 2011


None yet
2 participants

whatcould commented Oct 10, 2011

To either annoy or placate other developers you're working with, depending on their syntax preference.

  • Converts current line or selected text
  • Uses option-command-= for shortcut key (shortcut for hash-rocket is control-L, but that seemed more ergonomic than memorable).
@whatcould whatcould Add command to convert hashrocket syntax to 1.9 hash syntax
* Uses option-command-equals for shortcut key
* Converts current line or selected text

JEG2 commented Oct 10, 2011

I think it's handy to have a command like this, but I think we should make it toggle between the old and new styles. This makes it fit better with commands like Ruby → Toggle String / Symbol and Source → Toggle *.

If we do make that change, it looks the the toggle commands usually use a keyboard shortcut of ⌃ plus some meaningful character. ⌃: and ⌃{ are taken, so maybe we could use your = but with ⌃ for ⌃=.



whatcould commented Oct 10, 2011

Right, I thought of htat but then I'd have to figure out how to write a regex to toggle back from the new syntax to the old!

The hashrocket syntax is pretty straightforward, but the new syntax is a lot harder to reliably match, since colons are in regular use. Take this hash, for example:

{book: "A Book Title: A book subtitle", sentence: "Some may say: try harder"}

Guess I'd just have to ignore colons within strings? I'd have to think about that for a bit.


JEG2 commented Oct 10, 2011

Yeah. You could have TextMate pass you the scope delimited content, but I'm not sure that's even needed in this case. This gets us reasonably close, I think:

>> %q{{book: "A Book Title: A book subtitle", sentence: 'Some may \'say: try harder\'', number: 1_024, var: var, method: m(1, 2, 3)}}.gsub(/\G(\{|,\s*)(\w+):(\s*(?:"(?:\\"|[^"])*"|'(?:\\'|[^'])*'|\w+\([^)]*\)|[^,]+))/
=> "{:book => \"A Book Title: A book subtitle\", :sentence => 'Some may \\'say: try harder\\'', :number => 1_024, :var => var, :method => m(1, 2, 3)}"

whatcould commented Oct 10, 2011

Wow, that's impressive. I think you're missing some of the command? The second param to gsub is missing.


JEG2 commented Oct 11, 2011

Sorry, I'm not sure how that got cut off:

gsub(/\G(\{|,\s*)(\w+):(\s*(?:"(?:\\"|[^"])*"|'(?:\\'|[^'])*'|\w+\([^)]*\)|[^,]+))/, "\\1:\\2 =>\\3")

whatcould commented Oct 11, 2011

Ok, thanks, that is amazing. Works great. I changed it to toggle and switched the shortcut to ^=

I had to tweak it a bit -- for the toggles it's nice to have it do the whole line, and hashes don't necessarily start with { either. I suppose there might be a case where it doesn't work, but for every case in my current project it worked great, including Selecting all and hitting ^=.

JEG2 merged commit b6a4c65 into textmate:master Oct 11, 2011

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment