Visual Studio Code Extensionを作成するために、調べた結果をまとめます。

macOSでClipboard操作について分かったこと

対応方法

Visual Studio CodeのExtension内で完結しないのはいかがなものかと思い、「1.AppleScriptを利用する」で実装することにしました。

AppleScriptでClipboradの画像をpng保存する

そういえば、AppleScriptを書いたことがなかったので、調べながら書きました。基本的には、mushanshitiancai/vscode-paste-image: paste image from clipboard to markdown/asciidoc directly!を参考にさせていただき作成しました。

下記の想定です。

  • pngのファイルタイプを定義
  • Clipboardにpng形式が含まれている場合は、引数として渡されたファイル名として保存

filetypeについては、ASH Planning: クリップボード活用のススメを参照。

property fileTypes : {{<class PNGf>, ".png"}}
 
on run argv
if argv is {} then
    return ""
end if

set theType to getType()
if theType is missing value then
    return "no image"
end if

set imagePath to (item 1 of argv)
try
    set myFile to (open for access imagePath with write permission)
    set eof myFile to 0
    write (the clipboard as (first item of theType)) to myFile
    close access myFile
    return (POSIX path of imagePath)
on error
    try
        close access myFile
    end try
    return ""
end try
end run

on getType()
repeat with aType in fileTypes
    repeat with theInfo in (clipboard info)
        if (first item of theInfo) is equal to (first item of aType) then return aType
    end repeat
end repeat
return missing value
end getType

cmd + shift + ctl + 4でスクリーンショットを取得した後、上記AppleScriptをspawnから実行すると、先ほど取得したスクリーンショットが画像として保存されます。

import { spawn } from 'child_process';
const scriptPath = path.join(__dirname, '../script/mac.applescript');
const filepath = 'save_to_dir';
let ascript = spawn('osascript', [scriptPath, filepath]);

ascript.stdout.on('data', (data) => {
    console.log(data.toString().trim()); // filename
});
            
ascript.stderr.on('data', (data) => {
    console.error(data);
});

ascript.on('close', (code) => {
    console.log(`child process exited with code ${code}`);
});

参考