Obsidian์€ ์–ธ์ œ๋“ ์ง€ ์–ด๋–ค ์ฝ˜ํ…์ธ ๋ฅผ ๋ณผ ์ˆ˜ ์žˆ๋Š”์ง€ ๊ตฌ์„ฑํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ค๋‹ˆ๋‹ค. ํ•„์š” ์—†์„ ๋•Œ ํŒŒ์ผ ํƒ์ƒ‰๊ธฐ๋ฅผ ์ˆจ๊ธฐ๊ฑฐ๋‚˜, ์—ฌ๋Ÿฌ ๋ฌธ์„œ๋ฅผ ๋‚˜๋ž€ํžˆ ํ‘œ์‹œํ•˜๊ฑฐ๋‚˜, ์ž‘์—…ํ•˜๋Š” ๋™์•ˆ ๋ฌธ์„œ์˜ ๊ฐœ์š”๋ฅผ ํ‘œ์‹œํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ฐฝ ๋‚ด์—์„œ ๋ณด์ด๋Š” ์ฝ˜ํ…์ธ ์˜ ๊ตฌ์„ฑ์„ ์ž‘์—… ๊ณต๊ฐ„(workspace) ์ด๋ผ๊ณ  ํ•ฉ๋‹ˆ๋‹ค.

์ž‘์—… ๊ณต๊ฐ„์€ ํŠธ๋ฆฌ ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ๋กœ ๊ตฌํ˜„๋˜๋ฉฐ, ํŠธ๋ฆฌ์˜ ๊ฐ ๋…ธ๋“œ๋Š” ์ž‘์—… ๊ณต๊ฐ„ ํ•ญ๋ชฉ์ด๋ผ๊ณ  ํ•ฉ๋‹ˆ๋‹ค. ์ž‘์—… ๊ณต๊ฐ„ ํ•ญ๋ชฉ์—๋Š” ๋ถ€๋ชจ์™€ ๋ฆฌํ”„ ๋‘ ๊ฐ€์ง€ ์œ ํ˜•์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ฃผ์š” ์ฐจ์ด์ ์€ ๋ถ€๋ชจ ํ•ญ๋ชฉ์€ ๋‹ค๋ฅธ ๋ถ€๋ชจ ํ•ญ๋ชฉ์„ ํฌํ•จํ•œ ์ž์‹ ํ•ญ๋ชฉ์„ ํฌํ•จํ•  ์ˆ˜ ์žˆ์ง€๋งŒ, ๋ฆฌํ”„ ํ•ญ๋ชฉ์€ ์–ด๋–ค ์ž‘์—… ๊ณต๊ฐ„ ํ•ญ๋ชฉ๋„ ํฌํ•จํ•  ์ˆ˜ ์—†๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋ถ€๋ชจ ํ•ญ๋ชฉ์—๋Š” ๋ถ„ํ• ๊ณผ ํƒญ ๋‘ ๊ฐ€์ง€ ์œ ํ˜•์ด ์žˆ์œผ๋ฉฐ, ์ด๋Š” ์ž์‹์ด ์‚ฌ์šฉ์ž์—๊ฒŒ ์–ด๋–ป๊ฒŒ ํ‘œ์‹œ๋˜๋Š”์ง€๋ฅผ ๊ฒฐ์ •ํ•ฉ๋‹ˆ๋‹ค:

flowchart TD
    split{Split}
    split --> A((Leaf))
    split --> B((Leaf))
    split --> C((Leaf))

    tabs{Tabs}
    tabs --> X((Leaf))
    tabs --> Y((Leaf))
    tabs --> Z((Leaf))
  • ๋ถ„ํ•  ํ•ญ๋ชฉ์€ ์ž์‹ ํ•ญ๋ชฉ์„ ์ˆ˜์ง ๋˜๋Š” ์ˆ˜ํ‰ ๋ฐฉํ–ฅ์œผ๋กœ ์ฐจ๋ก€๋กœ ๋ฐฐ์น˜ํ•ฉ๋‹ˆ๋‹ค.
  • ํƒญ ํ•ญ๋ชฉ์€ ํ•œ ๋ฒˆ์— ํ•˜๋‚˜์˜ ์ž์‹ ํ•ญ๋ชฉ๋งŒ ํ‘œ์‹œํ•˜๊ณ  ๋‚˜๋จธ์ง€๋Š” ์ˆจ๊น๋‹ˆ๋‹ค.

์ž‘์—… ๊ณต๊ฐ„์—๋Š” ์™ผ์ชฝ, ์˜ค๋ฅธ์ชฝ, _๋ฃจํŠธ_๋ผ๋Š” ์„ธ ๊ฐ€์ง€ ํŠน๋ณ„ํ•œ ๋ถ„ํ•  ํ•ญ๋ชฉ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๋‹ค์Œ ๋‹ค์ด์–ด๊ทธ๋žจ์€ ์ผ๋ฐ˜์ ์ธ ์ž‘์—… ๊ณต๊ฐ„์ด ์–ด๋–ป๊ฒŒ ๋ณด์ผ ์ˆ˜ ์žˆ๋Š”์ง€ ๋ณด์—ฌ์ฃผ๋Š” ์˜ˆ์ž…๋‹ˆ๋‹ค:

flowchart TD
    Workspace --> Left{Left split}
    Workspace --> Root{Root split}
    Workspace --> Right{Right split}

    Left --> leftTabs{Tabs}
    leftTabs --> A((Leaf))
    leftTabs --> B((Leaf))

    Root --> C{Split}
    Root --> D((Leaf))

    C --> E((Leaf))
    C --> F((Leaf))

    Right --> rightTabs{Tabs}

    rightTabs --> I((Leaf))
    rightTabs --> J((Leaf))
    rightTabs --> K((Leaf))

๋ฆฌํ”„๋Š” ๋‹ค์–‘ํ•œ ๋ฐฉ์‹์œผ๋กœ ์ฝ˜ํ…์ธ ๋ฅผ ํ‘œ์‹œํ•  ์ˆ˜ ์žˆ๋Š” ์ฐฝ์ž…๋‹ˆ๋‹ค. ๋ฆฌํ”„์˜ ์œ ํ˜•์€ ์ฝ˜ํ…์ธ ๊ฐ€ ํ‘œ์‹œ๋˜๋Š” ๋ฐฉ์‹์„ ๊ฒฐ์ •ํ•˜๋ฉฐ, ํŠน์ • _๋ทฐ_์— ํ•ด๋‹นํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, graph ์œ ํ˜•์˜ ๋ฆฌํ”„๋Š” ๊ทธ๋ž˜ํ”„ ๋ทฐ๋ฅผ ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค.

๋ถ„ํ• (Splits)

๊ธฐ๋ณธ์ ์œผ๋กœ ๋ฃจํŠธ ๋ถ„ํ• ์˜ ๋ฐฉํ–ฅ์€ ์ˆ˜์ง์œผ๋กœ ์„ค์ •๋ฉ๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์— ์ƒˆ ๋ฆฌํ”„๋ฅผ ๋งŒ๋“ค๋ฉด Obsidian์€ ์‚ฌ์šฉ์ž ์ธํ„ฐํŽ˜์ด์Šค์— ์ƒˆ ์—ด์„ ๋งŒ๋“ญ๋‹ˆ๋‹ค. ๋ฆฌํ”„๋ฅผ ๋ถ„ํ• ํ•˜๋ฉด ๊ฒฐ๊ณผ ๋ฆฌํ”„๊ฐ€ ์ƒˆ ๋ถ„ํ•  ํ•ญ๋ชฉ์— ์ถ”๊ฐ€๋ฉ๋‹ˆ๋‹ค. ๋ฃจํŠธ ๋ถ„ํ•  ์•„๋ž˜์— ๋งŒ๋“ค ์ˆ˜ ์žˆ๋Š” ์ˆ˜์ค€์˜ ์ˆ˜์—๋Š” ์ •์˜๋œ ์ œํ•œ์ด ์—†์ง€๋งŒ, ์‹ค์ œ๋กœ๋Š” ๊ฐ ์ˆ˜์ค€๋งˆ๋‹ค ์œ ์šฉ์„ฑ์ด ๊ฐ์†Œํ•ฉ๋‹ˆ๋‹ค.

flowchart TD
    rootBefore{"Root split\n(before)"}

    rootBefore --> leaf1((Leaf))
    rootBefore --> leaf2((Leaf))

    rootAfter{"Root split\n(after)"}

    rootAfter --> split{Split}
    rootAfter --> leaf3((Leaf))
    split --> leaf4((Leaf))
    split --> leaf5((Leaf))

์™ผ์ชฝ ๋ฐ ์˜ค๋ฅธ์ชฝ ๋ถ„ํ• ์€ ์•ฝ๊ฐ„ ๋‹ค๋ฅด๊ฒŒ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. ์‚ฌ์ด๋“œ ๋„ํฌ์—์„œ ๋ฆฌํ”„๋ฅผ ๋ถ„ํ• ํ•˜๋ฉด Obsidian์€ ์ƒˆ ํƒญ ํ•ญ๋ชฉ์„ ์ƒ์„ฑํ•˜๊ณ  ๊ทธ ์•„๋ž˜์— ์ƒˆ ๋ฆฌํ”„๋ฅผ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค. ์‚ฌ์‹ค์ƒ, ์ด๋Š” ์–ธ์ œ๋“ ์ง€ ์„ธ ๊ฐ€์ง€ ์ˆ˜์ค€์˜ ์ž‘์—… ๊ณต๊ฐ„ ํ•ญ๋ชฉ๋งŒ ๊ฐ€์งˆ ์ˆ˜ ์žˆ์œผ๋ฉฐ, ๋ชจ๋“  ์ง์ ‘ ์ž์‹์€ ํƒญ ํ•ญ๋ชฉ์ด์–ด์•ผ ํ•จ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.

flowchart TD
    split1{"Right split\n(before)"}
    tabs1{Tabs}
    leaf1((Leaf))
    leaf2((Leaf))

    split1 --> tabs1
    tabs1 --> leaf1
    tabs1 --> leaf2

    split2{"Right split\n(after)"}
    tabs2{Tabs}
    tabs3{Tabs}
    leaf3((Leaf))
    leaf4((Leaf))
    leaf5((Leaf))

    split2 --> tabs2
    tabs2 --> leaf3
    tabs2 --> leaf4

    split2 --> tabs3
    tabs3 --> leaf5

์ž‘์—… ๊ณต๊ฐ„ ๊ฒ€์‚ฌํ•˜๊ธฐ

App ๊ฐ์ฒด๋ฅผ ํ†ตํ•ด ์ž‘์—… ๊ณต๊ฐ„์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‹ค์Œ ์˜ˆ์ œ๋Š” ์ž‘์—… ๊ณต๊ฐ„์˜ ๋ชจ๋“  ๋ฆฌํ”„ ์œ ํ˜•์„ ์ถœ๋ ฅํ•ฉ๋‹ˆ๋‹ค:

import { Plugin } from 'obsidian';
 
export default class ExamplePlugin extends Plugin {
  async onload() {
    this.addRibbonIcon('dice', 'Print leaf types', () => {
      this.app.workspace.iterateAllLeaves((leaf) => {
        console.log(leaf.getViewState().type);
      });
    });
  }
}

๋ฆฌํ”„ ์ƒ๋ช…์ฃผ๊ธฐ

ํ”Œ๋Ÿฌ๊ทธ์ธ์€ ์ž‘์—… ๊ณต๊ฐ„์— ๋ชจ๋“  ์œ ํ˜•์˜ ๋ฆฌํ”„๋ฅผ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์‚ฌ์šฉ์ž ์ •์˜ ๋ทฐ๋ฅผ ํ†ตํ•ด ์ƒˆ ๋ฆฌํ”„ ์œ ํ˜•์„ ์ •์˜ํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ์ž‘์—… ๊ณต๊ฐ„์— ๋ฆฌํ”„๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” ๋ช‡ ๊ฐ€์ง€ ๋ฐฉ๋ฒ•์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๋” ๋งŽ์€ ๋ฐฉ๋ฒ•์€ Workspace๋ฅผ ์ฐธ์กฐํ•˜์„ธ์š”.

  • ๋ฃจํŠธ ๋ถ„ํ• ์— ์ƒˆ ๋ฆฌํ”„๋ฅผ ์ถ”๊ฐ€ํ•˜๋ ค๋ฉด getLeaf(true)๋ฅผ ์‚ฌ์šฉํ•˜์„ธ์š”.
  • ์‚ฌ์ด๋“œ๋ฐ” ์ค‘ ํ•˜๋‚˜์— ์ƒˆ ๋ฆฌํ”„๋ฅผ ์ถ”๊ฐ€ํ•˜๋ ค๋ฉด getLeftLeaf() ๋ฐ getRightLeaf()๋ฅผ ์‚ฌ์šฉํ•˜์„ธ์š”. ๋‘˜ ๋‹ค ์ƒˆ ๋ถ„ํ• ์— ๋ฆฌํ”„๋ฅผ ์ถ”๊ฐ€ํ• ์ง€ ์—ฌ๋ถ€๋ฅผ ๊ฒฐ์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

createLeafInParent()๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์„ ํƒํ•œ ๋ถ„ํ• ์— ๋ช…์‹œ์ ์œผ๋กœ ๋ฆฌํ”„๋ฅผ ์ถ”๊ฐ€ํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ช…์‹œ์ ์œผ๋กœ ์ œ๊ฑฐํ•˜์ง€ ์•Š๋Š” ํ•œ, ํ”Œ๋Ÿฌ๊ทธ์ธ์ด ์ž‘์—… ๊ณต๊ฐ„์— ์ถ”๊ฐ€ํ•œ ๋ชจ๋“  ๋ฆฌํ”„๋Š” ํ”Œ๋Ÿฌ๊ทธ์ธ์ด ๋น„ํ™œ์„ฑํ™”๋œ ํ›„์—๋„ ๋‚จ์•„ ์žˆ์Šต๋‹ˆ๋‹ค. ํ”Œ๋Ÿฌ๊ทธ์ธ์€ ์ž‘์—… ๊ณต๊ฐ„์— ์ถ”๊ฐ€ํ•œ ๋ชจ๋“  ๋ฆฌํ”„๋ฅผ ์ œ๊ฑฐํ•  ์ฑ…์ž„์ด ์žˆ์Šต๋‹ˆ๋‹ค.

์ž‘์—… ๊ณต๊ฐ„์—์„œ ๋ฆฌํ”„๋ฅผ ์ œ๊ฑฐํ•˜๋ ค๋ฉด ์ œ๊ฑฐํ•˜๋ ค๋Š” ๋ฆฌํ”„์—์„œ detach()๋ฅผ ํ˜ธ์ถœํ•˜์„ธ์š”. detachLeavesOfType()์„ ์‚ฌ์šฉํ•˜์—ฌ ํŠน์ • ์œ ํ˜•์˜ ๋ชจ๋“  ๋ฆฌํ”„๋ฅผ ์ œ๊ฑฐํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ฆฌํ”„ ๊ทธ๋ฃน

setGroup()์„ ์‚ฌ์šฉํ•˜์—ฌ ์—ฌ๋Ÿฌ ๋ฆฌํ”„๋ฅผ ๋™์ผํ•œ ๊ทธ๋ฃน์— ํ• ๋‹นํ•˜์—ฌ ์—ฐ๊ฒฐ๋œ ๋ทฐ๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

leaves.forEach((leaf) => leaf.setGroup('group1');