Editing with Pry
I’ve already touched a bit on the power of
pry in a previous post back in 2016. I want to revisit
pry to expand on a new functionality that I have since started using – its ability to edit.
In my personal experiences, I’ve constructed some long one-liners while in
pry. These interactive sessions do not provide a great experience for multi line commands, as you are restricted to editing only one line at a time.
pry, there is the
edit method. This opens up a temporary file (
pry’s input buffer) with a more capable editor for your task. You can configure the editor by executing the
Pry.config.editor = "vim" statement, although your environment variable
EDITOR is used by default. If you want, you can even use a GUI editor like Atom (you’ll need to use
atom --wait for this to work). If you have a specific preference, it makes sense to add this configuration in your
.pryrc so it is configured when
pry loads up.
edit will open the last executed statement issued in your session. If you want to edit with a blank canvas, then you can use the
edit -t to open a temporary buffer. You can even get fancy and re-edit older inputs using
edit --in <input-number> (i.e.,
edit --in -2 – the second last input).
Using a full editor is great for those more complex statements. Now you can break up statements into multiple lines to make it easier to comprehend and create. In the event you were slightly wrong, you can simply
edit again and fix up your statement. This is great for iteratively building longer statements. It is a common style in Ruby to use indentation when using blocks and defining classes/methods/modules, so take advantage of
The following demonstrates
pry’s multi-line editing functionality.
edit method has one more amazing trick up its sleeve – patch editing.
pry now gives you the ability to modify existing object method definitions at runtime. To quote the help text for the
Instead of editing the object’s file, try to edit in a tempfile and apply as a monkey patch
As the patch is only for the
pry session, there is a greater sense of exploring and less worry surrounding the commitment of the edit.
Some caveats that I’ve hit with this approach is that you can only patch
<class>#<method> (instance method) or
<class>.<method> (class method). You might want to edit the class itself, but you’ll hit
NotImplementedError: Cannot yet patch #<Pry::WrappedModule:0x007fcc32afecd0> objects!. Unfortunately, I’ve not yet found a nice way to get around this (so let me know if you have a way!). I know that you can modify the file itself (i.e.,
edit app/models/model.rb) but that’ll actually write to the file – I would want it done as a patch.
The following demonstrates
pry’s patch editing functionality.