Skip to content

Centralize cmdline autocmd management: delegate register/unregister to denops API#168

Merged
Shougo merged 2 commits intomainfrom
copilot/centralize-autocmd-registration
Feb 24, 2026
Merged

Centralize cmdline autocmd management: delegate register/unregister to denops API#168
Shougo merged 2 commits intomainfrom
copilot/centralize-autocmd-registration

Conversation

Copy link
Contributor

Copilot AI commented Feb 24, 2026

ddc.ts's initialize() directly registered a CmdlineChanged autocmd alongside the autoload-managed ddc-cmdline augroup, splitting cmdline autocmd ownership across two layers. This PR moves all cmdline autocmd registration/deregistration into the denops side while preserving the autoload-controlled enable/disable lifecycle.

denops side (ddc.ts / app.ts)

  • Removed CmdlineChanged (for =/@ cmdline types) from initialize() — previously the only cmdline autocmd hardcoded in denops startup
  • Added registerCmdlineAutocmds() to Ddc class: registers the full ddc-cmdline augroup (CmdlineLeave, CmdlineEnter, CmdlineChanged for all types, ModeChanged c:n). Clears group first (helper.remove()) for idempotency
  • Added unregisterCmdlineAutocmds(): clears the ddc-cmdline group
  • Exposed both as dispatcher entries in app.ts
async registerCmdlineAutocmds(denops: Denops) {
  await autocmd.group(denops, "ddc-cmdline", (helper) => {
    helper.remove(); // idempotent
    helper.define("CmdlineLeave", "*", `call ddc#hide('CmdlineLeave')`, { nested: true });
    helper.define("CmdlineEnter", "*", `call ddc#on_event('CmdlineEnter')`, { nested: true });
    helper.define("CmdlineChanged", "*", `call ddc#on_event('CmdlineChanged')`, { nested: true });
    helper.define("ModeChanged", "c:n", `call ddc#_on_cmdline_leave()`, { nested: true });
  });
}

autoload side (autoload/ddc.vim)

  • Added ddc#_on_cmdline_leave(): public wrapper around s:disable_cmdline_completion(), required because denops-registered autocmds cannot invoke script-local functions
  • ddc#enable_cmdline_completion(): delegates to ddc#denops#_notify('registerCmdlineAutocmds', []) when denops is running; falls back to direct augroup creation otherwise (covers all cmdline types, matching the consolidated denops behavior)
  • s:disable_cmdline_completion(): delegates to ddc#denops#_notify('unregisterCmdlineAutocmds', []) when denops is running; falls back to autocmd! ddc-cmdline otherwise

Warning

Firewall rules blocked me from connecting to one or more addresses (expand for details)

I tried to connect to the following addresses, but was blocked by firewall rules:

  • jsr.io
    • Triggering command: /home/REDACTED/work/_temp/ghcca-node/node/bin/node /home/REDACTED/work/_temp/ghcca-node/node/bin/node --enable-source-maps /home/REDACTED/work/_temp/copilot-developer-action-main/dist/index.js (dns block)

If you need me to access, download, or install something from one of these locations, you can either:

Original prompt

目的

ddc.vim の autocmd 登録を一元化し、autoload 側(ユーザーが手動で一時的に有効化/無効化するコマンドライン補完用のハンドラ)と denops 側(常時登録する ModeChanged 等)との責務分離を保ちつつ、autocmd の登録/解除を denops 側で一元管理できるようにします。

背景

ddc.vim は現在、denops 側で一部の autocmd を直接 denops.cmd("autocmd ...") で定義しており、他の autocmd は autoload 側(ddc#enable_cmdline_completion)で augroup を作る構成になっています。設計意図としてコマンドライン補完は「ユーザーがそのセッションだけ有効化」する仕組みであるため、autocmd の制御を autoload 側に残す必要がありますが、登録処理そのものは denops 側で一元管理できると保守性が上がります。

変更点(要件)

  1. denops 側 API: autocmd の登録/解除を扱うエントリを追加

    • 追加する denops API 名(Entrypoint handlers):
      • register_cmdline_autocmds(): コマンドライン補完を有効化するために必要な autocmd を登録する。引数は不要。
      • unregister_cmdline_autocmds(): コマンドライン補完用に登録した autocmd を解除する。
    • これらは既存の Entrypoint 用オブジェクト(denops エントリポイントを実装しているファイル、例: denops/ddc/app.ts)に追加します。
    • 実装は現行の autocmd.group(denops, "ddc", ...) と helper.define(... ) を用いて登録/解除すること。
    • 実装は冪等にして、何度呼んでも重複登録が発生しないこと。
  2. denops 側の initialize(): 既存の denops.cmd("autocmd ddc ModeChanged ...") / denops.cmd("autocmd ddc CmdlineChanged ...") の直書きを削除し、次の方針で変更する。

    • ModeChanged のような常時登録する autocmd は denops 側の registerAutocmd() / autocmd.group を使って一元登録(initialize の流れで行う)。
    • CmdlineChanged 等の「一時的に有効化/無効化したい」autocmd 登録は denops 側からは自動登録しない(initialize から削除)。代わりに autoload 側から denops の register_cmdline_autocmds/unregister_cmdline_autocmds を呼ぶことで登録/解除する。
  3. autoload/ddc.vim の修正

    • ddc#enable_cmdline_completion() と s:disable_cmdline_completion() を修正して、現在の augroup/autocmd を直接生成する代わりに denops へ notify を送って denops 側に登録/解除を委譲する。
    • 既存のユーザー向け API(関数名と振る舞い)は変更しない。内部実装のみ置き換え。
    • 具体的には現状の augroup/ autocmd 定義を削除して、下記のような通知を行う:
      • call ddc#denops#_notify('registerCmdlineAutocmds')
      • call ddc#denops#_notify('unregisterCmdlineAutocmds')
    • 既存の getcmdtype() による条件は維持する。denops 側で define する際のコマンド展示文字列は元の条件をそのまま使用する(例: : if getcmdtype() !=# '=' && getcmdtype() !=# '@' | call ddc#on_event('CmdlineChanged') | endif など)。
  4. 互換性・安全性

    • 新 API は存在しない場合でも autoload のラッパがフォールバックできる設計とする。つまり、denops 側が registerCmdlineAutocmds を提供しない古いバージョンでも、autoload は既存の augroup を作成する従来実装に戻せるようにする(段階的ロールアウトを容易にする)。
    • denops 側の実装は重複登録を避け、unregister はグループ単位で安全に削除できること。
  5. テスト手順(PR に含めるチェックリスト)

    • (manual) :call ddc#enable() を実行して ModeChanged が autocmd グループ "ddc" に登録されていることを確認
    • (manual) ddc#enable_cmdline_completion() を呼んだ後、CmdlineEntered/Changed の autocmd が登録されることを確認
    • (manual) ddc#disable_cmdline_completion()(s:disable_cmdline_completion 実行)でコマンドライン用 autocmd が解除されることを確認
    • (manual) 既存のコマンドライン補完挙動(当該セッションのみ有効化されること)が維持されることを確認
  6. 変更ファイル(想定)

    • denops/ddc/app.ts (Entrypoint): エクス��ートオブジェクトに registerCmdlineAutocmds / unregisterCmdlineAutocmds を追加
    • denops/ddc/ddc.ts: initialize() の直書き denops.cmd の削除 (CmdlineChanged 関連) と ModeChanged の registerAutocmd 経路への統合(必要なら registerAutocmd の拡張)
    • autoload/ddc.vim: ddc#enable_cmdline_completion() / s:disable_cmdline_completion() を denops notify を使う実装へ変更。フォールバックロジックを追加。
    • autoload/ddc/denops.vim: もし _notify ラッパの名前や引数が違う場合は適切に呼び出すよう調整(既存の ddc#denops#_notify API を使う想定)。

実装上の細かい注意点

  • denops の Entrypoint で提供するメソッド名(registerCmdlineAutocmds / unregisterCmdlineAutocmds)は既存エンドポイントの命名規則に合わせる(例: registerPath / onEvent などの既存ハンドラと一貫させる)。
  • autocmd.define に渡すコマンド文字列は元の挙動(getcmdtype() 条件など)を正確に保つ。Vimscript の中のシンタックス(改行、パイプ、: 等)は Denops の autocmd helper が扱える形式に整形する。
  • unregister は autocmd.group の helper API で安全に行う(helper.define が追加したものだけを解除するか、グループ全体をクリアできる実装にする)。

PR タイトル案

"centralize autocmd management: add denops API to register/unregister cmdline autocmds and delegate autoload commandline enable/disable"

その他

  • この PR では機能の振る舞いを変えない(既存互換を保持)ことを重視します。将来的に完全に denops 側に移す場合は別 PR で行います。

作業を進めてよいですか?ブランチ名の希望があれば教えてください(指定がなければ feature/centralize-autocmds を使用します)。

This pull request was created from Copilot chat.


✨ Let Copilot coding agent set things up for you — coding agent works faster and does higher quality work when set up for your repo.

Copilot AI changed the title [WIP] Refactor autocmd registration for ddc.vim Centralize cmdline autocmd management: delegate register/unregister to denops API Feb 24, 2026
Copilot AI requested a review from Shougo February 24, 2026 10:48
@Shougo Shougo marked this pull request as ready for review February 24, 2026 11:51
- Add registerCmdlineAutocmds()/unregisterCmdlineAutocmds() to Ddc class
- Remove CmdlineChanged from initialize() (moved to registerCmdlineAutocmds)
- Add registerCmdlineAutocmds/unregisterCmdlineAutocmds to denops dispatcher
- Add ddc#_on_cmdline_leave() public wrapper for script-local function
- Update ddc#enable_cmdline_completion() to delegate to denops with fallback
- Update s:disable_cmdline_completion() to delegate to denops with fallback

Co-authored-by: Shougo <41495+Shougo@users.noreply.github.com>
@Shougo Shougo force-pushed the copilot/centralize-autocmd-registration branch from 0813146 to 6363611 Compare February 24, 2026 11:57
@Shougo Shougo merged commit b8109f3 into main Feb 24, 2026
3 checks passed
@Shougo Shougo deleted the copilot/centralize-autocmd-registration branch February 24, 2026 11:59
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants