我交出了一些遗留代码,首先我要更改
(int)a + b;
进入
static_cast<int>(a) + b;
它们中有很多并且手动完成它们非常耗时。有没有办法使用vim来实现这一目标?
我试过像
这样的东西:%s/\(int\).* /static_cast<int>(\2)/g
但它不起作用。请指教。
答案 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
...