Após uma rápida olhada na documentação ( help v_aquote , help v_iquote ), estou inclinado a dizer que isso é um erro em ci" , em vez de uma deficiência em ci( . O comportamento ci( observado é consistente com ci{ e ci[ .
Dito isso, você pode obter o comportamento desejado de ci( com esse mapeamento:
nnoremap ci( f(ci(
--- EDIT ---
--- (Esta questão foi migrada para superusuário, da qual não sou membro)
A função / mapeamento a seguir tem um comportamento diferente dependendo se um ( precedente é detectado. Ele resolve o problema (a) (b) com meu mapeamento original (como apontado nos comentários). Ainda pode não ser perfeito embora ...
function New_cib()
if search("(","bn") == line(".")
sil exe "normal! f)ci("
sil exe "normal! l"
startinsert
else
sil exe "normal! f(ci("
sil exe "normal! l"
startinsert
endif
endfunction
nnoremap ci( :call New_cib()<CR>
nnoremap cib :call New_cib()<CR>