A fork of https://github.com/ueokande/vim-vixen
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
107 lines
2.4 KiB
107 lines
2.4 KiB
import { spawn } from 'child_process'; |
|
|
|
const readLinux = (): Promise<string> => { |
|
let stdout = '', stderr = ''; |
|
return new Promise((resolve) => { |
|
let xsel = spawn('xsel', ['--clipboard', '--output']); |
|
xsel.stdout.on('data', (data) => { |
|
stdout += data; |
|
}); |
|
xsel.stderr.on('data', (data) => { |
|
stderr += data; |
|
}); |
|
xsel.on('close', (code) => { |
|
if (code !== 0) { |
|
throw new Error(`xsel returns ${code}: ${stderr}`) |
|
} |
|
resolve(stdout); |
|
}); |
|
}); |
|
}; |
|
|
|
const writeLinux = (data: string): Promise<string> => { |
|
let stderr = ''; |
|
return new Promise((resolve) => { |
|
let xsel = spawn('xsel', ['--clipboard', '--input']); |
|
xsel.stderr.on('data', (data) => { |
|
stderr += data; |
|
}); |
|
xsel.on('close', (code) => { |
|
if (code !== 0) { |
|
throw new Error(`xsel returns ${code}: ${stderr}`) |
|
} |
|
resolve(); |
|
}); |
|
xsel.stdin.write(data); |
|
xsel.stdin.end(); |
|
}); |
|
}; |
|
|
|
const readDarwin = (): Promise<string> => { |
|
let stdout = '', stderr = ''; |
|
return new Promise((resolve) => { |
|
let pbpaste = spawn('pbpaste'); |
|
pbpaste.stdout.on('data', (data) => { |
|
stdout += data; |
|
}); |
|
pbpaste.stderr.on('data', (data) => { |
|
stderr += data; |
|
}); |
|
pbpaste.on('close', (code) => { |
|
if (code !== 0) { |
|
throw new Error(`pbpaste returns ${code}: ${stderr}`) |
|
} |
|
resolve(stdout); |
|
}); |
|
}); |
|
}; |
|
|
|
const writeDarwin = (data: string): Promise<string> => { |
|
let stderr = ''; |
|
return new Promise((resolve) => { |
|
let pbcopy = spawn('pbcopy'); |
|
pbcopy.stderr.on('data', (data) => { |
|
stderr += data; |
|
}); |
|
pbcopy.on('close', (code) => { |
|
if (code !== 0) { |
|
throw new Error(`pbcopy returns ${code}: ${stderr}`) |
|
} |
|
resolve(); |
|
}); |
|
pbcopy.stdin.write(data); |
|
pbcopy.stdin.end(); |
|
}); |
|
}; |
|
|
|
class UnsupportedError extends Error { |
|
constructor(platform: string) { |
|
super(); |
|
this.message = `Unsupported platform: ${platform}`; |
|
} |
|
} |
|
|
|
const read = () => { |
|
switch (process.platform) { |
|
case 'linux': |
|
return readLinux(); |
|
case 'darwin': |
|
return readDarwin(); |
|
} |
|
throw new UnsupportedError(process.platform); |
|
} |
|
|
|
const write = (data: string) => { |
|
switch (process.platform) { |
|
case 'linux': |
|
return writeLinux(data); |
|
case 'darwin': |
|
return writeDarwin(data); |
|
} |
|
throw new UnsupportedError(process.platform); |
|
} |
|
|
|
export { |
|
read, |
|
write, |
|
};
|
|
|