8
votes

Comment convertir c style C en jeux de style C ++ dans Vim

J'ai eu la main sur un code hérité et je veux d'abord changer xxx

dans xxx

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?

J'ai essayé quelque chose comme xxx

mais cela ne fonctionne pas. S'il vous plaît conseil.


2 commentaires

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) (ce qui signifie la même chose). C'est-à-dire, n'introduisez pas nouvelle verbosité inutile .


Vous auriez probablement de meilleurs résultats en utilisant quelque chose comme Clang-Tidy .


3 Réponses :


6
votes

Essayez ceci:

static_cast<int>(a) + b
static_cast<float>(x) * y
static_cast<int>(z+m)


3 commentaires

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 [^] (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) est analysé sur static_cast ((p) + q) . OTOH, il est assez évident que z + m aurait été mieux analysé si nous avions utilisé [^ + - * /% ^ & |] . Aucune solution rapide pour (int) arr [i]


@ 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 . Mais content que cela vous ait aidé à son formulaire actuel aussi.



0
votes

Vous pouvez utiliser ceci:

%s/(int)\(a\)/static_cast<int>(\1)/g


1 commentaires

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.



0
votes

J'ai plusieurs mappages pour cette tâche dans LH-CPP .

Dans ce cas, ce sera , sc code> ou , rc code> ou , dc code>. (Ici, , code> est en fait mon code>). p>

Il est en fait implémenté comme suit: p>

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

...


0 commentaires