할 일이 없어서 텍스트 편집기를 만들었습니다.
더 이상 할 일이 없을 때 무엇을 합니까? 나는 깜짝 놀랐다.
그래서 저는 할 일을 열심히 찾고 있었습니다. 새로운 오픈 소스 프로젝트를 시작할 수도 있고(확실히 반쯤 완성한 프로젝트를 완료하지 않을 것이기 때문에), 새로운 프로그래밍 언어를 배울 수도 있고, 마침내 배울 수도 있습니다Svelte .
말할 필요도 없이 나는 analysis paralysis .
하지만 최근에 단일 텍스트 편집기를 고수하는 데 문제가 있다는 생각이 들었습니다. 나는 속도 때문에 Sublime을 좋아했지만 플러그인 지원이 부족하여 많이 사용할 수 없었습니다. 광범위한 플러그인이 지원하기 때문에 주로 Visual Studio Code를 사용하지만 때로는 매우 느려질 수 있습니다(electron 덕분에). 그다지 큰 문제는 아니지만 약간 성가신 일이 너무 많이 발생하면 신경이 쓰일 것입니다. 나는 또한 Vim/Neovim과 Emacs를 시도했고 그들에 대한 나의 유사성(또는 부족함)은 거의 동일합니다. 따라서 Vim 대 Emacs 논쟁을 피하십시오 :)
그래서 네, 저는 저만의 건물을 짓기 시작했습니다. 이것이 바로 지금의 모습입니다.
제가 이미 알고 있는 기술로 구축하는 것이 쉬울 것이기 때문에 (맞습니다) Electron을 사용하여 구축하는 것을 처음 생각했습니다. 하지만 결국에는 역효과를 낳지 않을까요? 전체 vscode 커뮤니티는 그들이 할 수 있는 최선의 일을 하고 있으며 그들이 하는 것보다 전자에서 더 빠른 텍스트 편집기를 만들 수 있는 방법이 없습니다.
그래서 내 사고 과정에서 관련 없는 많은 단계를 거친 후 Rust로 터미널에 텍스트 편집기를 만들었습니다. 이제 나는 이 모든 것을 허공에서 개념화한 천재가 아닙니다.
a tutorial by Philipp Flenker (고맙게도) based on a tutorial 이전에 시도했지만 C에 있었기 때문에 완료하지 못했습니다.
터미널용 텍스트 편집기를 구축하는 것은 처음부터 많은 UI 항목을 구축해야 하기 때문에 매우 어려운 일이며 다시는 GUI를 당연하게 여기지 않을 것입니다.
내가 어떻게 했지?
먼저 터미널 창을 지워야 합니다. 이스케이프 시퀀스\x1b[2J
를 인쇄해야 할 수 있습니다.
Escape sequences instruct the terminal to do various text formatting tasks, such as coloring text, moving the cursor around, and clearing parts of the screen.
키 누름 읽기
터미널에서는 키 누르기만 하면 됩니다. 이러한 키 누름과 그 조합을 수행하려는 특정 기능에 바인딩해야 합니다. 키보드의 각 키는 서로 다른 바이트를 나타냅니다. 루프를 실행하고 모든 입력을 인쇄하여 확인할 수 있습니다. C에서는 다음과 같이 수행됩니다.
#include<stdio.h>
int main() {
char c;
while (1) {
scanf(&c);
printf(c);
}
return 0;
}
화살표 키를 누르면 문자 키와 문자 키를 누르면 어떻게 다른 출력 바이트가 생성되는지 확인할 수 있습니다. 여기서부터 키 누름을 처리하는 것은 입력을 바이트와 일치시키고 필요한 작업을 수행하는 것입니다.
나는 이러한 작은 세부 사항을 추상화하고 내 삶을 더 쉽게 만들어주는 termion
라는 (훌륭한) 패키지를 사용하고 있습니다. 다음은 편집기의 실제 Rust 코드입니다.
fn process_keypress(&mut self) -> Result<(), std::io::Error> {
let pressed_key = Terminal::read_key()?;
match pressed_key {
Key::Ctrl('q') => self.quit(),
},
Key::Ctrl('f') => self.search(),
Key::Ctrl('s') => self.save(),
Key::Ctrl('h') => self.show_help(),
Key::Char(c) => {
// don't move cursor to the right if enter is pressed
self.move_cursor(Key::Right);
self.document.insert(&self.cursor_position, c);
},
Key::Delete => self.document.delete(&self.cursor_position),
Key::Backspace => {
// Backspace = going left and perform delete
if self.cursor_position.x > 0 || self.cursor_position.y > 0 {
self.move_cursor(Key::Left);
self.document.delete(&self.cursor_position);
}
}
Key::Up
| Key::Down
| Key::Left
| Key::Right
| Key::PageUp
| Key::PageDown
| Key::Home
| Key::End => self.move_cursor(pressed_key),
_ => (),
}
// ...
Ok(())
}
참고: 이 게시물에서 간단하고 읽기 쉽도록 일부 코드가 생략되었습니다.
패키지가 바이트로 작업할 필요가 없도록 Key
에 대한 추상화를 제공하는 방법을 볼 수 있습니다.
상태 표시줄 표시
텍스트 편집기는 상태 표시줄이 있을 때까지 진지한 텍스트 편집기가 아니라고 생각합니다. 물론 농담이지만 파일을 편집하는 동안 몇 가지 중요한 정보를 표시하여 좋은 사용자 경험을 제공합니다. 그 아래의 메시지 표시줄은 파일에서 검색하는 동안 도움말 메시지 및 텍스트 입력과 같은 유용한 정보를 표시할 수 있습니다.
로드맵
편집기에 몇 가지 기본 기능을 구축했지만 다음과 같은 많은 기능이 있었으면 합니다.
Escape sequences instruct the terminal to do various text formatting tasks, such as coloring text, moving the cursor around, and clearing parts of the screen.
#include<stdio.h>
int main() {
char c;
while (1) {
scanf(&c);
printf(c);
}
return 0;
}
fn process_keypress(&mut self) -> Result<(), std::io::Error> {
let pressed_key = Terminal::read_key()?;
match pressed_key {
Key::Ctrl('q') => self.quit(),
},
Key::Ctrl('f') => self.search(),
Key::Ctrl('s') => self.save(),
Key::Ctrl('h') => self.show_help(),
Key::Char(c) => {
// don't move cursor to the right if enter is pressed
self.move_cursor(Key::Right);
self.document.insert(&self.cursor_position, c);
},
Key::Delete => self.document.delete(&self.cursor_position),
Key::Backspace => {
// Backspace = going left and perform delete
if self.cursor_position.x > 0 || self.cursor_position.y > 0 {
self.move_cursor(Key::Left);
self.document.delete(&self.cursor_position);
}
}
Key::Up
| Key::Down
| Key::Left
| Key::Right
| Key::PageUp
| Key::PageDown
| Key::Home
| Key::End => self.move_cursor(pressed_key),
_ => (),
}
// ...
Ok(())
}
편집기에 몇 가지 기본 기능을 구축했지만 다음과 같은 많은 기능이 있었으면 합니다.
도와주세요
이 프로젝트에 관심이 있고 도움을 주고 싶거나 코드를 살펴보고 싶다면 Github repo here을 방문하십시오.
루프라고 부르는 이유는 무엇입니까? 글쎄, 나는 Tales from The Loop을보고 있었고 다른 이름을 생각할 수 없었습니다.
Reference
이 문제에 관하여(할 일이 없어서 텍스트 편집기를 만들었습니다.), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://dev.to/faraazahmad/i-had-nothing-to-do-so-i-built-a-text-editor-468n
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
Reference
이 문제에 관하여(할 일이 없어서 텍스트 편집기를 만들었습니다.), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/faraazahmad/i-had-nothing-to-do-so-i-built-a-text-editor-468n텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)