我已经在 stackoveflow 上问过这个问题,但没有得到答案,而且意见很少。我想我会在这里发帖,因为应该有更多的 bash 用户,而且有人可能已经偶然发现了这个问题。根据SO Meta,只要我链接到跨网站帖子,就可以这样做。如果我错了,请告诉我,我会删除这个问题。
我试图通过将自定义脚本绑定到一个键来实现ksh
路径自动完成的一些功能bash
。为了做到这一点,我的脚本读取来自信息bind
变量$READLINE_LINE
,并$READLINE_POINT
和尝试更新这些值。虽然我可以毫无问题地读取行缓冲区,但我似乎无法修改这些变量并更新当前行。
引用绑定手册页,这应该可以工作:
当 shell-command 被执行时,shell 将 READLINE_LINE 变量设置为 readline 行缓冲区的内容,并将 READLINE_POINT 变量设置为插入点的当前位置。如果执行的命令改变了 READLINE_LINE 或 READLINE_POINT 的值,这些新值将反映在编辑状态
我绑定了我的 sciptbind -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 …
Run Code Online (Sandbox Code Playgroud) bind -x
每当按下某个键序列时,我都会使用它来执行脚本。
例如,我有一个/usr/local/bin/foo
包含内容的脚本
#!/bin/bash
echo foo
Run Code Online (Sandbox Code Playgroud)
如果我运行,bind -x '" ": /usr/local/bin/foo'
那么每次我按两次空格键时都会回显“foo”。到现在为止还挺好。
我希望能够做的是访问(并理想地修改)正在输入的当前命令。如果我输入some really long command
(末尾有两个空格),我的脚本会被执行,但它怎么能看到我已经输入some really long command
并将其更改为some other long command
?