Day 04:金鱼记忆力太短暂,交给外挂记吧!autosuggestions 与 substring-search

更新
我把从第一天到现在每天的 Home 目录都放上 GitHub 了,README.md 里面有说明
这是今天的 Release https://github.com/simba-fs/2021-ironman-example/releases/tag/day04


今天的内容会比平常多,但是非常紮实!

有时候我们在 CLI 操作时遇到很多重复的指令,像是 git addgit 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


这篇文不小心断更了,呜呜呜,这里是我新的新开的文章系列 https://ithelp.ithome.com.tw/users/20130473/ironman/4804


<<:  Day4 - 接案者的作品集

>>:  安装 Django 在 Amazon Linux 2-Day 04

Day28 - 云端交易主机 - GCP云端平台申请&架设(Windows)

云端交易主机 - GCP云端平台申请&架设(Windows) 考虑到大部分使用者仍然习惯 W...

OpenCV癌细胞医学图片的特徵如何做侦测圈选分类

不知道现在台湾的AI有没有已经做到癌细胞医学图片的特徵侦测圈选跟分类 目前看到云象科技与林口长庚医院...

【Laravel】 MVC 与 专案结构

MVC 何谓MVC? MVC即是一种「网站架构流程」 Route(路由控制) 简介:将接收到的讯息,...

Kotlin Android 第20天,从 0 到 ML - RecyclerView - GradView

前言: RecyclerView 的 ListView 完成了,但我想要用GradView怎麽辨? ...

Day 1 - 什麽是 HomeLab 及网路

网路,是我们生活圈不可缺少的一部分。 每天一早,不少人都会打开手机查看新的讯息、新闻或影片。 由此可...