Adding Quicklook support for Ruby files with different/no extensions (e.g. rake files)

March 4th, 2010 Sean DeNigris No comments

1. Download the excellent qlcolorcode bundle from Google Code

2. Add the following line to QLColorCode.qlgenerator/Contents/Info.plist:

<string>public.data</string>
So that it looks like this:
3. In QLColorCode.qlgenerator/Contents/Resources/colorize.sh, add (and customize) the highlighted code, which you can get at github:
4. Oops!  Forgot, you may have to sudo touch /path/to/QLColorCode.qlgenerator for changes to take effect
Categories: Mac, Ruby Tags: , ,

Quicklook any plain-text file e.g. HAML or ERB

March 3rd, 2010 Sean DeNigris No comments

I’m often jumping from file to file in Rails, so I really wanted Quicklook support for my template files.  Unfortunately, the suggestions I found online were confusing and incomplete.

Here’s a really easy way to get it done – but no syntax highlighting :(

1. Show the contents of TextEdit’s package

2. Open Info.plist in a text editor… like TextEdit, perhaps… hmm…
3. Anyway, add the following snippet (find the code on github):


Put it just before the following section:

4. Customize
  • UTTypeDescription - put in description of your choice (although you probably don’t need to)
  • UTTypeIdentifier – apparently (and this is what was missing from other descriptions), you just make something up here
  • public.filename-extension – add as many extensions as you want to map to this file type
5. Gloat

Categories: Mac, Rails, Uncategorized Tags: , , ,

Rails text_field_with_auto_complete and Formtastic

March 1st, 2010 Sean DeNigris No comments

Formtastic is an awesome gem to make form creation easy and fun. Rails built-in autocompletion feature is also easy to use and a great service to users. However, they don’t play well together out of the box…

As you can see, the popup auto-complete menu and controls that follow are all jumbled up.  Luckily, the fix is very simple (after spending hours yelling at the computer, lol).  In formtastic_changes.css, add the following (get from github):

And everything’s right as rain…

Categories: Rails Tags: , ,

Reload Rails server to recognize plugins

March 1st, 2010 Sean DeNigris No comments

I’ve been following the excellent videos at Railscasts.com, but many times (especially after loading plugins or changing my layout files), I wouldn’t get the result from the video. What I found was that I needed to restart the Rails server to have the changes take effect. I remember for sure this happened while implementing the auto_complete text_field functionality.

Categories: Ruby Tags: , ,

Yes, You Can Applescript “Unscriptable” Applications (like Preview)… A Little

February 13th, 2010 Sean DeNigris No comments

Even though Preview doesn’t advertise scriptability, it at least responds to events needed by GUI applications in Mac OS X, including open…

From Mac Dev Center:

Apple Events Sent by the Mac OS
The Mac OS takes advantage of Apple events to communicate with applications, such as to notify an application that it has been launched or should open or print a list of documents. Applications that present a graphical user interface must be able to respond to whichever of these events make sense for the application. For example, all such applications can be launched and quit, but some may not be able to open or print documents.

So you can just say, for example:

tell application "Preview" to open POSIX file "/path/to/file.jpg"
Categories: Uncategorized Tags:

Premature optimization – wait, I learned that 10 years ago

February 12th, 2010 Sean DeNigris No comments

In reading Refactoring: Ruby Edition, I’m “learning” a lot of things that I already know, lol.

Optimization vs. Clarity

For instance… how many times have I heard “avoid premature optimization?” Yep, check, got that one; I would never do that.  Except I do!  I mean, I won’t go out of my way to optimize at first.  But I’m in this loop, and I want to record this other information that has nothing to do with what I’m doing right now… Let me just throw it in this temporary variable to use later.

Judges (Fowler, Beck, et al.).  Buuuuzzzzzzz, wrong answer.  Their advice (and you may not believe this, but I actually feel free now that it’s sunk in): don’t optimize with that temporary variable now, just code for clarity and repeat the loop as many times as it takes to get the info you need.  ”Holy crap,” I thought.  ”I’m not going to repeat that loop three times – that’s so inefficient!”  But luckily, the authors could sense me squirming in my seat, and added that I shouldn’t worry because, although this idea frequently causes “angst” in their presentation audiences

almost all the time extra method calls won’t matter; in the rare cases they do, they can be dealt with later

This is great, Kent Beck gave me permission to repeat loops over and over if the code is cleaner!

Categories: Software Engineering Tags:

A Small but Effective Tweak to Vim’s snipMate plugin

February 6th, 2010 Sean DeNigris No comments

Already awesome

If you haven’t tried snipMate, you have to give it a test-drive.  If you want to define a new ruby class in Vim, type “cla<tab>” and you’re presented with your choice of class templates:

Enter a number, and the code is automagically generated for you.

The tweak

By default, hitting enter at the menu cancels the snippet.  However, a user can already easily cancel using escape, and this probably won’t happen all that often anyway (I don’t think ever for me).  So I altered the code to choose the first (most common) snippet if no number is entered.  This saves me a non-home-row keystroke in almost 100% of my usage.

The code

In plugin/snipMate.vim, comment out the last line of the s:ChooseSnippet function and add two lines in it’s place:

fun s:ChooseSnippet(scope, trigger)
  [snip...]
  " Original last line (which cancels on enter) commented out
  "return num == -1 ? '' : s:multi_snips[a:scope][a:trigger][num][1]

  " Two lines added to choose first snippet if none are selected
  let snip_to_return = num == -1 ? 0 : num
  return s:multi_snips[a:scope][a:trigger][snip_to_return][1]
endf

Pretty simple, huh? Oh, just remember to save a copy of the changed lines somewhere.  When you update the plugin, your changes will be erased and you’ll have to re-paste them.

Categories: Software Engineering Tags:

Autospec with custom directory/file names

January 17th, 2010 Sean DeNigris No comments

Autotest is a great time-saver when doing BDD (or TDD for the less-enlightened, lol).  Autospec seemlessly integrates Rspec.  However, if you don’t use the expected “spec/*_spec.rb” structure, autotest will not find your specs – or examples, as I call them.

It is very easy to use whatever structure you want using the following steps:

Telling Autotest to use Rspec as the test runner

The first thing you want to happen is for Autotest to use Rspec as the test runner.  This usually happens automatically using autospec, which tests for the presence of the spec directory.  Since we do not want a spec directory, we must tell explicitly tell Autotest to do this.  So:

Step 1: in your project directory create a file autotest/discover.rb with the following line:

Autotest.add_discovery { "rspec" }

Teaching Autotest about our custom directory structure

In order to do this, we have two options.  If we want to use the same structure for all our projects, we can put a file in our home directory, otherwise we can add custom files to each project directory.

Step 2: create a file .autotest with the following code:


class Autotest::Rspec < Autotest remove_method :consolidate_failures def consolidate_failures(failed) filters = new_hash_of_arrays failed.each do |spec, trace| if trace =~ /\n(\.\/)?(.*example\.rb):[\d]+:/ filters[$2] << spec end end return filters end remove_method :add_options_if_present def add_options_if_present # :nodoc: File.exist?("examples/spec.opts") ? "-O examples/spec.opts " : "" end end Autotest.add_hook(:initialize) {|at| %w{.git .svn .hg .swp .DS_Store ._* tmp}.each do |exception| at.add_exception(exception) end at.clear_mappings # take out the default (test/test*rb) at.add_mapping(%r%^(examples|third_party)/.*_example.rb$%) { |filename, _| filename } at.add_mapping(%r%^lib/(.*)\.rb$%) { |_, m| ["examples/#{m[1]}_example.rb"] } at.add_mapping(%r%^examples/(example_helper|shared/.*)\.rb$%) { at.files_matching %r%^(examples|third_party)/.*_example\.rb$% } #nil }

Let’s take it piece by piece:


def consolidate_failures(failed)
  filters = new_hash_of_arrays
  failed.each do |spec, trace|
    if trace =~ /\n(\.\/)?(.*example\.rb):[\d]+:/
      filters[$2] << spec
    end
  end
  return filters
end

This method tells Autotest which test files have failed by pulling the file names out of the test output. Since autospec looks for *_spec.rb files, it will not find our custom files. I use *_example.rb filenames, so you should replace that part of the regex with whatever you use.


def add_options_if_present # :nodoc:
    File.exist?("examples/spec.opts") ? "-O examples/spec.opts " : ""
  end

This method tells Rspec where to find an option file. Again, replace the details with whatever you use.

In Autotest.add_hook(:initialize):

  %w{.git .svn .hg .swp .DS_Store ._* tmp}.each do |exception|
    at.add_exception(exception)
  end

This tells Autotest to ignore certain files that are irrelevent to testing

at.clear_mappings

This tells Autotest not to use any other mappings i.e. the default test/test*rb, or Rspec’s spec/*_spec.rb

at.add_mapping(%r%^(examples|third_party)/.*_example.rb$%) { |filename, _|
  filename
}
at.add_mapping(%r%^lib/(.*)\.rb$%) { |_, m|
  ["examples/#{m[1]}_example.rb"]
}
at.add_mapping(%r%^examples/(example_helper|shared/.*)\.rb$%) {
  at.files_matching %r%^(examples|third_party)/.*_example\.rb$%
}

This is the meat of the customization. It tells Autospec, based on which files have changed, which tests to run. Replace my regexes with your custom matches.

The end

Once you have added both these files, running autospec from your project directory will work as it should!

Fixing Parallels Desktop Start menu and Spotlight Clash

December 13th, 2009 Sean DeNigris No comments

Parallels Desktop crystal mode is awesome.  When combined with the “Mac look” option, you don’t even know you’re in Windows…

The only issue I ran into is that when you hit CMD+Space for Spotlight, the Windows Start menu pops up and makes Spotlight disappear.  The fix was easy enough:

  1. Exit crystal mode
  2. Go to Parallels Preferences menu
  3. Under the Keyboard & Mouse tab, create two shortcuts
    1. Change the Cmd -> Win shortcut to whatever you want to open the Windows Start menu (you can see I set it to Ctrl+Space above, in the spirit of Spotlight)
    2. Create a dummy Cmd shortcut to Ctrl (basically to have it od nothing in Windows).  This will just have Parallels forward the Cmd to the Mac side and open Spotlight.
Categories: Mac Tags:

Cucumber.vim

December 12th, 2009 Sean DeNigris No comments

Awesome plug-in!  Uh, ok… but what the heck does it do?!?!  Here’s a list of the goodness:

  • syntax highlighting

  • Jump to steps
    • CTRL-] opens the step definition in the current window
    • CTRL-W ] opens it in a split window (optionally hold CTRL with the ‘]’)
    • CTRL-W opens in a split preview window
  • Autocomplete – it seems from the source that it should work, but I can’t get it going.  I posted a question on the cucumber mailing list.
    Categories: Software Engineering Tags: ,