vim中的自动try / catch语句

时间:2016-05-11 11:48:08

标签: vim automation try-catch

我发现自己输入了类似

的内容
class Foo{
   myFancyType bar();
}

myFancyType Foo::bar()
{
    try{
        //do some stuff
    }
    catch(myFavoriteExceptionType &e){
        std::cerr<<e.what()<<std::endl;
        throw myFavoriteExceptionType("Foo::bar() failed");
    }
}

非常,非常,非常,经常。

我目前正在使用vim,但我的搜索失败了。是否有一些插件可以自动化在定义函数时手动插入try / catch语句的令人讨厌的重复性任务?

2 个答案:

答案 0 :(得分:1)

确实,你可以使用这个插件,它被称为snipmate,并受到textmate自动代码段插入的启发。它通常使用tab键触发,但可以设置为任何其他领导键击。它的工作方式非常简单:假设您已经为try catch定义了一个片段,那么您只需在插入模式try<tab>中编写它,然后插入try catch构造。连续的标签会让你跳转到需要输入的代码片段的不同部分(比如你捕获的内容,你想如何处理它,最后是尝试过的代码)。

另一个选择是尝试尝试比snipmate更聪明的UltiSnips,因为你可以在解析片段时运行一些代码。

你也可以在没有任何插件的情况下制作片段。您可以使用map执行正常模式,或abbrev执行插入模式:

map <leader>st maotry {<CR>} catch (my_exception err) {<CR>std::cerr<<e.what()<<std::endl;<CR>throw myFavoriteExceptionType("Foo::bar() failed");<CR>}<ESC>='a'ao

将设置标记(ma),在下一行(o)开始编辑,将模板代码写入<ESC>。然后它将从标记(='a)开始对齐代码,最后跳转到标记以开始编辑try {}块。

或者您也可以使用缩写:

iabbrev try <C-o>matry {<CR>} catch (my_exception err) {<CR>std::cerr<<e.what()<<std::endl;<CR>throw myFavoriteExceptionType("Foo::bar() failed");<CR>}<ESC>='a'ao

虽然你在插入模式下输入,但它会做同样的事情。

HTH

答案 1 :(得分:0)

lh-cpp中,我在trycatch上提供(上下文相关的)(插入模式)缩写,映射可以使用try{...}catch{}catch(){...},以及可以同时执行这两项操作的摘要。

还提供了其他C和C ++控制语句的片段,缩写和映射。

PS:在每一步中捕获异常通常是非常糟糕的C ++模式(在其他语言中有例外)。请参阅E.17 and E.18 in CppCoreGuidelines. - E.17:不要尝试捕获每个函数中的每个异常; E.18:尽量减少使用显式的try / catch