Clineが対応した内容をJetBrains IDEで修正する場合、エディタの切り替えが不便です。
そんな中、以下の資料を見たところ、 Switch2IDEA と Switch2Cursor を使うことで、 ファイルの同じカーソル位置でJetBrains IDEとVisual Studio Code を切り替えられると知りました。
Kotlinの開発でも AIをいい感じに使いたい / Making the Most of AI in Kotlin Development - Speaker Deck
それら2つはプラグインとして提供されているため、
を行うと、macでは
Option + Shift + Pというショートカットで、 JetBrains IDE と Cursor で同じプロジェクトを開けるOption + Shift + Oというショートカットで、 JetBrains IDE と Cursor で同じファイルの同じ行を開ける
となるようでした。
自分はCursorではなく Visual Studio Code (VS Code) + Cline をメインで使っていることから、JetBrains IDE と VS Code の間で同じようにできないか気になりました。試してみたところ実現できたことから、メモを残します。
目次
環境
- mac Sequoia
- JetBrains IDE
- 今回の場合、RubyMine 2025.1
- プラグイン
- Switch2Cursor 1.0.3
- VS Code 1.99.3
- プラグイン
- Switch2IDEA 1.0.3
- プラグイン
調査
両プラグインをデフォルトのままで動かしてみたところ、以下の結果となりました。
- RubyMine上でSwitch2Cursorのショートカットを使ったが、動作しない
- VS Code上でSwitch2IDEAのショートカットを使ったところ、動作した
次に、GitHubのissueで似たような事例がないかを確認したところ、すでにVS Codeで開きたいというissueがありました。
[Feature] Support open in vscode/vscode-insiders · Issue #10 · qczone/switch2cursor
ここで著者が「 Cursor Path にVS Codeのアプリケーション名を指定すれば動作する」旨の投稿をしていたことから、VS Codeでも実現できそうでした。
次に、Switch2Cursorのソースコードを読んで、どのように実装しているかを確認しました。
まずは、プロジェクトを開く機能です。
https://github.com/qczone/switch2cursor/blob/v1.0.3/src/main/kotlin/com/github/qczone/switch2cursor/actions/OpenProjectInCursorAction.kt#L27
単に open -a を使って、 $cursorPath のアプリで開いているだけでした。
続いて、ファイルを開く機能です。
https://github.com/qczone/switch2cursor/blob/v1.0.3/src/main/kotlin/com/github/qczone/switch2cursor/actions/OpenFileInCursorAction.kt#L36
こちらも open -a を使っていました。ただ、openコマンドの引数が "cursor://file$filePath:$line:$column" とハードコーディングしてあり、 VS Code で開けるのかは気になりました。
動作確認
JetBrains IDE側の設定を変更するため、 Settings > Tools > Switch2Curosr を選択します。
次に CursorPath へ Visual Studio Code を設定します。この値は which code の値ではなく、 ls -d /Applications/Visu* で出てきた名前から .app を省いた値です。
この状態で、特定のファイルを開いて RubyMine から Option + Shift + O を押すと、VS Codeで該当のファイルが開きます。
ただ、
An external application wants to open 'path/to/file:28:21' in Code. Do you want to open this file or folder?
のようなメッセージが表示されるため、 Yes ボタンをクリックする(もしくはEnterキーを押す)必要があります。
次にVS Code側の設定です。
まずはRubyMineの場所を確認します。
JetBrains ToolboxでRubyMineをインストールしている場合、JetBrains Toolbox の RubyMine の設定ページからインストール場所をコピーします。今回の場合、インストール場所として /Users/kamijo/Applications/RubyMine.app が設定されていることとします。
続いて、VS CodeのSwitch2IDEAの設定ページを開き、 IDEA executable path に上記でコピーしたパスを貼り付けます。
これで準備が完了です。
では、動作確認です。
VS Codeで Option + Shift + O を押すと、RubyMineで該当のファイルが開きます。
これら2つのプラグインはCursor専用かもしれないと思っていましたが、VS Codeでも動くことが確認できました。
Switch2Cursorをforkして、VS Codeへ対応する
ところで、Switch2CursorによりVS Codeで開くと毎回メッセージが表示されるため、都度 Yes とするのは手間です。
いちおう Allow opening local paths without asking というチェックボックスもあり、ここにチェックを入れればメッセージは非表示になりそうです。ただ、セキュリティ的な観点からはチェックを入れたくありません。
GitHubのソースコードを読む限り、コマンド部分だけ Cursor から VS Code へ差し替えると動作しそうに見えたため、forkして試してみることにします。
なお、Windowsの動作確認環境がないため、今回はmacだけでの対応とします。
環境構築
自分のリポジトリへfork後、ローカルへcloneします。
cloneしたリポジトリをIntelliJ IDEAで開き、次のようなビルドまわりの設定を行います*1。
- Project Structure から、SDKに
jbr-17(JetBrains Runtime 17.0.14) を指定 - Edit Configuration から、
Gradleを選び、 以下を設定- Runに
buildを指定したもの - Runに
cleanを指定したもの
- Runに
ソースコードの修正
今回は3つのファイルを修正します。
OpenFileInCursorAction.kt
元々の実装は open を使っていました。ここを修正すれば良さそうです。
System.getProperty("os.name").lowercase().contains("mac") -> { arrayOf("open", "-a", "$cursorPath", "cursor://file$filePath:$line:$column") }
Openの代わりに code コマンドで起動すれば良さそうな気がしました。ためしに、 open の代わりに code コマンドを渡す
arrayOf("code", filePath)
としてみたところ、VS Codeは起動できずにエラーとなりました。一方、 which code で表示される値を arrayOf の先頭の要素として設定したところ、VS Codeで指定したファイルが開きました。
which code の結果は環境により異なることも踏まえ、今回は「 which code で取得できる値を、JetBrains IDEの設定にある CursorPath で指定する」方法を採用することにしました。
次に、 code コマンドでファイルの行数や列位置を指定して開くオプションを調べたところ、 -g が使えそうでした。
% code --help Visual Studio Code 1.99.3 Usage: code [options][paths...] To read from stdin, append '-' (e.g. 'ps aux | grep code | code -') Options -g --goto <file:line[:character]> Open a file at the path on the specified line and character position.
ここまでを踏まえて次のように実装としたところ、ファイルの同じカーソル位置で VS Code が開きました。
System.getProperty("os.name").lowercase().contains("mac") -> { arrayOf(cursorPath, "-g", "$filePath:$line:$column") }
OpenProjectInCursorAction.kt
こちらも、元々は open を使っていました。
System.getProperty("os.name").lowercase().contains("mac") -> { arrayOf("open", "-a", "$cursorPath", projectPath) }
これを、先ほどと同じような方針で修正します。
System.getProperty("os.name").lowercase().contains("mac") -> { arrayOf(cursorPath, projectPath) }
build.gradle.kts
今回の修正したプラグインがインストールされていることを確認しやすくするよう、バージョンをちょっとだけ上げます。
version = "1.0.3.1"
ビルド
修正が終わったところでビルドします。環境構築で追加したGradleの build を実行します。
ビルドが終わると、 build/libs/ ディレクトリに switch2cursor-1.0.3.1.jar ができました。
動作確認
forkしたプラグインをRubyMineへインストールして動作確認します。
RubyMineへ次の設定を行います。
Settings > Plugins > 歯車マーク > Install Plugin from Diskで、先ほどビルドしたファイルを指定Settings > Tools > Switch2CursorにあるCursor Pathに/usr/local/bin/code(which codeして表示されたときの値) を設定
続いて次の操作を行い動作確認しましたが、良さそうです。
- RubyMineで
Option + Shift + Pを押すと、VS Codeで同じプロジェクトが開く- このとき、 「An external application wants to open」のようなメッセージが出ないこと
- RubyMineで
Option + Shift + Oを押すと、VS Codeで選択したファイル・行が開く- このとき、 「An external application wants to open」のようなメッセージが出ないこと
1点気になるのは、RubyMineからVS Codeを開くと、VS Codeのアイコンが増えたり減ったりすることでしょうか。このあたりは使っていくうちにどうしようか考えるかもしれません。
ソースコード
forkしたリポジトリはこちらです。
https://github.com/thinkAmi-sandbox/switch2cursor
VS Code向けの修正が入っているプルリクはこちら。もしビルドしたい場合は、このプルリクのブランチを使ってください。
https://github.com/thinkAmi-sandbox/switch2cursor/pull/1
*1:筆者はUltimateを使いますが、Communityでも大丈夫そうです
