如何将C样式转换为在vim中转换为C ++样式

时间:2016-01-15 03:39:04

标签: c++ vim

我交出了一些遗留代码,首先我要更改

(int)a + b;

进入

static_cast<int>(a) + b;

它们中有很多并且手动完成它们非常耗时。有没有办法使用vim来实现这一目标?

我试过像

这样的东西
:%s/\(int\).* /static_cast<int>(\2)/g

但它不起作用。请指教。

3 个答案:

答案 0 :(得分:6)

试试这个:

:%s/(\(.*\))\([^ ]*\)/static_cast<\1>(\2)/g

根据您的问题,这个正则表达式假设变量名后面会有一个空格:

示例:
对于以下测试数据:

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

结果将是

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

解释正则表达式

(\(.*\)) - 匹配()内的任何内容并将其捕获 \([^ ]*\) - 后跟任何不是空格的东西并将其捕获

答案 1 :(得分:0)

您可以使用:

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

假设变量名始终为a。如果不是,则可以将a替换为[a-z]

答案 2 :(得分:0)

我在lh-cpp中为此任务提供了多个映射。

在这种情况下,它应为,,sc,,rc,,dc。 (此处,,实际上是我的<localleader>)。

它实际上实现为:

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

...