최상의 답변
아직 Vim에 대해 아무도 말하지 않았다는 것이 믿기지 않습니다. Vim!
초기 학습 곡선을 넘어 서면 일상적인 프로그래밍 작업을 자동화하는 놀라운 도구입니다. 오늘 이전에 사용한 예를 들어 보겠습니다.
코드베이스의 구성 요소에 대한 XML 리더 클래스 (기본 XML 클래스에서 상 속됨)를 만들고있었습니다. .xml은 다음과 같습니다.
...
문제 (기존 아키텍처로 인해) 이러한 필드 값은 모두 코드에서 Some\_XML\_Class의 개인 데이터 멤버 여야했습니다. 즉, field-one 을 std :: string m\_field\_one으로 변환하는 의미없는 작업을 많이하려고했습니다. , 이러한 각 필드에 대해.
그것이 Vim이 들어오는 곳입니다. 20 분을 힘들게하는 대신. 위 코드 섹션을 붙여넣고 매크로를 기록했습니다.
^xistd::string m\_f-r\_ea;ld$j
이 일련의 vim 명령은 다음을 수행합니다. 줄의 첫 번째 문자로 이동하여 삭제합니다 (‘삭제됨). 삽입 모드로 들어가서 iv id = 앞에 std :: string m\_을 추가합니다. “80cb020c88″>
필드 . 그런 다음‘-’의 첫 번째 항목을 찾아‘\_’로 바꿉니다. 그런 다음 field\_N 단어의 끝으로 점프하고 추가 모드로 들어가 세미콜론을 추가하고 커서를 오른쪽으로 1 이동합니다. 이제
std::string m\_field\_one;value="value1" />
하지만 아직 완료되지 않았습니다. 그런 다음 명령 모드로 이동하여 나머지 줄을 삭제하고 다음 줄로 이동합니다. 따라서 다음과 같습니다.
std::string m\_field\_one;
첫 번째 줄은 완벽하게 형식이 지정되어 있고 커서는 현재 두 번째 줄에 있습니다.
마법이 들어오는 경우 다음 부분입니다.이 명령을 실행하기 전에 a를 등록하는 매크로 기록을 시작했습니다. . q 명령 다음에 a 를 사용합니다. 따라서 다음과 같이 완전한 명령을 작성합니다 (마지막 q 은 매크로 종료를 나타내는 데 사용됨).
qa^xistd::string m\_f-r\_ea;ld$jq
이제 Vim 명령을 사용하여 해당 매크로를 호출하는 경우 :
@a
매크로를 다시 실행하고 다음 줄의 형식을 자동으로 지정합니다.
std::string m\_field\_one;
std::string m\_field\_two;
그러나 잠깐, 우리는 여전히 비슷한 구조의 N-2 줄을 가지고 있습니다! 이 경우 N이 100이라고 가정 해 봅시다. 문제 없습니다. 다음 명령을 입력하면됩니다.
98@a
위의 매크로를 98 번 더 실행하여 나머지 코드의 서식을 자동으로 지정합니다 !! 이제 다음이 있습니다.
std::string m\_field\_one;
std::string m\_field\_two;
std::string m\_field\_three;
...
std::string m\_field\_ninetynine
std::string m\_field\_onehundered;
놀라움 .
* PS : 처음에는 이러한 명령이 낯설고 무섭게 보일 수 있지만, Vim을 기본 편집자로 사용하고 나면 제 2의 천성이됩니다. 예제 매크로는 작성하는 데 10 초가 걸렸고 엄청난 시간을 절약했습니다.
* PPS : 예제 코드가 멍청하다는 것을 알고 있지만 요점을 설명하기 위해 사용했습니다. 그러나 현실 세계에서는 비슷한 경우가 있습니다.
답변
물어 줘서 고맙습니다.
처음에는 이러한 목표에 대해 경고하기 위해 여기에 왔습니다. 제목에 … 기본적으로 오늘 텍스트 편집기를 작성하는 이유는 다음과 같습니다.
- 매우 특정한 필요가 있습니다 (그러나이 경우에는 여전히 기존 기반에서 시작하는 것이 좋습니다. 아주 새로운 아이디어가 없다면 처음부터 시작합니다.
- 또는 프로그래밍의 흥미로운 연습이라고 생각합니다. 이것이 바로 여러분의 목표입니다.
솔직히 “수백 개 중에서 꿈의 편집자를 찾을 수 없다면 수천 개는 아니더라도 매우 까다로울 것입니다!;-)
저는 또한 처음부터 텍스트 편집기를 작성하는 것이 초보자에게는 약간 어려울 수 있다고 말하고 싶었습니다. 중급 수준의 작업이라고 가정 해 보겠습니다. 완전 초보자에게는 약간 어렵고 한 번만 수행 할 수 있습니다. 당신은 약간의 경험을 얻습니다.
즉, 저는 아직 초심자 일 때 제 자신의 텍스트 편집기를 작성했습니다. 대학을 갓 졸업하고 실제 프로젝트없이 C로 약간만 코딩했습니다. 하지만 저는 SCO Unix가 vi 만 편집기로 사용하는 PC에있었습니다. 그리고 나는 항상 나를 혼란스럽게하는 두 가지 모드 (내비게이션 대 에디션) 때문에 그것을 싫어한다 (입력하기 시작하고, 첫 번째 i … 이후에만 내 텍스트를 본다).
그래서 저는 Curses를 인터페이스로 사용하여 제 자신의 데이터 구조를 만드는 등 C로 편집기를 코딩하기 시작했습니다 (아마 비효율적이지만 당시에는 작은 파일을 다뤘습니다).
많은 재미가 있었고 많은 것을 배웠고 다른 사용자들도 사용하기 시작했을 때 탭과 공백을 혼합하는 것과 같은 예상치 못한 일을 항상한다는 것을 알게되었습니다 … 🙂
다시 한번, 당신이 완전히 초보자라면, 작은 프로젝트부터 시작하여 언어의 기초 (루프, 배열 등), 데이터 구조, 텍스트 파일을 읽고 쓰는 방법 등에 대해 배워야합니다.
하나의 언어에 대해 조언하기는 어렵습니다 … JVM 기반 프로젝트의 경우 JavaFX 또는 SWT와 함께 Ceylon을 사용합니다. “close to the metal”프로젝트의 경우, Rust를 사용합니다 (Rust에서 텍스트 편집기를 작성하는 시작 프로젝트가 있고 유망 해 보입니다). 다른 사람들은 C ++ (초보자에게는 압도적 일 수 있습니다!)를 사용하는 것이 좋습니다. 더 쉬운 언어의 경우 아마도 Lua가 적합 할 것입니다 (다른 사람들은 Python을 사용하는 것이 좋지만 경험이 없습니다). 또는 JavaScript, Node.js 및 Electron 플랫폼, 트렌드 옵션 … (Atom, Visual Studio Code 및 Brackets이이를 사용하여 작성되었지만 기존 JS 코드 편집기를 사용하므로 “처음부터”거의 “처음부터”) )
일반적인 조언 : 먼저 데이터 구조를 설계하십시오 (Scintilla 프로젝트에서 사용하는 두 부분으로 구성된 전략은 좋습니다. Rust 프로젝트에서 사용하는 로프는 조금 더 / 너무 고급입니다). 데이터를 조작하는 방법 : 문자, 줄, 선택 등을 추가하거나 제거하는 방법
그런 다음 UI에 대해 생각합니다. 이상적으로는 둘을 분리합니다 (데이터 처리 및 데이터 표시). 이런 식으로 언젠가 기본 로직을 거의 또는 전혀 변경하지 않고 UI 대상 (Swing에서 JavaFX로, GTK +에서 Qt로)을 변경할 수 있습니다. 이식성에 좋습니다.