修改 bash 脚本中的 $READLINE_LINE 和 $READLINE_POINT 值

修改 bash 脚本中的 $READLINE_LINE 和 $READLINE_POINT 值

我已经在 stackoveflow 上问过这个问题,但没有得到任何答复,也很少有意见。我想我应该在这里发帖,因为应该有更多的 bash 用户,并且有人可能已经偶然发现了这个问题。根据SO元,只要我链接到跨网站帖子应该就可以了。如果我错了请告诉我,我会删除这个问题。


我尝试通过将自定义脚本绑定到键ksh来实现路径自动完成的一些功能。bash为此,我的脚本从bind变量中读取信息$READLINE_LINE$READLINE_POINT尝试更新这些值。虽然我可以毫无问题地读取行缓冲区,但我似乎无法修改这些变量并更新当前行。

引用绑定手册页,这应该可以工作:

执行 shell 命令时,shell 将 READLINE_LINE 变量设置为 readline 行缓冲区的内容,并将 READLINE_POINT 变量设置为插入点的当前位置。如果执行的命令更改了 READLINE_LINE 或 READLINE_POINT 的值,这些新值将反映在编辑状态中

我将我的脚本与bind -x '"\t":autocomplete.sh', 并做了类似的事情:

#!/bin/bash
#autocomplete.sh
echo $READLINE_LINE $READLINE_POINT   #I can read the current line values
EXPANSION=($(magical_autocomplete $READLINE_LINE))
#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

READLINE_LINE=${EXPANSION[0]}
READLINE_POINT=${#READLINE_LINE}
#echo READLINE_LINE READLINE_POINT echoes the correct values found by magical_autocomplete
#however the current line & the current point is not updated

当我回显一些信息时,我不能将脚本的输出重定向到调用$READLINE_LINEbind。为什么我可以读取变量但不能写入变量?

答案1

出于同样的原因,这不起作用:

$ export a=1
$ bash -c 'echo $a; let a++'
1
$ echo $a
1

环境变量是遗传,不可共享。由于autocomplete.sh作为新的子进程执行,因此它可以读取所有父进程的变量,但无法推回新值。

要修改READLINE_LINEREADLINE_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}
}

捆绑:

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

相关内容