본문 바로가기
C.W.K.
Lesson 02 of 04 · published

코어는 임베드, 다시 쓰지 마

~12 min · swiftterm, embed, pin, vt, core

Level 0불씨
0 XP0/48 lessons0/12 achievements
0/100 XP to next level100 XP to go0% complete

불만은 파서가 아니었어

VT 에뮬레이터는 몇십 년치 예외야. 글리프 대체, 결합 문자, 이미지 프로토콜, 괄호 붙여넣기, 한국어 IME 가 아직 조합 중일 때 표시하는 방식. 그 일은 진짜고, 아빠가 시킨 일이 아니야. 마찰은 다른 데 있었어. 객체처럼 안 느껴지는 탭, 창이랑 같이 죽는 세션, 두드릴 수 없는 형제, 주인이 되지 않고는 들여다볼 수 없는 폰. 전부 코어 위의 일이야.

그래서 Smolder 는 코어를 임베드하고 버전을 고정해. SwiftTerm, 정확한 버전, 판마다 터미널 뷰 하나. 코어에는 설정만 해. 글꼴, 색, 스크롤백, Option 을 Meta 로 쓸지, 벨까지. 패치는 안 해. 키보드 규칙이 필요하면 에뮬레이터를 포크하지 않고 앱 수준 이벤트 모니터에 맡겨.

범위가 아니라 핀인 이유

버전을 띄워 두면 화요일엔 렌더러가 바뀌고 수요일엔 하네스 넷을 띄운 창이 다르게 느껴지는데, 정작 가리킬 커밋은 트리 어디에도 없어. 정확히 고정하면 코어는 일부러 고른 벽돌이 돼. 핀을 옮기는 건 기록으로 남기는 결정이지, 습관처럼 치는 up 이 아니야.

핀을 고른 날 다른 코어도 읽어 보고 후보로 남겨 뒀어. 더 빠르긴 한데 API 가 아직 흔들리고, 버전이라고 부를 만한 버전도 없는 쪽이야. 하네스 넷의 지연을 재 보고 그게 필요하다고 나올 때만 다시 봐. 코어를 임베드한다고 성능이 증명되진 않아. 증명되는 건 잘못된 층을 다시 쓰는 일을 그만뒀다는 것뿐이야.

표면 둘, 코어 하나

맥 호스트는 AppKit 이야. 폰은 SwiftUI 가 UIKit 터미널 뷰를 감싸. 둘 다 SwiftTerm 을 붙여. 우연이 아니고 언어 수업 예고도 아니야. 언어 수업은 아직 없는 형제 퀘스트야. 제품의 사실은 이거야. 에뮬레이터는 양쪽 표면이 공유하는 의존성이라, 글리프 버그가 나도 손볼 건 핀 하나지 포크 둘이 아니야. 직접 짜는 코드는 배치, 부착, 표면, 크롬에만 남아.

코어는 설정해. 패치하지 마. 에뮬레이터에 로컬 diff 를 들고 있는 순간, 다시 안 쓴다고 했던 터미널 코어를 소유하게 돼. 그 선 위에서 표현할 수 없는 가족 기능이라면, 거절할 기능이거나 코어를 공개적으로 바꿀 때가 됐다는 측정 결과야.

Code

핀은 결정이고, 컴파일러 눈에 보이는 곳에 적혀·swift
// swift-tools-version: 6.2
import PackageDescription

let package = Package(
    name: "Smolder",
    platforms: [
        .macOS(.v14), .iOS(.v17)  // shared package; the iOS project links SmolderRemoteWire
    ],
    dependencies: [
        // Exact, not from:..to. The core does not move by accident.
        .package(url: "https://github.com/migueldeicaza/SwiftTerm.git", exact: "1.20.0"),
        // The family's shared Swift package, by local path like every other consumer.
        // Plumbing, not a pin: it is versioned with the family, not chosen here.
        .package(path: "../<family kit>/CwkKit"),
    ],
    targets: [
        // One view per pane. The daemon owns the PTY; this draws.
        .executableTarget(
            name: "SmolderApp",
            dependencies: [
                .product(name: "SwiftTerm", package: "SwiftTerm"),
                .product(name: "CwkKitMac", package: "CwkKit"),  // the family's View-menu chords
                // ... SmolderCore, SmolderKit, CwkKitCore
            ]
        )
        // iOS is a separate Xcode project with the same exact SwiftTerm 1.20.0 pin.
        // The phone's wire target, SmolderRemoteWire, compiles without AppKit and without SwiftTerm.
    ]
)

External links

Exercise

에뮬레이터에서 "그냥 고치고 싶은" 터미널 동작 하나를 골라. 키 조합, 글리프, 붙여넣기 모드 같은 거. 두 가지에 답해. (1) 설정이나 앱 수준 모니터로 해결돼? (2) 코어에 로컬 패치를 치면, 소유하고 싶지 않았던 파서의 주인이 돼? (2)가 예고 (1)이 아니오라면 그건 패치가 아니야. 코어를 바꾸는 결정이고, 공개적으로 내려야 해.
Hint
IME 조합 표시랑 이미지 프로토콜 때문에 남이 몇 년을 들인 코어를 가져다 쓰는 거야. 가족 키 조합 때문에 이벤트 모니터가 있는 거고. 둘을 섞으면 포크가 태어나.

Progress

Progress is local-only — sign in to sync across devices.
이 페이지에서 버그를 발견하셨거나 피드백이 있으세요?문제 신고

댓글 0

🔔 답글 알림 (로그인 필요)
로그인 — 댓글을 남기려면 로그인해 주세요.

아직 댓글이 없어요. 첫 댓글을 남겨보세요.