1. 程式人生 > >zsh安裝自動補全外掛incr

zsh安裝自動補全外掛incr

使用zsh的自動補全功能,首先滿足下面的條件:

  1. 你用 oh-my-zsh 來協助你完成 zsh 的配置

  2. 你開啟了 zsh

  3. 你下載了這個 外掛

  4. 你把外掛執行shell 寫到了你的 .zshrc 配置檔案中

上面說到的 1,2 在之前的博文裡面早,最上面其實我貼出來如何開啟 zsh 的連結.(如果你沒有滑鼠的話,肯定點不開)

今天就是分享下 3,4 提到的內容:

如何下載這個外掛:

點開後你的第一反應應該是一個F開頭的單詞蹦出來,我當時也是.

我下載的版本是 incr-0.2.zsh

如果某一天這個官網由於種種原因你訪問不到了…所以我把 incr-0.2.zsh 的指令碼貼出來一份就當備份

# Incremental completion for zsh
# by y.fujii <y-fujii at mimosa-pudica.net>, public domain


autoload -U compinit
zle -N self-insert self-insert-incr
zle -N vi-cmd-mode-incr
zle -N vi-backward-delete-char-incr
zle -N backward-delete-char-incr
zle -N expand-or-complete-prefix-incr
compinit

bindkey -M viins '^[' vi-cmd-mode-incr
bindkey -M viins '^h' vi-backward-delete-char-incr
bindkey -M viins '^?' vi-backward-delete-char-incr
bindkey -M viins '^i' expand-or-complete-prefix-incr
bindkey -M emacs '^h' backward-delete-char-incr
bindkey -M emacs '^?' backward-delete-char-incr
bindkey -M emacs '^i' expand-or-complete-prefix-incr

unsetopt automenu
compdef -d scp
compdef -d tar
compdef -d make
compdef -d java
compdef -d svn
compdef -d cvs

# TODO:
#     cp dir/

now_predict=0

function limit-completion
{
	if ((compstate[nmatches] <= 1)); then
		zle -M ""
	elif ((compstate[list_lines] > 6)); then
		compstate[list]=""
		zle -M "too many matches."
	fi
}

function correct-prediction
{
	if ((now_predict == 1)); then
		if [[ "$BUFFER" != "$buffer_prd" ]] || ((CURSOR != cursor_org)); then
			now_predict=0
		fi
	fi
}

function remove-prediction
{
	if ((now_predict == 1)); then
		BUFFER="$buffer_org"
		now_predict=0
	fi
}

function show-prediction
{
	# assert(now_predict == 0)
	if
		((PENDING == 0)) &&
		((CURSOR > 1)) &&
		[[ "$PREBUFFER" == "" ]] &&
		[[ "$BUFFER[CURSOR]" != " " ]]
	then
		cursor_org="$CURSOR"
		buffer_org="$BUFFER"
		comppostfuncs=(limit-completion)
		zle complete-word
		cursor_prd="$CURSOR"
		buffer_prd="$BUFFER"
		if [[ "$buffer_org[1,cursor_org]" == "$buffer_prd[1,cursor_org]" ]]; then
			CURSOR="$cursor_org"
			if [[ "$buffer_org" != "$buffer_prd" ]] || ((cursor_org != cursor_prd)); then
				now_predict=1
			fi
		else
			BUFFER="$buffer_org"
			CURSOR="$cursor_org"
		fi
		echo -n "\e[32m"
	else
		zle -M ""
	fi
}

function preexec
{
	echo -n "\e[39m"
}

function vi-cmd-mode-incr
{
	correct-prediction
	remove-prediction
	zle vi-cmd-mode
}

function self-insert-incr
{
	correct-prediction
	remove-prediction
	if zle .self-insert; then
		show-prediction
	fi
}

function vi-backward-delete-char-incr
{
	correct-prediction
	remove-prediction
	if zle vi-backward-delete-char; then
		show-prediction
	fi
}

function backward-delete-char-incr
{
	correct-prediction
	remove-prediction
	if zle backward-delete-char; then
		show-prediction
	fi
}

function expand-or-complete-prefix-incr
{
	correct-prediction
	if ((now_predict == 1)); then
		CURSOR="$cursor_prd"
		now_predict=0
		comppostfuncs=(limit-completion)
		zle list-choices
	else
		remove-prediction
		zle expand-or-complete-prefix
	fi
}

如何使用?

首先去你官網或者從上面把這個 shell 檔案內容copy 下來,然後放到一個指定的目錄下.
該放到什麼目錄下,這個看你的個人愛好,我推薦你放在 oh-my-zsh 目錄的外掛目錄下

➜  /Users/zhangzhi  >.oh-my-zsh/plugins/

然後新建一個 incr 目錄,最後在 incr 目錄下建立一個shell 文件,把你copy 的內容放進去.

上面的操作有幾個注意點: 建立資料夾用sudo許可權.

建立完的 shell 文件要給賦777許可權.

➜  /Users/zhangzhi/.oh-my-zsh/plugins/incr git:(master) ✗ >ls

上面就是我放置 incr 外掛的目錄.

然後是配置 .zshrc 檔案:

➜  /Users/zhangzhi  >nano .zshrc

然後插入一句下面的 shell 指令碼:

source ~/.oh-my-zsh/plugins/incr/incr*.zsh

我把她放在了配置檔案最下方.

請注意上面的路徑地址,你要改成你的 incr*.zsh 所在的目錄

然後儲存 .zshrc 配置檔案,這時如果你想讓它立即生效

➜  /Users/zhangzhi  >source .zshrc

這樣就可以了.其他 shell 視窗可以關閉重新開啟及有了補全提示.

它不僅僅是對指令的補全,而且也會補全路徑,檔名,最重要的是實時的,掌握好你的 tab 鍵,去飛吧!