├── README.md └── myvim /README.md: -------------------------------------------------------------------------------- 1 | myvim 2 | ===== 3 | 4 | A script that creates a portable bundle of your Vim environment. 5 | 6 | Usage 7 | ----- 8 | 9 | `myvim` script will create an executable named `vim.$(whoami)`. 10 | 11 | ```sh 12 | bash <(curl -fL https://raw.githubusercontent.com/junegunn/myvim/master/myvim) 13 | ``` 14 | 15 | ### Options 16 | 17 | - `-e|--edit` 18 | - Allow you to edit the list of files to be archived and the environment 19 | variables to apply 20 | - `-j` 21 | - Use bzip2 instead of gzip 22 | - `--exclude PATTERN` 23 | - `grep -v` pattern for excluding files 24 | 25 | Why? 26 | ---- 27 | 28 | You want your Vim settings and plugins on whichever server you connect to. But 29 | having your .vimrc on GitHub or Bitbucket is usually not enough. Because: 30 | 31 | - You need Git and free access to internet 32 | - Even when both conditions are met, downloading plugins can be time-consuming 33 | - When the user account on the server is shared among coworkers, you need to 34 | restore the default configuration every time when you're done 35 | 36 | How does it work? 37 | ----------------- 38 | 39 | `myvim` creates a tar archive of your .vimrc and .vim directory and append it 40 | to a small bash script that starts Vim with your usual settings and plugins. 41 | 42 | Caveat 43 | ------ 44 | 45 | The generated script injects code for temporarily swapping `$HOME` variable 46 | around the vimrc in the archive. This is because most vimrcs contain 47 | references to home directory (e.g. `call plug#begin('~/.vim/plugged')`). 48 | 49 | -------------------------------------------------------------------------------- /myvim: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | # https://github.com/junegunn/myvim 3 | 4 | set -u 5 | set -e 6 | 7 | EDIT=0 8 | COMPRESS=-z 9 | OUTPUT=vim.$(whoami) 10 | GREPV="cat" 11 | VIMRC=.vimrc 12 | if [ ! -e ~/$VIMRC ]; then 13 | if [ -e ~/.vim/vimrc ]; then 14 | VIMRC=.vim/vimrc 15 | else 16 | >&2 echo "~/.vimrc (or ~/.vim/vimrc) not found" 17 | exit 1 18 | fi 19 | fi 20 | 21 | usage() { 22 | echo "usage: $0 [-e|--edit] [--exclude PATTERN] [-j] [output]" 23 | } 24 | 25 | while [ $# -gt 0 ]; do 26 | case $1 in 27 | -e|--edit) EDIT=1 ;; 28 | -z|-j) COMPRESS=$1 ;; 29 | --exclude) shift; GREPV="grep -v $(printf %q "$1")" ;; 30 | -h|--help) usage; exit 0 ;; 31 | -*) echo "$0: Unrecognized option $1"; exit 1 ;; 32 | *) OUTPUT=$1 ;; 33 | esac 34 | shift 35 | done 36 | 37 | get_md5() { 38 | if which md5sum > /dev/null 2>&1; then 39 | md5sum "$1" | awk '{print $1}' 40 | else 41 | md5 -q "$1" 42 | fi 43 | } 44 | 45 | list() { 46 | (cd ~ && 47 | find -L .vim $VIMRC \ 48 | \( -name .git -o -name .hg -o -name .svn \) -prune \ 49 | -o ! -type d -print) | eval "$GREPV" 50 | } 51 | 52 | gitenv() { 53 | local NAME EMAIL 54 | if which git > /dev/null 2>&1 && NAME=$(git config user.name 2> /dev/null) && 55 | EMAIL=$(git config user.email 2> /dev/null); then 56 | echo "export GIT_AUTHOR_NAME=\"$NAME\"" 57 | echo "export GIT_AUTHOR_EMAIL=\"$EMAIL\"" 58 | echo 'export GIT_COMMITTER_NAME="$GIT_AUTHOR_NAME"' 59 | echo 'export GIT_COMMITTER_EMAIL="$GIT_AUTHOR_EMAIL"' 60 | fi 61 | } 62 | 63 | generate() { 64 | if [ $EDIT -eq 1 ]; then 65 | CONF="$OUTPUT.conf.sh" 66 | echo "# EDIT: environment variables" > "$CONF" 67 | gitenv >> "$CONF" 68 | echo >> "$CONF" 69 | 70 | echo "# EDIT: the list of files to be archived" >> "$CONF" 71 | list >> "$CONF" 72 | 73 | ${EDITOR:-vim} "$CONF" 74 | ENV_VARS=$(sed -n '1,/^# EDIT/{/^# EDIT/d; p;}' "$CONF") 75 | FILES=$(sed '1,/^# EDIT/d' "$CONF") 76 | rm -f "$CONF" 77 | else 78 | ENV_VARS="" 79 | FILES=$(list) 80 | fi 81 | 82 | TEMP=/tmp/myvim-$(whoami).tar.compressed 83 | tar -C ~ -h $COMPRESS -cf $TEMP -T <(echo "$FILES") 84 | 85 | MD5=$(get_md5 "$TEMP") 86 | MD5=${MD5:0:8} 87 | echo '#!/usr/bin/env bash 88 | # Created at: '$(date)' 89 | '"$ENV_VARS"' 90 | if [ "$1" == --hard ]; then 91 | HARD=1 92 | BASE=~ 93 | echo "** Overwriting ~/.vim and ~/'"$VIMRC"' **" 94 | for e in ~/.vim ~/'"$VIMRC"'; do 95 | rm -rf ${e}.bak 96 | [ -e $e ] && mv ${e} ${e}.bak 97 | done 98 | shift 99 | else 100 | HARD="" 101 | BASE=/tmp/myvim-$(whoami)/'$MD5' 102 | fi 103 | 104 | set -eu 105 | 106 | if [ ! -d $BASE/.vim ]; then 107 | >&2 echo "Extracting Vim environment to $BASE" 108 | mkdir -p $BASE 109 | sed "1,/^# EOF #$/d" "$0" | tar -C $BASE -x '$COMPRESS' 110 | [ -z "$HARD" ] && (cd $BASE 111 | mv -f '"$VIMRC"' '"$VIMRC"'.org 112 | echo "let [s:home_org, \$HOME] = [\$HOME, \"$BASE\"]" > '"$VIMRC"' 113 | echo "set rtp^=$BASE/.vim" >> '"$VIMRC"' 114 | echo "autocmd VimEnter * let \$HOME = s:home_org" >> '"$VIMRC"' 115 | cat '"$VIMRC"'.org >> '"$VIMRC"' 116 | echo "let \$HOME = s:home_org" >> '"$VIMRC"' 117 | rm -f '"$VIMRC"'.org) 118 | fi 119 | 120 | \vim -Nu $BASE/'"$VIMRC"' "$@" 121 | exit $? 122 | # EOF #' > "$OUTPUT" 123 | cat "$TEMP" >> "$OUTPUT" 124 | chmod +x "$OUTPUT" 125 | echo "Created $OUTPUT executable" 126 | rm -f "$TEMP" 127 | } 128 | 129 | if [ ! -e ~/.vim ]; then 130 | mkdir -p ~/.vim 131 | fi 132 | 133 | generate 134 | 135 | --------------------------------------------------------------------------------