J'ai eu la main sur un code hérité et je veux d'abord changer dans p> Il y en a beaucoup d'entre eux et Les faire manuellement, c'est beaucoup beaucoup de temps. Existe-t-il un moyen d'utiliser Vim pour que cela se produise? P> J'ai essayé quelque chose comme p> mais cela ne fonctionne pas. S'il vous plaît conseil. P> p>
3 Réponses :
Essayez ceci:
static_cast<int>(a) + b static_cast<float>(x) * y static_cast<int>(z+m)
Il pourrait être un peu trop flexible puisque quoi que ce soit dans les supports qui ne sont pas conçus comme celles de style C seront également changés, mais cela fonctionne!
Si je comprends correctement la regex, le bit [^] code> (pas espace) est la partie qui détermine les termes qui vont à l'intérieur de la distribution. C'est essentiellement un problème d'analyse, de complexité non liée - une regex ne peut jamais le résoudre. (int) (p + q) code> est analysé sur static_cast z + m code> aurait été mieux analysé si nous avions utilisé [^ + - * /% ^ & |] code>. Aucune solution rapide pour (int) arr [i] code>
@ user3667089: vrai, la regex est assez simpliste. Mais peut être facilement étendu à ne correspond à certains des types de données de base en modifiant la regex à ce :% s / (\ (int \ | float \ | double \ \ \) / static_cast <\ 1> (\ 2) / g code>. Mais content que cela vous ait aidé à son formulaire actuel aussi.
Vous pouvez utiliser ceci:
%s/(int)\(a\)/static_cast<int>(\1)/g
Le problème est que vous lancez des expressions, pas des variables. Il n'y a pas d'expression régulière qui peut capturer toutes les expressions et les expressions seulement.
J'ai plusieurs mappages pour cette tâche dans LH-CPP .
Dans ce cas, ce sera Il est en fait implémenté comme suit: p> , sc code> ou , rc code> ou , dc code>. (Ici, , code> est en fait mon function! s:ConvertToCPPCast(cast_type)
" Extract text to convert
let save_a = @a
normal! gv"ay
" Strip the possible brackets around the expression
let expr = matchstr(@a, '^(.\{-})\zs.*$')
let expr = substitute(expr, '^(\(.*\))$', '\1', '')
"
" Build the C++-casting from the C casting
let new_cast = substitute(@a, '(\(.\{-}\)).*',
\ a:cast_type.'<\1>('.escape(expr, '\&').')', '')
" Do the replacement
exe "normal! gvs".new_cast."\<esc>"
let @a = save_a
endfunction
vnoremap <buffer> <LocalLeader><LocalLeader>dc
\ <c-\><c-n>:'<,'>call <sid>ConvertToCPPCast('dynamic_cast')<cr>
nmap <buffer> <LocalLeader><LocalLeader>dc viw<LocalLeader><LocalLeader>dc
...
Je convertirais les moulages du pointeur en moulages nommés C ++, car l'exactitude, mais ces considérations ne s'appliquent pas aux couts de type de numéro, que je voudrais juste partir en place ou éventuellement convertir en notation C ++
int (a) code> (ce qui signifie la même chose). C'est-à-dire, n'introduisez pas nouvelle verbosité inutile i>.Vous auriez probablement de meilleurs résultats en utilisant quelque chose comme Clang-Tidy .