git-bash下默认使用zsh

背景

偶尔需要在windows下使用unity做些工作,
因此也需要设置一下配套的windows操作环境.
虽然也有WSL等,但git-bash无疑是最轻量的解决方案.
而之前的一个难题是,如何在git-bash中默认使用zsh,
目前该问题有了解决方案

zsh的版本

通过scoop安装的zsh,尽管可以切换但还是有些问题

  • 无法显示ansi色彩
  • 无法运行oh-my-zsh中的一些脚本

因此按照参考网页,从mysys2的仓库中下载(zsh-xx-x86~64~.pkg.tar.xz)

zsh的安装

解压后需要按照linux的方式分别将压缩包中的各个文件夹分别复制到 Git 的安装路径下,
通常 Git 的安装路径在 C:\Program Files\Git

默认加载zsh

此时应该已经可以手动使用 zsh 进入,
然后可以通过脚本控制从bash切换到zsh了.
~/.bashrc 文件中添加

1
2
3
4
# Launch Zsh
if [ -t 1 ]; then
exec zsh
fi
  • 如果还没有 .bashrc,git-bash会自动生成一些其他文件,没有影响

安装oh-my-zsh

按照oh-my-zsh的方法应该就可以

1
sh -c "$(curl -fsSL https://raw.githubusercontent.com/robbyrussell/oh-my-zsh/master/tools/install.sh)"

zsh主题备份

目前简单自定义了 robbyrussell.zsh-theme 主题.

1
2
3
4
5
6
7
8
9
10
# PROMPT="%(?:%{$fg_bold[green]%}➜:%{$fg_bold[red]%}➜)"
# PROMPT+=' %{$fg[cyan]%}%c%{$reset_color%} $(git_prompt_info)'
local ret_status="%(?:%{$fg_no_bold[green]%}%U%n:%{$fg_no_bold[red]%}%n)"
PROMPT='${ret_status}%u:%{$fg_no_bold[yellow]%}%~%{$fg[red]%}\$ %{$reset_color%}$(git_prompt_info)
> '

ZSH_THEME_GIT_PROMPT_PREFIX="%{$fg_bold[blue]%}git:(%{$fg[red]%}"
ZSH_THEME_GIT_PROMPT_SUFFIX="%{$reset_color%} "
ZSH_THEME_GIT_PROMPT_DIRTY="%{$fg[blue]%}) %{$fg[yellow]%}✗"
ZSH_THEME_GIT_PROMPT_CLEAN="%{$fg[blue]%})"

插件问题

常用的插件

  • git
  • z
  • colored-man-pages

开箱可用
第三方插件

  • zsh-autosuggestions
  • zsh-snytax-highlighting

等可以手动放到 ~/.oh-my-zsh/custom/plugins/ 下并配置一下就可用

fzf插件

由于windows的编译版本基本没有绑定快捷键的脚本,
因此需要从其他平台借来对应的脚本文件

Arch Linux下可以是
/usr/share/fzf/key-bindings.zsh, /usr/share/fzf/completion.zsh

macOS下可以是
/usr/local/Cellar/fzf/0.24.2/shell/key-bindings.zsh, /usr/local/Cellar/fzf/0.24.2/shell/completion.zsh

注意oh-my-zsh自带的 ~/.oh-my-zsh/lib/key-bindings.zsh 等并不涉及fzf相关内容,因此不能用.

另外这些脚本存放的位置通常是 $FZF_BASE/shell/,因此还需要配置环境变量,
另外注意如果是使用scoop安装的,不要在 /c/Users/xxx/scoop/shims/ 下创建和可执行文件同名的文件夹.
会导致找不到fzf的可执行文件(which fzf 会报错)
目前我将 key-bindings.zsh 放在 /c/Users/xxx/scoop/shims/_fzf/shell/

习以为常的快捷键

shell中时常使用的C-a,C-e,C-y等等快捷键,其实也是有配置文件的,
根源上的软件为 GNU readline,(linux和windows下的git-bash都用了,mac不清楚但并不影响bind和bindkey的使用)
默认配置文件通常是 ~/.inputrc/etc/inputrc
除去配置文件语法,还有一些用于配置的命令,
bash下内置的是 bind,可以使用 bind -p 查看目前绑定的快捷键和功能列表.
zsh下使用的是 bindkey,不过使用方法暂时不清楚,fzf自带的 key-bindings 里有一些.
命令的配置会覆盖配置文件,因此也不需要专门unbind了C-t对应的按键.

其他问题

  • exa还没有官方支持的windows编译

参考

  1. 主要参考
  2. readline的一些说明