Main.cpp 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116
  1. #include <ctype.h>
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4. #include <termios.h>
  5. #include <unistd.h>
  6. // https://viewsourcecode.org/snaptoken/kilo/02.enteringRawMode.html
  7. struct termios orig_termios;
  8. void disableRawMode() {
  9. tcsetattr(STDIN_FILENO, TCSAFLUSH, &orig_termios);
  10. }
  11. void enableRawMode() {
  12. tcgetattr(STDIN_FILENO, &orig_termios);
  13. atexit(disableRawMode);
  14. struct termios raw;
  15. tcgetattr(STDIN_FILENO, &raw);
  16. raw.c_iflag &= ~(ICRNL | IXON);
  17. raw.c_lflag &= ~(ECHO | ICANON | IEXTEN /*| ISIG*/);
  18. raw.c_cc[VMIN] = 0;
  19. raw.c_cc[VTIME] = 0;
  20. tcsetattr(STDIN_FILENO, TCSAFLUSH, &raw);
  21. }
  22. char buffer[256];
  23. int move = 0;
  24. void refreshLine() {
  25. putchar('\r');
  26. printf("> %s", buffer);
  27. if(move > 0) {
  28. printf("\33[%dD", move);
  29. }
  30. fflush(STDIN_FILENO);
  31. }
  32. int main() {
  33. enableRawMode();
  34. int index = 0;
  35. buffer[0] = '\0';
  36. while(1) {
  37. int c = 0;
  38. int bytes = read(STDIN_FILENO, &c, 1);
  39. printf("\33[2K\r");
  40. if(bytes < 0) {
  41. break;
  42. } else if(bytes == 0) {
  43. //printf("timeout\n");
  44. refreshLine();
  45. continue;
  46. } else if(c == 'q') {
  47. break;
  48. }
  49. if(c == 27) {
  50. char escape[10];
  51. int escapeBytes = read(STDIN_FILENO, escape, 10);
  52. printf("Escape sequence of length: %d\n", escapeBytes);
  53. if(escapeBytes == 2) {
  54. if(escape[0] == '[' && escape[1] == 'D' && move < index) {
  55. move++;
  56. }
  57. if(escape[0] == '[' && escape[1] == 'C' && move > 0) {
  58. move--;
  59. }
  60. }
  61. continue;
  62. }
  63. if(iscntrl(c)) {
  64. switch(c) {
  65. case 127:
  66. if(index > 0) {
  67. if(move == 0) {
  68. index--;
  69. buffer[index] = '\0';
  70. } else {
  71. int pos = index - move - 1;
  72. if(pos >= 0) {
  73. while(buffer[pos] != '\0') {
  74. buffer[pos] = buffer[pos + 1];
  75. pos++;
  76. }
  77. index--;
  78. }
  79. }
  80. }
  81. break;
  82. case 13:
  83. puts(buffer);
  84. index = 0;
  85. buffer[0] = '\0';
  86. move = 0;
  87. break;
  88. }
  89. printf("%d\n", c);
  90. } else {
  91. printf("%d ('%c')\n", c, c);
  92. if(move == 0) {
  93. buffer[index++] = c;
  94. buffer[index] = '\0';
  95. }
  96. }
  97. refreshLine();
  98. }
  99. return 0;
  100. }