Level Up Your Shell Game
viget.com
viget.com
Ctrl-r = reverse history search. Type a partial command after Ctrl-r and it'll find the most recent executed command with that substring in it.
Press Ctrl-r again, jump to the next oldest command containing your substring. Did you accidentally press too many Ctrl-r? Press backspace to move forward in history.
find . -name "*.png" -print0 | xargs -0 -P8 pngquant --ext .png --force 256 #optimizepng
(if you’re using zsh, you have to enable INTERACTIVE_COMMENTS option first; just run set -k)
Adding a comment there is a neat trick. It also works with bang searches (!?), almost like creating a temporary ad-hoc alias:
find . -name "*.png" -print0 | xargs -0 -P8 pngquant --ext .png --force 256 #optimizepng
... many other commands, time passes ...
!?optimizepngIf earlier I had a long command like `mvn clean test && mvn deploy -P release`, I can just type `mvn v` and press up on the arrows. zsh will present only history entries that start with what I've typed. Insanely useful!
## arrow up
"\e[A":history-search-backward
## arrow down
"\e[B":history-search-forward
(in .inputrc)
Backspace normally just deletes the last character in your incremental search string.
And be sure that C-s / C-q aren't set up for terminal flow control with something like:
stty start undef stop undef [alias]
br = branch
co = checkout
ci = commit -v
sci = svn dcommit --interactive
cp = cherry-pick
l = log --pretty=oneline --abbrev-commit
l3 = log --pretty=oneline --abbrev-commit -n3
lm = log --pretty=oneline --abbrev-commit master..
rc = rebase --continue
st = status -sb
squash = !git rebase -i --autosquash $(git merge-base master HEAD)
Also, I prefer to set aliases in my ~/.functions instead of in ~/.bash_profile or ~/.bashrc. I find that this makes it easier to move the .functions file from one machine to another, especially on a lab/test machine with a shared account where I shouldn't be modifying things in the shared ~/.bashrc. To make this work, you can add this to your ~/.bashrc or ~/.bash_profile: if [ -f ~/.functions ]; then . ~/.functions; fi
This will source your .functions file if it exists when your .bashrc is run.A tweak to the "editbash" suggested alias will make it so that you don't have to reopen your terminal. My equivalent alias is "vif", for "vi .functions":
alias vif='vi ~/.functions; . ~/.functions'
Note that the second command (after the semicolon) sources the modified .functions file.Lastly: brevity is king. I love 'alias psgrep="ps aux | grep"', since I use it several times a day, but to "level up your shell game", keep it short. My alias for this command is "psg". The other alias that I use all the time is "d" -- "alias d='ls -lFh --color --group-directories -v'".
'ps aux | grep' works everywhere
Write a script called git-mycommand, and you can invoke it with 'git mycommand'. Tab completion works too, at least for bash + bash_completion.
if [ -d $HOME/bin ]
then
PATH=$PATH:$HOME/bin
fiTilde-hyphen expands to the previous directory you were in, and of course "cd -" returns you to your previous directory, so I put them together all the time.
Here's an example workflow (with a fake PS1):
mac:/Users/me/Projects/my_new_app$ cd ~/.pow
mac:/Users/me/.pow$ ln -s ~- .
mac:/Users/me/.pow$ cd -
mac:/Users/me/Projects/my_new_app$
Now I can continue working on my app.<disclaimer>
That's bit of a contrived example above. Here's a more realistic way to do a symlink for pow:
mac:/Users/me/Projects/my_new_app$ ln -s `pwd` ~/.pow/
</disclaimer> ln -s $PWD ~/.pow
(Interesting tip about ~-, didn't know that one)What do you mean you've never used Emacs? mumble whippersnappers mumble
EDIT: In bash, that is. It's `bindkey -v` in zsh.
set editing-mode vi
Now any executable that uses readline will have vi editing commands on its command line. mysql, psql, etc.
Do as much of your command line editing configuration in .inputrc as possible, and you'll have it everywhere.
EDIT: man readline
http://www.ibm.com/developerworks/opensource/library/l-keyc/...
http://webcache.googleusercontent.com/search?q=cache:n5M47jV...
http://webcache.googleusercontent.com/search?q=cache:BzFiI_7...
(pt2/pt3 borked on IBMs site)
$ aaa ^U
# now "aaa" is the only thing in the kill ring
$ bbb ^U
# now kill ring is ["aaa", "bbb"]
$ ccc ^U
# now kill ring is ["aaa", "bbb", "ccc"]
$ ^Y
$ ccc
# alt+y cycles through the kill ring
$ bbb Alt+Y
$ aaa Alt+Y
$ ccc Alt+Y
$ bbb
etc. This likely feels completely natural if you're an emacs user. I don't know what the equivalent vi thing is.Alternatively, you can just do '. ~/.bash_profile' or 'source ~./bash_profile'.
alias refresh-bash="source ~/.bash_profile"ctrl + z
then, to send it to the background:
bg
and, to get it back from the background:
fg
Also, I really like to use "for", like:
// get the size of each file or directory in the current directory
for i in `ls -1`; do du -hs $i; done;
instead of "ls -1" you could use any other command that returns a list
The "du -hs ." will only return the size of the current directory, but that was also an example. You could use any other command that you wanted to perform over each item in the list returned by the first command.
Not sure if this is clear enough, please let me know.
http://www.hcs.harvard.edu/~jrus/site/cocoa-text.html
Also cf.:
http://www.hcs.harvard.edu/~jrus/site/system-bindings.html
http://www.hcs.harvard.edu/~jrus/site/selectors.html
https://github.com/jrus/cocoa-text-system/tree/master/KeyBin...
https://git.wiki.kernel.org/index.php/Aliases
...after aliasing git to 'g' in your shell config, of course :)
alias g='git' "\C-gs": "git status -sb "
Then, for example, after pressing Ctrl-g, s "git status -sb " will appear in your prompt. Much more readable than lots of two or three letter aliases. You can see the complete list of my shortcuts on my GitHub - https://github.com/grn/dotfiles/blob/master/inputrcAlternatively, you could change your workspace bindings to Control+[some other modifier].
> ctrl + left arrow Moves the cursor to the left by one word > ctrl + right arrow Moves the cursor to the right by one word
Alt + b and Alt + f are also aliases for the same action.
I also enjoyed the format of the article. A whole dev team each contributing their own piece to a blog post provides a lot of different voices and styles in a concise way.
to clear the screen, instead of typing "clear" is pretty useful too.