2016-05-11 2 views
0

Я считаю себя печатая что-то вродеавтоматические заявления попробовать/уловах в Vim

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 при определении функции?

+0

гул ... на самом деле это не _really_ вне темы, поскольку ОП выявил проблему с его процессом редактирования vim и ищет решение. Я также обновляю свой ответ, чтобы дать OP способ сделать это без плагина, но только с внутренними компонентами vim (когда у меня кончились батареи) ☺ – zmo

+0

К сожалению, многие считают, что вопросы о настройке инструментов программирования не приветствуются на SO , Они предпочли бы разбросать сообщество, которое овладевает этими инструментами на нескольких сайтах :( Кстати, ручное решение действительно может быть дано, но это не обеспечит лучший опыт конечного пользователя, когда уже существуют сложные плагины, которые решают проблему выраженный OP - когда плагины сложны, скорее всего, необходимость не в том, что тривиальна или полностью сформулирована (например, никто не хочет, чтобы 'try' расширялся в контексте строк или комментариев, а некоторые хотели бы' {'на новых строках, другие нет и т. д.) –

+0

ну, я бы проголосовал за это, чтобы быть дубликатом для http://stackoverflow.com/questions/15334/how-to-create-short-snippets-in-vim :-) или, может быть, иначе переехал в vi SE! но в любом случае ... – zmo

ответ

1

действительно есть плагин, который вы можете использовать с этой целью, он называется snipmate и был вдохновлен автоматической вставкой textmate. Обычно он запускается с помощью ключа tab, но его можно установить на любое другое нажатие клавиши. То, как это работает, довольно просто: если у вас есть фрагмент, определенный для try catch, вы просто пишете в режиме вставки try<tab>, и он введет конструкцию try catch. Последовательные вкладки позволят вам перейти к различным частям фрагмента, которые потребуют ввода (например, то, что вы поймаете, как вы хотите с этим справиться, и, наконец, проверенный код).

Другой вариант для вас было бы попытаться UltiSnips, что пытается быть умнее, чем snipmate, как вы можете иметь некоторый код, который работает при разрешении сниппет.

вы также можете сделать фрагменты без каких-либо плагинов. Вы можете использовать либо 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 

, который будет делать то же самое, но в то время как вы печатаете в режиме вставки.

НТН

+0

Отображение и аббревиатура должны быть '' -local и 'nore' (чтобы избежать проблем с плагинами брекетинга). Более того, я подозреваю, что отображение не будет работать в визуальном режиме, оно должно быть явно «nnoremap». Тогда улов должен быть с const-ссылкой, но это еще одна проблема, не связанная с vim :) –

0

В lh-cpp, я обеспечиваю (контекстно-зависимой) (вставка-режим) сокращения на try и catch, отображения могут может окружать выбор с try{...}catch{} или catch(){...}, и фрагменты, которые могут сделать оба.

Также предлагаются фрагменты, сокращения и сопоставления для других контрольных операторов C и C++.

PS: исключения на каждом шаге обычно и очень плохой шаблон на C++ (на и других языках с исключениями). См. E.17 and E.18 in CppCoreGuidelines. - E.17: не пытайтесь поймать каждое исключение в каждой функции; E.18: Сведите к минимуму использование явной попытки/уловки

Смежные вопросы