Andy Melnikov (nponeccop) wrote,
Andy Melnikov
nponeccop

Category:

Ещё одно чудо враждебной техники

Теперь это vim-syntastic

По совету друзей™ придумал и воплотил коварный план обновления cabal-install: собрал бинарный пекедж cabal-install 1.18.x используя б-ку Cabal 1.18, установленную на время сборки в песочницу. Потом обновил системный cabal-install на свой.

Так что теперь у меня есть cabal sandbox. Удивительно в нем то, что используется командная строка в старом виде, т.е. есть обратная совместимость, и всё что поддерживает простой cabal - поддерживает и sandbox, за исключением этапа создания песочницы.

Syntastic ставится просто и не требует конфигурации:

yaourt -S vim-syntastic haskell-ghc-mod

После чего по каждому сохранению запускается ghc-mod check, который из коробки понимает cabal sandbox.

Найденные проблемы красиво отображаются значками >> на "гуттере" (kak eto porusski?). Также можно огласить весь список, открыв :Errors

Но есть проблемы.

1. ghc-mod нельзя передать дополнительных аргументов.

По умолчанию он генерирует тучу ворнингов типа -Wall. А я пользуюсь скопипащенным кодом большой лигаси-библиотеки, и получаю 100500 ворнингов с ворнингами по смыслу в самом конце. Хотелось бы хотя бы передать -g -fno-warn-missing-signatures -g -fno-warn-name-shadowing, чтобы не предлагал фиксить совершенно уж низкоприоритетные вещи.

2. Syntastic (барабанная дробь!) НЕ. ПОДДЕРЖИВАЕТ. МНОГОСТРОЧНЫХ. ОШИБОК.

Когда-то просто показывалась первая строка ошибки. Но я засабмиттил (давно) баг, и теперь (внимание!) он соединяет строки ошибки в длинную колбасу.

Представьте себе теперь такой файлик:
main = do
          print 42
          print $ () + 2 
          print 666
При компиляции ghc выдает такой аски-арт:
Foo.hs:3:20:
    No instance for (Num ()) arising from a use of `+'
    Possible fix: add an instance declaration for (Num ())
    In the second argument of `($)', namely `() + 2'
    In a stmt of a 'do' block: print $ () + 2
    In the expression:
      do { print 42;
           print $ () + 2;
           print 666 }
ghc-mod check выдает

Foo.hs:3:20:No instance for (Num ()) arising from a use of `+'Possible fix: add an instance declaration for (Num ())In the second argument of `($)', namely `() + 2'In a stmt of a 'do' block: print $ () + 2In the expression: do { print 42; print $ () + 2; print 666 }

После чего в vim получается в панели :Error такоэ:

Foo.hs|1 col 19 error| No instance for (Num ()) arising from a use of `+'Possible fix: add an instance declaration for (Num ())In the second argument of `($)', namely `() + 2'In the expression: print $ () + 2In an equation for `main': main = print $ () + 2

А в последней строке начальная часть этой строки, которая уместилась в 1 строчку:

No instance for (Num ()) arising from a use of `+'Possible fix: add an instance declaration for (Num ())In the second argument of `($)', namely `() + 2'In a stmt of a 'do' block: print $ () + 2In the expression: do { print 42; print $ () + 2; print 666 }

Какой жопой они думали, я не знаю. Syntastic поддерживает крестики, где многострочные ошибки - норма.

Блядь (у меня уже нет слов). В крестиках он вообще ничего не показывает. На этом коде говорит что вообще нет ошибок, и панель :Errors показывать отказывается:
template <typename F>
void Foo(F bar)
{
        return bar + 1;
}

struct Baz {};

void bar()
{
        Baz quux;
        Foo(quux);

}
А если bar + 1 заменить на F + 1 (ошибка попроще) - то уже показывает. Короче, остались одни выражения.

Upd: https://github.com/scrooloose/syntastic/issues/860
Subscribe

  • Post a new comment

    Error

    default userpic

    Your reply will be screened

    Your IP address will be recorded 

    When you submit the form an invisible reCAPTCHA check will be performed.
    You must follow the Privacy Policy and Google Terms of use.
  • 5 comments