링크 검사
VMark는 마크다운의 로컬 링크와 이미지 대상이 디스크에 실제로 존재하는지 확인합니다. 마크다운 린트 엔진과 함께 Alt + Mod + V 또는 보기 → Markdown 검사 에서 실행됩니다.
검사 대상
문서의 모든 로컬 링크와 이미지에 대해:
[text](./other.md)— 파일./other.md가 해석되고 존재함— 이미지 파일이 존재함[text](./other.md#section)— 파일이 존재함 (앵커 검사는linkFragments규칙에서 처리)
대상이 누락되면 린트 배지와 F2 / Shift + F2 탐색에 항목이 나타납니다. 표시 방식은 모드에 따라 다릅니다: 소스 모드에서는 링크에 CodeMirror의 빨간 진단 밑줄이 그어지고, WYSIWYG 모드에서는 링크가 들어 있는 블록 전체의 왼쪽 가장자리를 따라 빨간 막대와 옅은 색조가 표시됩니다 — WYSIWYG 린트 표시는 블록 단위이며, 인라인 밑줄로 표시되지 않습니다.
건너뛰는 대상
- 프래그먼트 전용 링크 (
#anchor) — 현재 문서의 제목에 대해 검사하는linkFragments규칙이 처리 - 외부 URL — 모든 URI 스킴(
http:,https:,mailto:,obsidian:,vscode:, …)과 프로토콜 상대//host/…URL. Windows 드라이브 문자 경로(C:\…,C:/…)는 여전히 파일 경로로 검사됨 - 제목 없는 문서 — 저장된 파일 경로가 없으면 상대 URL을 어떤 디렉터리 기준으로도 해석할 수 없음
- 네트워크 경로와 드라이브 상대 경로 — UNC 경로(
\\server\share\…)는 조회하지 않음. Windows에서 이를 검사하면 네트워크를 통해 해당 호스트에 접속하게 되기 때문 (그 호스트에 Windows 로그인 자격 증명을 제공할 수도 있음). 드라이브 상대 경로C:file.md(드라이브 문자 뒤에 슬래시가 없는 경로)도 건너뜀: 문서가 아니라 앱의 작업 디렉터리를 기준으로 하기 때문
해석 작동 방식
링크 검사는 상대 경로를 소스 파일의 디렉터리를 기준으로 해석하고, 절대 경로는 그 경로가 가리키는 파일로 받아들입니다:
/repo/docs/intro.md의 링크 | 해석 결과 |
|---|---|
[a](./other.md) | /repo/docs/other.md |
[a](../shared.md) | /repo/shared.md |
[a](images/logo.png) | /repo/docs/images/logo.png |
[a](/docs/intro.md) | /docs/intro.md (절대 경로는 그 파일을 가리킴. Windows에서는 문서가 있는 드라이브에 위치) |
파일 조회 전에 프래그먼트는 제거됩니다 — [a](./other.md#section)은 ./other.md만 검사합니다.
성능
- 비동기 — 동기 규칙과 병렬로 실행되며, 결과는 준비되는 대로 병합됨
- 중복 제거 — 여러 번 링크되어도 각 고유한 해석된 경로는 실행당 한 번만 검사됨
- 키 입력 트리거 없음 — 모든 키 입력에서 fs.exists를 호출하면 부담이 크므로, 명시적 린트 트리거에서만 실행됨
- 운영 오류 허용 —
fs.exists가 예외를 던지면 (권한 거부, 기능 범위 문제 등) 결과는error(건너뜀)이지missing이 아님. 잘못된 것보다 조용한 편이 낫음.
진단 코드
| 코드 | 심각도 | 트리거 |
|---|---|---|
| M001 | Error | 해석된 로컬 경로에서 이미지 파일을 찾을 수 없음 |
| M002 | Error | 해석된 로컬 경로에서 링크된 파일을 찾을 수 없음 |
참고 항목
- Markdown 린트 — 전체 규칙 참조
- 설정 → 마크다운 → 린트