diff --git a/vcsh b/vcsh
index 8fedc09426938f4ef5b31d3769676fb4fc436adb..e3612b72520aeaac75bbd8e5073f3b6546f53415 100755
--- a/vcsh
+++ b/vcsh
@@ -3,7 +3,20 @@
 #set -x
 
 SELF=$(basename $0)
+
 [ -z $XDG_CONFIG_HOME ] && XDG_CONFIG_HOME="$HOME/.config"
+for check_directory in $XDG_CONFIG_HOME $XDG_CONFIG_HOME/vcsh $XDG_CONFIG_HOME/vcsh/repo.d
+do
+	if [ ! -d $check_directory ]; then
+		if [ -e $check_directory ]; then
+			echo "$SELF: error: $check_directory exists but is not a directory" >&2
+			exit 2
+		else
+			mkdir $check_directory || (echo "$SELF: error: could not create $check_directory" >&2; exit 2)
+		fi
+	fi
+done
+
 VCSH_BASE="$XDG_CONFIG_HOME/vcsh/repo.d"
 
 help() {
@@ -40,12 +53,12 @@ use() {
 
 init() {
 	[[ -e $GIT_DIR ]] &&
-		echo "$(basename $0): fatal: $GIT_DIR exists" &&
+		echo "$SELF: fatal: $GIT_DIR exists" &&
 		return 21
 	export GIT_WORK_TREE="$HOME"
 	mkdir -p $GIT_WORK_TREE
 	cd $GIT_WORK_TREE ||
-		(echo "$(basename $0): fatal: could not enter $GIT_WORK_TREE" &&
+		(echo "$SELF: fatal: could not enter $GIT_WORK_TREE" &&
 		 exit 20) || exit 20
 	cd $GIT_WORK_TREE
 	git init
@@ -80,7 +93,12 @@ elif [ "$1" = 'use' ]; then
 	if [[ -o NO_IGNORE_EOF ]]; then
 		export VCSH_NO_IGNORE_EOF=1
 		setopt IGNORE_EOF
-		vcsh_exit() {vcsh exit; zle reset-prompt}
+		if [[ -n $ZSH_VERSION ]]; then
+			vcsh_exit() {
+				vcsh exit;
+				zle reset-prompt;
+			}
+		fi
 		zle -N vcsh_exit
 		bindkey '^d' 'vcsh_exit'
 	fi
@@ -102,11 +120,11 @@ elif [ "$1" = 'clone' ]; then
 	git fetch
 	for i in $(git ls-tree -r origin/master | awk '{print $4}'); do
 	[[ -e $i ]] &&
-		echo "$(basename $0): error: $i exists." &&
+		echo "$SELF: error: $i exists." &&
 		CONFLICT=1;
 	done
 	[[ -n $CONFLICT ]] &&
-		echo "$(basename $0): fatal: will stop after fetching and not try to merge!\n" &&
+		echo "$SELF: fatal: will stop after fetching and not try to merge!\n" &&
 		exit 3
 	git merge origin/master
 	vcsh use $REPO_NAME