【问题标题】:Launching and killing (separately) multiple isolated instances of VS Code from command line从命令行启动和杀死(单独)多个隔离的 VS Code 实例
【发布时间】:2021-10-12 00:34:57
【问题描述】:

Visual Studio Code 支持通过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),即使在不同的窗口中打开了两个工作区。

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

【问题讨论】:

    标签: bash visual-studio-code electron command-line-interface pid


    【解决方案1】:

    您可以使用以下几个命令找到 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。

    【讨论】:

    • 成功了,但随后它暴露了一个事实,即您无法在 VS Code 中杀死单个窗口而不提示错误对话框。因此,似乎没有办法以有序的方式选择性地关闭各个窗口。 Ugh Electron 应用程序是最糟糕的。
    • 您可以查看github.com/sjitech/mac_list_windows_pids/blob/master/lswin.py 以找到关闭 vscode 窗口的“正确”方法。
    【解决方案2】:

    我可以让它工作的唯一可行方法是创建一个 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 等操作。这会彻底关闭窗口,如果存在任何未保存的文件,将提示先保存它们。

    【讨论】:

      猜你喜欢
      • 2016-08-19
      • 1970-01-01
      • 2019-02-04
      • 2020-01-27
      • 2011-03-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多