【问题标题】:Hacking help-style info into completion method将帮助样式信息侵入完成方法
【发布时间】:2013-08-16 16:14:59
【问题描述】:

我有一个方法可以解释它在不带选项的情况下运行时的用法:

Usage:
SQLbatch [database] [file] [maximum # of lines in batch] [time to sleep between batches] [who to email when finished]

最近,我一直在空闲时间写一个tab-completion脚本:

_SQLbatch()
{    

  local cur dbs
  COMPREPLY=()
  dbs=$(< /...directory paths.../allDbs.txt)
  cur="${COMP_WORDS[COMP_CWORD]}"

  case "$COMP_CWORD" in
  1)
     case "$cur" in
     *@*)   
        COMPREPLY=( $(compgen -W "$dbs" -- "$cur" | sed -e "s/.*@/@/") )
        return 0    
        ;;          
     *)   
        COMPREPLY=( $(compgen -W "$dbs" -- "$cur") )
        return 0    
        ;;          
     esac   
     ;;     
  2)
     COMPREPLY=( $(compgen -f -- "$cur") )
     return 0
     ;;     
  *)
  esac
}    

complete -F _SQLbatch SQLbatch

到目前为止,这对于使用适当的数据库和文件完成第一个和第二个条目非常有用。但是,我也一直在尝试添加一种方法来简单地打印出“使用”信息,如果您在文件之后的任何位置双击标签。所以,如果我把它放到控制台中:

SQLbatch server@database file.txt [TAB][TAB]

我希望完成以提醒用户他们还需要什么,而不会破坏他们已经输入的内容。我的最新方法是这样的:

...
  *)
     echo -e "\nSQLbatch [database] [file] [maximum # of lines in batch] [time to sleep between batches] [who to email when finished]"
     return 0
     ;;
  esac
...

几乎做到了,但最终无法在最新行重新显示用户输入。有没有办法强制这最后一步完成?

【问题讨论】:

    标签: bash tab-completion bash-completion


    【解决方案1】:

    这是你的做法。我们要做的是生成 PS1(shell 提示符)和您当前的单词来修复损坏的新行。我们可以将$actualPS1 的内容直接粘贴到我们的 echo 语句中,但我认为这种方法更易读。

    ...
    *)
        actualPS1=$(eval echo \"$PS1\")
        echo -en "\nWhatever line of text you want.\n"
        echo -en "${actualPS1}${COMP_WORDS[@]}"
        return 0
        ;;
    esac
    ...
    

    这将为您的特定情况打印一行文本,然后将控制台正确返回给您。无需指定 COMPREPLY 应该是什么。

    请注意,您基本上可以将此完成添加到无法通过正常方式完成的任何内容,作为对最终用户的有用提醒。一种可能使用它的方法是echo 本身!

    【讨论】:

      猜你喜欢
      • 2010-09-14
      • 1970-01-01
      • 1970-01-01
      • 2021-01-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-02-17
      • 1970-01-01
      相关资源
      最近更新 更多