옵시디언(Obsidian)을 사용하다 보면 특정 노트를 외부 프로그램(VSCode, Total Commander 등)에서 열어야 할 때가 있습니다. 이를 위해 RunJS를 활용하면 간단하게 외부 프로그램을 실행하고 파일을 열 수 있습니다. 이번 포스트에서는 RunJS를 활용하여 VSCode에서 노트 파일을 여는 방법을 단계별로 소개합니다. 더 나아가 모듈 활용법과 텍스트 선택 기능까지 함께 살펴보겠습니다.
1. VSCode에서 노트 열기: 단순한 방법
먼저 활성화된 옵시디언 노트 파일을 VSCode에서 여는 간단한 스크립트를 작성해 봅시다.
1.1 소스 코드 등록
아래 RunJS 코드블럭을 옵시디언 노트에 추가해 주세요. 코드블럭이 등록되면 RunJS 패널에 자동으로 나타납니다.
코드 설명:
- vscodePath를 통해 VSCode의 설치 경로를 설정합니다.
- 활성화된 노트 파일과 커서 위치를 기반으로 VSCode에서 파일을 엽니다.
- 커서 위치까지 정확하게 이동되기 때문에 매우 유용합니다.
```js RunJS="{n:'Examples/Open with/VSCode',t:'s'}"
const vscodePath = "C:\\Program Files\\Microsoft VS Code\\Code.exe";
const vscodeParams = ['--reuse-window']; // simple
// const vscodeParams = ['--reuse-window', '--user-data-dir', 'D:\\VSCode_data_A\\user-data', '--extensions-dir', 'D:\\VSCode_data_A\\extensions']; // other VSCode
const leaf = this.app.workspace.getLeaf();
this.app.workspace.setActiveLeaf(leaf);
const file = leaf.view.file;
let editor = leaf.view?.editor;
let editorPosition;
if (editor) {
editorPosition = editor.getCursor();
}
else {
new Notice("Error: No Editor.");
}
let lineAndChar = "";
if (editorPosition) {
lineAndChar = ":" + (editorPosition.line + 1) + ":" + (editorPosition.ch + 1);
}
const url = require('url');
let filePath = url.fileURLToPath(app.vault.adapter.getFilePath(file.path));
const { spawn } = require('child_process');
// Run VSCode
const vscodeProcess = spawn(vscodePath, vscodeParams.concat('--goto', filePath + lineAndChar));
// Error handling
vscodeProcess.on('error', (error) => {
console.error('An error occurred while running VSCode:', error);
});
// Exit handling
vscodeProcess.on('exit', (code) => {
if (code === 0) {
console.log('File opened in VSCode.');
} else {
console.error('An error occurred while opening the file.');
}
});
```
1.2 alias 등록
여러 개의 이름으로 같은 코드를 실행하고 싶다면 alias를 등록하면 됩니다. 아래 예제는 앞서 등록한 "Examples/Open with/VSCode"코드를 새로운 이름 "Examples/VSCode/Open with"으로 실행합니다.
```js RunJS="{n:'Examples/VSCode/Open with',t:'s'}"
this.runCodeByName("Examples/Open with/VSCode");
```
1.3 실행하기
다음 그림처럼 옵시디언의 RunJS 패널에 두 개의 항목이 등록 되었습니다.
RunJS 패널에서 "Examples/Open with/VSCode" 또는 "Examples/VSCode/Open with"를 클릭하면 현재 노트가 VSCode에서 열리며 커서 위치까지 이동합니다.
Note: RunJS 설정에서 자동 검색을 끈 경우 새로고침 아이콘을 눌러야 코드 등록이 반영됩니다.
2. VSCode에서 선택한 파일 경로 열기: 모듈 활용
이번에는 노트에 파일 경로 텍스트를 선택한 다음 RunJS 패널에서 명령을 실행하면 해당 파일을 VSCode에서 여는 기능을 만들어 봅니다. 이 과정에서 억지스럽게(?) 코드블럭 모듈과 자바스크립트 모듈 파일을 활용하면서 어떻게 모듈을 사용하는 가를 볼 수 있도록 하였습니다.
2.1 실행 코드 소스: 노트 안의 코드 블럭
아래 코드는 노트에서 파일 경로 텍스트를 선택하면 파일 경로에 해당하는 파일을 VSCode에서 열고, 선택이 없을 경우 활성화된 그 노트를 엽니다.
글 선택을 테스트 하기 위해 아래 파일 경로를 적어보았습니다.
file:///D:/test.html
file:///D:/test.md
```js RunJS="{n:'Examples/Open with/VSCode - selection',t:'s'}"
import { getSelection } from 'RunJS/Utils';
import { openVSCode } from "Examples/VSCode/openVSCode";
let filePath = await getSelection(this.app);
// 선택된 글이 없을 때는 활성화된 글을 연다.
if (filePath == "") {
this.runCodeByName("Examples/Open with/VSCode");
return;
}
if (filePath.startsWith("file:")) {
const url = require('url');
filePath = url.fileURLToPath(filePath);
}
openVSCode(filePath);
```
"Examples/VSCode/openVSCode" 모듈에 있는 openVSCode 함수를 사용하고 있습니다.
또 "RunJS/Utils"라는 모듈도 불러오고 있습니다. 이 모듈은 옵시디언 노트에 들어가 있는 코드블럭 코드가 아닙니다. RunJS 스크립트 폴더에 저장된 자바스크립트 파일에 들어 있습니다.
2.2 모듈 코드 소스: 노트 안의 코드 블럭
위 코드에서 사용된 openVSCode 함수는 별도의 모듈에서 정의합니다. 이 모듈은 VSCode 실행 기능을 재사용할 수 있도록 만듭니다.
RunJS="{n:'Examples/VSCode/openVSCode',t:'m'}"에서 "t:'m'"이라는 설정이 모듈을 뜻합니다.
```js RunJS="{n:'Examples/VSCode/openVSCode',t:'m'}"
export function openVSCode(filePath, lineAndChar = "") {
const vscodePath = "C:\\Program Files\\Microsoft VS Code\\Code.exe";
const { spawn } = require('child_process');
// VSCode 프로세스 실행
const vscodeProcess = spawn(vscodePath, ['--reuse-window', '--goto', filePath + lineAndChar]);
// const vscodeProcess = spawn(vscodePath, ['--reuse-window', '--goto', filePath + lineAndChar, '--user-data-dir', 'D:\\VSCode_data_A\\user-data', '--extensions-dir', 'D:\\VSCode_data_A\\extensions']);
// 오류 처리
vscodeProcess.on('error', (error) => {
console.error('VSCode 실행 도중 오류가 발생했습니다:', error);
});
// 종료 처리
vscodeProcess.on('exit', (code) => {
if (code === 0) {
console.log('파일이 VSCode에서 열렸습니다.');
} else {
console.error('파일 열기 도중 오류가 발생했습니다.');
}
});
}
```
2.3 모듈 코드: RunJS-Utils.mjs 파일
getSelection 함수는 RunJS 스크립트 폴더에 있는 RunJS-Utils.mjs 파일에서 제공됩니다. 이 파일은 옵시디언에서 텍스트 선택과 같은 반복 작업에 유용한 함수들을 포함하고 있습니다.
아래 링크에서 다운로드할 수 있습니다.
다운 받은 "RunJS-Utils.mjs" 파일을 RunJS 스크립트 폴더에 넣으면 됩니다. 파일 이름은 바꾸어도 되지만 파일 안의 주석 영역에 있는 RunJS 설정 구문(@RunJS RunJS/Utils)은 다른 코드들과 맞게 유지되어야 합니다.
Module of frequently used functions in Obsidian-RunJS
https://gist.github.com/eoureo/e5cb83afac9c9e39d7f909a3cae7ecf2
위의 "view raw"링크의 컨텍스트 메뉴(마우스 오른 버튼 클릭) "다른 이름으로 링크 저장..."을 통해 다운 받을 수 있습니다.
2.4 실행하기
- 위에서 작성한 코드블럭을 노트에 넣고 모듈 파일은 RunJS 스크립트 폴더에 넣으면 다음 그림과 같이 RunJS 패널에 새로 등록이 됩니다. 추가한 모듈들도 등록된 것이 보입니다.
- RunJS 패널에서 "Examples/Open with/VSCode - selection"을 실행해 보세요.
- 파일 경로를 선택하면 그 경로가 VSCode에서 열립니다.
- 선택하지 않으면 현재 활성화된 노트가 열립니다.
아래 그림과 같이 테스트하기 위해 넣어준 글에서 "file:///D:/test.html"이나 "D:/test.html"을 선택하고 RunJS 패널에서 "Examples/Open with/VSCode - selection"을 클릭하면 "D:/test.html" 파일이 VSCode에서 열리는 것을 볼 수 있습니다.
3. 마치며
이번 포스트에서는 옵시디언 RunJS를 활용하여 외부 프로그램, 특히 VSCode에서 노트를 여는 방법을 살펴보았습니다.
- 단순한 실행 코드로 시작해
- 모듈화 및 자바스크립트 파일을 활용하여 기능을 확장했습니다.
이 글은 GitHub Discussions에서도 확인할 수 있습니다
이제 필요에 따라 다른 외부 프로그램(Total Commander, Notepad++ 등)에도 응용해 보세요. RunJS를 잘 활용하면 옵시디언의 생산성을 극대화할 수 있습니다! 😊
궁금한 점이나 의견이 있다면 댓글로 알려주세요!
'RunJS - Obsidian Plugin > Codes' 카테고리의 다른 글
옵시디언 RunJS: 파일 탐색기에 "파일 경로 복사(클립보드)" 메뉴 추가하기 (1) | 2025.01.03 |
---|---|
옵시디언 RunJS: 파일 탐색기에 "VSCode에서 열기" 메뉴 추가하기 (0) | 2024.12.29 |
옵시디언 RunJS: 이벤트 다루기 (데일리 노트에 시간 자동 추가) (0) | 2024.12.24 |
옵시디언 RunJS: 외부 프로그램 실행하기 2 (Total Commander) (0) | 2024.12.21 |
옵시디언 RunJS: Callout 넣기 (1) | 2024.12.12 |