Text Editor: Data Structures
아래의 4가지 data type 에 대해 설명한다.
1. Array
Redis로 유명한 Antirez가 재미로 만든 kilo를 기반으로 하여 에디터 만들기를 설명하는 블로그가 있다. 처음 시작으로 좋을 듯.
2. Rope
Rust로 만든 에디터인 xi-editor가 rope로 구현되어 있다.
3. Gap Buffer
Emacs가 Gap Buffer를 사용하여 구현되어 있다고 한다.
4. Piece Table
Atom, Visual Studio Code가 Piece Table로 구현되어 있다고 한다.
2018년 5월 7일 월요일
2016년 10월 11일 화요일
Xi-Editor 소스 분석
https://github.com/google/xi-editor
front-end는 swift를 사용한 cocoa로 back-end는 rust로 되어있다.
(그냥 간단하게 맥쪽 코드는 swift라고 하고 rust쪽 코드는 rust라고 부르겠다.)
* Swift
- AppDelegate
CoreConnection을 초기화한다.
AppWindowController의 window를 화면에 띄운다.
AppWindowController가 실행되면 appWindowControllers 리스트에 등록하고 종료하면 리스트에서 제거한다.
rust로 부터 응답이 오면 실행되는 콜백을 CoreConnection에 등록한다: handleCoreCmd
메뉴 선택에 따른 연결 함수들이 여기에 있다.
- AppWindowController
첫 로딩시 "new_tab" 메시지를 rust에게 보낸다.
filename이 변경되면 window의 타이틀을 변경한다.
EditView와 ClipView의 constraint를 설정한다.
ScrollView의 frame이 바뀌거나 ScrollView.contentView의 bound가 바뀌면 EditView와 ShadowView의 scroll위치를 다시 지정한다.
- CoreConnection
NSTask를 사용하여 rust를 실행한다.
swift와 rust의 연결은 NSPipe를 사용해서
(swift의 writing -> rust의 standard input,
rust의 standard ooutput -> swift의 reading)로 연결한다.
rust로 보내는 메시지는 sync 또는 async로 보낼 수 있다.
sync의 경우는 semaphore를 사용해서 block되어 응답을 기다린다.
async의 경우는 응답이 오면 실행하기 위한 콜백을 등록한다. 콜백은 응답 json이 id를 가지고 있는 경우 실행된다.
- ShadowView
텍스트가 위(topShadow), 왼쪽(leadingShadow), 오른쪽(trailingShadow)을 벗어나는 경우 관련 shadow를 화면에 표시해준다.
- EditView
실제 텍스트를 보여주는 뷰
* Rust
front-end는 swift를 사용한 cocoa로 back-end는 rust로 되어있다.
(그냥 간단하게 맥쪽 코드는 swift라고 하고 rust쪽 코드는 rust라고 부르겠다.)
* Swift
- AppDelegate
CoreConnection을 초기화한다.
AppWindowController의 window를 화면에 띄운다.
AppWindowController가 실행되면 appWindowControllers 리스트에 등록하고 종료하면 리스트에서 제거한다.
rust로 부터 응답이 오면 실행되는 콜백을 CoreConnection에 등록한다: handleCoreCmd
메뉴 선택에 따른 연결 함수들이 여기에 있다.
- AppWindowController
첫 로딩시 "new_tab" 메시지를 rust에게 보낸다.
filename이 변경되면 window의 타이틀을 변경한다.
EditView와 ClipView의 constraint를 설정한다.
ScrollView의 frame이 바뀌거나 ScrollView.contentView의 bound가 바뀌면 EditView와 ShadowView의 scroll위치를 다시 지정한다.
- CoreConnection
NSTask를 사용하여 rust를 실행한다.
swift와 rust의 연결은 NSPipe를 사용해서
(swift의 writing -> rust의 standard input,
rust의 standard ooutput -> swift의 reading)로 연결한다.
rust로 보내는 메시지는 sync 또는 async로 보낼 수 있다.
sync의 경우는 semaphore를 사용해서 block되어 응답을 기다린다.
async의 경우는 응답이 오면 실행하기 위한 콜백을 등록한다. 콜백은 응답 json이 id를 가지고 있는 경우 실행된다.
- ShadowView
텍스트가 위(topShadow), 왼쪽(leadingShadow), 오른쪽(trailingShadow)을 벗어나는 경우 관련 shadow를 화면에 표시해준다.
- EditView
실제 텍스트를 보여주는 뷰
* Rust
피드 구독하기:
글 (Atom)
Generic interfaces 요점
https://go.dev/blog/generic-interfaces Generic interface를 정의할 때 최소한의 제약만을 정의하고 실제 구현체들이 자신만의 필요한 제약을 추가할 수 있도록 하는 것이 좋다. pointer receiver를...