RunJS - Obsidian Plugin/Codes

옵시디언 RunJS: 외부 프로그램 실행하기 2 (Total Commander)

eoureo 2024. 12. 21. 19:09

옵시디언 RunJS를 사용하여 활성화된 노트를 Total Commander에서 여는 방법을 소개합니다.

 

이 글은 옵시디언 RunJS: 외부 프로그램 실행하기 1 (VSCode)에서 이어지는 내용으로, 이번에는 Total Commander에서 노트 파일을 여는 RunJS 코드를 다룹니다.

이 코드는 조금만 수정하면 다른 응용 프로그램에도 쉽게 적용할 수 있습니다.

 

 

 

 

옵시디언에서 Total Commander 실행하기

아래 그림을 보면 RunJS 코드목록 패널에 네 개의 Total Commander 실행 항목과 두 개의 관련 모듈 항목(Total Commander, RunJS/Utils)을 확인할 수 있습니다. 각 실행 항목을 클릭하면 Total Commander에서 옵시디언의 활성화된 노트 파일을 열 수 있습니다.

옵시디언 RunJS: 외부 프로그램 실행하기 2 (Total Commander)

 

RunJS 코드목록 패널에 코드 추가하기

코드블럭으로 된 실행 코드와 모듈 코드들은 노트에 삽입하고 자바스크립트 파일로 된 코드들은 RunJS의 스크립프 폴더에 넣어줘야 합니다.

실행 코드 소스

다음 네 개의 코드블록은 RunJS 코드목록 패널에 실행 항목을 추가합니다. 이 코드는 옵시디언의 노트에 그대로 복사하여 사용할 수 있습니다.

  • 활성화된 옵시디언 노트를 Total Commander의 왼쪽(1)/오른쪽(2)/활성화(3)된 패널에서 열기
  • 마지막 코드블럭(selection)은 선택한 텍스트를 파일 경로로 인식하여 Total Commander에서 열기(4)

모든 코드블럭에서는 'Open with/Total Commander'이라는 모듈을 사용하고 있습니다.

```js RunJS="{n:'Open with/Total Commander - Left',t:'s'}"
import { openWithTotalCommander } from 'Open with/Total Commander';

openWithTotalCommander("left");
```

```js RunJS="{n:'Open with/Total Commander - Right',t:'s'}"
import { openWithTotalCommander } from 'Open with/Total Commander';

openWithTotalCommander("right");
```

```js RunJS="{n:'Open with/Total Commander - active',t:'s'}"
import { openWithTotalCommander } from 'Open with/Total Commander';

openWithTotalCommander();
```

```js RunJS="{n:'Open with/Total Commander - selection',t:'s'}"
import { openWithTotalCommander_selection } from 'Open with/Total Commander';

// openWithTotalCommander_selection(this.app, "left");
openWithTotalCommander_selection(this.app);
```

 

Total Commander 모듈 코드 소스

실행 코드에서 사용하는 공통 함수는 코드블럭으로 만들어진 다음 모듈 코드에서 정의됩니다. 이 코드 또한 옵시디언의 노트에 복사하여 사용하면 됩니다.

Total Commander의 설치 위치가 다른 경우 exeFilePath 변수의 값을 바꾸어 주세요.

```js RunJS="{n:'Open with/Total Commander',t:'m'}"
/*
 * Command line parameters - TotalcmdWiki  
 * https://www.ghisler.ch/wiki/index.php/Command_line_parameters  
 * 
 * totalcmd.exe [/o] [/n] [Drive1:\Directory1 [Drive2:\Directory2]] [/i=name.ini] [/f=ftpname.ini]
 * totalcmd.exe [/o] [/n] [/L=Drive1:\Directory1] [/R=Drive2:\Directory2] [/i=name.ini] [/f=ftpname.ini]
 */
import { getSelection } from 'RunJS/Utils';

const exeFilePath = "C:\\Program Files\\totalcmd\\TOTALCMD64.EXE";

function getActiveFilePath() {
	const leaf = app.workspace.getLeaf();
	app.workspace.setActiveLeaf(leaf);
	
	const file = leaf.view.file;
	console.log("file:", file);
	
	const url = require('url');
	
	let filePath = url.fileURLToPath(app.vault.adapter.getFilePath(file.path));
	console.log("filePath:", filePath);
	
	return filePath;
}

const { spawn } = require('child_process');
const path = require('path');


function _openWithTotalCommander(...args) {
	// "C:\Program Files\totalcmd\TOTALCMD64.EXE" /I=D:\totalcmd00\wincmd.ini /F=D:\totalcmd00\wcx_ftp.ini
	
	// 프로세스 실행
	const exeProcess = spawn(exeFilePath, [...args]);
	
	// 오류 처리
	exeProcess.on('error', (error) => {
	  console.error('TC 실행 도중 오류가 발생했습니다:', error);
	});
	
	// 종료 처리
	exeProcess.on('exit', (code) => {
	  if (code === 0) {
	    console.log('파일이 TC에서 열렸습니다.');
	  } else {
	    console.error('파일 열기 도중 오류가 발생했습니다.');
	  }
	});
}

export function openWithTotalCommander(where) {
	if (where === "right") {
		_openWithTotalCommander('/o', '/R=' + getActiveFilePath());
	} else if (where === "left") {
		_openWithTotalCommander('/o', '/L=' + getActiveFilePath());
	} else {
		_openWithTotalCommander('/o', '/S', getActiveFilePath());
	}
}

export async function openWithTotalCommander_selection(app, where) {
	let filePath = await getSelection(app);
	
	if (filePath.startsWith("file:")) {
	  const url = require('url');
	  
	  filePath = url.fileURLToPath(filePath);
	}
	
	if (where === "right") {
		_openWithTotalCommander('/o', '/R=' + filePath);
	} else if (where === "left") {
		_openWithTotalCommander('/o', '/L=' + filePath);
	} else {
		_openWithTotalCommander('/o', '/S', filePath);
	}
}
```

 

공용 모듈(RunJS/Utils)

위 Total Commander 모듈 코드에서는 'RunJS/Utils' 모듈을 사용합니다. 'RunJS/Utils'는 코드블록이 아닌 별도의 모듈 파일로 제공됩니다. 설치 방법은 이전 글(옵시디언 RunJS: 외부 프로그램 실행하기 1 (VSCode))에서 확인하세요. 이미 설치한 경우 건너뛰면 됩니다.

 

마치며

이번 포스트에서는 옵시디언 RunJS를 활용하여 외부 프로그램, 특히 Total Commander에서 노트를 여는 방법을 알아보았습니다.

 

이 글은 GitHub Discussions에서도 확인할 수 있습니다

 

이제 필요에 따라 다른 외부 프로그램(Everything, Notepad++ 등)에도 응용해 보세요. RunJS를 잘 활용하면 옵시디언의 생산성을 높일 수 있습니다! 😊

 

궁금한 점이나 의견이 있다면 댓글로 알려주세요!