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

时间:2016-05-04 17:44:09

标签: bash events readline

旧东西:

  

背景:    - 最终的目标是在我的if __name__ == '__main__': m = len(lines) dma = np.zeros(m * (m - 1) // 2, dtype=np.int8) pool = Pool(processes=4) idx = 0 for resultset in pool.imap(myfunc3, range(len(lines)-1)): lenres = len(resultset) dma[idx:lenres+idx] = resultset idx += lenres pool.close() 中添加一个脚本,如果我输入提交消息,它会改变文本颜色,从而警告我   很长(是的,我知道vim有这样的东西)。

     

进度:    - 我找到了.bash_profile选项让我写这个:

read -n
     

问题:    - 但是,运行此操作会使用户退出bash提示符。在正常提示下我需要一种方法来做这样的事情。我无法找到   关于这样的事情的信息。这是否意味着它不可能?   或者我只是以错误的方式去做?

新进展:

我找到while true; do # This hits at the 53rd character read -rn53 input # I have commit aliased to gc so the if is just checking if I'm writing a commit if [ "${input:0:2}" = "gc" ]; then printf "\nMessage getting long" fi done 选项让我写这个:

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}"和其他一些事情,但似乎都没有效果。这里的正确方法是什么?

1 个答案:

答案 0 :(得分:0)

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

如果您希望在使用prompt内置的脚本中进行此操作,则可以通过循环

来实现这一点。
read -e -i $(munge_buf $buf) -n $(buf_warn_len $buf) -p $(buf_warning $buf) buf
像命令一样。这将允许您创建munge_buf()以在需要时更改当前键入的文本,buf_warn_len()以计算要警告的新len(如果已显示警告,则可能非常大),并{{1根据缓冲区派生警告消息。