Add plugin: fz
This commit is contained in:
parent
b908feebcf
commit
337bfd5f72
21
plugins/fz/LICENSE
Normal file
21
plugins/fz/LICENSE
Normal file
@ -0,0 +1,21 @@
|
|||||||
|
MIT License
|
||||||
|
|
||||||
|
Copyright (c) 2017 Henry Chang
|
||||||
|
|
||||||
|
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
|
of this software and associated documentation files (the "Software"), to deal
|
||||||
|
in the Software without restriction, including without limitation the rights
|
||||||
|
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||||
|
copies of the Software, and to permit persons to whom the Software is
|
||||||
|
furnished to do so, subject to the following conditions:
|
||||||
|
|
||||||
|
The above copyright notice and this permission notice shall be included in all
|
||||||
|
copies or substantial portions of the Software.
|
||||||
|
|
||||||
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
|
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
|
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||||
|
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||||
|
SOFTWARE.
|
144
plugins/fz/README-zh.md
Normal file
144
plugins/fz/README-zh.md
Normal file
@ -0,0 +1,144 @@
|
|||||||
|
# fz
|
||||||
|
|
||||||
|
完全不須再綁定其他熱鍵,fz 無縫接軌地為 [z](https://github.com/rupa/z) 的 tab 自動完成(自動補全、自動補完、tab completion)加上模糊搜尋功能。使用者可以透過此程式在歷史目錄中自由跳躍。支援 Bash 與 zsh。
|
||||||
|
|
||||||
|
* [展示](#展示)
|
||||||
|
* [安裝程序](#安裝程序)
|
||||||
|
* [macOS](#macos)
|
||||||
|
* [Bash](#bash)
|
||||||
|
* [zsh](#zsh)
|
||||||
|
* [Ubuntu](#ubuntu)
|
||||||
|
* [Bash](#bash-1)
|
||||||
|
* [zsh](#zsh-1)
|
||||||
|
* [使用說明](#使用說明)
|
||||||
|
* [相關資訊](#相關資訊)
|
||||||
|
* [授權條款](#授權條款)
|
||||||
|
|
||||||
|
## 展示
|
||||||
|
|
||||||
|
![示意圖](fz-demo.gif)
|
||||||
|
|
||||||
|
## 安裝程序
|
||||||
|
|
||||||
|
由 shell 中 source 對應的程式檔案即可使用。但因本程式仰仗 [z](https://github.com/rupa/z) 與 [fzf](https://github.com/junegunn/fzf),故此二者亦須一併安裝至系統中。
|
||||||
|
|
||||||
|
注意:`fz` 需在 `z` 之後 source。
|
||||||
|
|
||||||
|
### macOS
|
||||||
|
|
||||||
|
#### Bash
|
||||||
|
|
||||||
|
1. 經由 [Homebrew](https://brew.sh/) 安裝 fzf:
|
||||||
|
|
||||||
|
```sh
|
||||||
|
brew install fzf
|
||||||
|
```
|
||||||
|
|
||||||
|
2. 下載 z 與 fz:
|
||||||
|
|
||||||
|
```sh
|
||||||
|
mkdir ~/.bash_completion.d
|
||||||
|
curl "https://raw.githubusercontent.com/rupa/z/master/{z.sh}" \
|
||||||
|
-o ~/.bash_completion.d/"#1"
|
||||||
|
curl "https://raw.githubusercontent.com/changyuheng/fz/master/{fz.sh}" \
|
||||||
|
-o ~/.bash_completion.d/z"#1"
|
||||||
|
```
|
||||||
|
|
||||||
|
3. 在 `~/.bashrc` 中加入以下資訊:
|
||||||
|
|
||||||
|
```sh
|
||||||
|
if [ -d ~/.bash_completion.d ]; then
|
||||||
|
for file in ~/.bash_completion.d/*; do
|
||||||
|
. $file
|
||||||
|
done
|
||||||
|
fi
|
||||||
|
```
|
||||||
|
|
||||||
|
#### zsh
|
||||||
|
|
||||||
|
1. 經由 [Homebrew](https://brew.sh/) 安裝 fzf:
|
||||||
|
|
||||||
|
```sh
|
||||||
|
brew install fzf
|
||||||
|
```
|
||||||
|
|
||||||
|
2. 透過 [zplug](https://github.com/zplug/zplug) 部署 z 與 fz。將以下資訊加入 `~/.zshrc`:
|
||||||
|
|
||||||
|
```sh
|
||||||
|
zplug "changyuheng/fz", defer:1
|
||||||
|
zplug "rupa/z", use:z.sh
|
||||||
|
```
|
||||||
|
|
||||||
|
### Ubuntu
|
||||||
|
|
||||||
|
#### Bash
|
||||||
|
|
||||||
|
1. 安裝 fzf:
|
||||||
|
|
||||||
|
```sh
|
||||||
|
git clone --depth 1 https://github.com/junegunn/fzf.git ~/.fzf
|
||||||
|
~/.fzf/install
|
||||||
|
```
|
||||||
|
|
||||||
|
2. 下載 z 與 fz:
|
||||||
|
|
||||||
|
```sh
|
||||||
|
mkdir ~/.bash_completion.d
|
||||||
|
curl "https://raw.githubusercontent.com/rupa/z/master/{z.sh}" \
|
||||||
|
-o ~/.bash_completion.d/"#1"
|
||||||
|
curl "https://raw.githubusercontent.com/changyuheng/fz/master/{fz.sh}" \
|
||||||
|
-o ~/.bash_completion.d/z"#1"
|
||||||
|
```
|
||||||
|
|
||||||
|
3. 在 `~/.bashrc` 中加入以下資訊:
|
||||||
|
|
||||||
|
```sh
|
||||||
|
if [ -d ~/.bash_completion.d ]; then
|
||||||
|
for file in ~/.bash_completion.d/*; do
|
||||||
|
. $file
|
||||||
|
done
|
||||||
|
fi
|
||||||
|
```
|
||||||
|
|
||||||
|
#### zsh
|
||||||
|
|
||||||
|
1. 安裝 fzf:
|
||||||
|
|
||||||
|
```sh
|
||||||
|
git clone --depth 1 https://github.com/junegunn/fzf.git ~/.fzf
|
||||||
|
~/.fzf/install
|
||||||
|
```
|
||||||
|
|
||||||
|
2. 透過 [zplug](https://github.com/zplug/zplug) 部署 z 與 fz。將以下資訊加入 `~/.zshrc`:
|
||||||
|
|
||||||
|
```sh
|
||||||
|
zplug "changyuheng/fz", defer:1
|
||||||
|
zplug "rupa/z", use:z.sh
|
||||||
|
```
|
||||||
|
|
||||||
|
## 使用說明
|
||||||
|
|
||||||
|
```
|
||||||
|
z [dir name slug]<TAB>
|
||||||
|
zz [dir name slug]<TAB>
|
||||||
|
```
|
||||||
|
|
||||||
|
- 程式的功能與 [z](https://github.com/rupa/z) 雷同。`zz` 指令限制搜尋範圍為當前目錄及其子目錄。
|
||||||
|
- `tab`/`shift-tab`、`ctrl-n`/`ctrl-p`、`ctrl-j`/`ctrl-k` 選擇下一個、上一個選項。`Enter` 確定。
|
||||||
|
- `FZ_CMD=z` 指定指令名稱。預設為 `z`。
|
||||||
|
- `FZ_SUBDIR_CMD=zz` 指定指令名稱。預設為 `zz`。
|
||||||
|
- `FZ_SUBDIR_TRAVERSAL=0` 關閉子目錄補完。預設為開啟。
|
||||||
|
- `FZ_CASE_INSENSITIVE=0` 關閉子目錄補完不限大小寫。預設為開啟。
|
||||||
|
- `FZ_ABBREVIATE_HOME=0` 不展開 `~` 變數。預設為展開。
|
||||||
|
|
||||||
|
## 相關資訊
|
||||||
|
|
||||||
|
- [cdr](https://github.com/willghatch/zsh-cdr) + [zaw](https://github.com/zsh-users/zaw)
|
||||||
|
- fzf 的[自動完成說明](https://github.com/junegunn/fzf#fuzzy-completion-for-bash-and-zsh)及其[維基頁面](https://github.com/junegunn/fzf/wiki)
|
||||||
|
- [fasd](https://github.com/clvv/fasd)
|
||||||
|
- [autojump](https://github.com/wting/autojump)
|
||||||
|
- [命令行上的narrowing(随着输入逐步减少备选项)工具](http://www.cnblogs.com/bamanzi/p/cli-narrowing-tools.html)
|
||||||
|
|
||||||
|
## 授權條款
|
||||||
|
|
||||||
|
本軟體以 [MIT 授權條款](LICENSE)授權。
|
161
plugins/fz/README.md
Normal file
161
plugins/fz/README.md
Normal file
@ -0,0 +1,161 @@
|
|||||||
|
# fz
|
||||||
|
|
||||||
|
A shell plugin that seamlessly adds fuzzy search to tab completion of
|
||||||
|
[z](https://github.com/rupa/z),
|
||||||
|
lets you easy to jump around among your historical directories.
|
||||||
|
Not any additional key binding is needed. Currently supports Bash and zsh.
|
||||||
|
|
||||||
|
* [Demo](#demo)
|
||||||
|
* [Installation](#installation)
|
||||||
|
* [macOS](#macos)
|
||||||
|
* [Bash](#bash)
|
||||||
|
* [zsh](#zsh)
|
||||||
|
* [Ubuntu](#ubuntu)
|
||||||
|
* [Bash](#bash-1)
|
||||||
|
* [zsh](#zsh-1)
|
||||||
|
* [Usage](#usage)
|
||||||
|
* [See Also](#see-also)
|
||||||
|
* [License](#license)
|
||||||
|
|
||||||
|
## Demo
|
||||||
|
|
||||||
|
![gif-demo](fz-demo.gif)
|
||||||
|
|
||||||
|
## Installation
|
||||||
|
|
||||||
|
By simply sourcing corresponding script file for your shell, you're all set.
|
||||||
|
However, this plugin is sitting on top of [z](https://github.com/rupa/z) and
|
||||||
|
[fzf](https://github.com/junegunn/fzf), so you must have them installed as well.
|
||||||
|
|
||||||
|
N.B. `fz` needs to be sourced after `z`.
|
||||||
|
|
||||||
|
### macOS
|
||||||
|
|
||||||
|
#### Bash
|
||||||
|
|
||||||
|
1. Install fzf via [Homebrew](https://brew.sh/).
|
||||||
|
|
||||||
|
```sh
|
||||||
|
brew install fzf
|
||||||
|
```
|
||||||
|
|
||||||
|
2. Download z and fz.
|
||||||
|
|
||||||
|
```sh
|
||||||
|
mkdir ~/.bash_completion.d
|
||||||
|
curl "https://raw.githubusercontent.com/rupa/z/master/{z.sh}" \
|
||||||
|
-o ~/.bash_completion.d/"#1"
|
||||||
|
curl "https://raw.githubusercontent.com/changyuheng/fz/master/{fz.sh}" \
|
||||||
|
-o ~/.bash_completion.d/z"#1"
|
||||||
|
```
|
||||||
|
|
||||||
|
3. Add the following content to `~/.bashrc`:
|
||||||
|
|
||||||
|
```sh
|
||||||
|
if [ -d ~/.bash_completion.d ]; then
|
||||||
|
for file in ~/.bash_completion.d/*; do
|
||||||
|
. $file
|
||||||
|
done
|
||||||
|
fi
|
||||||
|
```
|
||||||
|
|
||||||
|
#### zsh
|
||||||
|
|
||||||
|
1. Install fzf via [Homebrew](https://brew.sh/).
|
||||||
|
|
||||||
|
```sh
|
||||||
|
brew install fzf
|
||||||
|
```
|
||||||
|
|
||||||
|
2. Install z and fz via [zplug](https://github.com/zplug/zplug).
|
||||||
|
Add the following content to `~/.zshrc`:
|
||||||
|
|
||||||
|
```sh
|
||||||
|
zplug "changyuheng/fz", defer:1
|
||||||
|
zplug "rupa/z", use:z.sh
|
||||||
|
```
|
||||||
|
|
||||||
|
### Ubuntu
|
||||||
|
|
||||||
|
#### Bash
|
||||||
|
|
||||||
|
1. Install fzf.
|
||||||
|
|
||||||
|
```sh
|
||||||
|
git clone --depth 1 https://github.com/junegunn/fzf.git ~/.fzf
|
||||||
|
~/.fzf/install
|
||||||
|
```
|
||||||
|
|
||||||
|
2. Download z and fz.
|
||||||
|
|
||||||
|
```sh
|
||||||
|
mkdir ~/.bash_completion.d
|
||||||
|
curl "https://raw.githubusercontent.com/rupa/z/master/{z.sh}" \
|
||||||
|
-o ~/.bash_completion.d/"#1"
|
||||||
|
curl "https://raw.githubusercontent.com/changyuheng/fz/master/{fz.sh}" \
|
||||||
|
-o ~/.bash_completion.d/z"#1"
|
||||||
|
```
|
||||||
|
|
||||||
|
3. Add the following content to `~/.bashrc`:
|
||||||
|
|
||||||
|
```sh
|
||||||
|
if [ -d ~/.bash_completion.d ]; then
|
||||||
|
for file in ~/.bash_completion.d/*; do
|
||||||
|
. $file
|
||||||
|
done
|
||||||
|
fi
|
||||||
|
```
|
||||||
|
|
||||||
|
#### zsh
|
||||||
|
|
||||||
|
1. Install fzf.
|
||||||
|
|
||||||
|
```sh
|
||||||
|
git clone --depth 1 https://github.com/junegunn/fzf.git ~/.fzf
|
||||||
|
~/.fzf/install
|
||||||
|
```
|
||||||
|
|
||||||
|
2. Install z and fz via [zplug](https://github.com/zplug/zplug).
|
||||||
|
Add the following content to `~/.zshrc`:
|
||||||
|
|
||||||
|
```sh
|
||||||
|
zplug "changyuheng/fz", defer:1
|
||||||
|
zplug "rupa/z", use:z.sh
|
||||||
|
```
|
||||||
|
|
||||||
|
## Usage
|
||||||
|
|
||||||
|
```
|
||||||
|
z [dir name slug]<TAB>
|
||||||
|
zz [dir name slug]<TAB>
|
||||||
|
```
|
||||||
|
|
||||||
|
- The function of fz is pretty much like what it is of
|
||||||
|
[z](https://github.com/rupa/z).
|
||||||
|
`zz` limits the search base starting from current working directory.
|
||||||
|
Check z’s doc for more information.
|
||||||
|
- `tab`/`shift-tab`, `ctrl-n`/`ctrl-p`, `ctrl-j`/`ctrl-k`,
|
||||||
|
for next and previous item. `Enter` for selection.
|
||||||
|
Check fzf’s [doc](https://github.com/junegunn/fzf#search-syntax)
|
||||||
|
for the search syntaxes.
|
||||||
|
- `FZ_CMD=z` specifies command name of `fz`. Default is `z`.
|
||||||
|
- `FZ_SUBDIR_CMD=zz` specifies command name for subdirectory only `z`.
|
||||||
|
Default is `zz`.
|
||||||
|
- `FZ_SUBDIR_TRAVERSAL=0` disables subdirectory completion.
|
||||||
|
Default is enabled.
|
||||||
|
- `FZ_CASE_INSENSITIVE=0` disables case-insensitive subdirectory completion.
|
||||||
|
Default is enabled.
|
||||||
|
- `FZ_ABBREVIATE_HOME=0` disables abbreviating `~`. Default is enabled.
|
||||||
|
|
||||||
|
## See Also
|
||||||
|
|
||||||
|
- [cdr](https://github.com/willghatch/zsh-cdr) + [zaw](https://github.com/zsh-users/zaw)
|
||||||
|
- fzf’s [readme of completion](https://github.com/junegunn/fzf#fuzzy-completion-for-bash-and-zsh)
|
||||||
|
and its [wiki](https://github.com/junegunn/fzf/wiki)
|
||||||
|
- [fasd](https://github.com/clvv/fasd)
|
||||||
|
- [autojump](https://github.com/wting/autojump)
|
||||||
|
- [命令行上的narrowing(随着输入逐步减少备选项)工具](http://www.cnblogs.com/bamanzi/p/cli-narrowing-tools.html)
|
||||||
|
|
||||||
|
## License
|
||||||
|
|
||||||
|
This software is licensed under a [MIT License](LICENSE).
|
BIN
plugins/fz/fz-demo.gif
Normal file
BIN
plugins/fz/fz-demo.gif
Normal file
Binary file not shown.
After Width: | Height: | Size: 1.4 MiB |
1
plugins/fz/fz.bash
Symbolic link
1
plugins/fz/fz.bash
Symbolic link
@ -0,0 +1 @@
|
|||||||
|
fz.sh
|
1
plugins/fz/fz.plugin.zsh
Symbolic link
1
plugins/fz/fz.plugin.zsh
Symbolic link
@ -0,0 +1 @@
|
|||||||
|
fz.sh
|
297
plugins/fz/fz.sh
Normal file
297
plugins/fz/fz.sh
Normal file
@ -0,0 +1,297 @@
|
|||||||
|
[[ -n "$FZ_CMD" ]] || FZ_CMD=z
|
||||||
|
[[ -n "$FZ_SUBDIR_CMD" ]] || FZ_SUBDIR_CMD=zz
|
||||||
|
|
||||||
|
[[ -n "$FZ_HISTORY_CD_CMD" ]] || FZ_HISTORY_CD_CMD=_z
|
||||||
|
[[ -n "$FZ_SUBDIR_HISTORY_CD_CMD" ]] || FZ_SUBDIR_HISTORY_CD_CMD="_z -c"
|
||||||
|
|
||||||
|
[[ -n "$FZ_HISTORY_LIST_GENERATOR" ]] \
|
||||||
|
|| FZ_HISTORY_LIST_GENERATOR=__fz_generate_matched_history_list
|
||||||
|
[[ -n "$FZ_SUBDIR_HISTORY_LIST_GENERATOR" ]] \
|
||||||
|
|| FZ_SUBDIR_HISTORY_LIST_GENERATOR=__fz_generate_matched_subdir_history_list
|
||||||
|
|
||||||
|
[[ -n "$FZ_SUBDIR_TRAVERSAL" ]] || FZ_SUBDIR_TRAVERSAL=1
|
||||||
|
[[ -n "$FZ_CASE_INSENSITIVE" ]] || FZ_CASE_INSENSITIVE=1
|
||||||
|
[[ -n "$FZ_ABBREVIATE_HOME" ]] || FZ_ABBREVIATE_HOME=1
|
||||||
|
|
||||||
|
alias ${FZ_CMD}='_fz'
|
||||||
|
alias ${FZ_SUBDIR_CMD}='_fzz'
|
||||||
|
|
||||||
|
__fz_generate_matched_subdir_list() {
|
||||||
|
local dir seg starts_with_dir
|
||||||
|
if [[ "$1" == */ ]]; then
|
||||||
|
dir="$1"
|
||||||
|
find -L "$(cd "$dir" 2>/dev/null && pwd)" -mindepth 1 -maxdepth 1 -type d \
|
||||||
|
2>/dev/null | while read -r line; do
|
||||||
|
base="${line##*/}"
|
||||||
|
if [[ "$base" == .* ]]; then
|
||||||
|
continue
|
||||||
|
fi
|
||||||
|
echo "$line"
|
||||||
|
done
|
||||||
|
else
|
||||||
|
dir=$(dirname -- "$1")
|
||||||
|
seg=$(basename -- "$1")
|
||||||
|
if [[ "$FZ_CASE_INSENSITIVE" == "1" ]]; then
|
||||||
|
seg=$(echo "$seg" | tr '[:upper:]' '[:lower:]')
|
||||||
|
fi
|
||||||
|
starts_with_dir=$( \
|
||||||
|
find -L "$(cd "$dir" 2>/dev/null && pwd)" -mindepth 1 -maxdepth 1 \
|
||||||
|
-type d 2>/dev/null | while read -r line; do \
|
||||||
|
base="${line##*/}"
|
||||||
|
if [[ "$seg" != .* && "$base" == .* ]]; then
|
||||||
|
continue
|
||||||
|
fi
|
||||||
|
if [[ "$FZ_CASE_INSENSITIVE" != "1" ]]; then
|
||||||
|
if [[ "$base" == "$seg"* ]]; then
|
||||||
|
echo "$line"
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
if [[ -n "$BASH_VERSION" ]]; then
|
||||||
|
if [[ "${base,,}" == "${seg,,}"* ]]; then
|
||||||
|
echo "$line"
|
||||||
|
fi
|
||||||
|
elif [[ -n "$ZSH_VERSION" ]]; then
|
||||||
|
if [[ "${base:l}" == "${seg:l}"* ]]; then
|
||||||
|
echo "$line"
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
)
|
||||||
|
if [ -n "$starts_with_dir" ]; then
|
||||||
|
echo "$starts_with_dir"
|
||||||
|
else
|
||||||
|
find -L "$(cd "$dir" 2>/dev/null && pwd)" -mindepth 1 -maxdepth 1 \
|
||||||
|
-type d 2>/dev/null | while read -r line; do \
|
||||||
|
base="${line##*/}"
|
||||||
|
if [[ "$seg" != .* && "$base" == .* ]]; then
|
||||||
|
continue
|
||||||
|
fi
|
||||||
|
if [[ "$FZ_CASE_INSENSITIVE" != "1" ]]; then
|
||||||
|
if [[ "$base" == *"$seg"* ]]; then
|
||||||
|
echo "$line"
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
if [[ -n "$BASH_VERSION" ]]; then
|
||||||
|
if [[ "${base,,}" == *"${seg,,}"* ]]; then
|
||||||
|
echo "$line"
|
||||||
|
fi
|
||||||
|
elif [[ -n "$ZSH_VERSION" ]]; then
|
||||||
|
if [[ "${base:l}" == *"${seg:l}"* ]]; then
|
||||||
|
echo "$line"
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
done
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
__fz_generate_matched_history_list() {
|
||||||
|
_z -l $@ 2>&1 | while read -r line; do
|
||||||
|
if [[ "$line" == common:* ]]; then continue; fi
|
||||||
|
# Reverse the order and cut off the scores
|
||||||
|
echo "$line"
|
||||||
|
done | sed '1!G;h;$!d' | cut -b 12-
|
||||||
|
}
|
||||||
|
|
||||||
|
__fz_generate_matched_subdir_history_list() {
|
||||||
|
__fz_generate_matched_history_list -c "$@"
|
||||||
|
}
|
||||||
|
|
||||||
|
__fz_generate_matches() {
|
||||||
|
local cmd histories subdirs
|
||||||
|
|
||||||
|
if [[ -n "$BASH_VERSION" ]]; then
|
||||||
|
cmd=$([[ "${COMP_WORDS[0]}" =~ [[:space:]]*([^[:space:]]|[^[:space:]].*[^[:space:]])[[:space:]]* ]]; \
|
||||||
|
echo -n "${BASH_REMATCH[1]}")
|
||||||
|
elif [[ -n "$ZSH_VERSION" ]]; then
|
||||||
|
cmd=(${(z)LBUFFER})
|
||||||
|
cmd=${cmd[1]}
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [[ "$cmd" == "$FZ_CMD" ]]; then
|
||||||
|
if [[ "$FZ_ABBREVIATE_HOME" == "1" ]]; then
|
||||||
|
if [ "$FZ_SUBDIR_TRAVERSAL" == "1" ]; then
|
||||||
|
cat <("$FZ_HISTORY_LIST_GENERATOR" "$@") \
|
||||||
|
<(__fz_generate_matched_subdir_list "$@") \
|
||||||
|
| sed '/^$/d' | sed -e "s,^$HOME,~," | awk '!seen[$0]++'
|
||||||
|
else
|
||||||
|
cat <("$FZ_HISTORY_LIST_GENERATOR" "$@") \
|
||||||
|
| sed '/^$/d' | sed -e "s,^$HOME,~," | awk '!seen[$0]++'
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
if [ "$FZ_SUBDIR_TRAVERSAL" == "1" ]; then
|
||||||
|
cat <("$FZ_HISTORY_LIST_GENERATOR" "$@") \
|
||||||
|
<(__fz_generate_matched_subdir_list "$@") \
|
||||||
|
| sed '/^$/d' | awk '!seen[$0]++'
|
||||||
|
else
|
||||||
|
cat <("$FZ_HISTORY_LIST_GENERATOR" "$@") \
|
||||||
|
| sed '/^$/d' | awk '!seen[$0]++'
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
elif [[ "$cmd" == "$FZ_SUBDIR_CMD" ]]; then
|
||||||
|
histories=$("$FZ_SUBDIR_HISTORY_LIST_GENERATOR" "$@")
|
||||||
|
if [[ "$FZ_ABBREVIATE_HOME" == "1" ]]; then
|
||||||
|
if [ "$FZ_SUBDIR_TRAVERSAL" == "1" ]; then
|
||||||
|
cat <("$FZ_SUBDIR_HISTORY_LIST_GENERATOR" "$@") \
|
||||||
|
<(__fz_generate_matched_subdir_list "$@") \
|
||||||
|
| sed '/^$/d' | sed -e "s,^$HOME,~," | awk '!seen[$0]++'
|
||||||
|
else
|
||||||
|
cat <("$FZ_SUBDIR_HISTORY_LIST_GENERATOR" "$@") \
|
||||||
|
| sed '/^$/d' | sed -e "s,^$HOME,~," | awk '!seen[$0]++'
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
if [ "$FZ_SUBDIR_TRAVERSAL" == "1" ]; then
|
||||||
|
cat <("$FZ_SUBDIR_HISTORY_LIST_GENERATOR" "$@") \
|
||||||
|
<(__fz_generate_matched_subdir_list "$@") \
|
||||||
|
| sed '/^$/d' | awk '!seen[$0]++'
|
||||||
|
else
|
||||||
|
cat <("$FZ_SUBDIR_HISTORY_LIST_GENERATOR" "$@") \
|
||||||
|
| sed '/^$/d' | awk '!seen[$0]++'
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
__fz_bash_completion() {
|
||||||
|
COMPREPLY=()
|
||||||
|
|
||||||
|
local selected slug
|
||||||
|
eval "slug=${COMP_WORDS[@]:(-1)}"
|
||||||
|
|
||||||
|
if [[ "$(__fz_generate_matches "$slug" | head | wc -l)" -gt 1 ]]; then
|
||||||
|
selected=$(__fz_generate_matches "$slug" \
|
||||||
|
| FZF_DEFAULT_OPTS="--height ${FZF_TMUX_HEIGHT:-40%} --reverse \
|
||||||
|
--bind 'shift-tab:up,tab:down' $FZF_DEFAULT_OPTS" fzf)
|
||||||
|
elif [[ "$(__fz_generate_matches "$slug" | head | wc -l)" -eq 1 ]]; then
|
||||||
|
selected=$(__fz_generate_matches "$slug")
|
||||||
|
else
|
||||||
|
return
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [[ -n "$selected" ]]; then
|
||||||
|
if [[ "$FZ_ABBREVIATE_HOME" == "1" ]]; then
|
||||||
|
selected=${selected/#\~/$HOME}
|
||||||
|
fi
|
||||||
|
selected=$(printf %q "$selected")
|
||||||
|
if [[ "$selected" != */ ]]; then
|
||||||
|
selected="${selected}/"
|
||||||
|
fi
|
||||||
|
if [[ "$FZ_ABBREVIATE_HOME" == "1" ]]; then
|
||||||
|
selected=${selected/#$HOME/\~}
|
||||||
|
fi
|
||||||
|
COMPREPLY=( "$selected" )
|
||||||
|
fi
|
||||||
|
|
||||||
|
printf '\e[5n'
|
||||||
|
}
|
||||||
|
|
||||||
|
__fz_zsh_completion() {
|
||||||
|
setopt localoptions noshwordsplit noksh_arrays noposixbuiltins nonomatch
|
||||||
|
local args cmd selected slug
|
||||||
|
|
||||||
|
args=(${(z)LBUFFER})
|
||||||
|
cmd=${args[1]}
|
||||||
|
|
||||||
|
if [[ "$cmd" != "$FZ_CMD" && "$cmd" != "$FZ_SUBDIR_CMD" ]] \
|
||||||
|
|| [[ "$cmd" == "$FZ_CMD" && "$LBUFFER" =~ "^\s*$FZ_CMD$" ]] \
|
||||||
|
|| [[ "$cmd" == "$FZ_SUBDIR_CMD" && "$LBUFFER" =~ "^\s*$FZ_SUBDIR_CMD$" ]]; then
|
||||||
|
zle ${__fz_zsh_default_completion:-expand-or-complete}
|
||||||
|
return
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [[ "${#args}" -gt 1 ]]; then
|
||||||
|
eval "slug=${args[-1]}"
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [[ "$(__fz_generate_matches "$slug" | head | wc -l)" -gt 1 ]]; then
|
||||||
|
selected=$(__fz_generate_matches "$slug" \
|
||||||
|
| FZF_DEFAULT_OPTS="--height ${FZF_TMUX_HEIGHT:-40%} --reverse \
|
||||||
|
--bind 'shift-tab:up,tab:down' $FZF_DEFAULT_OPTS" fzf)
|
||||||
|
elif [[ "$(__fz_generate_matches "$slug" | head | wc -l)" -eq 1 ]]; then
|
||||||
|
selected=$(__fz_generate_matches "$slug")
|
||||||
|
else
|
||||||
|
return
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [[ -n "$selected" ]]; then
|
||||||
|
if [[ "$FZ_ABBREVIATE_HOME" == "1" ]]; then
|
||||||
|
selected=${selected/#\~/$HOME}
|
||||||
|
fi
|
||||||
|
selected="${(q)selected}"
|
||||||
|
if [[ "$selected" != */ ]]; then
|
||||||
|
selected="${selected}/"
|
||||||
|
fi
|
||||||
|
if [[ "$FZ_ABBREVIATE_HOME" == "1" ]]; then
|
||||||
|
selected=${selected/#$HOME/\~}
|
||||||
|
fi
|
||||||
|
LBUFFER="$cmd $selected"
|
||||||
|
fi
|
||||||
|
|
||||||
|
zle redisplay
|
||||||
|
typeset -f zle-line-init >/dev/null && zle zle-line-init
|
||||||
|
}
|
||||||
|
|
||||||
|
__fz_init_bash_completion() {
|
||||||
|
# Enable redrawing line by printf '\e[5n'
|
||||||
|
bind '"\e[0n": redraw-current-line'
|
||||||
|
|
||||||
|
complete -o nospace -F __fz_bash_completion "$FZ_CMD"
|
||||||
|
complete -o nospace -F __fz_bash_completion "$FZ_SUBDIR_CMD"
|
||||||
|
}
|
||||||
|
|
||||||
|
__fz_init_zsh_completion() {
|
||||||
|
[ -n "$__fz_zsh_default_completion" ] || {
|
||||||
|
binding=$(bindkey '^I')
|
||||||
|
# $binding[(s: :w)2]
|
||||||
|
# The command substitution and following word splitting to determine the
|
||||||
|
# default zle widget for ^I formerly only works if the IFS parameter contains
|
||||||
|
# a space via $binding[(w)2]. Now it specifically splits at spaces, regardless
|
||||||
|
# of IFS.
|
||||||
|
# It’s not compatitable with bash so use awk instead.
|
||||||
|
[[ $binding =~ 'undefined-key' ]] \
|
||||||
|
|| __fz_zsh_default_completion=$(echo "$binding" | awk '{print $2}')
|
||||||
|
unset binding
|
||||||
|
}
|
||||||
|
zle -N __fz_zsh_completion
|
||||||
|
bindkey '^I' __fz_zsh_completion
|
||||||
|
}
|
||||||
|
|
||||||
|
_fz() {
|
||||||
|
local rc
|
||||||
|
if [[ "$($FZ_HISTORY_LIST_GENERATOR "$@" | head | wc -l)" -gt 0 ]]; then
|
||||||
|
"$FZ_HISTORY_CD_CMD" "$@"
|
||||||
|
elif [[ "$FZ_SUBDIR_TRAVERSAL" -ne 0 ]]; then
|
||||||
|
err=$(cd "${@: -1}" 2>&1)
|
||||||
|
rc=$?
|
||||||
|
if ! cd "${@: -1}" 2>/dev/null; then
|
||||||
|
echo ${err#* } >&2
|
||||||
|
return $rc
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
_fzz() {
|
||||||
|
local rc
|
||||||
|
if [[ "$($FZ_SUBDIR_HISTORY_LIST_GENERATOR "$@" | head | wc -l)" -gt 0 ]]; then
|
||||||
|
if [[ -n "$BASH_VERSION" ]]; then
|
||||||
|
$FZ_SUBDIR_HISTORY_CD_CMD "$@"
|
||||||
|
elif [[ -n "$ZSH_VERSION" ]]; then
|
||||||
|
${=FZ_SUBDIR_HISTORY_CD_CMD} "$@"
|
||||||
|
fi
|
||||||
|
elif [[ "$FZ_SUBDIR_TRAVERSAL" -ne 0 ]]; then
|
||||||
|
err=$(cd "${@: -1}" 2>&1)
|
||||||
|
rc=$?
|
||||||
|
if ! cd "${@: -1}" 2>/dev/null; then
|
||||||
|
echo ${err#* } >&2
|
||||||
|
return $rc
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
if [[ -n "$BASH_VERSION" ]]; then
|
||||||
|
__fz_init_bash_completion
|
||||||
|
elif [[ -n "$ZSH_VERSION" ]]; then
|
||||||
|
__fz_init_zsh_completion
|
||||||
|
fi
|
Loading…
Reference in New Issue
Block a user