首页 文章

用户在提示时可以获得bash输入吗? (基本上是一个事件监听器)

提问于
浏览
3

旧东西:

背景: - 最终的目标是在我的.bash_profile中添加一个脚本,如果我输入一个提交消息并且它太长就改变文本颜色警告我(是的我知道vim有这样的东西) . 进展: - 我找到了读取-n选项,这导致我写这个:while true;做
#这次击中了第53个角色
读-rn53输入
#我已经将别名提交给gc,所以if只是检查我是否正在写提交
if [“$ {input:0:2}”=“gc”];然后
printf“\ n消息变长”
科幻
DONE
问题: - 但是,运行此操作会使用户退出bash提示符 . 在正常提示下我需要一种方法来做这样的事情 . 我找不到这样的信息 . 这是否意味着它不可能?或者我只是以错误的方式去做?

新进展:

我找到了 bind -x 选项让我写这个:

check_commit() {
    if [ "${READLINE_LINE:0:13}" == 'git commit -m' ] && [ ${#READLINE_LINE} -gt 87 ]; then
        echo "Commit is $((${#READLINE_LINE} - 87)) characters too long!"
    fi
    READLINE_LINE="$READLINE_LINE$1"
    READLINE_POINT=$(($READLINE_POINT+1))
}
bind -x '"\"": check_commit "\""'

它会听一个双引号,如果我正在写一个很长的提交消息告诉我有多少字符我超过了限制 . 同时将我输入的字符放入当前行,因为它被绑定吃掉了 .

新问题:

现在我只需要一种方法来放入一个正则表达式,字符列表或至少一个变量而不是 \" 所以我可以听更多的键(是的,我知道 bind -x 可能不是这样用的 . 我可以自己检查性能/足迹/稳定性) . 我尝试了 "$char""${char}""$(char)" 和其他一些东西,但似乎都没有用 . 这里的正确方法是什么?

1 回答

  • 0

    AFAIK,如果您希望在正常提示期间(当评估 PROMPT_COMMANDPS1 时)发生这种情况,则无法以理智的方式进行 . 这将涉及为每个 insert-self 和类似物绑定自定义编译的readline函数 .

    如果你想在一个使用 prompt builtin的脚本中发生这种情况,那么循环可能很难实现

    read -e -i $(munge_buf $buf) -n $(buf_warn_len $buf) -p $(buf_warning $buf) buf
    

    喜欢命令 . 这将允许您创建 munge_buf() 以在需要时更改当前键入的文本, buf_warn_len() 以计算要警告的新len(如果已显示警告,则可能非常大),并且 buf_warn_msg() 以基于缓冲区派生警告消息 .

相关问题