The Software Developer's Command Line Toolkit

@BradUrani Carpinteria, CA

Diamond Sponsor, RailsConf 2018 Diamond Sponsor, RailsConf 2017 Diamond Sponsor, RubyConf 2015

@BradUrani

@BradUrani @BradUrani > 1,500,000 Lines of Ruby

Started 2005 Rails 0.95

@BradUrani

IBrad do 2013 .Net on Windows. What's this command line thing? 2013

@BradUrani EVERYTHINGBrad 2013 COMMAND LINE EVERYTHING NOW! 2018

@BradUrani Dotfiles

@BradUrani @BradUrani

You will break everything at some point…

@BradUrani You will break everything at some point…

At work...

@BradUrani You will break everything at some point…

At work…

It will be embarrassing

@BradUrani But you will fix it

@BradUrani WARNING: this gets addictive Shells I'm a shell I'm cool! Terminal (iTerm)

Shell (Zsh) The default Korn Bash Z Shell Korn Fish

Like Bash, but better Bash Z Shell KornShell Fish Shell Z Shell Zsh % chsh -s /bin/zsh % for i in {1..5}; do echo $i; done 1 2 3 4 5

7 8 9 10 #!/bin/bash for i in $( ls ); do echo item: $i done .zshrc # ~/.zshrc be='bundle exec' # ~/.zshrc alias be='bundle exec' alias bers='bundle exec rails s' # ~/.zshrc function mcd() { mkdir -p "$1" && cd "$1"; } # ~/.zshrc g() { if [[ $# -gt 0 ]]; then git "$@" else git status fi } # ~/.zshrc man() { env \ LESS_TERMCAP_mb=$(printf "\e[1;31m") \ LESS_TERMCAP_md=$(printf "\e[1;31m") \ LESS_TERMCAP_me=$(printf "\e[0m") \ LESS_TERMCAP_se=$(printf "\e[0m") \ LESS_TERMCAP_so=$(printf "\e[1;44;33m") \ LESS_TERMCAP_ue=$(printf "\e[0m") \ LESS_TERMCAP_us=$(printf "\e[1;32m") \ man "$@" }

default

git branch

...and unstaged, staged, commited

...and diff w/origin current dir current branch commits behind origin/master commits ahead of origin/master staged changes unstaged changes

FZF

To Vim or not to Vim? 1. Suffering 1. Suffering 2. Stockholm Syndrome 1. Suffering 2. Stockholm Syndrome 3. Sunk Cost Fallacy Vim on Laptop Vim on Server PSQL # ~/.psql

\set QUIET 1 \pset null '[NULL]'

\set PROMPT1 '%[%033[1m%]%M %n@%/%R%[%033[0m%]%# ' \set PROMPT2 '[more] %R > '

\timing

\x auto \set VERBOSITY verbose \set HISTFILE ~/.psql_history- :DBNAME \set HISTCONTROL ignoredups \set COMP_KEYWORD_CASE upper \unset QUIET # ~/.psql

\set QUIET 1 \pset null '[NULL]'

\set PROMPT1 '%[%033[1m%]%M %n@%/%R%[%033[0m%]%# ' \set PROMPT2 '[more] %R > '

\timing

\x auto \set VERBOSITY verbose \set HISTFILE ~/.psql_history- :DBNAME \set HISTCONTROL ignoredups \set COMP_KEYWORD_CASE upper \unset QUIET

~/.psql

\set QUIET 1 \pset null '[NULL]'

\set PROMPT1 '%[%033[1m%]%M %n@%/%R%[%033[0m%]%# ' \set PROMPT2 '[more] %R > '

\timing

\x auto \set VERBOSITY verbose \set HISTFILE ~/.psql_history- :DBNAME \set HISTCONTROL ignoredups \set COMP_KEYWORD_CASE upper \unset QUIET

~/.psql

\set QUIET 1 \pset null '[NULL]'

\set PROMPT1 '%[%033[1m%]%M %n@%/%R%[%033[0m%]%# ' \set PROMPT2 '[more] %R > '

\timing

\x auto \set VERBOSITY verbose \set HISTFILE ~/.psql_history- :DBNAME \set HISTCONTROL ignoredups \set COMP_KEYWORD_CASE upper \unset QUIET

GIT [user] name = Brad Urani email = [email protected] [pull] default = current [merge] ff = yes [color "diff"] meta = yellow bold frag = magenta bold old = red bold new = green bold whitespace = red reverse [color "status"] added = yellow changed = green untracked = cyan [color "branch"] current = yellow reverse local = yellow remote = green [branch "master"] remote = origin merge = refs/heads/master [alias] cm = commit -v com = checkout master br = branch df = diff --color dfm = diff master --color dfom = diff origin/master --color dfn = diff --color --name-only rbom = rebase origin/master hist = log --pretty=format:'%h %ad | %s%d [%an]' --graph --date=short lg = log --color --graph --pretty=format:'%Cred%h%Creset -%(yellow)%d%Creset%s %Cgreen(%cr) %C(bold blue)<%an>%Creset' --abbrev-commit su = submodule update --init --recursive pom = pull origin master s = status pu = push -u ignored = ls-files --others --ignored --exclude-standard codb = !git fetch && git checkout origin/master db/structure.sql && bundle exec rake db:migrate commend = commit --amend --no-edit dfom = diff origin/master --color lg = log --color --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset%s %Cgreen(%cr) %C(bold blue)<%an>%Creset' --abbrev-commit .git ├── COMMIT_EDITMSG ├── FETCH_HEAD ├── HEAD ├── ORIG_HEAD ├── config ├── gc.log ├── gitk.cache ├── hooks ├── index ├── info ├── logs ├── modules ├── objects ├── packed-refs └── refs # .git/hooks/pre-push protected_branch='master' current_branch=$(git symbolic-ref HEAD | sed -e 's,.*/\(.*\),\1,') exec < /dev/tty PUSH_PROMPT="You're about to push master, is that what you intended? [y|n] " if [ "$protected_branch" = "$current_branch" ] then if command -v cowsay >/dev/null then cowsay "$PUSH_PROMPT" else printf "\n***************************************************************\n" printf "%s\n", "$PUSH_PROMPT" printf "***************************************************************\n" fi read -p "" REPLY if echo "$REPLY" | grep -E '^[Yy]$' > /dev/null then 0 # push will execute fi exit 1 # push will not execute else exit 0 # push will execute fi Ruby .gemrc

.rspecrc

.railsrc # ~/.gemrc

gem: --no-document # ~/.rspec

--colour

--order random # ~/.railsrc

--database=postgresql --skip--unit --skip-turbolinks PRY

@BradUrani # ~/.pryrc if defined?(PryByebug) Pry.commands.alias_command 'cc', 'continue' Pry.commands.alias_command 'ss', 'step' Pry.commands.alias_command 'nn', 'next' Pry.commands.alias_command 'ff', 'finish' end Pry.commands.alias_command 'ee', 'exit' Pry.commands.alias_command 'sh', 'show-source' Pry.commands.alias_command 'dd', 'disable-pry' # ~/.pryrc begin require 'awesome_print' AwesomePrint.pry! rescue LoadError warn "awesome_print not installed" end # ~/.pryrc begin require 'factory_girl' FactoryGirl.find_definitions include FactoryGirl::Syntax::Methods rescue => e end # ~/.pryrc

Pry::Commands.command "sql", "Send sql over AR." do |query| if ENV['RAILS_ENV'] || defined?(Rails) ap ActiveRecord::Base.connection.select_all(query).to_a else ap "No rails env defined" end end TMUX

@BradUrani Github

@BradUrani

Installing your dotfiles:

● Use rcm

@BradUrani

Installing your dotfiles:

● Use rcm ● Use a gem

@BradUrani

Installing your dotfiles:

● Use rcm ● Use a gem ● Write your own !

@BradUrani

To fork or not to fork?

Don't check in secret stuff!

@BradUrani # ~/.zshrc if [[ -a ~/.localrc ]] then source ~/.localrc fi Go Experiment!

He means it!

@BradUrani Resources

● https://medium.com/@webprolific/getting-started-with-dotfiles-43c36 02fd789 ● https://github.com/thoughtbot/dotfiles ● https://github.com/webpro/awesome-dotfiles Who am I?

I tweet at @BradUrani

I work in Santa Barbara at linkedin.com/in/bradurani