Visual Studio Code支持通过code
CLI工具启动自身的实例。您可以执行如下操作:
$ 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
等。这将干净地关闭窗口,如果存在任何未保存的文件,将提示先保存它们。