Refactor vim into a library - minsuk-jang/teamproject GitHub Wiki

λ‹€μŒμ€ Vim이 λͺ¨λ“œκ°„에 μž…λ ₯ 및 μ „ν™˜μ„ μ½λŠ” 방법에 λŒ€ν•œ μ•„μ΄λ””μ–΄μž…λ‹ˆλ‹€. μ‹€μ œ μ½”λ“œλŠ” 훨씬 더 λ³΅μž‘ν•˜μ§€λ§Œ λ‹€μŒκ³Ό 같은 κΈ°λ³Έ 흐름을 λ”°λ¦…λ‹ˆλ‹€.

while (1) {
  normal_mode_process_byte(getc());
}

void normal_mode_process_byte(char c) {
  if (c == 'i') // enter insert mode
    while (1) {
	  insert_mode_process_byte(getc());
	}
}

μˆ˜ν–‰ν•΄μ•Ό ν•  일은 μž…λ ₯을 λ²„νΌλ§ν•˜κ³ , λͺ¨λ“œ νŠΉμ • μž…λ ₯ 처리 ν•¨μˆ˜μ— μœ„μž„ν•˜κ±°λ‚˜, ν•„μš”ν•œ 경우 λ³€ν™˜ νŽΈμ§‘κΈ° μƒνƒœλ₯Ό μ „λ‹¬ν•˜λŠ” ν•¨μˆ˜ (예 :process_byte (char c))둜 λͺ¨λ“  읽기 루프λ₯Ό μ œκ±°ν•˜κ³  λŒ€μ²΄ν•˜λŠ” κ²ƒμž…λ‹ˆλ‹€. λ‚΄μš©μ€ λ‹€μŒκ³Ό κ°™μŠ΅λ‹ˆλ‹€ :

void process_byte(char c) {
  if (mode == NORMAL)
    normal_mode_process_byte(c);
  else if (mode == INSERT)
    insert_mode_process_byte(c);
  ...
}

void normal_mode_process_byte(char c) {
  if (c == 'i') {
    mode = INSERT;
    return;
  }
  ...
}

νŽΈμ§‘κΈ°λ₯Ό μƒνƒœ 기계라고 μƒκ°ν•˜μ‹­μ‹œμ˜€. μž…λ ₯을 읽고 기계에 μž…λ ₯ν•˜λ©΄ ν™œμ„± 버퍼, μ „ν™˜ λͺ¨λ“œ 등이 λ³€κ²½ 될 수 μžˆμŠ΅λ‹ˆλ‹€. μš”μ μ€ : 기계가 IO κΈ°λŠ₯을 직접 ν˜ΈμΆœν•΄μ„œλŠ” μ•ˆλœλ‹€λŠ” κ²ƒμž…λ‹ˆλ‹€.