我把从第一天到现在每天的 Home 目录都放上 GitHub 了,README.md 里面有说明
这是今天的 Release https://github.com/simba-fs/2021-ironman-example/releases/tag/day04
今天的内容会比平常多,但是非常紮实!
有时候我们在 CLI 操作时遇到很多重复的指令,像是 git add
、git commit -m 'ba la ba la'
等等,这些指令可能又长又复杂,一直都是自己打也不是办法,这时候就该请出 autosuggestions 了
安装 autosuggestions
老样子,安装外挂只须要修改 ~/.zshrc
就可以了
# plugins
zplug 'romkatv/powerlevel10k', as:theme, depth:1
+ zplug 'zsh-users/zsh-autosuggestions'
因为 autosuggestions
是外挂,不需要特别写 tag 了
[问题]好像有奇怪的字跑出来?
写好之後重开终端机,按下 enter 你可能会发现跳出了一堆东西,这是因为你开启了 p10k 的 Instant Prompt Mode,这个虽然会让你的终端机跑起来比较顺(官方说的,我感觉不出来),但是在 zsh 载入完成之前就不能有任何字输出。
可是你看看,如果我们新增了一个外挂,zplug 会跳出来问我们是否要安装,这时後 Instant Prompt Mode 就出来抱怨了。
这个问题的解决方法直觉上有两个,一是关掉 Instant Prompt Mode,二是让 zplug 先不要吵
关掉 Instant Prompt Mode
关掉 Instant Prompt Mode 很简单,重新设定一次 p10k 就好了,在设定程序问你是否要开启 p10k 时选择 (3) Off
,这样下次安装外挂就不会有奇怪的警告讯息跳出来了。
让 zplug 先闭嘴
如果你觉得 Instant Prompt Mode 很重要,需要保留,那你可能会想到这个方法
在 ~/.zshrc
中有一行 zplug load
,这行会让 zplug 在 ~/.zshrc
载入时侦测是否要安装新外挂,把这行拿掉再重新开启终端机,以後他就不会自动检查了
这时候如果你要安装新外挂,一样是修改 ~/.zshrc
之後重开终端机,手动下指令 zplug load
,zplug 就会开始检查更新。
有没有兼得的方法呢?
以上两种方法都是治标不治本,其实 ~/.zshrc
里面已经有写解决办法了,看看 ~/.zshrc
最上面的注解,这是设定 p10k 时如果你有开启 Instant Prompt Mode 他帮你加的
# Enable Powerlevel10k instant prompt. Should stay close to the top of ~/.zshrc.
# Initialization code that may require console input (password prompts, [y/n]
# confirmations, etc.) must go above this block; everything else may go below.
他说如果载入过程中会有输出,像是问 y/N 之类的,要放到这段前面
所以我们只需要把 zplug 搬到最前面就可以了,现在 ~/.zshrc
长这样
source ~/.zplug/init.zsh
# plugins
zplug 'romkatv/powerlevel10k', as:theme, depth:1
zplug 'zsh-users/zsh-autosuggestions'
if ! zplug check --verbose; then
printf "Install? [y/N]: "
if read -q; then
echo; zplug install
fi
fi
zplug load
# Enable Powerlevel10k instant prompt. Should stay close to the top of ~/.zshrc.
# Initialization code that may require console input (password prompts, [y/n]
# confirmations, etc.) must go above this block; everything else may go below.
if [[ -r "${XDG_CACHE_HOME:-$HOME/.cache}/p10k-instant-prompt-${(%):-%n}.zsh" ]]; then
source "${XDG_CACHE_HOME:-$HOME/.cache}/p10k-instant-prompt-${(%):-%n}.zsh"
fi
# To customize prompt, run `p10k configure` or edit ~/.p10k.zsh.
[[ ! -f ~/.p10k.zsh ]] || source ~/.p10k.zsh
[问题]为什麽按 方向键上 时会出现和现在指令开头不同的字
假设你现在打过以下指令
$ ls /home/purecli
$ cat ~/.zshrc
$ ls /
这时候你先打 ls
,想找到之前 ls
开头的指令按,按 方向键上 会出现 cat ~/.zshrc
呢?这是因为现在的 方向键上 是 zsh 本身的「上一个指令」。
这个问题需要装另一个外挂来解决:zsh-users/zsh-history-substring-search
在 ~/.zshrc
新增一行
# plugins
zplug 'romkatv/powerlevel10k', as:theme, depth:1
zplug 'zsh-users/zsh-autosuggestions'
+ zplug 'zsh-users/zsh-history-substring-search'
然後要绑定按键,一样是放在 ~/.zshrc
,位置随便
bindkey "$terminfo[kcuu1]" history-substring-search-up
bindkey "$terminfo[kcud1]" history-substring-search-down
重开终端机後就可以搜寻同样开头的指令纪录了
[问题]为什麽开新的终端机 autosuggestions 读不到以前下过得指令?
这是因为我们的 ~/.zshrc
中没有设定把 history 存下来,所以 autosuggestions 只能拿到目前这个终端机的纪录,一关掉纪录就不见了,autosuggestions 自然找不到。
要解决也很简单,让他把 history 写进档案就好了,在 ~/.zshrc
中任意地方新增这两行
SAVEHIST=1000
export HISTFILE=~/.zsh_history
setopt share_history
这样 autosuggestions 就可以读到以前下过的指指令了
结尾
今天介绍了好用的 autosuggestions 和 zplug 与 p10k 设定冲突的解决方法。
不的不说 autosuggestions 真是懒人福音,打过的指令不用再打第二次
明天再介绍两个外挂後就 zsh 的部份就差不多完结了,紧接着会进入精彩的 tmux