From 1826e633c19dec009790f8bc61d8b9066a1601a9 Mon Sep 17 00:00:00 2001 From: Konstantin Bukley Date: Tue, 30 Oct 2018 23:34:18 +0200 Subject: [PATCH] dotfiles: init --- .stowrc | 3 + Brewfile | 53 ++++ README.md | 1 + TODO.md | 2 + bash/.bash_profile | 8 + bash/.bashrc | 61 ++++ git/.git-prompt.sh | 535 +++++++++++++++++++++++++++++++ ruby/.gemrc | 1 + sync.sh | 22 ++ tmux/.tmux.conf | 89 ++++++ vim/.config/nvim/init.vim | 1 + vim/.vimrc | 643 ++++++++++++++++++++++++++++++++++++++ 12 files changed, 1419 insertions(+) create mode 100644 .stowrc create mode 100644 Brewfile create mode 100644 README.md create mode 100644 TODO.md create mode 100644 bash/.bash_profile create mode 100644 bash/.bashrc create mode 100644 git/.git-prompt.sh create mode 100644 ruby/.gemrc create mode 100755 sync.sh create mode 100644 tmux/.tmux.conf create mode 100644 vim/.config/nvim/init.vim create mode 100644 vim/.vimrc diff --git a/.stowrc b/.stowrc new file mode 100644 index 0000000..166c154 --- /dev/null +++ b/.stowrc @@ -0,0 +1,3 @@ +--ignore='README.md' +--target=/Users/madundead + diff --git a/Brewfile b/Brewfile new file mode 100644 index 0000000..815b10d --- /dev/null +++ b/Brewfile @@ -0,0 +1,53 @@ +tap "heroku/brew" +tap "homebrew/bundle" +tap "homebrew/cask" +tap "homebrew/core" +tap "homebrew/services" + +brew "bat" +brew "curl" +brew "diff-so-fancy" +brew "fd" +brew "fzf" +brew "htop" +brew "httpie" +brew "mysql", restart_service: true +brew "neovim" +brew "nmap" +brew "node" +brew "rbenv" +brew "reattach-to-user-namespace" +brew "redis", restart_service: true +brew "ripgrep" +brew "speedtest-cli" +brew "stow" +brew "streamlink" +brew "tig" +brew "tldr" +brew "tmux" +brew "urlview" +brew "wget" +brew "zsh" +brew "heroku/brew/heroku" + +cask "alfred" +cask "dash" +cask "discord" +cask "iterm2" +cask "karabiner-elements" +cask "macdown" +cask "macvim" +cask "qlcolorcode" +cask "qlimagesize" +cask "qlmarkdown" +cask "qlstephen" +cask "qlvideo" +cask "quicklook-json" +cask "quicklookase" +cask "sequel-pro" +cask "steam" +cask "transmission" +cask "virtualbox" +cask "vlc" +cask "webpquicklook" +cask "xquartz" diff --git a/README.md b/README.md new file mode 100644 index 0000000..9c35308 --- /dev/null +++ b/README.md @@ -0,0 +1 @@ +# DOTFILES diff --git a/TODO.md b/TODO.md new file mode 100644 index 0000000..980e379 --- /dev/null +++ b/TODO.md @@ -0,0 +1,2 @@ +* cleanup all this mess +* use this repo instead of stuff diff --git a/bash/.bash_profile b/bash/.bash_profile new file mode 100644 index 0000000..07578f8 --- /dev/null +++ b/bash/.bash_profile @@ -0,0 +1,8 @@ +if [ -s ~/.bashrc ]; then + source ~/.bashrc; +fi + +eval "$(rbenv init -)" +export PATH="/usr/local/sbin:$PATH" + +export PATH="$HOME/.cargo/bin:$PATH" diff --git a/bash/.bashrc b/bash/.bashrc new file mode 100644 index 0000000..261892c --- /dev/null +++ b/bash/.bashrc @@ -0,0 +1,61 @@ +[ -f /etc/bashrc ] && . /etc/bashrc +[ -f ~/.z.sh ] && . ~/.z.sh +[ -f /etc/bash_completion ] && . /etc/bash_completion + +# Don't put duplicate lines in the history. See bash(1) for more options +export HISTCONTROL=$HISTCONTROL${HISTCONTROL+,}ignoredups +# ... or force ignoredups and ignorespace +export HISTCONTROL=ignoreboth + +shopt -s histappend +shopt -s checkwinsize +shopt -s no_empty_cmd_completion +shopt -s cdspell +shopt -s checkhash + +export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:.:/usr/local/lib +export EDITOR=nvim +export LANG=en_US.UTF-8 +export LC_ALL=en_US.UTF-8 + +# Creds +export HOMEBREW_GITHUB_API_TOKEN="2a4fad8fb1b5ff1de5fdf043aeea7d6cf0c5b101" + +alias ls='ls -G' +alias ll='ls -l' +alias vi='vim' +alias cat='bat --style changes' +alias grep='rg' +alias be='bundle exec' +alias vim='nvim' +alias ..='cd ..' +alias ...='cd ../..' + +# Homebrew stuff +if [ -x /usr/local/bin/brew ]; then + export PATH=/usr/local/bin:/usr/local/sbin:$PATH + export MANPATH=/usr/local/share/man:$MANPATH + + # bash_completion if installed + if [ -f `brew --prefix`/etc/bash_completion.d ]; then + . `brew --prefix`/etc/bash_completion.d + fi +fi + +__git_ps1() { :;} +if [ -e ~/.git-prompt.sh ]; then + source ~/.git-prompt.sh +fi +PS1='\[\e[34m\]\u\[\e[1;32m\]@\[\e[0;33m\]\h\[\e[35m\]:\[\e[m\]\w\[\e[1;34m\]$(__git_ps1)\[\e[1;31m\]> \[\e[0m\]' + +# fzf experiments +export FZF_DEFAULT_COMMAND='fd --type f --hidden --follow --exclude .git' +export FZF_ALT_C_COMMAND='fd --type d --hidden --follow --exclude .git' +export FZF_CTRL_T_COMMAND='fd --type f --type d --hidden --follow --exclude .git' +[ -n "$NVIM_LISTEN_ADDRESS" ] && export FZF_DEFAULT_OPTS='--no-height' + +if [ -x ~/.vim/plugged/fzf.vim/bin/preview.rb ]; then + export FZF_CTRL_T_OPTS="--preview '~/.vim/plugged/fzf.vim/bin/preview.rb {} | head -200'" +fi + +export FZF_CTRL_R_OPTS="--preview 'echo {}' --preview-window down:3:hidden:wrap --bind '?:toggle-preview' --bind 'ctrl-y:execute-silent(echo -n {2..} | pbcopy)+abort' --header 'Press CTRL-Y to copy command into clipboard' --border" diff --git a/git/.git-prompt.sh b/git/.git-prompt.sh new file mode 100644 index 0000000..983e419 --- /dev/null +++ b/git/.git-prompt.sh @@ -0,0 +1,535 @@ +# bash/zsh git prompt support +# +# Copyright (C) 2006,2007 Shawn O. Pearce +# Distributed under the GNU General Public License, version 2.0. +# +# This script allows you to see repository status in your prompt. +# +# To enable: +# +# 1) Copy this file to somewhere (e.g. ~/.git-prompt.sh). +# 2) Add the following line to your .bashrc/.zshrc: +# source ~/.git-prompt.sh +# 3a) Change your PS1 to call __git_ps1 as +# command-substitution: +# Bash: PS1='[\u@\h \W$(__git_ps1 " (%s)")]\$ ' +# ZSH: setopt PROMPT_SUBST ; PS1='[%n@%m %c$(__git_ps1 " (%s)")]\$ ' +# the optional argument will be used as format string. +# 3b) Alternatively, for a slightly faster prompt, __git_ps1 can +# be used for PROMPT_COMMAND in Bash or for precmd() in Zsh +# with two parameters,
 and , which are strings
+#        you would put in $PS1 before and after the status string
+#        generated by the git-prompt machinery.  e.g.
+#        Bash: PROMPT_COMMAND='__git_ps1 "\u@\h:\w" "\\\$ "'
+#          will show username, at-sign, host, colon, cwd, then
+#          various status string, followed by dollar and SP, as
+#          your prompt.
+#        ZSH:  precmd () { __git_ps1 "%n" ":%~$ " "|%s" }
+#          will show username, pipe, then various status string,
+#          followed by colon, cwd, dollar and SP, as your prompt.
+#        Optionally, you can supply a third argument with a printf
+#        format string to finetune the output of the branch status
+#
+# The repository status will be displayed only if you are currently in a
+# git repository. The %s token is the placeholder for the shown status.
+#
+# The prompt status always includes the current branch name.
+#
+# In addition, if you set GIT_PS1_SHOWDIRTYSTATE to a nonempty value,
+# unstaged (*) and staged (+) changes will be shown next to the branch
+# name.  You can configure this per-repository with the
+# bash.showDirtyState variable, which defaults to true once
+# GIT_PS1_SHOWDIRTYSTATE is enabled.
+#
+# You can also see if currently something is stashed, by setting
+# GIT_PS1_SHOWSTASHSTATE to a nonempty value. If something is stashed,
+# then a '$' will be shown next to the branch name.
+#
+# If you would like to see if there're untracked files, then you can set
+# GIT_PS1_SHOWUNTRACKEDFILES to a nonempty value. If there're untracked
+# files, then a '%' will be shown next to the branch name.  You can
+# configure this per-repository with the bash.showUntrackedFiles
+# variable, which defaults to true once GIT_PS1_SHOWUNTRACKEDFILES is
+# enabled.
+#
+# If you would like to see the difference between HEAD and its upstream,
+# set GIT_PS1_SHOWUPSTREAM="auto".  A "<" indicates you are behind, ">"
+# indicates you are ahead, "<>" indicates you have diverged and "="
+# indicates that there is no difference. You can further control
+# behaviour by setting GIT_PS1_SHOWUPSTREAM to a space-separated list
+# of values:
+#
+#     verbose       show number of commits ahead/behind (+/-) upstream
+#     name          if verbose, then also show the upstream abbrev name
+#     legacy        don't use the '--count' option available in recent
+#                   versions of git-rev-list
+#     git           always compare HEAD to @{upstream}
+#     svn           always compare HEAD to your SVN upstream
+#
+# You can change the separator between the branch name and the above
+# state symbols by setting GIT_PS1_STATESEPARATOR. The default separator
+# is SP.
+#
+# By default, __git_ps1 will compare HEAD to your SVN upstream if it can
+# find one, or @{upstream} otherwise.  Once you have set
+# GIT_PS1_SHOWUPSTREAM, you can override it on a per-repository basis by
+# setting the bash.showUpstream config variable.
+#
+# If you would like to see more information about the identity of
+# commits checked out as a detached HEAD, set GIT_PS1_DESCRIBE_STYLE
+# to one of these values:
+#
+#     contains      relative to newer annotated tag (v1.6.3.2~35)
+#     branch        relative to newer tag or branch (master~4)
+#     describe      relative to older annotated tag (v1.6.3.1-13-gdd42c2f)
+#     tag           relative to any older tag (v1.6.3.1-13-gdd42c2f)
+#     default       exactly matching tag
+#
+# If you would like a colored hint about the current dirty state, set
+# GIT_PS1_SHOWCOLORHINTS to a nonempty value. The colors are based on
+# the colored output of "git status -sb" and are available only when
+# using __git_ps1 for PROMPT_COMMAND or precmd.
+#
+# If you would like __git_ps1 to do nothing in the case when the current
+# directory is set up to be ignored by git, then set
+# GIT_PS1_HIDE_IF_PWD_IGNORED to a nonempty value. Override this on the
+# repository level by setting bash.hideIfPwdIgnored to "false".
+
+# check whether printf supports -v
+__git_printf_supports_v=
+printf -v __git_printf_supports_v -- '%s' yes >/dev/null 2>&1
+
+# stores the divergence from upstream in $p
+# used by GIT_PS1_SHOWUPSTREAM
+__git_ps1_show_upstream ()
+{
+	local key value
+	local svn_remote svn_url_pattern count n
+	local upstream=git legacy="" verbose="" name=""
+
+	svn_remote=()
+	# get some config options from git-config
+	local output="$(git config -z --get-regexp '^(svn-remote\..*\.url|bash\.showupstream)$' 2>/dev/null | tr '\0\n' '\n ')"
+	while read -r key value; do
+		case "$key" in
+		bash.showupstream)
+			GIT_PS1_SHOWUPSTREAM="$value"
+			if [[ -z "${GIT_PS1_SHOWUPSTREAM}" ]]; then
+				p=""
+				return
+			fi
+			;;
+		svn-remote.*.url)
+			svn_remote[$((${#svn_remote[@]} + 1))]="$value"
+			svn_url_pattern="$svn_url_pattern\\|$value"
+			upstream=svn+git # default upstream is SVN if available, else git
+			;;
+		esac
+	done <<< "$output"
+
+	# parse configuration values
+	for option in ${GIT_PS1_SHOWUPSTREAM}; do
+		case "$option" in
+		git|svn) upstream="$option" ;;
+		verbose) verbose=1 ;;
+		legacy)  legacy=1  ;;
+		name)    name=1 ;;
+		esac
+	done
+
+	# Find our upstream
+	case "$upstream" in
+	git)    upstream="@{upstream}" ;;
+	svn*)
+		# get the upstream from the "git-svn-id: ..." in a commit message
+		# (git-svn uses essentially the same procedure internally)
+		local -a svn_upstream
+		svn_upstream=($(git log --first-parent -1 \
+					--grep="^git-svn-id: \(${svn_url_pattern#??}\)" 2>/dev/null))
+		if [[ 0 -ne ${#svn_upstream[@]} ]]; then
+			svn_upstream=${svn_upstream[${#svn_upstream[@]} - 2]}
+			svn_upstream=${svn_upstream%@*}
+			local n_stop="${#svn_remote[@]}"
+			for ((n=1; n <= n_stop; n++)); do
+				svn_upstream=${svn_upstream#${svn_remote[$n]}}
+			done
+
+			if [[ -z "$svn_upstream" ]]; then
+				# default branch name for checkouts with no layout:
+				upstream=${GIT_SVN_ID:-git-svn}
+			else
+				upstream=${svn_upstream#/}
+			fi
+		elif [[ "svn+git" = "$upstream" ]]; then
+			upstream="@{upstream}"
+		fi
+		;;
+	esac
+
+	# Find how many commits we are ahead/behind our upstream
+	if [[ -z "$legacy" ]]; then
+		count="$(git rev-list --count --left-right \
+				"$upstream"...HEAD 2>/dev/null)"
+	else
+		# produce equivalent output to --count for older versions of git
+		local commits
+		if commits="$(git rev-list --left-right "$upstream"...HEAD 2>/dev/null)"
+		then
+			local commit behind=0 ahead=0
+			for commit in $commits
+			do
+				case "$commit" in
+				"<"*) ((behind++)) ;;
+				*)    ((ahead++))  ;;
+				esac
+			done
+			count="$behind	$ahead"
+		else
+			count=""
+		fi
+	fi
+
+	# calculate the result
+	if [[ -z "$verbose" ]]; then
+		case "$count" in
+		"") # no upstream
+			p="" ;;
+		"0	0") # equal to upstream
+			p="=" ;;
+		"0	"*) # ahead of upstream
+			p=">" ;;
+		*"	0") # behind upstream
+			p="<" ;;
+		*)	    # diverged from upstream
+			p="<>" ;;
+		esac
+	else
+		case "$count" in
+		"") # no upstream
+			p="" ;;
+		"0	0") # equal to upstream
+			p=" u=" ;;
+		"0	"*) # ahead of upstream
+			p=" u+${count#0	}" ;;
+		*"	0") # behind upstream
+			p=" u-${count%	0}" ;;
+		*)	    # diverged from upstream
+			p=" u+${count#*	}-${count%	*}" ;;
+		esac
+		if [[ -n "$count" && -n "$name" ]]; then
+			__git_ps1_upstream_name=$(git rev-parse \
+				--abbrev-ref "$upstream" 2>/dev/null)
+			if [ $pcmode = yes ] && [ $ps1_expanded = yes ]; then
+				p="$p \${__git_ps1_upstream_name}"
+			else
+				p="$p ${__git_ps1_upstream_name}"
+				# not needed anymore; keep user's
+				# environment clean
+				unset __git_ps1_upstream_name
+			fi
+		fi
+	fi
+
+}
+
+# Helper function that is meant to be called from __git_ps1.  It
+# injects color codes into the appropriate gitstring variables used
+# to build a gitstring.
+__git_ps1_colorize_gitstring ()
+{
+	if [[ -n ${ZSH_VERSION-} ]]; then
+		local c_red='%F{red}'
+		local c_green='%F{green}'
+		local c_lblue='%F{blue}'
+		local c_clear='%f'
+	else
+		# Using \[ and \] around colors is necessary to prevent
+		# issues with command line editing/browsing/completion!
+		local c_red='\[\e[31m\]'
+		local c_green='\[\e[32m\]'
+		local c_lblue='\[\e[1;34m\]'
+		local c_clear='\[\e[0m\]'
+	fi
+	local bad_color=$c_red
+	local ok_color=$c_green
+	local flags_color="$c_lblue"
+
+	local branch_color=""
+	if [ $detached = no ]; then
+		branch_color="$ok_color"
+	else
+		branch_color="$bad_color"
+	fi
+	c="$branch_color$c"
+
+	z="$c_clear$z"
+	if [ "$w" = "*" ]; then
+		w="$bad_color$w"
+	fi
+	if [ -n "$i" ]; then
+		i="$ok_color$i"
+	fi
+	if [ -n "$s" ]; then
+		s="$flags_color$s"
+	fi
+	if [ -n "$u" ]; then
+		u="$bad_color$u"
+	fi
+	r="$c_clear$r"
+}
+
+# Helper function to read the first line of a file into a variable.
+# __git_eread requires 2 arguments, the file path and the name of the
+# variable, in that order.
+__git_eread ()
+{
+	test -r "$1" && IFS=$'\r\n' read "$2" <"$1"
+}
+
+# __git_ps1 accepts 0 or 1 arguments (i.e., format string)
+# when called from PS1 using command substitution
+# in this mode it prints text to add to bash PS1 prompt (includes branch name)
+#
+# __git_ps1 requires 2 or 3 arguments when called from PROMPT_COMMAND (pc)
+# in that case it _sets_ PS1. The arguments are parts of a PS1 string.
+# when two arguments are given, the first is prepended and the second appended
+# to the state string when assigned to PS1.
+# The optional third parameter will be used as printf format string to further
+# customize the output of the git-status string.
+# In this mode you can request colored hints using GIT_PS1_SHOWCOLORHINTS=true
+__git_ps1 ()
+{
+	# preserve exit status
+	local exit=$?
+	local pcmode=no
+	local detached=no
+	local ps1pc_start='\u@\h:\w '
+	local ps1pc_end='\$ '
+	local printf_format=' (%s)'
+
+	case "$#" in
+		2|3)	pcmode=yes
+			ps1pc_start="$1"
+			ps1pc_end="$2"
+			printf_format="${3:-$printf_format}"
+			# set PS1 to a plain prompt so that we can
+			# simply return early if the prompt should not
+			# be decorated
+			PS1="$ps1pc_start$ps1pc_end"
+		;;
+		0|1)	printf_format="${1:-$printf_format}"
+		;;
+		*)	return $exit
+		;;
+	esac
+
+	# ps1_expanded:  This variable is set to 'yes' if the shell
+	# subjects the value of PS1 to parameter expansion:
+	#
+	#   * bash does unless the promptvars option is disabled
+	#   * zsh does not unless the PROMPT_SUBST option is set
+	#   * POSIX shells always do
+	#
+	# If the shell would expand the contents of PS1 when drawing
+	# the prompt, a raw ref name must not be included in PS1.
+	# This protects the user from arbitrary code execution via
+	# specially crafted ref names.  For example, a ref named
+	# 'refs/heads/$(IFS=_;cmd=sudo_rm_-rf_/;$cmd)' might cause the
+	# shell to execute 'sudo rm -rf /' when the prompt is drawn.
+	#
+	# Instead, the ref name should be placed in a separate global
+	# variable (in the __git_ps1_* namespace to avoid colliding
+	# with the user's environment) and that variable should be
+	# referenced from PS1.  For example:
+	#
+	#     __git_ps1_foo=$(do_something_to_get_ref_name)
+	#     PS1="...stuff...\${__git_ps1_foo}...stuff..."
+	#
+	# If the shell does not expand the contents of PS1, the raw
+	# ref name must be included in PS1.
+	#
+	# The value of this variable is only relevant when in pcmode.
+	#
+	# Assume that the shell follows the POSIX specification and
+	# expands PS1 unless determined otherwise.  (This is more
+	# likely to be correct if the user has a non-bash, non-zsh
+	# shell and safer than the alternative if the assumption is
+	# incorrect.)
+	#
+	local ps1_expanded=yes
+	[ -z "${ZSH_VERSION-}" ] || [[ -o PROMPT_SUBST ]] || ps1_expanded=no
+	[ -z "${BASH_VERSION-}" ] || shopt -q promptvars || ps1_expanded=no
+
+	local repo_info rev_parse_exit_code
+	repo_info="$(git rev-parse --git-dir --is-inside-git-dir \
+		--is-bare-repository --is-inside-work-tree \
+		--short HEAD 2>/dev/null)"
+	rev_parse_exit_code="$?"
+
+	if [ -z "$repo_info" ]; then
+		return $exit
+	fi
+
+	local short_sha=""
+	if [ "$rev_parse_exit_code" = "0" ]; then
+		short_sha="${repo_info##*$'\n'}"
+		repo_info="${repo_info%$'\n'*}"
+	fi
+	local inside_worktree="${repo_info##*$'\n'}"
+	repo_info="${repo_info%$'\n'*}"
+	local bare_repo="${repo_info##*$'\n'}"
+	repo_info="${repo_info%$'\n'*}"
+	local inside_gitdir="${repo_info##*$'\n'}"
+	local g="${repo_info%$'\n'*}"
+
+	if [ "true" = "$inside_worktree" ] &&
+	   [ -n "${GIT_PS1_HIDE_IF_PWD_IGNORED-}" ] &&
+	   [ "$(git config --bool bash.hideIfPwdIgnored)" != "false" ] &&
+	   git check-ignore -q .
+	then
+		return $exit
+	fi
+
+	local r=""
+	local b=""
+	local step=""
+	local total=""
+	if [ -d "$g/rebase-merge" ]; then
+		__git_eread "$g/rebase-merge/head-name" b
+		__git_eread "$g/rebase-merge/msgnum" step
+		__git_eread "$g/rebase-merge/end" total
+		if [ -f "$g/rebase-merge/interactive" ]; then
+			r="|REBASE-i"
+		else
+			r="|REBASE-m"
+		fi
+	else
+		if [ -d "$g/rebase-apply" ]; then
+			__git_eread "$g/rebase-apply/next" step
+			__git_eread "$g/rebase-apply/last" total
+			if [ -f "$g/rebase-apply/rebasing" ]; then
+				__git_eread "$g/rebase-apply/head-name" b
+				r="|REBASE"
+			elif [ -f "$g/rebase-apply/applying" ]; then
+				r="|AM"
+			else
+				r="|AM/REBASE"
+			fi
+		elif [ -f "$g/MERGE_HEAD" ]; then
+			r="|MERGING"
+		elif [ -f "$g/CHERRY_PICK_HEAD" ]; then
+			r="|CHERRY-PICKING"
+		elif [ -f "$g/REVERT_HEAD" ]; then
+			r="|REVERTING"
+		elif [ -f "$g/BISECT_LOG" ]; then
+			r="|BISECTING"
+		fi
+
+		if [ -n "$b" ]; then
+			:
+		elif [ -h "$g/HEAD" ]; then
+			# symlink symbolic ref
+			b="$(git symbolic-ref HEAD 2>/dev/null)"
+		else
+			local head=""
+			if ! __git_eread "$g/HEAD" head; then
+				return $exit
+			fi
+			# is it a symbolic ref?
+			b="${head#ref: }"
+			if [ "$head" = "$b" ]; then
+				detached=yes
+				b="$(
+				case "${GIT_PS1_DESCRIBE_STYLE-}" in
+				(contains)
+					git describe --contains HEAD ;;
+				(branch)
+					git describe --contains --all HEAD ;;
+				(tag)
+					git describe --tags HEAD ;;
+				(describe)
+					git describe HEAD ;;
+				(* | default)
+					git describe --tags --exact-match HEAD ;;
+				esac 2>/dev/null)" ||
+
+				b="$short_sha..."
+				b="($b)"
+			fi
+		fi
+	fi
+
+	if [ -n "$step" ] && [ -n "$total" ]; then
+		r="$r $step/$total"
+	fi
+
+	local w=""
+	local i=""
+	local s=""
+	local u=""
+	local c=""
+	local p=""
+
+	if [ "true" = "$inside_gitdir" ]; then
+		if [ "true" = "$bare_repo" ]; then
+			c="BARE:"
+		else
+			b="GIT_DIR!"
+		fi
+	elif [ "true" = "$inside_worktree" ]; then
+		if [ -n "${GIT_PS1_SHOWDIRTYSTATE-}" ] &&
+		   [ "$(git config --bool bash.showDirtyState)" != "false" ]
+		then
+			git diff --no-ext-diff --quiet || w="*"
+			git diff --no-ext-diff --cached --quiet || i="+"
+			if [ -z "$short_sha" ] && [ -z "$i" ]; then
+				i="#"
+			fi
+		fi
+		if [ -n "${GIT_PS1_SHOWSTASHSTATE-}" ] &&
+		   git rev-parse --verify --quiet refs/stash >/dev/null
+		then
+			s="$"
+		fi
+
+		if [ -n "${GIT_PS1_SHOWUNTRACKEDFILES-}" ] &&
+		   [ "$(git config --bool bash.showUntrackedFiles)" != "false" ] &&
+		   git ls-files --others --exclude-standard --directory --no-empty-directory --error-unmatch -- ':/*' >/dev/null 2>/dev/null
+		then
+			u="%${ZSH_VERSION+%}"
+		fi
+
+		if [ -n "${GIT_PS1_SHOWUPSTREAM-}" ]; then
+			__git_ps1_show_upstream
+		fi
+	fi
+
+	local z="${GIT_PS1_STATESEPARATOR-" "}"
+
+	# NO color option unless in PROMPT_COMMAND mode
+	if [ $pcmode = yes ] && [ -n "${GIT_PS1_SHOWCOLORHINTS-}" ]; then
+		__git_ps1_colorize_gitstring
+	fi
+
+	b=${b##refs/heads/}
+	if [ $pcmode = yes ] && [ $ps1_expanded = yes ]; then
+		__git_ps1_branch_name=$b
+		b="\${__git_ps1_branch_name}"
+	fi
+
+	local f="$w$i$s$u"
+	local gitstring="$c$b${f:+$z$f}$r$p"
+
+	if [ $pcmode = yes ]; then
+		if [ "${__git_printf_supports_v-}" != yes ]; then
+			gitstring=$(printf -- "$printf_format" "$gitstring")
+		else
+			printf -v gitstring -- "$printf_format" "$gitstring"
+		fi
+		PS1="$ps1pc_start$gitstring$ps1pc_end"
+	else
+		printf -- "$printf_format" "$gitstring"
+	fi
+
+	return $exit
+}
diff --git a/ruby/.gemrc b/ruby/.gemrc
new file mode 100644
index 0000000..882316e
--- /dev/null
+++ b/ruby/.gemrc
@@ -0,0 +1 @@
+gem: --no-rdoc --no-ri
diff --git a/sync.sh b/sync.sh
new file mode 100755
index 0000000..3b8aaa2
--- /dev/null
+++ b/sync.sh
@@ -0,0 +1,22 @@
+# xcode-select --install
+
+if ! [ -x "$(command -v brew)" ]; then
+  echo "==> Found brew"
+  /usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
+else
+  echo "==> Brew already installed"
+fi
+
+echo "==> Brew bundle"
+brew bundle
+
+if [ -f ~/.local/share/nvim/site/autoload/plug.vim ]; then
+  echo "==> Found vim-plug"
+else
+  echo "==> Installing vim-plug"
+  curl -fLo ~/.local/share/nvim/site/autoload/plug.vim --create-dirs \
+    https://raw.githubusercontent.com/junegunn/vim-plug/master/plug.vim
+fi
+
+echo "==> Symlinking dotfiles"
+for dir in $(ls -d */); do stow -Rv ${dir}; done
diff --git a/tmux/.tmux.conf b/tmux/.tmux.conf
new file mode 100644
index 0000000..03be6b7
--- /dev/null
+++ b/tmux/.tmux.conf
@@ -0,0 +1,89 @@
+# NOTE: First of all install TPM
+# git clone https://github.com/tmux-plugins/tpm ~/.tmux/plugins/tpm
+
+unbind-key C-b
+set -g prefix C-a
+
+set-clipboard on
+
+set-option -g default-command "reattach-to-user-namespace -l bash"
+
+# Set the base index for windows to 1 instead of 0.
+set -g base-index 1
+
+# Set the base index for panes to 1 instead of 0.
+setw -g pane-base-index 1
+
+# Vi-mode
+set -g mode-keys vi
+
+# Enable activity alerts.
+set -g visual-activity off
+
+# Renumber windows when a window is closed
+set -g renumber-windows on
+
+# => Theme
+set -g status-bg black
+set -g status-fg white
+set -g window-status-current-bg white
+set -g window-status-current-fg black
+set -g window-status-current-attr bold
+
+# Default window title colors
+setw -g window-status-fg colour244 #base0
+setw -g window-status-bg default
+
+# Active window title colors
+setw -g window-status-current-fg colour166 #orange
+setw -g window-status-current-bg default
+
+# Message text
+set -g message-bg colour235 #base02
+set -g message-fg colour166 #orange
+
+set -g window-status-format " #W "
+set -g window-status-current-format " #W "
+
+set -g status-left ''
+set -g status-right ''
+set -g status-justify centre
+
+# => Bindings
+# Kill pane without confirmation
+bind-key x kill-pane
+bind-key \ split-window -h
+bind-key - split-window -v
+
+# Painless copying with tmux-yank
+unbind [
+bind Escape copy-mode
+
+setw -g mode-keys vi
+
+unbind-key -T copy-mode-vi v
+
+bind-key -T copy-mode-vi 'v' send -X begin-selection # Begin selection in copy mode.
+bind-key -T copy-mode-vi 'C-v' send -X rectangle-toggle # Begin selection in copy mode.
+bind-key -T copy-mode-vi 'y' send -X copy-selection # Yank selection in copy mode.
+bind-key -t copy-mode-vi 'K' halfpage-up
+bind-key -t copy-mode-vi 'J' halfpage-down
+
+# => Plugins
+set -g @plugin 'tmux-plugins/tpm'
+set -g @plugin 'tmux-plugins/tmux-sensible'
+
+# Depends on 'urlview'
+set -g @plugin 'tmux-plugins/tmux-urlview'
+set -g @plugin 'tmux-plugins/tmux-copycat'
+set -g @plugin 'tmux-plugins/tmux-yank'
+set -g @plugin 'tmux-plugins/tmux-open'
+
+# Default keysbindings for panes
+set -g @plugin 'tmux-plugins/tmux-pain-control'
+
+# If run as "tmux attach", create a session if one does not already exist
+new-session -A -s main
+
+# Initialize TMUX plugin manager (keep this line at the very bottom of tmux.conf)
+run '~/.tmux/plugins/tpm/tpm'
diff --git a/vim/.config/nvim/init.vim b/vim/.config/nvim/init.vim
new file mode 100644
index 0000000..fc17dda
--- /dev/null
+++ b/vim/.config/nvim/init.vim
@@ -0,0 +1 @@
+source ../../.vimrc
diff --git a/vim/.vimrc b/vim/.vimrc
new file mode 100644
index 0000000..587b2b7
--- /dev/null
+++ b/vim/.vimrc
@@ -0,0 +1,643 @@
+" Author:      Konstantin Bukley 
+" License:     WTFPL
+" Description: Personal vim configuration
+
+
+
+" ========================================================
+" -> General
+" ========================================================
+
+" Turn off vi-compatible mode
+set nocompatible
+
+" Encoding
+set encoding=utf-8
+set fileencoding=utf-8
+
+" Quantity of comand line entries vim have to remember
+set history=500
+
+" Remap the  to ,
+let mapleader=","
+let g:mapleader=","
+
+" Includes ftplugin.vim which is responsible for filetype detection
+filetype plugin indent on
+
+" Set syntax highlighting
+syntax on
+
+
+
+" ========================================================
+" -> Plugins
+" ========================================================
+
+if empty(glob('~/.local/share/nvim/site/autoload/plug.vim'))
+  silent !curl -fLo ~/.local/share/nvim/site/autoload/plug.vim --create-dirs \
+      https://raw.githubusercontent.com/junegunn/vim-plug/master/plug.vim
+  autocmd VimEnter * PlugInstall
+endif
+
+call plug#begin('~/.vim/plugged')
+
+" ======== Languages / Textobjects =======================
+
+Plug 'sheerun/vim-polyglot'
+Plug 'mxw/vim-jsx'
+Plug 'jtratner/vim-flavored-markdown', { 'for': 'markdown' }
+Plug 'kana/vim-textobj-user'
+Plug 'kana/vim-textobj-datetime'
+Plug 'kana/vim-textobj-entire'
+Plug 'kana/vim-textobj-function'
+Plug 'nelstrom/vim-textobj-rubyblock'
+Plug 'austintaylor/vim-indentobject'
+Plug 'lucapette/vim-textobj-underscore'
+Plug 'bootleq/vim-textobj-rubysymbol'
+
+" ======== Utility  ======================================
+
+Plug 'mattn/emmet-vim',
+Plug 'mileszs/ack.vim'
+Plug 'scrooloose/nerdtree',     { 'on': 'NERDTreeToggle' }
+Plug 'gregsexton/gitv',         { 'on': 'Gitv' }
+Plug 'junegunn/vim-easy-align', { 'on': ['(EasyAlign)', 'EasyAlign'] }
+Plug 'gregsexton/MatchTag',     { 'for': 'html' }
+Plug 'ctrlpvim/ctrlp.vim'
+Plug 'AndrewRadev/splitjoin.vim'
+Plug 'mattn/gist-vim' | Plug 'mattn/webapi-vim'
+Plug 'Raimondi/delimitMate'
+Plug 'nelstrom/vim-visual-star-search'
+Plug 'benmills/vimux'
+Plug 'skalnik/vim-vroom'
+Plug 'dyng/ctrlsf.vim'
+Plug 'terryma/vim-expand-region'
+Plug 'terryma/vim-multiple-cursors'
+Plug 'bogado/file-line'
+
+" ======== Snippets & Autocomplete ======================
+
+Plug 'SirVer/ultisnips' | Plug 'honza/vim-snippets'
+
+" ======== Appearence ===================================
+
+Plug 'altercation/vim-colors-solarized'
+Plug 'itchyny/lightline.vim'
+Plug 'airblade/vim-gitgutter'
+Plug 'mhinz/vim-startify'
+
+" ======== tpope <3  ====================================
+
+Plug 'tpope/vim-endwise'
+Plug 'tpope/vim-fugitive'
+Plug 'tpope/vim-rails',     { 'for': 'ruby' }
+Plug 'tpope/vim-surround'
+Plug 'tpope/vim-commentary'
+Plug 'tpope/vim-repeat'
+Plug 'tpope/vim-git'
+Plug 'tpope/vim-unimpaired'
+Plug 'tpope/vim-vinegar'
+
+" ========= Some of my stuff  ===========================
+" Bunch of helper functions extracted in their own plugin
+
+" Plug 'madundead/vim-madundead'
+Plug '~/Development/vim-madundead'
+
+" ======== Experimental =================================
+
+Plug 'vim-utils/vim-interruptless' " prevents [O]K, [L]oad interuption
+Plug 'ngmy/vim-rubocop'
+Plug 'junegunn/goyo.vim'
+Plug 'junegunn/fzf.vim'
+Plug 'neomake/neomake'
+Plug 'slashmili/alchemist.vim'
+Plug 'dylanaraps/crayon'
+Plug 'machakann/vim-highlightedyank'
+Plug 'rhysd/clever-f.vim'
+Plug 'majutsushi/tagbar'
+Plug 'darfink/vim-plist'
+
+call plug#end()
+
+
+
+" ========================================================
+" -> Plugin settings
+" ========================================================
+
+
+" Enable matchit.vim
+runtime macros/matchit.vim
+
+" --- Netrw
+
+let g:netrw_banner    = 0
+let g:netrw_list_hide = '^\.$'
+let g:netrw_liststyle = 4
+
+" --- NERDTree
+
+let NERDTreeWinPos           = "right"
+let NERDTreeMinimalUI        = 1
+let NERDTreeDirArrows        = 1
+let NERDTreeAutoDeleteBuffer = 1
+let NERDTreeHijackNetrw      = 1
+
+" --- CtrlP
+
+let g:ctrlp_max_height      = 10
+let g:ctrlp_show_hidden     = 0
+let g:ctrlp_follow_symlinks = 1
+let g:ctrlp_max_files       = 20000
+let g:ctrlp_reuse_window    = 'startify'
+let g:ctrlp_extensions      = ['funky']
+let g:ctrlp_user_command    = 'rg --files  %s'
+let g:ctrlp_status_func     =
+  \ {
+  \   'main': 'madundead#ctrlp_main_status',
+  \   'prog': 'madundead#ctrlp_prog_status',
+  \ }
+let g:ctrlp_custom_ignore =
+  \ {
+  \   'dir': '\v[\/]\.(git|hg|svn|idea)$',
+  \   'file': '\v\.DS_Store$'
+  \ }
+
+" --- Ultisnips
+
+let g:UltiSnipsExpandTrigger       = ''
+let g:UltiSnipsJumpForwardTrigger  = ''
+let g:UltiSnipsJumpBackwardTrigger = ''
+
+" --- CtrlSF
+
+let g:ctrlsf_ackprg         = 'rg'
+let g:ctrlsf_regex_pattern  = 1
+let g:ctrlsf_case_sensitive = 'smart'
+let g:ctrlsf_default_root   = 'project'
+let g:ctrlsf_context        = '-B 1 -A 1'
+let g:ctrlsf_position       = 'bottom'
+let g:ctrlsf_winsize        = '40%'
+let g:ctrlsf_mapping        =
+  \ {
+  \   'next': 'n',
+  \   'prev': 'N',
+  \ }
+
+" --- gist-vim
+
+let g:gist_clip_command    = 'pbcopy'
+let g:gist_detect_filetype = 1
+let g:gist_post_private    = 1
+let g:gist_show_privates   = 1
+
+" --- vimux
+
+let g:vroom_use_vimux = 1
+
+" --- vim-startify
+
+let g:startify_relative_path          = 0
+let g:startify_files_number           = 5
+let g:startify_session_persistence    = 1
+let g:startify_session_autoload       = 1
+let g:startify_session_delete_buffers = 1
+let g:startify_enable_special         = 1
+let g:startify_change_to_vcs_root     = 1
+let g:startify_show_sessions          = 1
+let g:startify_list_order =
+  \ [
+  \   [ ' > Recent: ' ],
+  \   'dir',
+  \   [ ' > Bookmarks: ' ],
+  \   'bookmarks'
+  \ ]
+let g:startify_skiplist =
+  \ [
+  \   'COMMIT_EDITMSG',
+  \   $VIMRUNTIME .'/doc',
+  \   'bundle/.*/doc',
+  \   '\.vimgolf',
+  \ ]
+let g:startify_custom_indices = [ '1', '2', '3', '4', '5', 'h', 'd', 'E', 'z' ]
+let g:startify_bookmarks      = [ '~/', '~/Development', '~/.vimrc', '~/.zshrc' ]
+let g:startify_custom_footer  = [ '', '   All work and no play makes Jack a dull boy', '' ]
+let g:startify_custom_header  = []
+
+" --- lightline
+"
+"  NOTE:  Proper status line marks require madundead/vim-madundead
+"
+
+let g:lightline =
+  \ {
+  \ 'enable': { 'tabline': 0 },
+  \ 'colorscheme': 'solarized',
+  \ 'active': {
+  \   'left': [ [ 'mode', 'paste' ], [ 'fugitive', 'filename' ], ['ctrlpmark'] ],
+  \   'right': [],
+  \ },
+  \ 'inactive': {
+  \   'right': [],
+  \ },
+  \ 'component_function': {
+  \     'fugitive':     'madundead#lightline_fugitive',
+  \     'filename':     'madundead#lightline_file_name',
+  \     'fileformat':   'madundead#lightline_file_format',
+  \     'filetype':     'madundead#lightline_file_type',
+  \     'fileencoding': 'madundead#lightline_file_encoding',
+  \     'mode':         'madundead#lightline_mode',
+  \     'ctrlpmark':    'madundead#lightline_ctrlp',
+  \   },
+  \ }
+let g:lightline.mode_map =
+  \ {
+  \ 'n' : ' N ',
+  \ 'i' : ' I ',
+  \ 'R' : ' R ',
+  \ 'v' : ' V ',
+  \ 'V' : ' V ',
+  \ 'c' : ' N ',
+  \ "\": ' V ',
+  \ 's' : 'S',
+  \ 'S' : 'S',
+  \ "\": 'S',
+  \ '?': '      '
+  \ }
+
+
+
+" ========================================================
+" -> Colors & Fonts
+" ========================================================
+
+" solarized is love solarized is life
+colorscheme solarized
+set background=dark
+
+" set guifont=Source\ Code\ Pro:h16
+if has('gui_running')
+  set guifont=Menlo:h14
+  set guioptions-=T                         " remove toolbar
+  set guioptions-=m                         " remove menubar
+  set guioptions+=LlRrb                     " remove
+  set guioptions-=LlRrb                     " scrollbars
+  set t_Co=256
+else
+  " Disable Background Color Erase (BCE) so that color schemes
+  " work properly when Vim is used inside tmux and GNU screen.
+  " See also http://snk.tuxfamily.org/log/vim-256color-bce.html
+  set t_ut=
+  set t_Co=16
+endif
+
+
+
+" ========================================================
+" -> User Interface
+" ========================================================
+
+" enables menu at the bottom
+set wildmenu
+" highlight search
+set hlsearch
+" nicer separators
+set fillchars=diff:⣿,vert:│
+" don't try to highlight lines longer than 800 characters.
+set synmaxcol=200
+" when a file has been detected to have been changed outside of Vim and
+" it has not been changed inside of Vim, automatically read it again.
+set autoread
+" do not redraw while running macros
+set lazyredraw
+" tab label - requires vim-madundead
+set tabline=%!madundead#tabline()
+" show status even for single buffer displayed
+set laststatus=2
+" highlight current line
+set cursorline
+" number rows
+set number
+" disable welcome message
+set shortmess+=I
+" show matching braces
+set showmatch
+" shows when you are in insert mode
+set showmode
+" shows commands in right bottom corner
+set showcmd
+" show cursor position all the tiem
+set ruler
+" show title in console status bar
+set title
+" dont wrap lines
+set nowrap
+" when I scroll up or down, there are 2 lines between the line I'm on and the bottom or top of the screen.
+set scrolloff=5
+" how many tenths of a second to blink on matching brackets
+set mat=2
+" disable cursor blink
+set gcr=a:blinkon0
+" hide the mouse pointer while typing
+set mousehide
+" vim requires a POSIX-compliant shell. fish isn't
+if $SHELL =~ 'bin/fish'
+  set shell=/bin/sh
+endif
+
+
+
+" ========================================================
+" -> Behavior & Different Tricks
+" ========================================================
+
+" Shamelessly taken from YADR dotfile repo https://github.com/skwp/dotfiles
+" Stuff to ignore whent tab completing
+set wildignore=*.o,*.obj,*~
+set wildignore+=*vim/backups*
+set wildignore+=*sass-cache*
+set wildignore+=*DS_Store*
+set wildignore+=vendor/rails/**
+set wildignore+=vendor/cache/**
+set wildignore+=*.gem
+set wildignore+=log/**
+set wildignore+=tmp/**
+set wildignore+=*.png,*.jpg,*.gif
+
+" Russian keymap support
+set langmap=ФИСВУАПРШОЛДЬТЩЗЙКЫЕГМЦЧНЯЖ;ABCDEFGHIJKLMNOPQRSTUVWXYZ:,фисвуапршолдьтщзйкыегмцчня;abcdefghijklmnopqrstuvwxyz
+
+" W invokes sudo
+command! W w !sudo tee % > /dev/null
+
+" Use the OS clipboard by default (on versions compiled with `+clipboard`)
+set clipboard=unnamed
+
+" Dunno
+set matchtime=2
+
+" Force backspace to behave like in any other editor
+set backspace=2
+
+" Start searching as soon as you type first letter
+set incsearch
+
+" Turn off visualbell
+set novisualbell
+
+" Fuck backups
+set nobackup
+set nowb
+set noswapfile
+
+" Doesn't select lines number in vim
+set mouse=a
+
+" Facny whitespace characters
+set list listchars=tab:→\ ,trail:·
+
+" Abbrev. of messages (avoids 'hit enter')
+set shortmess+=filmnrxoOtT
+
+" Start scrolling when we're 8 lines away from margins
+set scrolloff=8
+
+" The minimal number of screen columns to keep to the left and to the
+" right of the cursor if 'nowrap' is set.
+set sidescrolloff=15
+
+" The minimal number of columns to scroll horizontally
+set sidescroll=1
+
+" Vertical splits in diff mode
+set diffopt+=vertical
+
+" Reduce delay between modes
+set timeoutlen=1000 ttimeoutlen=0
+
+
+
+" ========================================================
+" -> Indentations
+" ========================================================
+
+" Automatically inserts one extra level of indentation in some cases
+set smartindent
+
+" Affects how  key presses are interpreted depending on where the cursor is
+set smarttab
+
+" Tab counts as 2 columns
+set tabstop=2
+
+" Numbers of spaces to (auto)indent
+set shiftwidth=2
+
+" Spaces
+set expandtab
+
+" Don't write end of file
+" set noeol
+
+
+
+" ========================================================
+" -> Filetype Dependent Settings
+" ========================================================
+
+if has("autocmd")
+  au filetype help nnoremap  
+  au filetype help nnoremap  
+  au filetype help set nonumber
+
+  au BufNewFile,BufRead Capfile,Gemfile,Vagrantfile setl ft=ruby
+  au BufNewFile,BufRead *.rabl,*.jbuilder           setl ft=ruby
+
+  au BufNewFile,BufRead *.phtml         setl ft=html
+  au BufNewFile,BufRead *.md,*.markdown setl ft=ghmarkdown
+
+  " Only show cursorline in the current window and in normal mode.
+  augroup cline
+      au!
+      au WinLeave,InsertEnter * set nocursorline
+      au WinEnter,InsertLeave * set cursorline
+  augroup END
+
+  " Close tab if only NERDTree left
+  au WinEnter * call madundead#nerdtree_close_hack()
+
+  " Apply solarized tweak
+  au VimEnter * call madundead#tweak_solarized()
+
+  " Neomake
+  au BufWritePost * Neomake
+
+  " Prevent CtrlP or NERDTree from opening a split in Startify
+  au User Startified setl buftype=
+endif
+
+
+
+" ========================================================
+" -> Hotkeys & Bindings
+" ========================================================
+" Remap ; to :
+nnoremap ; :
+
+" Close buffer by Q
+nnoremap  Q :q!
+
+" Move between splits (not very nice)
+nmap   :wincmd k
+nmap   :wincmd j
+nmap   :wincmd h
+nmap   :wincmd l
+
+" Move between splits (better backup option)
+nnoremap  h
+nnoremap  j
+nnoremap  k
+nnoremap  l
+
+" Bash like keys for the vim command line
+cnoremap  
+cnoremap  
+
+" , -> clears search highlight
+nmap  :nohlsearch
+" ,, -> toggle between last open buffers
+nmap  
+" ,w -> strip trailing whitespace
+nmap w :call madundead#strip_trailing_whitespace()
+" ,n -> NERDTree
+nmap n :NERDTreeToggle
+" ,c -> next conflict marker
+nmap c /\v^[<=>]{7}( .*\|$)
+" ,b -> Gblame
+nmap b :Gblame
+" ,t -> opens new tab
+nmap t :tabnew
+" ,f -> prompts for search
+nmap f :CtrlSF 
+" ,g -> Gitv
+nmap g :Gitv 
+" ,d -> binding fucking pry
+nmap d orequire 'pry'; binding.pry
+" ,p -> current buffer file path
+nmap p :echo @%
+" ,s -> reload vimrc
+nmap s :so ~/.vimrc
+      \ :call madundead#tweak_solarized()
+" ,rh -> hashrocket to :
+nmap rh :%s/\v:(\w+) \=\>/\1:/g
+
+" Switching between tabs
+nmap  :tabnext
+nmap  :tabprevious
+
+" n/N centers screen on the entry
+nmap N Nzz
+nmap n nzz
+
+" Move faster
+nnoremap  
+nnoremap  
+" Even in VISUAL mode
+vnoremap  
+vnoremap  
+
+" Move properly when line wrapping is on
+nnoremap j gj
+nnoremap k gk
+
+" Visual mode indentations
+vnoremap <  >gv
+
+" Make Y/yy consistent with D/dd and C/cc
+nnoremap yy Y
+nnoremap Y y$
+
+" vv/ss for splits
+nnoremap vv v
+" nnoremap ss s
+
+" Highlight VCS conflict markers
+match ErrorMsg '^\(<\|=\|>\)\{7\}\([^=].\+\)\?$'
+
+" Start interactive EasyAlign in visual mode
+vmap  (EasyAlign)
+
+" Ctrl + e for emmet
+imap  , 
+
+" Allow the . to execute once for each line of a visual selection
+vnoremap . :normal .
+
+nnoremap H ^
+nnoremap L $
+nnoremap K 
+
+" Move visual block
+vnoremap J :m '>+1gv=gv
+vnoremap K :m '<-2gv=gv
+
+" Keep the cursor in place while joining lines
+nnoremap J mzJ`z
+
+" TODO: Space should be used for something more useful
+" Folding on 
+
+" NOTE: Keep this for future reference
+" My attempt at git 2-way merging
+" map  l :diffget //2:diffupdate
+" map  h :diffget //3:diffupdate
+" nnoremap j ]cw
+" nnoremap k [cw
+" map   :only:w
+
+" REMINDERS:
+" m         -- ruby method motion (e.g. cim)
+" i         -- indentation motion (e.g. dai)
+" gx        -- opens url in browser
+" ctrl + e  -- emmet
+" ctrl + n  -- vim-multiple-cursor
+
+" EXPERIMENTAL:
+
+" Toggle wrap
+nnoremap W :set wrap!
+
+" Keep old vim-commentary hotkeys
+xmap \\  Commentary
+nmap \\  Commentary
+nmap \\\ CommentaryLine
+nmap \\u CommentaryUndo
+
+" git
+noremap ga :Gwrite
+noremap gc :Gcommit
+noremap gsh :Gpush
+noremap gll :Gpull
+noremap gs :Gstatus
+noremap gb :Gblame
+noremap gd :Gvdiff
+noremap gr :Gremove
+
+map  :echo "hi<" . synIDattr(synID(line("."),col("."),1),"name") . '> trans<' . synIDattr(synID(line("."),col("."),0),"name") . "> lo<" . synIDattr(synIDtrans(synID(line("."),col("."),1)),"name") . ">"
+
+map y (highlightedyank)
+
+let g:highlightedyank_highlight_duration = 400
+
+" Delete comment character when joining commented lines
+if v:version > 703 || v:version == 703 && has("patch541")
+  set formatoptions+=j
+endif
+
+map  Sneak_;
+map  Sneak_,
+
+au FileType markdown vmap  :EasyAlign*