背景
在2023年4月的时候从phodal的项目中知道了jupyter core是可以embedded之后,我就尝试将它embedd进了IDEA自身以获取全量IDE的自动化能力
源码:https://github.com/dev-assistant/skykoma-plugin-idea
示例:https://github.com/dev-assistant/skykoma-plugin-idea/blob/main/demo/demo.ipynb
因部分java项目的sdk总是没法正确识别,IDEA多年以来的bug都需要手动选下无法完成全量的自动化,所以在官方处理之前想尝试解决下。部分kotlin简写本次一并更新,同时替换掉了基于命令行的git信息获取,改成git4idea接口和官方保持一致
20250201更新:
今天发现官方有了mcp-server的实现,以及已经有了基于MCP的客户端来集成但功能有限,我的插件甚至比MCP的出现(2024年11月25日)和IDEA官方MCP实现(2024年12月9日)要早得多(2023年4月)
0 1 2 3 4 5 6 7 8 9 |
官方插件 https://github.com/JetBrains/mcp-server-plugin https://plugins.jetbrains.com/plugin/26071-mcp-server 官方MCP server https://github.com/JetBrains/mcp-jetbrains goose集成 https://github.com/block/goose/blob/main/extensions-site/public/servers.json https://github.com/block/goose/tree/main/crates/goose-mcp/src/jetbrains |
自动设置SDK
注意到源码com.intellij.openapi.roots.ui.configuration.ProjectConfigurableUi就是project structure的实现
myProjectJdkConfigurable内容修改时候会触发
0 1 |
myLanguageLevelCombo.sdkUpdated(myProjectJdkConfigurable.selectedProjectJdk, myProject.isDefault) |
而当myLanguageLevelCombo变动时会触发
0 1 |
LanguageLevelProjectExtensionImpl.getInstanceImpl(myProject).currentLevel = myLanguageLevelCombo.selectedLevels |
所以最终实际修改的是LanguageLevelProjectExtensionImpl.getInstanceImpl(myProject).currentLevel
也不难发现是SDK选择后生效的代码
0 1 |
com.intellij.openapi.roots.ui.configuration.ProjectJdkConfigurable#apply |
而从ProjectJdkTable.getInstance().findJdk()等一系列方法可以快速获取想要的Sdk对象
官方初始化过程可参考
0 1 |
com.intellij.openapi.projectRoots.impl.JavaAwareProjectJdkTableImpl#preconfigure |
自动操作GIT
相关操作都在GitRepositoryManager里,UI操作参考GitLogBranchOperationsActionGroup即可
0 1 |
GitRepositoryManager.getInstance(this) |
分支UI的操作见plugins/git4idea/resources/META-INF/plugin.xml
0 1 2 3 4 5 6 |
<group class="git4idea.ui.branch.GitLogBranchOperationsActionGroup" id="Git.BranchOperationGroup"/> <action class="git4idea.actions.GitCheckoutRevisionAction" id="Git.CheckoutRevision"/> <action class="git4idea.actions.GitCreateNewBranchAction" id="Git.CreateNewBranch"/> git4idea.ui.branch.GitLogBranchOperationsActionGroup#createBranchGroup git4idea.ui.branch.GitLogBranchOperationsActionGroup#createBranchActions |
可以看到右键菜单是固定的一个分组+两个固定操作,分组操作里会根据选中项是否有分支和tag决定是否显示相关操作
git4idea.ui.branch.GitBranchPopupActions.RemoteBranchActions.CheckoutRemoteBranchAction
TODO
git4idea.ui.branch.GitBranchPopupActions.CheckoutAsNewBranch
TODO
com.intellij.vcs.log.ui.actions.RefreshLogAction
0 1 2 3 4 5 6 7 8 9 10 |
import com.intellij.vcs.log.impl.VcsProjectLog import com.intellij.vcs.log.impl.VcsLogManager import com.intellij.vcs.log.util.VcsLogUtil import com.intellij.openapi.command.WriteCommandAction var myProjectLog = VcsProjectLog.getInstance(project) var logManager = myProjectLog.logManager var ui = logManager!!.logUis[0] WriteCommandAction.runWriteCommandAction(project) { logManager!!.dataManager!!.refresh(VcsLogUtil.getVisibleRoots(ui)); } |
git4idea.actions.GitFetch
0 1 2 3 4 5 6 7 |
//execCmd("git fetch", "$projectDir") import git4idea.fetch.GitFetchSupport import git4idea.GitUtil var fetchSupport = GitFetchSupport.fetchSupport(project) var repos = GitUtil.getRepositories(project) var result = fetchSupport.fetchAllRemotes(repos) result.showNotification() |
com.intellij.openapi.vcs.changes.actions.RefreshAction
其他自动化
可以参考官方MCP实现
或直接翻官方的IDEA源码https://github.com/JetBrains/intellij-community照抄即可
END
0 Comments