从命令行启动和终止(分别)多个独立的VS Code实例



Visual Studio Code支持通过codeCLI工具启动自身的实例。您可以执行如下操作:

$ code /Users/username/projects/dotfiles

,它将打开带有相应项目的VS Code。由于VS Code只是一个电子应用程序,这会产生许多独立的进程,父进程匹配如下内容:

/Applications/Visual Studio Code.app/Contents/MacOS/Electron /Users/username/projects/dotfiles

所以我似乎有一种方法来识别IDE进程从它的路径参数。然而,当我尝试以同样的方式启动另一个项目时,说…

$ code /Users/username/projects/work

没有其他带有该path参数的进程出现。它仍然只显示第一个(projects/dotfiles),即使在单独的窗口中打开了两个工作区。

最终,我希望能够通过bash/CLI关闭/杀死单个项目IDE窗口。是否有一些方法可以在新进程中启动第二个VS代码项目,使其路径显示为ps中的命令参数,因此可以独立于其他项目而被杀死?

您可以使用以下几个命令找到PID与项目的关联:

$ lsof | grep state.vscdb
Electron 349 username 63u REG 1,4 20480 551122 /Users/username/Library/Application Support/Code/User/workspaceStorage/9db2e998b18618ec427ec85178a324e6/state.vscdb
# 349 being PID
$ cd "/Users/username/Library/Application Support/Code/User/workspaceStorage/9db2e998b18618ec427ec85178a324e6"
$ sqlite3 state.vscdb "select * from ItemTable;" | grep "debug.selectedroot.*launch.json"
debug.selectedroot|file:///Users/username/projects/dotfiles/.vscode/launch.json
# /Users/username/projects/dotfiles is project folder

试试这个方法:

lsof -R|/usr/bin/grep "^Code\\x20H.* /Users/username/project"

第三列包含要杀死的pid。

唯一可行的方法是创建一个JXA/Applescript函数,该函数将项目名称作为参数,然后循环遍历窗口并关闭它们,如果它们的窗口名称包含项目名称:

#!/usr/bin/env osascript -l JavaScript
run = argv => {
system = Application('System Events')
vscode = system.processes['Code']
vscode.windows().forEach( window => {
argv.forEach( projectName => {
if(window.name().includes(projectName)) {
window.buttons.at(0).click()  
}
})
})
}

创建一个包含chmod +x的文件,使其可执行,然后您可以执行./closeCode.jxa ProjectName1 ProjectName2等。这将干净地关闭窗口,如果存在任何未保存的文件,将提示先保存它们。

最新更新