Table of Contents
- Introduction to IRB and Customization
- Understanding IRB Configuration Files
- Basic Customizations to Enhance Your Workflow
- Advanced Customizations with Gems
- Keybindings and Navigation
- Loading Scripts and Libraries on Startup
- Sharing and Versioning Your .irbrc
- Troubleshooting Common Issues
- Conclusion
- References
Introduction to IRB and Customization
IRB (Interactive Ruby) is a REPL (Read-Eval-Print Loop) that ships with Ruby, allowing you to execute Ruby code interactively. It’s invaluable for testing ideas, debugging, and exploring APIs. However, the default IRB experience is minimal: a simple prompt, no syntax highlighting, and limited history.
Customizing IRB via its configuration file (.irbrc) lets you tailor the environment to your needs. You can add syntax highlighting, auto-load frequently used gems, define custom prompts, and even set up keybindings for faster navigation. The result? A more efficient, enjoyable, and personalized workflow.
Understanding IRB Configuration Files
IRB’s behavior is controlled by a configuration file named .irbrc, typically located in your home directory (~/.irbrc). This file is a Ruby script, meaning you can write any valid Ruby code in it—from simple variable assignments to complex method definitions.
.irbrc Location and Loading Order
IRB loads configuration in the following order (stopping at the first found file):
- The path specified by the
IRBRCenvironment variable (e.g.,export IRBRC=~/.config/irb/irbrc). ~/.irbrc(the default location for most users)./etc/irbrc(system-wide configuration, less common).
To check which .irbrc IRB is using, start IRB with the --verbose flag:
irb --verbose
Basic Structure of an .irbrc File
Your .irbrc is a Ruby script, so it can include:
- Variable assignments (e.g., setting
IRB.confoptions). - Method definitions (e.g., utility functions).
requirestatements (e.g., loading gems likeawesome_print).- Conditionals (e.g., checking if a gem is installed before loading it).
Example minimal .irbrc:
# ~/.irbrc
puts "Loading custom IRB config..."
# Enable auto-indentation
IRB.conf[:AUTO_INDENT] = true
# Set prompt mode to simple
IRB.conf[:PROMPT_MODE] = :simple
Basic Customizations to Enhance Your Workflow
Customizing the Prompt
The IRB prompt is what appears before each input line (e.g., irb(main):001:0>). You can customize it to show useful info like the current directory, Ruby version, or git branch.
IRB supports predefined prompt modes (e.g., :default, :simple, :xmp), but you can also define a custom prompt.
Predefined Prompt Modes
Set a predefined mode with IRB.conf[:PROMPT_MODE]:
# Use the "simple" prompt (e.g., >> )
IRB.conf[:PROMPT_MODE] = :simple
Custom Prompt
Define a custom prompt by configuring IRB.conf[:PROMPT][:CUSTOM_NAME]. For example, a prompt showing the current directory and Ruby version:
# Define a custom prompt
IRB.conf[:PROMPT][:CUSTOM] = {
:PROMPT_I => "%{dir} > ", # Normal input prompt
:PROMPT_N => "%{dir} > ", # Continuation prompt (e.g., multi-line code)
:PROMPT_S => "%{dir} > ", # String continuation prompt
:PROMPT_C => "%{dir} > ", # Command prompt (e.g., `irb> help`)
:RETURN => "=> %s\n" # Format for return values
}
# Use the custom prompt
IRB.conf[:PROMPT_MODE] = :CUSTOM
# Add dynamic data (e.g., current directory) to the prompt
IRB.conf[:PROMPT][:CUSTOM][:PROMPT_I] = "%{pwd} > "
Here, %{pwd} inserts the current working directory. Other placeholders include %N (Ruby version), %m (method name), and %l (line number).
Enabling History Persistence
By default, IRB doesn’t save command history between sessions. To persist history, configure IRB.conf[:HISTORY_FILE] and IRB.conf[:SAVE_HISTORY]:
# Save history to ~/.irb_history
IRB.conf[:HISTORY_FILE] = File.expand_path("~/.irb_history")
# Save the last 10,000 commands
IRB.conf[:SAVE_HISTORY] = 10000
Now, your commands will persist across IRB sessions, and you can use the up/down arrows to recall them.
Auto-Indentation and Syntax Highlighting
Auto-indentation makes multi-line code (e.g., loops, classes) more readable. Enable it with:
IRB.conf[:AUTO_INDENT] = true
Syntax highlighting isn’t built into IRB by default, but we’ll cover it later with the wirb gem (see Advanced Customizations).
Setting Default Encoding and Environment
Ensure IRB uses UTF-8 (recommended for most projects) and set environment variables:
# Set default encoding to UTF-8
IRB.conf[:ENCODING] = "UTF-8"
# Set environment variables (e.g., RAILS_ENV for Rails projects)
ENV["RAILS_ENV"] ||= "development"
Advanced Customizations with Gems
Gems extend IRB’s functionality. Here are some essential ones:
Adding Syntax Highlighting with wirb
wirb adds syntax highlighting to IRB output. Install it first:
gem install wirb
Then enable it in .irbrc:
begin
require 'wirb'
Wirb.start
rescue LoadError
puts "Wirb not installed. Run `gem install wirb` for syntax highlighting."
end
Customize colors by configuring Wirb::Colorize:
Wirb::Colorize.colors = {
:symbol => :green,
:string => :blue,
:integer => :red
}
Pretty-Printing Output with awesome_print
awesome_print formats Ruby objects (hashes, arrays, etc.) in a human-readable way, replacing IRB’s default pp (pretty-print).
Install it:
gem install awesome_print
Enable it in .irbrc and alias ap to awesome_print for convenience:
begin
require 'awesome_print'
# Use awesome_print for output
IRB.conf[:OUTPUT_PREFIX] = "" # Remove default "=> " prefix
AwesomePrint.irb! # Integrate with IRB
alias ap awesome_print # Alias `ap` to `awesome_print`
rescue LoadError
puts "awesome_print not installed. Run `gem install awesome_print` for pretty output."
end
Now, typing ap { name: "Alice", age: 30 } will display a formatted hash.
Improving Debugging with byebug or pry-byebug
For advanced debugging, replace IRB’s built-in debugger with byebug (or pry-byebug for Pry integration).
Install byebug:
gem install byebug
Auto-load it in .irbrc so you can use byebug anywhere:
begin
require 'byebug'
rescue LoadError
puts "byebug not installed. Run `gem install byebug` for debugging."
end
Tab Completion Enhancements
IRB uses Readline for tab completion, but you can enhance it with bond (a more powerful completion library).
Install bond:
gem install bond
Configure it in .irbrc to add completion for method arguments, hashes, and more:
begin
require 'bond'
Bond.start
rescue LoadError
puts "bond not installed. Run `gem install bond` for better tab completion."
end
Keybindings and Navigation
IRB uses Readline for input handling, supporting Emacs or Vi-style keybindings.
Emacs vs. Vi Mode
By default, IRB uses Emacs mode (common shortcuts: Ctrl+A to jump to start of line, Ctrl+E to end). To switch to Vi mode (for Vim users):
Readline.vi_mode
To confirm the mode:
puts "Readline mode: #{Readline.emacs_mode? ? 'Emacs' : 'Vi'}"
Custom Keybindings
Define custom keybindings using Readline.binding:
# Example: Bind Ctrl+L to clear the screen
Readline.binding.press('C-l') { system('clear') }
Loading Scripts and Libraries on Startup
Avoid repetitive require statements by auto-loading gems and scripts in .irbrc.
Requiring Common Gems Automatically
If you frequently use gems like json, date, or active_support/core_ext, require them on startup:
# Auto-load common gems
%w(json date active_support/core_ext).each do |lib|
begin
require lib
rescue LoadError
puts "Warning: #{lib} not installed. Skipping."
end
end
Defining Utility Methods
Add custom utility functions to .irbrc for daily tasks:
# Example: Time execution of a block
def timeit(&block)
start = Time.now
result = block.call
puts "Time: #{Time.now - start}s"
result
end
# Example: Pretty-print JSON
def json_pp(obj)
puts JSON.pretty_generate(obj)
end
Now you can use timeit { sleep 1 } or json_pp({ name: "Bob" }) directly in IRB.
Sharing and Versioning Your .irbrc
Treat your .irbrc like code—version it with Git and sync it across machines.
Using Git for Configuration Management
Store .irbrc in a Git repository (e.g., a “dotfiles” repo):
# Initialize a dotfiles repo (if you don't have one)
mkdir ~/dotfiles && cd ~/dotfiles
git init
mv ~/.irbrc .
ln -s ~/dotfiles/.irbrc ~/.irbrc # Symlink to home directory
git add .irbrc && git commit -m "Initial .irbrc commit"
Syncing Across Machines
Sync your .irbrc across devices using:
- Git: Clone your dotfiles repo and symlink
.irbrc. - Tools like Chezmoi: A dotfile manager that handles symlinks and templating.
- Cloud storage: Dropbox or Google Drive (less ideal for code, but simple).
Troubleshooting Common Issues
.irbrc Not Loading
- Check location: Ensure
.irbrcis in~/.irbrc(orIRBRCenvironment variable is set). - Permissions: Verify the file is readable (
chmod 644 ~/.irbrc). - Syntax errors: Run
ruby ~/.irbrcto check for Ruby syntax errors. - Verbose mode: Start IRB with
irb --verboseto see loading logs.
Gem Conflicts
If a gem in .irbrc causes errors (e.g., missing dependency), wrap it in a begin-rescue block:
begin
require 'non_existent_gem'
rescue LoadError => e
puts "Error loading gem: #{e.message}"
end
Conclusion
Customizing IRB transforms it from a basic REPL into a powerful, personalized tool. By tweaking your .irbrc, you can save time, reduce friction, and make interactive Ruby development more enjoyable. Start small—add a custom prompt or auto-load a favorite gem—then experiment with advanced features like syntax highlighting and keybindings.
Your .irbrc is a reflection of your workflow—invest time in it, and it will pay dividends daily.