λ·° ν”ŒλŸ¬κ·ΈμΈ(View plugin)은 에디터 λ·°ν¬νŠΈμ— μ ‘κ·Όν•  수 μžˆλŠ” 에디터 ν™•μž₯ κΈ°λŠ₯μž…λ‹ˆλ‹€.

Note

이 νŽ˜μ΄μ§€λŠ” Obsidian ν”ŒλŸ¬κ·ΈμΈ 개발자λ₯Ό μœ„ν•΄ 곡식 CodeMirror 6 λ¬Έμ„œλ₯Ό μš”μ•½ν•œ κ²ƒμž…λ‹ˆλ‹€. μƒνƒœ 관리에 λŒ€ν•œ 더 μžμ„Έν•œ μ •λ³΄λŠ” Affecting the Viewλ₯Ό μ°Έμ‘°ν•˜μ„Έμš”.

ν•„μˆ˜ 쑰건

λ·° ν”ŒλŸ¬κ·ΈμΈ 생성

λ·° ν”ŒλŸ¬κ·ΈμΈμ€ λ·°ν¬νŠΈκ°€ μž¬κ³„μ‚°λœ 후에 μ‹€ν–‰λ˜λŠ” 에디터 ν™•μž₯ κΈ°λŠ₯μž…λ‹ˆλ‹€. μ΄λŠ” λ·°ν¬νŠΈμ— μ ‘κ·Όν•  수 μžˆμŒμ„ μ˜λ―Έν•˜μ§€λ§Œ, λ™μ‹œμ— λ·° ν”ŒλŸ¬κ·ΈμΈμ€ λ·°ν¬νŠΈμ— 영ν–₯을 λ―ΈμΉ˜λŠ” λ³€κ²½ 사항을 λ§Œλ“€ 수 μ—†μŒμ„ μ˜λ―Έν•©λ‹ˆλ‹€. 예λ₯Ό λ“€μ–΄ λ¬Έμ„œμ— λΈ”λ‘μ΄λ‚˜ 쀄 λ°”κΏˆμ„ μ‚½μž…ν•˜λŠ” λ“±μ˜ μž‘μ—…μ€ λΆˆκ°€λŠ₯ν•©λ‹ˆλ‹€.

Tip

λΈ”λ‘μ΄λ‚˜ 쀄 λ°”κΏˆμ„ μ‚½μž…ν•˜λŠ” λ“± μ—λ””ν„°μ˜ 수직 λ ˆμ΄μ•„μ›ƒμ— 영ν–₯을 μ£ΌλŠ” 변경을 μ›ν•œλ‹€λ©΄ μƒνƒœ ν•„λ“œλ₯Ό μ‚¬μš©ν•΄μ•Ό ν•©λ‹ˆλ‹€.

λ·° ν”ŒλŸ¬κ·ΈμΈμ„ μƒμ„±ν•˜λ €λ©΄ PluginValueλ₯Ό κ΅¬ν˜„ν•˜λŠ” 클래슀λ₯Ό λ§Œλ“€κ³  ViewPlugin.fromClass() ν•¨μˆ˜μ— μ „λ‹¬ν•˜μ„Έμš”.

import {
  ViewUpdate,
  PluginValue,
  EditorView,
  ViewPlugin,
} from '@codemirror/view';
 
class ExamplePlugin implements PluginValue {
  constructor(view: EditorView) {
    // ...
  }
 
  update(update: ViewUpdate) {
    // ...
  }
 
  destroy() {
    // ...
  }
}
 
export const examplePlugin = ViewPlugin.fromClass(ExamplePlugin);

λ·° ν”ŒλŸ¬κ·ΈμΈμ˜ μ„Έ κ°€μ§€ λ©”μ„œλ“œλŠ” 라이프사이클을 μ œμ–΄ν•©λ‹ˆλ‹€:

  • constructor(): ν”ŒλŸ¬κ·ΈμΈμ„ μ΄ˆκΈ°ν™”ν•©λ‹ˆλ‹€.
  • update(): μ‚¬μš©μžκ°€ ν…μŠ€νŠΈλ₯Ό μž…λ ₯ν•˜κ±°λ‚˜ μ„ νƒν•˜λŠ” λ“± λ³€κ²½ 사항이 μžˆμ„ λ•Œ ν”ŒλŸ¬κ·ΈμΈμ„ μ—…λ°μ΄νŠΈν•©λ‹ˆλ‹€.
  • destroy(): ν”ŒλŸ¬κ·ΈμΈ 정리 μž‘μ—…μ„ μˆ˜ν–‰ν•©λ‹ˆλ‹€.

예제의 λ·° ν”ŒλŸ¬κ·ΈμΈμ€ λ™μž‘ν•˜μ§€λ§Œ λ§Žμ€ κΈ°λŠ₯을 ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€. ν”ŒλŸ¬κ·ΈμΈμ΄ μ—…λ°μ΄νŠΈλ˜λŠ” 원인을 더 잘 μ΄ν•΄ν•˜λ €λ©΄ update() λ©”μ„œλ“œμ— console.log(update); 쀄을 μΆ”κ°€ν•˜μ—¬ λͺ¨λ“  μ—…λ°μ΄νŠΈλ₯Ό μ½˜μ†”μ— 좜λ ₯ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

λ‹€μŒ 단계

λ·° ν”ŒλŸ¬κ·ΈμΈμ—μ„œ λ°μ½”λ ˆμ΄μ…˜μ„ μ œκ³΅ν•˜μ—¬ λ¬Έμ„œ ν‘œμ‹œ 방식을 λ³€κ²½ν•˜μ„Έμš”.