sk0ya.Editor.Controls
1.0.4
dotnet add package sk0ya.Editor.Controls --version 1.0.4
NuGet\Install-Package sk0ya.Editor.Controls -Version 1.0.4
<PackageReference Include="sk0ya.Editor.Controls" Version="1.0.4" />
<PackageVersion Include="sk0ya.Editor.Controls" Version="1.0.4" />
<PackageReference Include="sk0ya.Editor.Controls" />
paket add sk0ya.Editor.Controls --version 1.0.4
#r "nuget: sk0ya.Editor.Controls, 1.0.4"
#:package sk0ya.Editor.Controls@1.0.4
#addin nuget:?package=sk0ya.Editor.Controls&version=1.0.4
#tool nuget:?package=sk0ya.Editor.Controls&version=1.0.4
Editor
Editor は、WPF で作られた Vim ライクなテキストエディタです。
コアロジックと UI を分離した 3 層構成になっており、Vim 操作の多くを Editor.Core で処理します。
主な機能
- Normal / Insert / Visual / Visual Block / Visual Line モード
- ドットコマンド (
.)、レジスタ、マーク、マクロ :substitute、:changes/:jumps/:undolist/:earlier/:later、コマンド履歴、.vimrc/_vimrc読み込み- Vimscript 設定の基本機能(
:let、:echo、:execute、:if/:else/:endif、:for/:endfor、:function/:endfunction、:call。関数は.vimrc/:source内で定義でき、a:arg形式の引数と再帰深さ制限に対応) - シンタックスハイライト(複数言語対応)
- LSP 連携(補完、ホバー、診断、定義ジャンプ、参照検索、シグネチャヘルプ、フォーマット、リネーム、コードアクション、スマート選択範囲)
- マルチバッファ、タブ、ウィンドウ分割(
:split/:vsplit/Ctrl+Wプレフィックス) - Quickfix(
:copen/:cclose/:cn/:cp/:cc N/:cl)と Location list(:lopen/:lclose/:lnext/:lprev/:ll [N]/:llist) - LSP ワークスペース診断(
:diagnostics/:diag、workspace/diagnostic対応サーバーで複数ファイルの診断を References パネルに表示) - プロジェクト横断検索・置換(
:grep/:vimgrep/:grepreplace/:creplace、Quickfix 結果から確認付き一括置換) - コードフォールド(
za/zc/zo/zR/zM/zf) - テキストオブジェクト(
iw/awなど、Visual character mode の3iw/2awカウント付き選択に対応) - サラウンド操作(
ys/cs/ds) - コメントトグル(
gc/gcc) - Git 差分表示・ブレームアノテーション(
:Git blame) - スペルチェック(
set spell、]s/[s/z=) - 大規模ファイル向けの可視範囲構文解析・描画キャッシュ
- 統合ターミナル(
:terminal/:term、複数起動、:terms/:termnext/:termprev/:termselect N/:termclose [N]) - セッション管理(
:mksession/:source) - テキスト整形(
gq{motion}/gqq)
動作環境
- Windows 10/11(WPF アプリ)
- .NET SDK 9.0 以上
ビルド・実行
# ソリューション全体をビルド
dotnet build Editor.sln
# アプリ起動
dotnet run --project src/Editor.App/
# 指定ファイルを開いて起動(引数1つ目をファイルパスとして解釈)
dotnet run --project src/Editor.App/ -- "C:\path\to\file.cs"
# リリースビルド
dotnet build Editor.sln -c Release
テスト
# Core テストを実行
dotnet test tests/Editor.Core.Tests/
# 特定テストを実行
dotnet test tests/Editor.Core.Tests/ --filter "FullyQualifiedName~VimEngineTests.DD_DeletesLine"
アーキテクチャ
依存方向は次の通りです。
Editor.App -> Editor.Controls -> Editor.Core
Editor.App -> Editor.Controls.Defaults
Editor.Controls.Defaults -> Editor.Controls
Editor.Controls.Defaults -> Editor.Core
Editor.Core.Tests -> Editor.Core
src/Editor.CoreWPF 非依存の Vim エンジン、バッファ、Ex コマンド、シンタックス、フォールドなどの純ロジック層src/Editor.ControlsVimEditorControl/EditorCanvasを含む、NuGet 化対象の WPF コントロール層src/Editor.Controls.DefaultsGit / LSP の既定実装をまとめた補助 DLL。Editor.Controlsに注入して使うsrc/Editor.Appメインウィンドウ、タブ管理、ファイルツリーなどのホストアプリ層tests/Editor.Core.TestsEditor.Coreのユニットテスト
NuGet パッケージ
Editor.CoreVim エンジンやテキスト処理のコアロジックEditor.Controls再利用可能なVimEditorControl本体Editor.Controls.DefaultsEditor.Controls用の既定 Git/LSP 実装
このリポジトリの NuGet 配布先は nuget.org です。公開パッケージは認証なしで取得できます。
利用側のアプリでは、コントロール本体と既定実装を追加します。
dotnet add package sk0ya.Editor.Controls --version 1.0.1
dotnet add package sk0ya.Editor.Controls.Defaults --version 1.0.1
sk0ya.Editor.Core は上記パッケージの依存として自動的に取得されます。
Editor.App では VimEditorControlDefaults.CreateOptions() を使って既定の Git/LSP 実装を注入しています。
NuGet 公開
.github/workflows/publish-nuget.yml は次の条件で nuget.org にパッケージを公開します。
v*形式の Git タグを push したとき- GitHub Actions の
workflow_dispatchで手動実行したとき(versionを指定)
公開には GitHub リポジトリのシークレット NUGET_API_KEY(nuget.org の API キー)が必要です。タグ v1.0.1 を push すると、1.0.1 を package version として sk0ya.Editor.Core / sk0ya.Editor.Controls / sk0ya.Editor.Controls.Defaults を nuget.org に push します。
LSP キーバインド
| キー | モード | 動作 |
|---|---|---|
K |
Normal | ホバー情報をステータスバーに表示 |
gd |
Normal | 定義にジャンプ |
gr |
Normal | 全参照を検索(References パネル) |
ga |
Normal | コードアクション(j/k/Enter/Esc で選択) |
F2 |
Normal | シンボルのリネーム |
Shift+Alt+Right |
Normal/Visual | LSP selectionRange で選択範囲を親へ拡張 |
Shift+Alt+Left |
Visual | LSP selectionRange で選択範囲を直前段階へ縮小 |
Ctrl+Space |
Insert | 補完トリガー |
↓/Ctrl+N、↑/Ctrl+P |
Insert+補完 | 補完候補を移動 |
Tab/Enter |
Insert+補完 | 選択候補を挿入 |
:Format |
コマンド | LSP でドキュメントをフォーマット |
:Rename [name] |
コマンド | LSP リネーム(名前省略時はダイアログ) |
:diagnostics / :diag |
コマンド | LSP workspace/diagnostic でワークスペース診断を取得し、References パネルに表示 |
:lopen / :llist |
コマンド | 現在バッファの診断、または検索結果を Location list として表示 |
:lnext / :lprev / :ll [N] |
コマンド | 現在バッファの Location list 内を移動 |
LSP 対応サーバー
LSP サーバー本体は同梱していません。必要なサーバーを個別にインストールしてください。
| 拡張子 | サーバー |
|---|---|
.cs |
csharp-ls |
.py |
pylsp |
.ts / .js |
typescript-language-server |
.rs |
rust-analyzer |
.go |
gopls |
.c / .cpp |
clangd |
.lua |
lua-language-server |
.md / .markdown |
marksman |
ウィンドウ分割
| コマンド | 動作 |
|---|---|
:split / :sp |
水平分割 |
:vsplit / :vs |
垂直分割 |
Ctrl+W w |
次のウィンドウへ |
Ctrl+W q |
ウィンドウを閉じる |
Ctrl+W h/j/k/l |
方向を指定してウィンドウ移動 |
Ctrl+W v |
垂直分割 |
Ctrl+W s |
水平分割 |
サラウンド操作
| コマンド | 動作 |
|---|---|
ys{motion}{char} |
モーション範囲を囲む |
cs{old}{new} |
囲み文字を変更 |
ds{char} |
囲み文字を削除 |
コメントトグル
| コマンド | 動作 |
|---|---|
gcc |
カレント行のコメントをトグル |
gc{motion} |
モーション範囲のコメントをトグル |
Visual + gc |
選択範囲のコメントをトグル |
テーマ
Dracula(デフォルト)NordTokyoNightOneDark
テーマは VimEditorControl.SetTheme(EditorTheme) で変更できます。
設定(.vimrc)
起動時にホームディレクトリまたはプロジェクトディレクトリの .vimrc / _vimrc / init.vim を読み込みます。
set tabstop=4
set expandtab
set scrolloff=8
set number
set relativenumber
set spell
set textwidth=80
let mapleader = " "
nnoremap <Leader>w :w<CR>
nnoremap <Leader>q :q<CR>
function ApplyProjectDefaults(name)
let g:project_name = a:name
if 1
for item in [1, 2]
let g:last_project_item = item
endfor
endif
endfunction
call ApplyProjectDefaults('editor')
modeline は安全側の既定として無効です。.vimrc で set modeline を指定すると、ファイル読み込み時に先頭または末尾 5 行から vim: set option=value option ...: 形式だけを解釈し、既存の set オプションに反映します。任意の Ex コマンドは実行しません。
set modeline
参考
- 今後の実装計画と実装済み機能:
ROADMAP.md
| Product | Versions Compatible and additional computed target framework versions. |
|---|---|
| .NET | net9.0-windows7.0 is compatible. net10.0-windows was computed. |
-
net9.0-windows7.0
- sk0ya.Editor.Core (>= 1.0.4)
NuGet packages (1)
Showing the top 1 NuGet packages that depend on sk0ya.Editor.Controls:
| Package | Downloads |
|---|---|
|
sk0ya.Editor.Controls.Defaults
Default Git and LSP integrations for the Editor WPF control. |
GitHub repositories
This package is not used by any popular GitHub repositories.