代码之家  ›  专栏  ›  技术社区  ›  j4ckofalltrades

是否可以从外部(即通过命令行)调用Intellij IDE脚本?

  •  0
  • j4ckofalltrades  · 技术社区  · 3 年前

    我正在尝试使用 Intellij IDE scripting console ,并使用命令行启动器从外部调用它,例如。 idea Intellij IDEA。

    看起来支持是在2021.1中添加的(请参阅 YouTrack ticket ],但它可能已从(?)起删除。

    我尝试使用以下命令调用该脚本,但没有发生任何事情;脚本似乎并没有被执行,并且并没有记录任何错误。

    # following command in YouTrack ticket referenced above
    idea ideScript /path/to/script
    

    这些是脚本的内容,当在IDE中运行时可以正常工作。

    # ide_script.kts
    import com.intellij.openapi.actionSystem.ActionManager
    import com.intellij.openapi.actionSystem.AnAction
    import com.intellij.openapi.project.ProjectManager
    import com.intellij.openapi.ui.Messages
    import com.intellij.openapi.util.ActionCallback
    
    val project = ProjectManager.getInstance().defaultProject
    val actionManager: ActionManager = ActionManager.getInstance()
    val action: AnAction = actionManager.getAction("NextTab")
    val actionResult: ActionCallback = actionManager.tryToExecute(action, null, null, null, true)
    
    Messages.showInfoMessage(project, actionResult.error ?: "Action success", "Action Result")
    

    理想情况下,我还想(如果可能的话)参数化脚本,例如传入操作名称。

    1 回复  |  直到 3 年前
        1
  •  0
  •   Soren James    3 年前

    你没有定义你的旗帜

    试试这个:

    idea --ideScript /path/to/script
    
    import com.intellij.openapi.actionSystem.ActionManager
    import com.intellij.openapi.actionSystem.AnAction
    import com.intellij.openapi.project.ProjectManager
    import com.intellij.openapi.ui.Messages
    import com.intellij.openapi.util.ActionCallback
    
    val projectName = args[0]
    val actionName = args[1]
    
    val project = ProjectManager.getInstance().defaultProject
    val actionManager: ActionManager = ActionManager.getInstance()
    val action: AnAction = actionManager.getAction(actionName)
    val actionResult: ActionCallback = actionManager.tryToExecute(action, null, null, null, true)
    
    Messages.showInfoMessage(project, actionResult.error ?: "Action success", "Action Result: $projectName")
    
    idea --ideScript /path/to/script myProject myAction
    

    或者,您可以尝试:

    import com.intellij.openapi.actionSystem.ActionManager
    import com.intellij.openapi.actionSystem.AnAction
    import com.intellij.openapi.project.ProjectManager
    import com.intellij.openapi.ui.Messages
    import com.intellij.openapi.util.ActionCallback
    
    val projectName = System.getenv("PROJECT_NAME")
    val actionName = System.getenv("ACTION_NAME")
    
    val project = ProjectManager.getInstance().defaultProject
    val actionManager: ActionManager = ActionManager.getInstance()
    val action: AnAction = actionManager.getAction(actionName)
    val actionResult: ActionCallback = actionManager.tryToExecute(action, null, null, null, true)
    
    Messages.showInfoMessage(project, actionResult.error ?: "Action success", "Action Result: $projectName")
    
    export PROJECT_NAME=myProject
    export ACTION_NAME=myAction
    idea --ideScript /path/to/script
    

    这样,脚本将读取“PROJECT_NAME”和“ACTION_NAME”环境变量,并在脚本中使用它们。这种方法允许您在不修改脚本内容的情况下将参数传递给脚本。

        2
  •  0
  •   j4ckofalltrades    3 年前

    我通过将脚本的内容包装在以下片段中来实现它:

    IDE.application.invokeLater {
      // execute IDE action here
    }
    

    然后像往常一样调用IDE脚本 idea ideScript /path/to/script

    我还创建了一个shell脚本,用于处理接受操作名称作为参数的操作;完整的代码如下 GitHub gist 对于任何感兴趣的人。