├── README.md ├── config.zsh ├── init.zsh ├── transform.d ├── apt.zsh ├── cd.zsh ├── chattr.zsh ├── chmod.zsh ├── cp.zsh ├── dstat.zsh ├── echo.zsh ├── find.zsh ├── git.zsh ├── ls.zsh ├── modprobe.zsh ├── mount.zsh ├── mv.zsh ├── rm.zsh ├── rsync.zsh ├── service.zsh ├── ssh.zsh ├── tar.zsh ├── watch.zsh └── wine.zsh └── zsh-dwim.plugin.zsh /README.md: -------------------------------------------------------------------------------- 1 | # zsh-dwim - A "Do What I Mean" Key 2 | 3 | `zsh-dwim` attempts to predict what you will want to do next. It provides a key binding (control-u) that will replace the current (or previous) command line with the command you will want to run next. 4 | 5 | ## Some examples 6 | 7 | * `apt-cache show zsh` becomes `sudo apt-get install zsh` 8 | * `tar ft RandomFile.tar.bz2` becomes `tar fx RandomFile.tar.bz2` 9 | * `sudo service apache stop` becomes `sudo service apache start` 10 | * `mkdir new_directory` becomes `cd new_directory` 11 | * `find . -size +5M` becomes `find . -size +5M -exec echo {} \;` becomes `find . -size +5M -exec {} \;` 12 | * If `ssh user@hostwithnewip` fails it becomes `ssh-keygen -R hostwithnewip` 13 | * If `mkdir more/than/one/path` fails it becomes `mkdir -p more/than/one/path` 14 | * If `cd /some/path` failes it becomes `mkdir /some/path` 15 | 16 | 17 | There are some short screencasts on my blog demonstrating `zsh-dwim`: 18 | 19 | * [Demonstration of a few of zsh-dwim's oldest features](http://blog.patshead.com/2012/10/cleanup-of-zsh-dwim.html) 20 | * [Demonstration of zsh-dwim's remote filename completion](http://blog.patshead.com/2013/01/zsh-dwim-most-recent-remote-file-completion.html) 21 | 22 | 23 | ## Installation 24 | 25 | Since I am using [Prezto](https://github.com/sorin-ionescu/prezto) to manage my `zsh` configuration this repository is set up to work with it. `zsh-dwim` is a simple enough script, though, so it should be easily loaded into any `zsh` configuration. 26 | 27 | ### Installing under [Prezto](https://github.com/sorin-ionescu/prezto) 28 | 29 | cd .zprezto 30 | git submodule add https://github.com/oknowton/zsh-dwim.git modules/dwim 31 | 32 | Add `dwim` to your `.zpreztorc` file: 33 | 34 | # Set the Prezto modules to load (browse modules). 35 | # The order matters. 36 | zstyle ':prezto:load' pmodule \ 37 | 'environment' \ 38 | 'terminal' \ 39 | 'editor' \ 40 | 'history' \ 41 | 'directory' \ 42 | 'spectrum' \ 43 | 'utility' \ 44 | 'completion' \ 45 | 'prompt' \ 46 | 'dwim' 47 | 48 | ### Installing under oh-my-zsh 49 | 50 | You should be able to install the `zsh-dwim` script under `oh-my-zsh` with the following command: 51 | 52 | wget https://raw.github.com/oknowton/zsh-dwim/master/init.zsh -O $HOME/.oh-my-zsh/custom/zsh-dwim.zsh 53 | 54 | It should start working the next time you open a new shell. 55 | 56 | ### Installing using [Antigen](https://github.com/zsh-users/antigen) 57 | 58 | If you use [Antigen](https://github.com/zsh-users/antigen), I am told that adding the following line to your `.zshrc` will work: 59 | 60 | antigen-bundle oknowton/zsh-dwim 61 | 62 | ### Using `zsh-dwim` anywhere else 63 | 64 | Anyone running `zsh` should only need to `source` the `init.zsh` file (run `source init.zsh`). If you want to permentantly "install" `zsh-dwim` just add the proper `source` command to your `.zshrc`. 65 | 66 | ## Usage 67 | 68 | Type a command and hit `control-u` and `zsh-dwim` will attempt to transform your command. Typing `control-u` at an empty command prompt will recall the previous command from your history and then attempt to transform it. 69 | 70 | ## Creating your own transformations 71 | 72 | You can add your own transformations by calling the `_dwim_add_transform` function. This function takes up to three parameters, the third being optional. 73 | 74 | _dwim_add_transform [exit status of previous command] 75 | 76 | Here's a simple example: 77 | 78 | ## tar ft -> tar fx (a.k.a. list -> extract) 79 | _dwim_add_transform '^tar (ft|tf)' \ 80 | '_dwim_sed "s/^tar (ft|tf)/tar fx/"' 81 | 82 | The `_dwim_sed` function is a little helped function that applies a `sed` regex to the current command. 83 | 84 | ## License 85 | 86 | The MIT License (MIT) 87 | 88 | Copyright (c) 2013 Pat Regan 89 | 90 | Permission is hereby granted, free of charge, to any person obtaining a copy 91 | of this software and associated documentation files (the "Software"), to deal 92 | in the Software without restriction, including without limitation the rights 93 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 94 | copies of the Software, and to permit persons to whom the Software is 95 | furnished to do so, subject to the following conditions: 96 | 97 | The above copyright notice and this permission notice shall be included in 98 | all copies or substantial portions of the Software. 99 | 100 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 101 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 102 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 103 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 104 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 105 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 106 | THE SOFTWARE. 107 | 108 | 109 | -------------------------------------------------------------------------------- /config.zsh: -------------------------------------------------------------------------------- 1 | zle -N dwim 2 | bindkey "^U" dwim 3 | 4 | ## Import configuration for various transformations 5 | ## Order of import may be important, so be careful 6 | 7 | ## Checks exist to make sure inappropriate transformations aren't 8 | ## offered when the zsh-dwim key is pressed 9 | 10 | hash apt-get &>/dev/null && 11 | source "$_dwim_transform_dir/apt.zsh" 12 | 13 | source "$_dwim_transform_dir/cd.zsh" 14 | 15 | source "$_dwim_transform_dir/cp.zsh" 16 | 17 | source "$_dwim_transform_dir/chmod.zsh" 18 | 19 | source "$_dwim_transform_dir/chattr.zsh" 20 | 21 | hash dstat &>/dev/null && 22 | source "$_dwim_transform_dir/dstat.zsh" 23 | 24 | source "$_dwim_transform_dir/echo.zsh" 25 | 26 | source "$_dwim_transform_dir/find.zsh" 27 | 28 | hash git &>/dev/null && 29 | source "$_dwim_transform_dir/git.zsh" 30 | 31 | source "$_dwim_transform_dir/ls.zsh" 32 | 33 | hash modprobe &>/dev/null && 34 | source "$_dwim_transform_dir/modprobe.zsh" 35 | 36 | hash mount &>/dev/null && 37 | source "$_dwim_transform_dir/mount.zsh" 38 | 39 | source "$_dwim_transform_dir/mv.zsh" 40 | 41 | hash rsync &>/dev/null && 42 | source "$_dwim_transform_dir/rsync.zsh" 43 | 44 | source "$_dwim_transform_dir/rm.zsh" 45 | 46 | hash ssh &>/dev/null && 47 | source "$_dwim_transform_dir/ssh.zsh" 48 | 49 | hash service &>/dev/null && 50 | source "$_dwim_transform_dir/service.zsh" 51 | 52 | source "$_dwim_transform_dir/tar.zsh" 53 | 54 | hash wine &>/dev/null && 55 | source "$_dwim_transform_dir/wine.zsh" 56 | 57 | -------------------------------------------------------------------------------- /init.zsh: -------------------------------------------------------------------------------- 1 | typeset -ga _dwim_data_regex 2 | typeset -ga _dwim_data_sed 3 | typeset -ga _dwim_data_exitstatus 4 | 5 | _dwim_transform_dir=${0:a:h}/transform.d 6 | 7 | if [[ $DWIM_REGEX_CMD == "" ]]; then 8 | if (( $+commands[gsed] )); then 9 | DWIM_REGEX_CMD='gsed -re' # use gsed if it exists, for BSDs 10 | else 11 | echo | sed -re '' &> /dev/null 12 | if [[ $? == 0 ]]; then 13 | DWIM_REGEX_CMD='sed -re' # use sed if it supports the -r option 14 | else 15 | DWIM_REGEX_CMD='perl -pe' # otherwise, use perl 16 | fi 17 | fi 18 | fi 19 | 20 | _dwim_sed(){ 21 | BUFFER=$(echo $BUFFER | ${=DWIM_REGEX_CMD} "$1") 22 | } 23 | 24 | _dwim_prepend_transform() { 25 | _dwim_data_regex[$(($#_dwim_data_regex+1))]=$1 26 | _dwim_data_sed[$(($#_dwim_data_sed+1))]=$2 27 | 28 | if [[ "$3" != "" ]]; then 29 | _dwim_data_exitstatus[$(($#_dwim_data_exitstatus+1))]=$3 30 | else 31 | _dwim_data_exitstatus[$(($#_dwim_data_exitstatus+1))]="any" 32 | fi 33 | 34 | return 35 | } 36 | 37 | _dwim_add_transform() { 38 | local regex_tmp 39 | local sed_tmp 40 | local exitstatus_tmp 41 | local i 42 | 43 | typeset -a regex_tmp 44 | typeset -a sed_tmp 45 | typeset -a exitstatus_tmp 46 | 47 | for i in {1..${#_dwim_data_regex}}; do 48 | regex_tmp[$i]="$_dwim_data_regex[$i]" 49 | done 50 | 51 | for i in {1..${#_dwim_data_sed}}; do 52 | sed_tmp[$i]="$_dwim_data_sed[$i]" 53 | done 54 | 55 | for i in {1..${#_dwim_data_exitstatus}}; do 56 | exitstatus_tmp[$i]="$_dwim_data_exitstatus[$i]" 57 | done 58 | 59 | _dwim_data_regex=() 60 | _dwim_data_regex[1]="$1" 61 | for i in {1..${#regex_tmp}}; do 62 | _dwim_data_regex[$(($i+1))]="$regex_tmp[$i]" 63 | done 64 | 65 | _dwim_data_sed=() 66 | _dwim_data_sed[1]="$2" 67 | for i in {1..${#sed_tmp}}; do 68 | _dwim_data_sed[$(($i+1))]="$sed_tmp[$i]" 69 | done 70 | 71 | _dwim_data_exitstatus=() 72 | for i in {1..${#exitstatus_tmp}}; do 73 | _dwim_data_exitstatus[$(($i+1))]="$exitstatus_tmp[$i]" 74 | done 75 | 76 | if [[ "$3" != "" ]]; then 77 | _dwim_data_exitstatus[1]=$3 78 | else 79 | _dwim_data_exitstatus[1]="any" 80 | fi 81 | 82 | return 83 | } 84 | 85 | _dwim_transform() { 86 | local regex 87 | local oldbuffer 88 | oldbuffer=$BUFFER 89 | 90 | for i in {1..${#_dwim_data_regex}}; do 91 | if [[ "$BUFFER" =~ "$_dwim_data_regex[$i]" ]]; then 92 | if [[ "$_dwim_data_exitstatus[$i]" == "$_dwim_exit_status" || 93 | "$_dwim_data_exitstatus[$i]" == "any" ]]; then 94 | eval "$_dwim_data_sed[$i]" 95 | fi 96 | fi 97 | 98 | if [[ "$oldbuffer" != "$BUFFER" ]]; then 99 | return 100 | fi 101 | done 102 | 103 | ## TODO: rework dwim hash to eliminate this special case 104 | if [[ $BUFFER =~ '^sudo ' ]]; then 105 | _dwim_sed "s/^sudo //" 106 | else 107 | BUFFER="sudo $BUFFER" 108 | fi 109 | 110 | return 111 | } 112 | 113 | dwim() { 114 | _dwim_exit_status=$? ## Must be stored immediately... 115 | local ORIGINAL_BUFFER 116 | 117 | if [[ ! -n $BUFFER ]]; then 118 | (( HISTNO -= 1 )) 119 | fi 120 | 121 | ORIGINAL_BUFFER=$BUFFER 122 | 123 | _dwim_transform 124 | 125 | if [[ $_dwim_cursor -gt 0 ]]; then 126 | CURSOR=$_dwim_cursor 127 | _dwim_cursor=0 128 | elif [[ $CURSOR == $#ORIGINAL_BUFFER ]]; then 129 | CURSOR=$#BUFFER 130 | elif [[ $CURSOR == 0 ]]; then 131 | CURSOR=0 132 | elif [[ $#ORIGINAL_BUFFER -gt $#BUFFER ]]; then 133 | (( CURSOR -= $#ORIGINAL_BUFFER - $#BUFFER )) 134 | elif [[ $#ORIGINAL_BUFFER -lt $#BUFFER ]]; then 135 | (( CURSOR += $#BUFFER - $#ORIGINAL_BUFFER )) 136 | fi 137 | } 138 | 139 | source ${0:a:h}/config.zsh 140 | -------------------------------------------------------------------------------- /transform.d/apt.zsh: -------------------------------------------------------------------------------- 1 | ## apt-cache search -> sudo apt-get install 2 | _dwim_prepend_transform '^apt-cache (search|show)' \ 3 | '_dwim_sed "s/^apt-cache (search|show)/sudo apt-get install/"' 4 | 5 | ## sudo apt-get update -> sudo apt-get upgrade 6 | _dwim_prepend_transform '^sudo apt-get update' \ 7 | '_dwim_sed "s/^sudo apt-get update/sudo apt-get upgrade/"' 8 | 9 | ## failed dpkg --install -> apt-get -f install 10 | _dwim_prepend_transform '^sudo dpkg --install' \ 11 | 'BUFFER="sudo apt-get -f install"' \ 12 | 1 13 | 14 | _dwim_prepend_transform '^which ' \ 15 | 'BUFFER="dpkg -S \$(/usr/bin/$BUFFER)"' 16 | 17 | _dwim_prepend_transform '^dpkg -S ' \ 18 | 'BUFFER="apt-cache show \$($BUFFER | cut -d : -f 1 )"' 19 | 20 | _dwim_prepend_transform '^sudo add-apt-repository' \ 21 | 'BUFFER="sudo apt-get update" 22 | _dwim_cursor=$#BUFFER' 23 | _dwim_prepend_transform '^add-apt-repository' \ 24 | 'BUFFER="sudo $BUFFER"' 25 | -------------------------------------------------------------------------------- /transform.d/cd.zsh: -------------------------------------------------------------------------------- 1 | ## mkdir -> mkdir -p (on failure) 2 | _dwim_prepend_transform '^mkdir (-p){0}' \ 3 | '_dwim_sed "s/mkdir /mkdir -p /"' \ 4 | 1 5 | 6 | ## mkdir -p -> cd 7 | _dwim_prepend_transform '^mkdir -p' \ 8 | '_dwim_sed "s/mkdir -p /cd /"' 9 | 10 | ## mkdir -> cd 11 | _dwim_prepend_transform '^mkdir ' \ 12 | '_dwim_sed "s/^mkdir /cd /"' 13 | 14 | ## cd -> mkdir on failure 15 | _dwim_prepend_transform '^cd ' \ 16 | '_dwim_sed "s/cd /mkdir /"' \ 17 | 1 18 | 19 | -------------------------------------------------------------------------------- /transform.d/chattr.zsh: -------------------------------------------------------------------------------- 1 | ## chmattr failure -> sudo chattr 2 | _dwim_prepend_transform '^chattr.*\+' \ 3 | '_dwim_sed "s/chattr/sudo chattr/"' \ 4 | 1 5 | 6 | ## chattr - -> + 7 | _dwim_prepend_transform '^chattr.*-' \ 8 | '_dwim_sed "s/-([acdeijstuACDST]+)/+\1/g"' 9 | 10 | ## chattr + -> = 11 | _dwim_prepend_transform '^chattr.*\+' \ 12 | '_dwim_sed "s/\+([acdeijstuACDST]+)/=\1/g"' 13 | 14 | ## chattr = -> - 15 | _dwim_prepend_transform '^chattr.*\=' \ 16 | '_dwim_sed "s/=([acdeijstuACDST]+)/-\1/g"' 17 | 18 | ## sudo chattr - -> + 19 | _dwim_prepend_transform '^sudo chattr.*-' \ 20 | '_dwim_sed "s/-([acdeijstuACDST]+)/+\1/g"' 21 | 22 | ## sudo chattr + -> = 23 | _dwim_prepend_transform '^sudo chattr.*\+' \ 24 | '_dwim_sed "s/\+([acdeijstuACDST]+)/=\1/g"' 25 | 26 | ## sudo chattr = -> - 27 | _dwim_prepend_transform '^sudo chattr.*\+' \ 28 | '_dwim_sed "s/=([acdeijstuACDST]+)/-\1/g"' 29 | -------------------------------------------------------------------------------- /transform.d/chmod.zsh: -------------------------------------------------------------------------------- 1 | ## chmod failure -> sudo chmod 2 | _dwim_prepend_transform '^chmod.*\+' \ 3 | '_dwim_sed "s/chmod/sudo chmod/"' \ 4 | 1 5 | 6 | ## chmod - -> + 7 | _dwim_prepend_transform '^chmod.*-' \ 8 | '_dwim_sed "s/([ ugo]+)-([rwxXst]+)/\1+\2/g"' 9 | 10 | ## chmod + -> - 11 | _dwim_prepend_transform '^chmod.*\+' \ 12 | '_dwim_sed "s/([ ugo]+)\+([rwxXst]+)/\1-\2/g"' 13 | 14 | ## sudo chmod - -> + 15 | _dwim_prepend_transform '^sudo chmod.*-' \ 16 | '_dwim_sed "s/([ ugo]+)-([rwxXst]+)/\1+\2/g"' 17 | 18 | ## sudo chmod + -> - 19 | _dwim_prepend_transform '^sudo chmod.*\+' \ 20 | '_dwim_sed "s/([ ugo]+)\+([rwxXst]+)/\1-\2/g"' 21 | 22 | 23 | -------------------------------------------------------------------------------- /transform.d/cp.zsh: -------------------------------------------------------------------------------- 1 | # cp -> cp -R on failure 2 | _dwim_prepend_transform '^cp ' \ 3 | '_dwim_sed "s/^cp /cp -R /"' \ 4 | 1 5 | -------------------------------------------------------------------------------- /transform.d/dstat.zsh: -------------------------------------------------------------------------------- 1 | ## vmstat -> dstat -f -> vmstat 2 | _dwim_prepend_transform '^vmstat' \ 3 | '_dwim_sed "s/^vmstat/dstat -f/"' 4 | 5 | _dwim_prepend_transform '^dstat -f' \ 6 | '_dwim_sed "s/^dstat -f/vmstat/"' 7 | 8 | -------------------------------------------------------------------------------- /transform.d/echo.zsh: -------------------------------------------------------------------------------- 1 | ## cat /proc/sys/* or /sys/* -> echo _ | sudo tee /proc/sys/* 2 | _dwim_prepend_transform '^cat ' \ 3 | 'if [[ $PWD =~ "(/proc/sys/|/sys/)" ]]; then 4 | _dwim_sed "s/cat (.*)/echo | sudo tee \1/" 5 | else 6 | _dwim_sed "s/cat ((\/proc)?\/sys\/.*)/echo | sudo tee \1/" 7 | fi 8 | _dwim_cursor=5' 9 | 10 | ## echo _ > -> echo _ | sudo tee 11 | _dwim_prepend_transform '^echo.*\> ' \ 12 | '_dwim_sed "s/>/|sudo tee /"' 13 | 14 | -------------------------------------------------------------------------------- /transform.d/find.zsh: -------------------------------------------------------------------------------- 1 | ## find -> find -exec echo {} \; -> find -exec {} \; -> find -print0 | xargs -0 2 | _dwim_prepend_transform '^find .*-exec echo' \ 3 | '_dwim_sed "s/-exec echo/-exec/"' 4 | 5 | _dwim_prepend_transform '^find .*-exec' \ 6 | '_dwim_sed "s/-exec/-print0 | xargs -0/" 7 | _dwim_sed "s/\{\} \\\;//"' 8 | 9 | _dwim_prepend_transform '^find .*' \ 10 | 'BUFFER="$BUFFER -exec echo {} \;" 11 | (( _dwim_cursor = $#BUFFER - 5))' 12 | 13 | -------------------------------------------------------------------------------- /transform.d/git.zsh: -------------------------------------------------------------------------------- 1 | ## git clone -> git clone --recursive 2 | _dwim_prepend_transform '^git clone' \ 3 | '_dwim_sed "s/git clone /git clone --recursive /"' 4 | 5 | ## git rm -> git rm -f (on failure) 6 | _dwim_prepend_transform '^git rm' \ 7 | '_dwim_sed "s/git rm /git rm -f /"' \ 8 | 1 9 | 10 | ## git rm -f -> git rm -rf (on failure) 11 | _dwim_prepend_transform '^git rm -f' \ 12 | '_dwim_sed "s/git rm -f /git rm -rf /"' \ 13 | 1 14 | -------------------------------------------------------------------------------- /transform.d/ls.zsh: -------------------------------------------------------------------------------- 1 | ## TODO: ls matches not very accurate 2 | ## ls - -> cd 3 | _dwim_prepend_transform '^ls -[A-Za-z0-9]+ .+' \ 4 | 'local filename 5 | _dwim_sed "s/^ls -[A-Za-z0-9]+ //" 6 | filename=$BUFFER 7 | filename=${(Q)filename} 8 | if [[ -d "$filename" ]]; then 9 | BUFFER="cd $filename" 10 | fi' 11 | 12 | ## ls -> cd 13 | _dwim_prepend_transform '^ls [^-].*' \ 14 | 'local filename 15 | _dwim_sed "s/^ls //" 16 | filename=$BUFFER 17 | filename=${(Q)filename} 18 | if [[ -d "$filename" ]]; then 19 | BUFFER="cd $filename" 20 | fi' 21 | 22 | -------------------------------------------------------------------------------- /transform.d/modprobe.zsh: -------------------------------------------------------------------------------- 1 | ## modprobe -> modprobe -r -> modprobe 2 | _dwim_prepend_transform '^(sudo modprobe |modprobe )-r' \ 3 | '_dwim_sed "s/ -r//"' 4 | 5 | _dwim_prepend_transform '^(sudo modprobe |modprobe )' \ 6 | '_dwim_sed "s/modprobe/modprobe -r/"' 7 | 8 | -------------------------------------------------------------------------------- /transform.d/mount.zsh: -------------------------------------------------------------------------------- 1 | ## mount -> umount 2 | _dwim_prepend_transform '^sudo mount' \ 3 | '_dwim_sed "s/^sudo mount/sudo umount/"' 4 | 5 | ## umount -> mount 6 | _dwim_prepend_transform '^sudo umount' \ 7 | '_dwim_sed "s/^sudo umount/sudo mount/"' 8 | 9 | -------------------------------------------------------------------------------- /transform.d/mv.zsh: -------------------------------------------------------------------------------- 1 | ## mv -> cd 2 | _dwim_prepend_transform '^mv [a-zA-Z0-9/_-]+ ' \ 3 | 'local filename 4 | _dwim_sed "s/^mv [a-zA-Z0-9/_-]+ //" 5 | filename=$BUFFER 6 | filename=${(Q)filename} 7 | if [[ -d "$filename" ]]; then 8 | BUFFER="cd $filename" 9 | fi' 10 | -------------------------------------------------------------------------------- /transform.d/rm.zsh: -------------------------------------------------------------------------------- 1 | ## rm -> rm -f (on failure) 2 | _dwim_add_transform '^rm' \ 3 | '_dwim_sed "s/^rm /rm -f /"' \ 4 | 1 5 | 6 | ## rm -f -> rm -rf (on failure) 7 | _dwim_add_transform '^rm -f' \ 8 | '_dwim_sed "s/^rm -f /rm -rf /"' \ 9 | 1 10 | 11 | ## rm -rf -> sudo rm -rf (on failure) 12 | _dwim_add_transform '^rm -rf' \ 13 | '_dwim_sed "s/^rm -rf /sudo rm -rf /"' \ 14 | 1 15 | 16 | ## rmdir -> rm -rf (on failure) 17 | _dwim_add_transform '^rmdir ' \ 18 | '_dwim_sed "s/^rmdir /rm -rf /"' \ 19 | 1 20 | -------------------------------------------------------------------------------- /transform.d/rsync.zsh: -------------------------------------------------------------------------------- 1 | ## rsync -> rsync -aHAXS -> rsync -axHAXS 2 | _dwim_prepend_transform '^rsync -aHAXS' \ 3 | '_dwim_sed "s/^rsync -aHAXS/rsync -axHAXS/"' 4 | 5 | _dwim_prepend_transform '^rsync -axHAXS' \ 6 | '_dwim_sed "s/^rsync -axHAXS/rsync/"' 7 | 8 | _dwim_prepend_transform '^rsync ' \ 9 | '_dwim_sed "s/^rsync /rsync -aHAXS /"' 10 | -------------------------------------------------------------------------------- /transform.d/service.zsh: -------------------------------------------------------------------------------- 1 | ## service <> stop -> service <> start 2 | _dwim_prepend_transform '^sudo (service |\/etc\/init.d\/)[a-zA-Z0-9]+ stop' \ 3 | '_dwim_sed "s/stop/start/"' 4 | 5 | ## service <> start -> service <> stop 6 | _dwim_prepend_transform '^sudo (service |\/etc\/init.d\/)[a-zA-Z0-9]+ start' \ 7 | '_dwim_sed "s/start/stop/"' 8 | 9 | -------------------------------------------------------------------------------- /transform.d/ssh.zsh: -------------------------------------------------------------------------------- 1 | ## ssh -> ssh-keygen 2 | _dwim_prepend_transform '^ssh ' \ 3 | 'if [[ $BUFFER =~ "^ssh .*[A-Za-z0-9]+@([A-Za-z0-9.]+).*" ]]; then 4 | _dwim_sed "s/^ssh\s+[A-Za-z0-9]+@([A-Za-z0-9.\-]+).*/ssh-keygen -R \1/" 5 | else 6 | _dwim_sed "s/^ssh /ssh-keygen -R /" 7 | fi' \ 8 | 255 9 | 10 | ## scp hostname: -> scp hostname: 11 | ### Long winded, assuming no zsh on remote side 12 | _dwim_prepend_transform '^scp .+:$' \ 13 | 'local HOST 14 | local FILE 15 | HOST=$(echo $BUFFER | sed -re "s/^scp (.+):/\1/") 16 | FILE=$(ssh $HOST "ls -tpb" | grep -v / | head -1) 17 | BUFFER="$BUFFER\"$FILE\" "' 18 | 19 | ## ssh hostname -> scp hostname: 20 | _dwim_prepend_transform '^ssh .+' \ 21 | '_dwim_sed "s/^ssh (.+)/scp \1:/"' 22 | 23 | ## scp -> mv 24 | _dwim_prepend_transform '^scp .+:' \ 25 | '_dwim_sed "s/^scp /mv /"; _dwim_sed "s/ [A-Za-z0-9@\-\.]+:.*//"' 26 | 27 | -------------------------------------------------------------------------------- /transform.d/tar.zsh: -------------------------------------------------------------------------------- 1 | ## tar ft -> tar fx 2 | _dwim_prepend_transform '^tar (ft|tf)' \ 3 | '_dwim_sed "s/^tar (ft|tf)/tar fx/"' 4 | 5 | ## tar xf -> cd # using tarball contents 6 | _dwim_prepend_transform '^tar [A-Za-z0-9\-]*x[A-Za-z0-9]* ' \ 7 | 'local tarball 8 | _dwim_sed "s/^tar [A-Za-z]+ //" 9 | tarball=$BUFFER 10 | tarball=${(Q)tarball} 11 | if [[ -e "$tarball" ]]; then 12 | local newpath 13 | newpath=$(tar ft $tarball | head -1) 14 | BUFFER="cd $newpath" 15 | fi' 16 | 17 | -------------------------------------------------------------------------------- /transform.d/watch.zsh: -------------------------------------------------------------------------------- 1 | ## watch -> watch -n 10 -> watch -n 30 2 | _dwim_prepend_transform '^(sudo watch |watch )-n 10' \ 3 | '_dwim_sed "s/ -n 10/ -n 30/"' 4 | 5 | _dwim_prepend_transform '^(sudo watch |watch )-n 30' \ 6 | '_dwim_sed "s/ -n 30//"' 7 | 8 | _dwim_prepend_transform '^(sudo watch |watch )' \ 9 | '_dwim_sed "s/watch/watch -n 10/"' 10 | 11 | -------------------------------------------------------------------------------- /transform.d/wine.zsh: -------------------------------------------------------------------------------- 1 | ## wine -> WINDEBUG="-all" wine 2 | _dwim_prepend_transform '^wine ' \ 3 | '_dwim_sed "s/^wine /WINEDEBUG=\"-all\" wine /"' 4 | 5 | -------------------------------------------------------------------------------- /zsh-dwim.plugin.zsh: -------------------------------------------------------------------------------- 1 | init.zsh --------------------------------------------------------------------------------