diff --git a/userspace/programs/Shell/Input.cpp b/userspace/programs/Shell/Input.cpp index a39992a2..7e6af322 100644 --- a/userspace/programs/Shell/Input.cpp +++ b/userspace/programs/Shell/Input.cpp @@ -382,7 +382,17 @@ BAN::Optional Input::get_input(BAN::Optional custo continue; } - switch (ch) + if (ch == m_backspace) + { + if (m_buffer_col <= 0) + continue; + while ((m_buffers[m_buffer_index][m_buffer_col - 1] & 0xC0) == 0x80) + m_buffers[m_buffer_index].remove(--m_buffer_col); + m_buffers[m_buffer_index].remove(--m_buffer_col); + printf("\b\e[s%s \e[u", m_buffers[m_buffer_index].data() + m_buffer_col); + fflush(stdout); + } + else switch (ch) { case '\e': { @@ -680,6 +690,8 @@ Input::Input() s_raw_termios.c_lflag &= ~(ECHO | ICANON); atexit([] { tcsetattr(0, TCSANOW, &s_original_termios); }); s_termios_initialized = true; + + m_backspace = s_original_termios.c_cc[VERASE]; } char hostname_buffer[HOST_NAME_MAX]; diff --git a/userspace/programs/Shell/Input.h b/userspace/programs/Shell/Input.h index dd3649d2..ceeb11c5 100644 --- a/userspace/programs/Shell/Input.h +++ b/userspace/programs/Shell/Input.h @@ -31,5 +31,7 @@ private: BAN::Optional> m_tab_completions; size_t m_tab_completion_keep { 0 }; + char m_backspace; + int m_waiting_utf8 { 0 }; };