prompt.js 1.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697
  1. /*
  2. * Used for prompt popup on vim
  3. */
  4. const readline = require("readline")
  5. const rl = readline.createInterface({
  6. input: process.stdin,
  7. output: process.stdout,
  8. escapeCodeTimeout: 0,
  9. prompt: ''
  10. })
  11. rl.setPrompt('')
  12. let value = process.argv[2]
  13. if (value) {
  14. rl.write(value)
  15. }
  16. rl.on('line', input => {
  17. send(['confirm', input])
  18. process.exit()
  19. })
  20. let original_ttyWrite = rl._ttyWrite
  21. rl._ttyWrite = function (code, key) {
  22. if (key.name === 'enter') {
  23. send(['send', '<C-j>'])
  24. return ''
  25. }
  26. original_ttyWrite.apply(rl, arguments)
  27. send(['change', rl.line])
  28. }
  29. function createSequences(str) {
  30. return '\033]51;' + str + '\x07'
  31. }
  32. function send(args) {
  33. process.stdout.write(createSequences(JSON.stringify(['call', 'CocPopupCallback', args])))
  34. }
  35. process.stdin.on('keypress', (e, key) => {
  36. if (key) {
  37. let k = getKey(key)
  38. if (k == '<bs>') {
  39. return
  40. }
  41. if (k == '<esc>') {
  42. send(['exit', ''])
  43. process.exit()
  44. return
  45. }
  46. if (k) {
  47. send(['send', k])
  48. return
  49. }
  50. }
  51. })
  52. function getKey(key) {
  53. if (key.ctrl === true) {
  54. if (key.name == 'n') {
  55. return '<C-n>'
  56. }
  57. if (key.name == 'p') {
  58. return '<C-p>'
  59. }
  60. if (key.name == 'j') {
  61. return '<C-j>'
  62. }
  63. if (key.name == 'k') {
  64. return '<C-k>'
  65. }
  66. if (key.name == 'f') {
  67. return '<C-f>'
  68. }
  69. if (key.name == 'b') {
  70. return '<C-b>'
  71. }
  72. if (key.sequence == '\x00') {
  73. return '<C-@>'
  74. }
  75. }
  76. if (key.sequence == '\u001b') {
  77. return '<esc>'
  78. }
  79. if (key.sequence == '\r') {
  80. return '<cr>'
  81. }
  82. if (key.sequence == '\t') {
  83. return key.shift ? '<s-tab>' : '<tab>'
  84. }
  85. if (key.name == 'up') {
  86. return '<up>'
  87. }
  88. if (key.name == 'down') {
  89. return '<down>'
  90. }
  91. return ''
  92. }