ZSH 插件配置2.0

用Oh-my-zsh管理插件有个很大的缺陷, 就是不支持插件的自动下载安装, 所以换用zplug进行管理, 顺便重新整理了一些配置的结构, 将配置文件模块化. 不过还是有点乱, 就用文字就理一下配置文件, 以及当前安装的插件.

配置文件

配置文件结构如下, 其中init文件用于加载文件夹下的其它zsh文件, 其加载顺序依次是:

  1. parameter.zsh: 定义一些变量, 比如定义插件的下载路径, 历史记录存储位置, 主题等. 类似于config文件.
  2. plugin.zsh: 管理插件, 所有需要用到的插件都放在这个文件中
  3. fzf.zsh: 模糊搜索插件fzf的配置, 定义模糊搜索时需要使用的命令.
  4. alias.zsh:定义别名, 注意一定要放在最后, 以免被插件定义的alias覆盖.
~/.config/zsh
	 ├── init.zsh
   ├── parameter.zsh
   ├── plugin.zsh
   ├── fzf.zsh
   └── aliases.zsh

不过, ZSH默认读取的文件是~/.zshrc, 所有我们需要在里面加入如下内容, 让它能自动克隆git仓库并加载init.zsh.

1
2
3
4
ZSH_DIR=$HOME/.config/zsh
ZSH_GIT=[email protected]:baohengtao/zshrc.git
[[ -d $ZSH_DIR ]] || git clone $ZSH_GIT $ZSH_DIR
source  $ZSH_DIR/init.zsh

插件管理

当前使用zplug管理插件, 其配置大概长这样子.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
ZPLUG_GIT=https://github.com/zplug/zplug
[[ -d $ZPLUG_HOME ]] ||  git clone  $ZPLUG_GIT $ZPLUG_HOME
source $ZPLUG_HOME/init.zsh

# theme
zplug romkatv/powerlevel10k, as:theme, depth:1
zplug "zdharma/fast-syntax-highlighting"
zplug "plugins/colored-man-pages", from:"oh-my-zsh"
# and other plugins

# Install plugins if there are plugins that have not been installed
if ! zplug check --verbose; then
    printf "Install? [y/N]: "
    if read -q; then; echo; zplug install; fi
fi
# Then, source plugins and add commands to $PATH
zplug load 

这段配置加载了三个插件, colored-man-pages fast-syntax-highlighting用于语法高亮, 无需多介绍, 用就行了~ powerlevel10k是一个异步加载主题, 特点就是快, 不需要等待插件加载完成才能看到提示符.

Git 插件

bigH/git-fuzzy

这是一款基于fzf的插件, 提供了git fuzzy子命令, 分别是:

  • git fuzzy status :Interact with staged and unstaged changes.

  • git fuzzy branch: Search for, checkout and look at branches.

  • git fuzzy log: Look for commits in git log. Typing in the search simply filters in the usual fzf style.

  • git fuzzy reflog : Look for entries in git reflog. Typing in the search simply filters in the usual fzf style.

  • git fuzzy stash: Look for entries in git stash. Typing in the search simply filters in the usual fzf style.

  • git fuzzy diff : Interactively select diff subjects. Drilling down enables searching through diff contents in a diff browser.

  • git fuzzy pr: Interactively select and open/diff GitHub pull requests.

wfxr/forgit

功能好像重复了和git-fuzzy, 提供命令forgit::<command>.

一些快捷键: ?触发预览; Alt+K/J/P/N预览上下移动... (有点乱, 其它没看懂emmm

补全插件

Aloxaf/fzf-tab: 一个使用fzf提供补全菜单的插件 Replace zsh's default completion selection menu with fzf!

zsh-users/zsh-autosuggestions: 显示可自动补全的命令 Fish-like autosuggestions for zsh

提示插件

djui/alias-tips: 提供alias提示 An oh-my-zsh plugin to help remembering those aliases you defined once

ohmyzsh/command-not-found: 对没有安装的命令提供安装提示

工具加载插件

ohmyzsh/fasd: 加载fasd命令

命令行工具

FASD: 目录 & 文件

clvv/fasd: Command-line productivity booster, offers quick access to files and directories, inspired by autojump, z and v.

fasd是一个可快速提取并打开文件的工具, 其具体原理是将访问过的文件存储在一个列表中, 根据访问频次对列表中的文件进行打分, 当下次搜索时从列表中取出匹配的文件, 并根据评分排序, 默认取出评分最高的文件作为结果输出.

下面的三个alias将分别提取所有查询到的内容; 只提前目录; 只显示文件夹.

1
2
3
alias a="fasd -a"
alias d="fasd -d"
alias f="fasd -f"

当然有时候我们只想拿到一个结果, 而不是一个列表, 此时我们可用i选项开启interactive mode. 好像fasd -afasd -s的效果是一样的, 可能作者只是单纯想把它凑成fasd中的s把(斜眼)

1
2
3
alias s="fasd -si"
alias sd="s -d"
alias sf="s -f"

不过, 单列出文件有啥用呢, 拿到文件我们需要打开它呀, 这时就需要拿出我们的-e <cmd>选项了. 下面几个alias分别定义了:

  • o: 使用系统默认软件打开;
  • v: 在终端用 nvim 打开文本文件;
  • c: 使用 vs-code 打开文本文件;
  • t: 使用 typora 打开 markdown 文件;
  • p: 使用 pixea 打开图片
1
2
3
4
5
alias o="a -e open"
alias v="f -e nvim"
alias c="f -e code"
alias t="a -e typora"
alias p="a -e pixea -B 'native current_folder'"

上面介绍的fasd主要负责文件的打开操作, 下面介绍一下用于目录跳转的 fasd_cd命令. 其实fasd_cd只是一个基于fasd的函数. 将fasd得到的结果传给cd.

1
2
3
4
5
6
7
8
9
fasd_cd () {
	if [ $# -le 1 ]; then
      fasd "$@"
  else
      local _fasd_ret="$(fasd -e 'printf %s' "$@")"
      [ -z "$_fasd_ret" ] && return
      [ -d "$_fasd_ret" ] && cd "$_fasd_ret" || printf %s\n "$_fasd_ret"
	fi
}

定义如下的alias:

  • z: 直接跳转到返回得到的第一个结果;
  • j: 当有多个匹配结果时需手动选择;
  • jj: 将当前目录添加到搜索选项中;
  • jh: 将home目录添加到搜索选项中;
  • jc: 将搜索限定在当前工作目录;
  • jd: 将搜索限定在桌面.
1
2
3
4
5
6
alias z="fasd_cd -d"
alias j="z -i"
alias jj="j -B 'native current_folder'"
alias jh="j -B 'native home_folder' "
alias jc="j -b 'native current_folder'"
alias jd="j -b 'native desk_folder'"

解释一下-b -B选项. b表示backend, 也就是搜索对象; -b <name>表示只使用指定的backend; -B <name>则将该backend添加到额外的搜索内容中.

这里我定义三个函数作为backend:

  • current_folder: 返回当前所在目录的文件夹列表
  • home_folder : 返回Home目录的文件夹列表
  • desk_folder: 返回桌面目录的文件夹列表
1
2
3
4
5
6
7
8
9
home_folder(){
 fd -td . $HOME -x echo "$PWD/{}|1"
}
desk_folder(){
  fd -td . $HOME/Desktop -x echo "$PWD/{}|1"
}
current_folder(){
 fd  -td . -x echo "$PWD/{}|1" 
}

FD: 文件搜索

列出文件

1
2
3
4
5
6
7
fd  # 列出当前目录所有文件
fd . path/to/folder # 列出指定目录的所有文件
fd -e md # e: extension 列出 md 类型文件
fd -g '*.py' # g: glob-based search 默认使用正则表达式寻找文件

fd … -l # l: list-details 和下一条等价
fd … -X ls -lhd --color=always

隐藏文件

可以将需要排除的文件写在~/.config/fd/ignore文件中

1
2
3
4
5
fd -H  # H: hidden 显示隐藏文件
fd -I # I: 显示 gitignore 文件
fd -HI # 两者结合
fd -E /folder/exculed  # E: 排除特定目录
fd -E '*.bak'# 排除特定文件

批量处理

-x, --exec <cmd>为每个文件单独执行一次命令; -X, --exec-batch <cmd> 则将所有文件一次性传入命令中.

1
2
3
4
fd -e zip -x unzip # 解压所有zip文件
fd -g '*.py' -X vim #  在vim中打开所有python文件 
fd -e jpg -x convert {} {.}.png # 将所有jpg图片转为png
fd -H '^\.DS_Store$' -tf -X rm # 删除 .DS_Store; t表示类型 f表示为文件 

占位符

  • {}表示目录+文件名documents/images/party.jpg;
  • {//}表示目录documents/images
  • {.}去除扩展名documents/images/party;
  • {/}去除路径名party.jpg;
  • {/.}: 去除路径和扩展名party

FZF: 模糊搜索

快捷键:

  • C-r 搜索历史记录

  • C-t搜索文件;

  • M-c改变工作目录

  • C-c C-G ESC退出;

  • tab shift-tab进行多选.

  • 使用;<TAB> 自动补全

搜索语法:

  • sbtrkt模糊搜索; wild 精确搜索; 可用-e -exact选项关闭模糊搜索, 此时'sbtrkt将打开精确搜索.
  • ^music.mp3$ 前后缀; !fire !^music !.mp3$排除.
  • ^core md$ | zsh$ | py$ ‘或’选项, 匹配 md zsh py 结尾的文件;

配置:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
# 使用 `;` 触发搜索
export FZF_COMPLETION_TRIGGER=';'
# 设置UI选项
export FZF_DEFAULT_OPTS='--height 80% --layout=reverse --border --multi --info=inline --exact  '
export FZF_ALT_C_OPTS=''
export FZF_CTRL_T_OPTS=''
export FZF_CTRL_R_OPTS=''
export FORGIT_FZF_DEFAULT_OPTS="--cycle --reverse" 
# 设置执行命令
export FZF_DEFAULT_COMMAND="fd -tf --no-ignore-vcs "
export FZF_ALT_C_COMMAND="fd -td --no-ignore-vcs  . ~"
export FZF_CTRL_T_COMMAND="fd -tf --no-ignore-vcs "
# 设置路径生产使用的函数
_fzf_compgen_path() { fd --no-ignore-vcs   . "$1"}
_fzf_compgen_dir() { fd -td --no-ignore-vcs   . "$1"}

省略tmux内容

文档

可用使用eg tldr查询命令, 依赖:

其它有待尝试的工具

Ripgrep: 使用rg命令进行内容搜索

ranger/ranger: A VIM-inspired filemanager for the console

MIX

updatedupdated2023-06-052023-06-05
Update https-ca.md