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

작은 기록 하나

~11 min · flint-macro, value-type, uuid, persistence

Level 0식은 부싯돌
0 XP0/34 lessons0/12 achievements
0/100 XP to next level100 XP to go0% complete
"변환이 뭔지 — 이름, 시키는 말, 부르는 키, 맥락이 얼마나 필요한지 — 가 작은 기록 하나에 다 들어가."

변환 하나가 기록 하나에

FlintMacro 는 변환 하나를 돌리는 데 필요한 걸 다 담고 그 외엔 아무것도 안 담는 작은 값 타입이야. 안 바뀌는 번호 하나. 사람이 부르는 이름. 뭘 하는지 정하는 프롬프트 틀, 긁어놓은 글이 들어갈 {input} 자리와 함께. 켜져 있는지. 단축키(없어도 되고). vault 를 쓸지 말지. 언제 만들었는지. 이게 전부야. 모델도, 쥐고 있는 상태도, 기록도 안에 없어. 매크로는 엔진이 아니라 '이렇게 해줘' 라고 적어둔 종이 한 장이야.

번호가 왜 안 바뀌어야 하나

번호는 만들 때 한 번 붙고 그 뒤로 안 바뀌어. 이름을 고쳐도, 단축키를 갈아도, 틀을 손봐도. 그 덕에 다른 것들이 이 매크로를 안심하고 가리킬 수 있는 거야. 핫키 센터가 이 번호로 등록을 걸어두고, 팔레트도 이걸로 목록을 만들어. 단축키를 바꾸는 것도 '지우고 새로 만들기' 가 아니라 '이 번호를 풀고 같은 번호로 새 키를 거는 일' 이 되고. 이름도 바뀌고 단축키도 바뀌지만, 그 밑의 정체는 그대로야.

번호      : 영원히 그대로 (진짜 정체)
이름      : 고칠 수 있음  (사람이 부르는 말)
틀        : 고칠 수 있음  (실제로 뭘 하는지)
단축키    : 고칠 수 있음  (어떻게 부르는지)
vault     : 고칠 수 있음  (맥락이 얼마나 필요한지)

바뀌는 것 전부가 안 바뀌는 번호 하나에 매달려 있다.

그냥 값이고, 그냥 파일이야

매크로가 결국 데이터일 뿐이라 저장도 아주 간단해. 목록을 Flint 자기 폴더의 JSON 파일에 쓰고, 켤 때 읽어. 데이터베이스도, 마이그레이션도, 맞춰두기도 없어. 파일 하나에 작은 기록 몇 개 담긴 배열이 전부지. 이 단순함은 일부러고, 그 자체가 기능이야. 열어서 읽으면 그냥 이해되는 매크로 파일이라야 믿고 고칠 수 있거든.

고칠 수 있는 물건엔 고치는 것과 별개인, 안 바뀌는 정체를 줘. 기록을 이름이나 단축키로 알아본다면, 이름을 고치거나 단축키를 바꾸는 순간 그걸 가리키던 것들이 전부 끊겨. 따로 붙인 안 바뀌는 번호가 '이게 어느 기록인지' 를 '이 기록이 지금 뭐라고 적혀 있는지' 에서 떼어놔. 그래야 바뀌는 칸들이 마음대로 바뀌어도 가리키던 것들이 계속 살아 있어. 번호는 닻이고, 나머지는 움직여도 되는 거야.
그냥 JSON 으로 두는 게 한계가 아니라 기능이야. 매크로 파일이 읽을 수 있는 JSON 이라, 앱을 안 켜고도 Flint 가 뭘 돌릴지 정확히 볼 수 있어. 급하면 손으로 고칠 수도 있고, 두 버전을 나란히 놓고 뭐가 달라졌는지 볼 수도 있고. 여기에 데이터베이스를 들이는 건 그 투명함을 데이터한테 필요도 없는 기계랑 맞바꾸는 짓이야. 이 정도 크기 목록엔 작고 읽히고 파일로 있는 쪽이 화려하지만 안 보이는 쪽을 이겨.

Code

FlintMacro — 매크로가 담고 있는 전부·swift
struct FlintMacro: Codable, Identifiable, Equatable {
    let id: UUID                    // 만들 때 한 번 붙고 안 바뀐다
    var name: String
    var promptTemplate: String      // {input} 자리를 품고 있다
    var enabled: Bool
    var hotkey: HotkeyBinding?      // 없어도 된다. 팔레트로 부를 수 있으니까
    var vaultContextMode: VaultContextMode
    let createdAt: Date

    func render(input: String) -> String {
        promptTemplate.replacingOccurrences(of: "{input}", with: input)
    }
}

enum VaultContextMode: String, Codable {
    case useVault      // 개인 맥락까지 붙인다. 느리고 풍부하다
    case bypassVault   // 맥락 없이 간다. 빠르고 조용하고 얕다
}

External links

Exercise

사용자가 'Correct' 매크로 이름을 'Fix Typos' 로 바꾸고 단축키도 Cmd+Shift+C 에서 Cmd+Shift+F 로 갈았어. 어떤 칸이 바뀌고 어떤 칸이 그대로인지 따라가 봐. 그리고 두 번 고쳤는데도 핫키 센터랑 쓰던 기록이 왜 멀쩡히 이어지는지도. 만약 매크로를 번호가 아니라 이름으로 알아봤다면 뭐가 깨졌을까?
Hint
이름이랑 단축키가 바뀌고, 번호랑 틀이랑 vault 설정이랑 만든 날짜는 그대로야. 핫키 센터는 안 바뀐 번호로 다시 걸고, 그 번호로 쌓인 기록도 여전히 같은 매크로를 가리키고. 이름으로 알아봤다면 이름을 바꾸는 순간 가리키던 게 전부 끊겨. 기록은 주인을 잃고, 단축키를 다시 건 것도 아예 다른 매크로처럼 보였겠지.

Progress

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

댓글 0

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

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