在回答这个问题时,我使用了一个非常混乱的bind函数来根据我的automplete.sh脚本结果修改当前行.
当我最终使用这个脚本供我个人使用时,我试图简化bind并尝试直接在脚本中进行所有读取和修改.
到目前为止,我可以访问$READLINE_LINE并$READLINE_POINT提取我需要的信息,但我无法替换当前值.引用bind命令页面,这应该工作:
执行shell命令时,shell将READLINE_LINE变量设置为readline行缓冲区的内容,将READLINE_POINT变量设置为插入点的当前位置.如果执行的命令更改了READLINE_LINE或READLINE_POINT的值,则这些新值将反映在编辑状态中
我绑了我的scipt bind -x '"\t":autocomplete.sh',做了这样的事情:
#!/bin/bash
#autocomplete.sh
BASE="${READLINE_LINE% *} "
LAST_CMD="${READLINE_LINE##* }"
EXPANSION=($(magical_autocomplete $LAST_CMD))
#we store the desired value for the line in ${EXPANSION[0]}
[[ ${#EXPANSION[@]} -gt 1 ]] && echo ${EXPANSION[@]:1} #we echo the match if there are more than 1
#Doesn't work, even with simple values like READLINE_LINE="test" or READLINE_POINT=0
READLINE_LINE=${EXPANSION[0]}
READLINE_POINT=${#READLINE_LINE}
#echo READLINE_LINE READLINE_POINT echoes the correct value here
Run Code Online (Sandbox Code Playgroud)
执行脚本后,将显示正确的匹配项,但不会更新当前换行符.当我回应一些信息时,我不能仅仅重新定位bind部分中我的脚本的输出.为什么我可以从变量中读取而不是写入变量?
仅仅因为这不起作用的原因相同:
$ export a=1
$ bash -c 'echo $a; let a++'
1
$ echo $a
1
Run Code Online (Sandbox Code Playgroud)
环境变量是可遗传的,不可共享.由于autocomplete.sh作为新的子进程执行,它可以读取所有父变量,但不能推回新值.
要修改READLINE_LINE,READLINE_POINT您必须在同一过程中执行自动完成 - source功能将帮助您.
# autocomplete.sh
# should be sourced from ~/.bashrc or something
autocomplete() {
echo $READLINE_LINE $READLINE_POINT
EXPANSION=($(magical_autocomplete $READLINE_LINE))
#we store the desired value for the line in ${EXPANSION[0]}
[[ ${#EXPANSION[@]} -gt 1 ]] && echo ${EXPANSION[@]:1}
READLINE_LINE=${EXPANSION[0]}
READLINE_POINT=${#READLINE_LINE}
}
Run Code Online (Sandbox Code Playgroud)
捆绑:
if [[ -s "$HOME/.bashrc.d/autocomplete.sh" ]]; then
source "$HOME/.bashrc.d/autocomplete.sh"
bind -x '"\t" : autocomplete'
fi
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
818 次 |
| 最近记录: |