gpt4 book ai didi

bash 使用 zsh 等快捷方式扩展 cd

转载 作者:行者123 更新时间:2023-11-29 09:00:09 25 4
gpt4 key购买 nike

是否可以在 bash 中扩展类似的东西

cd/u/lo/b

cd/usr/local/bin

?

最佳答案

抱歉,我不能早点发帖,我在工作中,绑定(bind)功能比我最初想象的更容易出现问题。

这是我想出的:

绑定(bind)以下脚本:

#!/bin/bash
#$HOME/.bashrc.d/autocomplete.sh
autocomplete_wrapper() {
BASE="${READLINE_LINE% *} " #we save the line except for the last argument
[[ "$BASE" == "$READLINE_LINE " ]] && BASE=""; #if the line has only 1 argument, we set the BASE to blank
EXPANSION=($(autocomplete "${READLINE_LINE##* }"))
[[ ${#EXPANSION[@]} -gt 1 ]] && echo "${EXPANSION[@]:1}" #if there is more than 1 match, we echo them
READLINE_LINE="$BASE${EXPANSION[0]}" #the current line is now the base + the 1st element
READLINE_POINT=${#READLINE_LINE} #we move our cursor at the end of the current line
}

autocomplete() {
LAST_CMD="$1"
#Special starting character expansion for '~', './' and '/'
[[ "${LAST_CMD:0:1}" == "~" ]] && LAST_CMD="$HOME${LAST_CMD:1}"
S=1; [[ "${LAST_CMD:0:1}" == "/" || "${LAST_CMD:0:2}" == "./" ]] && S=2; #we don't expand those

#we do the path expansion of the last argument here by adding a * before each /
EXPANSION=($(echo "$LAST_CMD*" | sed s:/:*/:"$S"g))

if [[ ! -e "${EXPANSION[0]}" ]];then #if the path cannot be expanded, we don't change the output
echo "$LAST_CMD"
elif [[ "${#EXPANSION[@]}" -eq 1 ]];then #else if there is only one match, we output it
echo "${EXPANSION[0]}"
else
#else we expand the path as much as possible and return all the possible results
while [[ $l -le "${#EXPANSION[0]}" ]]; do
for i in "${EXPANSION[@]}"; do
if [[ "${EXPANSION[0]:$l:1}" != "${i:$l:1}" ]]; then
CTRL_LOOP=1
break
fi
done
[[ $CTRL_LOOP -eq 1 ]] && break
((l++))
done
#we add the partial solution at the beggining of the array of solutions
echo "${EXPANSION[0]:0:$l} ${EXPANSION[@]}"
fi
}

使用以下命令:

    source "$HOME/.bashrc.d/autocomplete.sh" 
bind -x '"\t" : autocomplete_wrapper'

输出:

>$ cd /u/lo/b<TAB>
>$ cd /usr/local/bin


>$ cd /u/l<TAB>
/usr/local /usr/lib
>$ cd /usr/l

可以将绑定(bind)行添加到您的 ~/.bashrc 文件中,执行如下操作:

if [[ -s "$HOME/.bashrc.d/autocomplete.sh" ]]; then
source "$HOME/.bashrc.d/autocomplete.sh"
bind -x '"\t" : autocomplete_wrapper'
fi

(取自this answer)

此外,我强烈建议不要将此命令绑定(bind)到您的 Tab 键,因为它会覆盖默认的自动完成。

注意:在某些情况下,这会出现错误,例如,如果您尝试自动完成 "/path/with spaces/something",作为完成的最后一个参数由 ${READLINE_LINE##* } 决定。如果这是你的问题,你应该编写一个函数,在考虑引号时返回一行的最后一个参数

请随时要求进一步说明,我欢迎任何改进此脚本的建议

关于bash 使用 zsh 等快捷方式扩展 cd,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25076611/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com