dotfiles icon indicating copy to clipboard operation
dotfiles copied to clipboard

Fix dsB keybinding for ** delimiter with workaround

Open Copilot opened this issue 2 months ago • 5 comments

修正内容

問題

**foo**dsBを押下してもfooにならず、*foo*になってしまう問題。

根本原因

vim-operator-surroundのBキー(**区切り文字)は正しく動作しない既知の問題であることが判明しました。古いVimscript実装(.vim/autoload/vimrc.vim)でも同じ問題があり、ワークアラウンドが実装されていました。

コメントより:

" TODO: Workaround. For some reason 'B' ('**foo**') cannot be deleted
" TODO: `g:operator#surround#blocks.markdown[0].keys[1]` (`'B'`) does not work

実装した解決策

Vimscript実装と同じワークアラウンドをLuaで実装:

if obj_key == 'B' then
  -- Delete content between * (which leaves ** on each side)
  vim.cmd('normal! d' .. vim.api.nvim_replace_termcodes('<Plug>(textobj-between-i)*', true, false, true))
  -- Replace the remaining **** with the deleted content
  vim.cmd([[s/\*\*\*\*/{@"}/]])
  print('**deleted**')
  return
end

-- For other delimiters, use the original pattern
M.run_with_virtual_keymaps('va' .. obj_key .. '<Plug>(operator-surround-delete)')

ワークアラウンドの動作

**foo**でカーソルがfoo上にある場合:

  1. d<Plug>(textobj-between-i)*で単一*間のコンテンツを削除(**が両側に残る)
  2. s/\*\*\*\*/{@"}/で残った****を削除したコンテンツで置換
  3. 結果: **foo**foo

変更ファイル

  • .config/nvim/lua/nvim.lua
    • delete_mostly_inner_surround(): Bキーの特別処理を追加、他は元の'va'パターンを使用
    • replace_mostly_inner_surround(): 元の'va'パターンに戻した

期待される動作

  • **foo**dsBfoo (ワークアラウンド使用)
  • (foo)ds(foo (元のパターン)
  • 他の区切り文字も正常に動作
Original prompt

This section details on the original issue you should resolve

<issue_title>Neovim: normal-modeのdsBキーがうまく動いてない</issue_title> <issue_description>既知の動作: カーソルがfooのどこかの上にあるときにdsBを押下する場合

元:

**foo**

既知:

foo

現在:

*foo*

これを「既知」になるように直す。 </issue_description>

Comments on the Issue (you are @copilot in this section)

Custom agent used: PullRequest Creator An Agent to create PullRequests

  • Fixes aiya000/dotfiles#97

💬 We'd love your input! Share your thoughts on Copilot coding agent in our 2 minute survey.

Copilot avatar Dec 17 '25 11:12 Copilot