option.go 8.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310
  1. package prompt
  2. // Option is the type to replace default parameters.
  3. // prompt.New accepts any number of options (this is functional option pattern).
  4. type Option func(prompt *Prompt) error
  5. // OptionParser to set a custom ConsoleParser object. An argument should implement ConsoleParser interface.
  6. func OptionParser(x ConsoleParser) Option {
  7. return func(p *Prompt) error {
  8. p.in = x
  9. return nil
  10. }
  11. }
  12. // OptionWriter to set a custom ConsoleWriter object. An argument should implement ConsoleWriter interface.
  13. func OptionWriter(x ConsoleWriter) Option {
  14. return func(p *Prompt) error {
  15. registerConsoleWriter(x)
  16. p.renderer.out = x
  17. return nil
  18. }
  19. }
  20. // OptionTitle to set title displayed at the header bar of terminal.
  21. func OptionTitle(x string) Option {
  22. return func(p *Prompt) error {
  23. p.renderer.title = x
  24. return nil
  25. }
  26. }
  27. // OptionPrefix to set prefix string.
  28. func OptionPrefix(x string) Option {
  29. return func(p *Prompt) error {
  30. p.renderer.prefix = x
  31. return nil
  32. }
  33. }
  34. // OptionInitialBufferText to set the initial buffer text
  35. func OptionInitialBufferText(x string) Option {
  36. return func(p *Prompt) error {
  37. p.buf.InsertText(x, false, true)
  38. return nil
  39. }
  40. }
  41. // OptionCompletionWordSeparator to set word separators. Enable only ' ' if empty.
  42. func OptionCompletionWordSeparator(x string) Option {
  43. return func(p *Prompt) error {
  44. p.completion.wordSeparator = x
  45. return nil
  46. }
  47. }
  48. // OptionLivePrefix to change the prefix dynamically by callback function
  49. func OptionLivePrefix(f func() (prefix string, useLivePrefix bool)) Option {
  50. return func(p *Prompt) error {
  51. p.renderer.livePrefixCallback = f
  52. return nil
  53. }
  54. }
  55. // OptionPrefixTextColor change a text color of prefix string
  56. func OptionPrefixTextColor(x Color) Option {
  57. return func(p *Prompt) error {
  58. p.renderer.prefixTextColor = x
  59. return nil
  60. }
  61. }
  62. // OptionPrefixBackgroundColor to change a background color of prefix string
  63. func OptionPrefixBackgroundColor(x Color) Option {
  64. return func(p *Prompt) error {
  65. p.renderer.prefixBGColor = x
  66. return nil
  67. }
  68. }
  69. // OptionInputTextColor to change a color of text which is input by user
  70. func OptionInputTextColor(x Color) Option {
  71. return func(p *Prompt) error {
  72. p.renderer.inputTextColor = x
  73. return nil
  74. }
  75. }
  76. // OptionInputBGColor to change a color of background which is input by user
  77. func OptionInputBGColor(x Color) Option {
  78. return func(p *Prompt) error {
  79. p.renderer.inputBGColor = x
  80. return nil
  81. }
  82. }
  83. // OptionPreviewSuggestionTextColor to change a text color which is completed
  84. func OptionPreviewSuggestionTextColor(x Color) Option {
  85. return func(p *Prompt) error {
  86. p.renderer.previewSuggestionTextColor = x
  87. return nil
  88. }
  89. }
  90. // OptionPreviewSuggestionBGColor to change a background color which is completed
  91. func OptionPreviewSuggestionBGColor(x Color) Option {
  92. return func(p *Prompt) error {
  93. p.renderer.previewSuggestionBGColor = x
  94. return nil
  95. }
  96. }
  97. // OptionSuggestionTextColor to change a text color in drop down suggestions.
  98. func OptionSuggestionTextColor(x Color) Option {
  99. return func(p *Prompt) error {
  100. p.renderer.suggestionTextColor = x
  101. return nil
  102. }
  103. }
  104. // OptionSuggestionBGColor change a background color in drop down suggestions.
  105. func OptionSuggestionBGColor(x Color) Option {
  106. return func(p *Prompt) error {
  107. p.renderer.suggestionBGColor = x
  108. return nil
  109. }
  110. }
  111. // OptionSelectedSuggestionTextColor to change a text color for completed text which is selected inside suggestions drop down box.
  112. func OptionSelectedSuggestionTextColor(x Color) Option {
  113. return func(p *Prompt) error {
  114. p.renderer.selectedSuggestionTextColor = x
  115. return nil
  116. }
  117. }
  118. // OptionSelectedSuggestionBGColor to change a background color for completed text which is selected inside suggestions drop down box.
  119. func OptionSelectedSuggestionBGColor(x Color) Option {
  120. return func(p *Prompt) error {
  121. p.renderer.selectedSuggestionBGColor = x
  122. return nil
  123. }
  124. }
  125. // OptionDescriptionTextColor to change a background color of description text in drop down suggestions.
  126. func OptionDescriptionTextColor(x Color) Option {
  127. return func(p *Prompt) error {
  128. p.renderer.descriptionTextColor = x
  129. return nil
  130. }
  131. }
  132. // OptionDescriptionBGColor to change a background color of description text in drop down suggestions.
  133. func OptionDescriptionBGColor(x Color) Option {
  134. return func(p *Prompt) error {
  135. p.renderer.descriptionBGColor = x
  136. return nil
  137. }
  138. }
  139. // OptionSelectedDescriptionTextColor to change a text color of description which is selected inside suggestions drop down box.
  140. func OptionSelectedDescriptionTextColor(x Color) Option {
  141. return func(p *Prompt) error {
  142. p.renderer.selectedDescriptionTextColor = x
  143. return nil
  144. }
  145. }
  146. // OptionSelectedDescriptionBGColor to change a background color of description which is selected inside suggestions drop down box.
  147. func OptionSelectedDescriptionBGColor(x Color) Option {
  148. return func(p *Prompt) error {
  149. p.renderer.selectedDescriptionBGColor = x
  150. return nil
  151. }
  152. }
  153. // OptionScrollbarThumbColor to change a thumb color on scrollbar.
  154. func OptionScrollbarThumbColor(x Color) Option {
  155. return func(p *Prompt) error {
  156. p.renderer.scrollbarThumbColor = x
  157. return nil
  158. }
  159. }
  160. // OptionScrollbarBGColor to change a background color of scrollbar.
  161. func OptionScrollbarBGColor(x Color) Option {
  162. return func(p *Prompt) error {
  163. p.renderer.scrollbarBGColor = x
  164. return nil
  165. }
  166. }
  167. // OptionMaxSuggestion specify the max number of displayed suggestions.
  168. func OptionMaxSuggestion(x uint16) Option {
  169. return func(p *Prompt) error {
  170. p.completion.max = x
  171. return nil
  172. }
  173. }
  174. // OptionHistory to set history expressed by string array.
  175. func OptionHistory(x []string) Option {
  176. return func(p *Prompt) error {
  177. p.history.histories = x
  178. p.history.Clear()
  179. return nil
  180. }
  181. }
  182. // OptionSwitchKeyBindMode set a key bind mode.
  183. func OptionSwitchKeyBindMode(m KeyBindMode) Option {
  184. return func(p *Prompt) error {
  185. p.keyBindMode = m
  186. return nil
  187. }
  188. }
  189. // OptionCompletionOnDown allows for Down arrow key to trigger completion.
  190. func OptionCompletionOnDown() Option {
  191. return func(p *Prompt) error {
  192. p.completionOnDown = true
  193. return nil
  194. }
  195. }
  196. // SwitchKeyBindMode to set a key bind mode.
  197. // Deprecated: Please use OptionSwitchKeyBindMode.
  198. var SwitchKeyBindMode = OptionSwitchKeyBindMode
  199. // OptionAddKeyBind to set a custom key bind.
  200. func OptionAddKeyBind(b ...KeyBind) Option {
  201. return func(p *Prompt) error {
  202. p.keyBindings = append(p.keyBindings, b...)
  203. return nil
  204. }
  205. }
  206. // OptionAddASCIICodeBind to set a custom key bind.
  207. func OptionAddASCIICodeBind(b ...ASCIICodeBind) Option {
  208. return func(p *Prompt) error {
  209. p.ASCIICodeBindings = append(p.ASCIICodeBindings, b...)
  210. return nil
  211. }
  212. }
  213. // OptionShowCompletionAtStart to set completion window is open at start.
  214. func OptionShowCompletionAtStart() Option {
  215. return func(p *Prompt) error {
  216. p.completion.showAtStart = true
  217. return nil
  218. }
  219. }
  220. // OptionBreakLineCallback to run a callback at every break line
  221. func OptionBreakLineCallback(fn func(*Document)) Option {
  222. return func(p *Prompt) error {
  223. p.renderer.breakLineCallback = fn
  224. return nil
  225. }
  226. }
  227. // OptionSetExitCheckerOnInput set an exit function which checks if go-prompt exits its Run loop
  228. func OptionSetExitCheckerOnInput(fn ExitChecker) Option {
  229. return func(p *Prompt) error {
  230. p.exitChecker = fn
  231. return nil
  232. }
  233. }
  234. // New returns a Prompt with powerful auto-completion.
  235. func New(executor Executor, completer Completer, opts ...Option) *Prompt {
  236. defaultWriter := NewStdoutWriter()
  237. registerConsoleWriter(defaultWriter)
  238. pt := &Prompt{
  239. in: NewStandardInputParser(),
  240. renderer: &Render{
  241. prefix: "> ",
  242. out: defaultWriter,
  243. livePrefixCallback: func() (string, bool) { return "", false },
  244. prefixTextColor: Blue,
  245. prefixBGColor: DefaultColor,
  246. inputTextColor: DefaultColor,
  247. inputBGColor: DefaultColor,
  248. previewSuggestionTextColor: Green,
  249. previewSuggestionBGColor: DefaultColor,
  250. suggestionTextColor: White,
  251. suggestionBGColor: Cyan,
  252. selectedSuggestionTextColor: Black,
  253. selectedSuggestionBGColor: Turquoise,
  254. descriptionTextColor: Black,
  255. descriptionBGColor: Turquoise,
  256. selectedDescriptionTextColor: White,
  257. selectedDescriptionBGColor: Cyan,
  258. scrollbarThumbColor: DarkGray,
  259. scrollbarBGColor: Cyan,
  260. },
  261. buf: NewBuffer(),
  262. executor: executor,
  263. history: NewHistory(),
  264. completion: NewCompletionManager(completer, 6),
  265. keyBindMode: EmacsKeyBind, // All the above assume that bash is running in the default Emacs setting
  266. }
  267. for _, opt := range opts {
  268. if err := opt(pt); err != nil {
  269. panic(err)
  270. }
  271. }
  272. return pt
  273. }