Graph Highlight Lock

approved

by goverse

Lock and preserve node connection highlighting in Obsidian Graph View, with a visible navigation trail. - This plugin has not been manually reviewed by Obsidian staff.

โ†“ 21 downloadsUpdated 5d agoMIT

๐Ÿ”’ Graph Highlight Lock

A highlight that doesn't disappear when your mouse moves. Pin the hover-highlight of any node in Obsidian's built-in Graph View with a single click, and watch your navigation trail stay lit up behind you as a colored path.

English ยท ํ•œ๊ตญ์–ด

Version Obsidian minAppVersion License: MIT No new dependencies

Graph Highlight Lock demo โ€” locking a node and extending the trail across a real vault


English

It does not create a separate graph view โ€” it works directly on top of the Graph View you already use, with zero extra setup.

Why?

Obsidian's Graph View highlights a node's connections while your mouse hovers over it, but the highlight disappears the moment you move away. In a vault with hundreds or thousands of notes, that means freezing your mouse in place just to trace a note's connections โ€” and following a chain of links means losing everything you've already seen the second you move on.

Graph Highlight Lock pins that highlight to a node. Move your mouse freely, follow a link to the next node, and lock that one too โ€” the entire path you took stays visible as a colored line, so you always know how you got where you are.

Core Features

ActionResult
Hover a nodeDefault Obsidian behavior (neighbors/edges highlighted)
Alt + Left Click on a hovered nodeLocks the current highlight โ€” stays even after the mouse moves away
Alt + Click a connected neighborThe lock extends โ€” the navigation trail stays visible as a colored line with a direction arrow, so you can always see the path you took, in order
Alt + Click a node already on the trailWalks the trail back to that point
Alt + Click an unrelated nodeStarts a fresh trail
EscClears the lock entirely
Alt + Click on empty spaceClears the lock entirely
Normal click / drag / zoom / right-clickCompletely unaffected โ€” all native Graph View behavior is preserved

The trail's color, thickness, and direction arrows are all configurable in settings. Works with both the Global Graph and Local Graph views.

Commands

  • Graph Highlight Lock: Lock hovered node
  • Graph Highlight Lock: Clear highlight lock
  • Graph Highlight Lock: Toggle lock

Settings

  • Lock trigger: the modifier key used to lock (default Alt; Ctrl/Shift/Cmd also supported)
  • Locked node marker: shows the current locked trail in the top-left corner as ๐Ÿ”’ A โ†’ B โ†’ C
  • Trail color: color used for the trail (previously-locked nodes and their connecting edges)
  • Trail edge thickness: thickness of trail edges, as a multiple of the native line thickness
  • Trail direction arrows: show an arrow on each trail edge pointing in the order you locked the nodes

Installation

Graph Highlight Lock is available in Obsidian's Community Plugins directory.

  1. Open Settings โ†’ Community plugins โ†’ Browse.
  2. Search for "Graph Highlight Lock".
  3. Click Install, then Enable.

You can also install it via BRAT (useful for getting updates before they land in the directory), or manually:

  1. Download main.js, manifest.json, and styles.css from Releases.
  2. Create a folder .obsidian/plugins/graph-highlight-lock/ inside your vault and put the 3 files there.
  3. Enable "Graph Highlight Lock" under Settings โ†’ Community plugins.

How it works

Obsidian's Graph View has no official public API. This plugin reuses the existing highlight state of the internal PIXI-based renderer (getHighlightNode, onNodeClick, etc.) instead of drawing its own graph โ€” which keeps it lightweight and visually identical to the native Graph View.

That said, this relies on undocumented internal APIs, so it may break on future Obsidian updates. All such access is isolated in a single file, src/graph-adapter.ts, so only that file needs to change if Obsidian's internals shift.

Keeping the trail visible works differently for nodes and links. Nodes get their own color function (getFillColor) replaced for as long as they're on the trail, so every time native code recomputes it, it lands on our color anyway. Links have no equivalent override point, so instead the link's own draw function is wrapped to always run the native draw first and apply our color/thickness/arrow right after โ€” guaranteed to be the last write, every time. Neither approach uses a polling timer; both only ever touch the (small) set of nodes/edges actually on the trail, never the full graph.

Building from source

npm install
npm run dev     # watch mode for development
npm run build   # production build (produces main.js)

Copy the built main.js, manifest.json, and styles.css into your test vault's .obsidian/plugins/graph-highlight-lock/.

Roadmap

  • Multiple simultaneous locks / trails
  • Selectable connection depth (1โ€“3 hops)
  • Persisting lock state across sessions

Author

GOVERSE

Bug reports and feature requests are welcome in Issues.

License

MIT


ํ•œ๊ตญ์–ด

๋ณ„๋„์˜ ๊ทธ๋ž˜ํ”„ ํ™”๋ฉด์„ ๋งŒ๋“ค์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์—ฌ๋Ÿฌ๋ถ„์ด ์ด๋ฏธ ์“ฐ๊ณ  ์žˆ๋Š” Obsidian Graph View ์œ„์—์„œ, ์ถ”๊ฐ€ ์„ค์ • ์—†์ด ๊ทธ๋Œ€๋กœ ๋™์ž‘ํ•ฉ๋‹ˆ๋‹ค.

์™œ ํ•„์š”ํ•œ๊ฐ€์š”?

Obsidian Graph View๋Š” ๋…ธ๋“œ์— ๋งˆ์šฐ์Šค๋ฅผ ์˜ฌ๋ฆฌ๋ฉด ์—ฐ๊ฒฐ๋œ ๋…ธ๋“œ/๋งํฌ๊ฐ€ ๊ฐ•์กฐ๋˜์ง€๋งŒ, ๋งˆ์šฐ์Šค๋ฅผ ๋–ผ๋Š” ์ˆœ๊ฐ„ ์‚ฌ๋ผ์ง‘๋‹ˆ๋‹ค.

๋…ธ๋“œ๊ฐ€ ๋ช‡๋ฐฑ~๋ช‡์ฒœ ๊ฐœ์ธ Vault์—์„œ "์ด ๋…ธํŠธ๊ฐ€ ๋ญ๋ž‘ ์—ฐ๊ฒฐ๋ผ ์žˆ์—ˆ์ง€?"๋ฅผ ํ™•์ธํ•˜๋ ค๊ณ  ๋งˆ์šฐ์Šค๋ฅผ ๊ทธ ์ž๋ฆฌ์— ์–ผ์–ด๋ถ™์€ ๋“ฏ ๊ณ ์ •ํ•ด์•ผ ํ–ˆ๋˜ ๊ฒฝํ—˜, ๋‹ค๋“ค ์žˆ์œผ์‹ค ๊ฒ๋‹ˆ๋‹ค. ์—ฐ๊ฒฐ๋œ ๋…ธ๋“œ๋ฅผ ํ•˜๋‚˜์”ฉ ๋”ฐ๋ผ๊ฐ€ ๋ณด๊ณ  ์‹ถ์–ด๋„, ๋งˆ์šฐ์Šค๋ฅผ ์˜ฎ๊ธฐ๋Š” ์ˆœ๊ฐ„ ์ง€๊ธˆ๊นŒ์ง€ ๋ณธ ๊ฒŒ ๋‹ค ๋‚ ์•„๊ฐ€ ๋ฒ„๋ฆฝ๋‹ˆ๋‹ค.

Graph Highlight Lock์€ ๊ทธ ๊ฐ•์กฐ ์ƒํƒœ๋ฅผ ๋…ธ๋“œ์— ๊ณ ์ •(Lock)ํ•ฉ๋‹ˆ๋‹ค. ๋งˆ์šฐ์Šค๋ฅผ ์ž์œ ๋กญ๊ฒŒ ์›€์ง์ด๋ฉฐ ์—ฐ๊ฒฐ ๊ด€๊ณ„๋ฅผ ํƒ์ƒ‰ํ•˜๊ณ , ๋งํฌ๋ฅผ ๋”ฐ๋ผ ๋‹ค์Œ ๋…ธ๋“œ๋กœ ๋„˜์–ด๊ฐ€๋ฉด โ€” ์ง€๋‚˜์˜จ ๊ฒฝ๋กœ ์ „์ฒด๊ฐ€ ์ƒ‰๊น” ์žˆ๋Š” ์„ ์œผ๋กœ ๊ณ„์† ๋‚จ์•„์žˆ์Šต๋‹ˆ๋‹ค. "๋‚ด๊ฐ€ ์–ด๋””์„œ๋ถ€ํ„ฐ ์–ด๋–ป๊ฒŒ ์—ฌ๊ธฐ๊นŒ์ง€ ์™”๋Š”์ง€"๋ฅผ ํ•œ๋ˆˆ์— ๋˜์งš์–ด๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

ํ•ต์‹ฌ ๊ธฐ๋Šฅ

๋™์ž‘๊ฒฐ๊ณผ
๋…ธ๋“œ์— ๋งˆ์šฐ์Šค ์˜ฌ๋ฆฌ๊ธฐ๊ธฐ๋ณธ Obsidian ๋™์ž‘ ๊ทธ๋Œ€๋กœ (์—ฐ๊ฒฐ ๋…ธ๋“œ/๋งํฌ ๊ฐ•์กฐ)
Alt + ์ขŒํด๋ฆญ (ํ˜ธ๋ฒ„ ์ค‘์ธ ๋…ธ๋“œ)ํ˜„์žฌ ๊ฐ•์กฐ ์ƒํƒœ๋ฅผ ๊ณ ์ •(Lock) โ€” ๋งˆ์šฐ์Šค๋ฅผ ์˜ฎ๊ฒจ๋„ ์œ ์ง€๋จ
์—ฐ๊ฒฐ๋œ ๋‹ค๋ฅธ ๋…ธ๋“œ์—์„œ Alt + ํด๋ฆญLock ๋Œ€์ƒ์ด ์ด์–ด์ง โ€” ์ง€๋‚˜์˜จ ๊ฒฝ๋กœ(Trail)๊ฐ€ ์ƒ‰๊น” ์žˆ๋Š” ์„  + ํ™”์‚ดํ‘œ๋กœ ๊ณ„์† ํ‘œ์‹œ๋˜์–ด, ์–ด๋–ค ์ˆœ์„œ๋กœ ์ฐพ์•„์™”๋Š”์ง€ ํ•œ๋ˆˆ์— ๋ณด์ž„
๊ฒฝ๋กœ ์ค‘๊ฐ„ ๋…ธ๋“œ๋ฅผ ๋‹ค์‹œ Alt + ํด๋ฆญ๊ทธ ์ง€์ ๊นŒ์ง€ ๊ฒฝ๋กœ๋ฅผ ๋˜๋Œ๋ฆผ
์—ฐ๊ฒฐ ์—†๋Š” ๋…ธ๋“œ๋ฅผ Alt + ํด๋ฆญ์ƒˆ๋กœ์šด ๊ฒฝ๋กœ๋กœ ๋ฆฌ์…‹
EscLock ์ „์ฒด ํ•ด์ œ
๋นˆ ๊ณต๊ฐ„์—์„œ Alt + ํด๋ฆญLock ์ „์ฒด ํ•ด์ œ
์ผ๋ฐ˜ ํด๋ฆญ / ๋“œ๋ž˜๊ทธ / ์คŒ / ์šฐํด๋ฆญ์ „ํ˜€ ์˜ํ–ฅ๋ฐ›์ง€ ์•Š์Œ โ€” ๊ธฐ์กด Graph View ๊ธฐ๋Šฅ 100% ๊ทธ๋Œ€๋กœ

๊ฒฝ๋กœ์˜ ์ƒ‰์ƒ ยท ๊ตต๊ธฐ ยท ํ™”์‚ดํ‘œ ํ‘œ์‹œ ์—ฌ๋ถ€๋Š” ์„ค์ •์—์„œ ์ž์œ ๋กญ๊ฒŒ ๋ฐ”๊ฟ€ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. Global Graph์™€ Local Graph ๋‘˜ ๋‹ค ์ง€์›ํ•ฉ๋‹ˆ๋‹ค.

์ปค๋งจ๋“œ ํŒ”๋ ˆํŠธ

  • Graph Highlight Lock: Lock hovered node
  • Graph Highlight Lock: Clear highlight lock
  • Graph Highlight Lock: Toggle lock

์„ค์ •

  • Lock trigger: Lock์— ์‚ฌ์šฉํ•  ๋ณด์กฐํ‚ค (๊ธฐ๋ณธ๊ฐ’ Alt, Ctrl/Shift/Cmd ๋“ฑ์œผ๋กœ ๋ณ€๊ฒฝ ๊ฐ€๋Šฅ)
  • Locked node marker: ํ™”๋ฉด ์ขŒ์ƒ๋‹จ์— ํ˜„์žฌ Lock๋œ ๊ฒฝ๋กœ๋ฅผ ๐Ÿ”’ A โ†’ B โ†’ C ํ˜•ํƒœ๋กœ ํ‘œ์‹œํ• ์ง€ ์—ฌ๋ถ€
  • Trail color: ๊ฒฝ๋กœ(์ด์ „์— Lockํ–ˆ๋˜ ๋…ธ๋“œ/์—ฐ๊ฒฐ์„ )์— ์‚ฌ์šฉํ•  ์ƒ‰์ƒ
  • Trail edge thickness: ๊ฒฝ๋กœ ์—ฐ๊ฒฐ์„ ์˜ ๋‘๊ป˜ (๊ธฐ๋ณธ ๋‘๊ป˜์˜ ๋ฐฐ์ˆ˜)
  • Trail direction arrows: ์—ฐ๊ฒฐ์„ ์— Lockํ•œ ์ˆœ์„œ๋ฅผ ๊ฐ€๋ฆฌํ‚ค๋Š” ํ™”์‚ดํ‘œ๋ฅผ ํ‘œ์‹œํ• ์ง€ ์—ฌ๋ถ€

์„ค์น˜ ๋ฐฉ๋ฒ•

Graph Highlight Lock์€ Obsidian ์ปค๋ฎค๋‹ˆํ‹ฐ ํ”Œ๋Ÿฌ๊ทธ์ธ ๋ชฉ๋ก์— ์ •์‹์œผ๋กœ ๋“ฑ๋ก๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.

  1. ์„ค์ • โ†’ ์ปค๋ฎค๋‹ˆํ‹ฐ ํ”Œ๋Ÿฌ๊ทธ์ธ โ†’ ์ฐพ์•„๋ณด๊ธฐ(Browse)
  2. "Graph Highlight Lock" ๊ฒ€์ƒ‰
  3. ์„ค์น˜ ํ›„ ํ™œ์„ฑํ™”

๋˜๋Š” BRAT ํ”Œ๋Ÿฌ๊ทธ์ธ์œผ๋กœ ์ €์žฅ์†Œ ์ฃผ์†Œ๋ฅผ ๋“ฑ๋กํ•ด์„œ ์„ค์น˜ํ•  ์ˆ˜๋„ ์žˆ๊ณ (์ •์‹ ๋ชฉ๋ก์— ๋ฐ˜์˜๋˜๊ธฐ ์ „ ์ตœ์‹  ๋ฒ„์ „์„ ๋จผ์ € ์จ๋ณด๊ณ  ์‹ถ์„ ๋•Œ ์œ ์šฉ), ์ˆ˜๋™์œผ๋กœ๋„ ์„ค์น˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:

  1. Releases ์—์„œ main.js, manifest.json, styles.css 3๊ฐœ ํŒŒ์ผ์„ ๋‚ด๋ ค๋ฐ›์Šต๋‹ˆ๋‹ค.
  2. Vault ํด๋” ์•ˆ์˜ .obsidian/plugins/graph-highlight-lock/ ํด๋”๋ฅผ ๋งŒ๋“ค๊ณ  ๊ทธ ์•ˆ์— 3๊ฐœ ํŒŒ์ผ์„ ๋„ฃ์Šต๋‹ˆ๋‹ค.
  3. Obsidian โ†’ ์„ค์ • โ†’ ์ปค๋ฎค๋‹ˆํ‹ฐ ํ”Œ๋Ÿฌ๊ทธ์ธ์—์„œ "Graph Highlight Lock"์„ ์ผญ๋‹ˆ๋‹ค.

์–ด๋–ป๊ฒŒ ๋™์ž‘ํ•˜๋‚˜์š”? (๊ธฐ์ˆ ์ ์œผ๋กœ)

Obsidian Graph View๋Š” ๊ณต์‹ ๊ณต๊ฐœ API๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

์ด ํ”Œ๋Ÿฌ๊ทธ์ธ์€ Graph View๊ฐ€ ๋‚ด๋ถ€์ ์œผ๋กœ ์‚ฌ์šฉํ•˜๋Š” PIXI ๊ธฐ๋ฐ˜ ๋ Œ๋”๋Ÿฌ์˜ ํ•˜์ด๋ผ์ดํŠธ ์ƒํƒœ(getHighlightNode, onNodeClick ๋“ฑ)๋ฅผ ๊ทธ๋Œ€๋กœ ์žฌ์‚ฌ์šฉํ•ด์„œ Lock์„ ๊ตฌํ˜„ํ•ฉ๋‹ˆ๋‹ค. ๋ณ„๋„์˜ ๊ทธ๋ž˜ํ”„ ๋ Œ๋”๋ง ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜์ง€ ์•Š์•˜๊ธฐ ๋•Œ๋ฌธ์— ๊ฐ€๋ณ๊ณ , ๊ธฐ์กด Graph View์˜ ์‹œ๊ฐ์  ์Šคํƒ€์ผ๊ณผ 100% ๋™์ผํ•˜๊ฒŒ ๋ณด์ž…๋‹ˆ๋‹ค.

๋‹ค๋งŒ ์ด๋Š” ๋น„๊ณต์‹(undocumented) ๋‚ด๋ถ€ API์ด๋ฏ€๋กœ, Obsidian์ด ๋‚ด๋ถ€ ๊ตฌ์กฐ๋ฅผ ๋ณ€๊ฒฝํ•˜๋ฉด ๋™์ž‘ํ•˜์ง€ ์•Š์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Ÿฐ ๋‚ด๋ถ€ ์ ‘๊ทผ์€ src/graph-adapter.ts ํ•œ ํŒŒ์ผ์—๋งŒ ๊ฒฉ๋ฆฌ๋˜์–ด ์žˆ์–ด, ํ–ฅํ›„ ๋Œ€์‘์ด ํ•„์š”ํ•  ๋•Œ ๊ทธ ํŒŒ์ผ๋งŒ ์ˆ˜์ •ํ•˜๋ฉด ๋˜๋„๋ก ์„ค๊ณ„ํ–ˆ์Šต๋‹ˆ๋‹ค.

์ง€๋‚˜์˜จ ๊ฒฝ๋กœ(Trail)๋ฅผ ๊ณ„์† ํ‘œ์‹œํ•˜๋Š” ๋ถ€๋ถ„์€ ๋…ธ๋“œ์™€ ๋งํฌ๊ฐ€ ์„œ๋กœ ๋‹ค๋ฅธ ๋ฐฉ์‹์œผ๋กœ ์ฒ˜๋ฆฌ๋ฉ๋‹ˆ๋‹ค. ๋…ธ๋“œ๋Š” ์ƒ‰์ƒ ๊ณ„์‚ฐ ํ•จ์ˆ˜(getFillColor)๋ฅผ ํ•„์š”ํ•œ ๋™์•ˆ๋งŒ ๋ฐ”๊ฟ”์น˜๊ธฐํ•ด์„œ, Obsidian์ด ๋งค ํ”„๋ ˆ์ž„ ๋‹ค์‹œ ๊ณ„์‚ฐํ•ด๋„ ํ•ญ์ƒ ์šฐ๋ฆฌ ์ƒ‰์ด ๋‚˜์˜ค๊ฒŒ ๋งŒ๋“ญ๋‹ˆ๋‹ค. ๋งํฌ(์„ )๋Š” ์ด๋Ÿฐ ํ•จ์ˆ˜๊ฐ€ ๋”ฐ๋กœ ์—†์–ด์„œ, ์—ฐ๊ฒฐ์„  ์ž์ฒด์˜ "๊ทธ๋ฆฌ๊ธฐ" ํ•จ์ˆ˜๋ฅผ ๊ฐ์‹ธ "์›๋ž˜ ๊ทธ๋ฆฌ๊ธฐ โ†’ ๊ทธ ์งํ›„ ์šฐ๋ฆฌ ๊ฐ’(์ƒ‰์ƒ ยท ๊ตต๊ธฐ ยท ํ™”์‚ดํ‘œ) ์ ์šฉ" ์ˆœ์„œ๋ฅผ ํ•ญ์ƒ ๋ณด์žฅํ•˜๋Š” ๋ฐฉ์‹์„ ์”๋‹ˆ๋‹ค. ๋‘ ๋ฐฉ์‹ ๋ชจ๋‘ ๋ฐ˜๋ณต ์‹คํ–‰๋˜๋Š” ํƒ€์ด๋จธ ์—†์ด, ๊ฒฝ๋กœ์— ์žˆ๋Š” ๋…ธ๋“œ/์—ฐ๊ฒฐ์„ (์ „์ฒด ๊ทธ๋ž˜ํ”„๊ฐ€ ์•„๋‹ˆ๋ผ)๋งŒ ๊ฑด๋“œ๋ฆฝ๋‹ˆ๋‹ค.

๊ฐœ๋ฐœ์ž์šฉ ๋นŒ๋“œ ๋ฐฉ๋ฒ•

npm install
npm run dev     # ๊ฐ์‹œ ๋ชจ๋“œ๋กœ ๋นŒ๋“œ (๊ฐœ๋ฐœ ์ค‘)
npm run build   # ํ”„๋กœ๋•์…˜ ๋นŒ๋“œ (main.js ์ƒ์„ฑ)

๋นŒ๋“œ๋œ main.js, manifest.json, styles.css๋ฅผ ํ…Œ์ŠคํŠธ Vault์˜ .obsidian/plugins/graph-highlight-lock/์— ๋ณต์‚ฌํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.

ํ–ฅํ›„ ๊ณ„ํš

  • ๋‹ค์ค‘ Lock / ์—ฌ๋Ÿฌ ๊ฒฝ๋กœ ๋™์‹œ ํ‘œ์‹œ
  • ์—ฐ๊ฒฐ ๊นŠ์ด(Depth) 1~3๋‹จ๊ณ„ ์„ ํƒ
  • Lock ์ƒํƒœ ์ €์žฅ (์„ธ์…˜ ๊ฐ„ ์œ ์ง€)

์ œ์ž‘์ž

GOVERSE

๋ฒ„๊ทธ ์ œ๋ณด๋‚˜ ๊ธฐ๋Šฅ ์ œ์•ˆ์€ Issues๋กœ ๋‚จ๊ฒจ์ฃผ์„ธ์š”.

๋ผ์ด์„ ์Šค

MIT

For plugin developers

Search results and similarity scores are powered by semantic analysis of your plugin's README. If your plugin isn't appearing for searches you'd expect, try updating your README to clearly describe your plugin's purpose, features, and use cases.