从命令行启动和杀死(单独)多个独立的 VS Code 实例

Launching and killing (separately) multiple isolated instances of VS Code from command line

Visual Studio 代码支持通过 code CLI 工具启动自身实例。您可以执行以下操作:

$ code /Users/username/projects/dotfiles

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

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

所以我似乎有办法从其路径参数中识别 IDE 进程。但是,当我尝试以同样的方式启动另一个项目时,比如说...

$ code /Users/username/projects/work

没有其他进程与该路径参数一起出现。它仍然只显示第一个 (projects/dotfiles),即使在单独的 windows.

中打开了两个工作区

最终,我希望能够通过 bash/CLI close/kill 一个单独的项目 IDE window。是否有某种方法可以在新进程中启动第二个 VS Code 项目,使其路径显示为 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 函数,将项目名称作为参数,然后循环遍历 windows 并在 window 名称包含项目名称:

#!/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 等。这会干净地关闭 window,如果存在任何未保存的文件, 会提示先保存。