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

Merged
merged 2 commits into from Oct 11, 2011

Conversation

Projects
None yet
2 participants
Contributor

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
96020fb
Contributor

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 ⌃=.

Thoughts?

Contributor

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.

Contributor

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)}"
Contributor

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.

Contributor

JEG2 commented Oct 11, 2011

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

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

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