PhpStorm 2017.3


Всем привет!


Вот и состоялся очередной релиз PhpStorm, третий в этом году. В этот раз, помимо добавления новых возможностей и исправления старых проблем, мы уделили особенное внимание производительности, повысив отзывчивость редактора при наборе текста и увеличив скорость работы некоторых инспекций. Помимо этого, мы поддерживаем контакт с авторами популярных плагинов, помогая им сделать их как можно быстрее.


Для вступления, я думаю, достаточно. Стоит разве что добавить, что статья является вольным переводом страницы “What’s new”. Скачать новую версию можно по предыдущей ссылке или с помощью Toolbox App. Как всегда, доступна 30-дневная пробная версия. Полную же версию могут использовать обладатели действующей подписки на PhpStorm или All Products pack, а также студенты и разработчики проектов с открытым исходным кодом.


Погнали! (Осторожно, под катом 2873.15 Кбайт картинок.)


REST-клиент в редакторе кода


С незапамятных времен в комплекте с PhpStorm идет плагин REST Client. Даже если вы с ним не знакомы, то можете представить его функциональность, если когда-либо использовали Postman или что-нибудь подобное. Мы решили пересмотреть эту концепцию и сделали REST-клиент, работающий напрямую с запросами в формате RFC 2616.


REST-клиент


Можно как вставить в редактор имеющийся запрос, так и написать новый. Во втором случае привычные любому пользователю IDE автодополнение и рефакторинги упростят работу. Сформированный запрос можно выполнить прямо из редактора, и там же увидеть ответ.


Все данные хранятся в текстовых файлах с расширением .http, так что референсные запросы можно держать в любимой VCS прямо рядом с кодом. Части специфичные, например, для тестового или боевого окружения, можно прятать за переменными.


Переменные окружения


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


Сравнение файлов


Подробнее и с картинками про REST-клиент — в нашем блоге, правда, на английском языке.


Производительность редактора


Как уже упоминалось во вступительной части, улучшения производительности коснулись редактирования. В мире PHP нередко встречаются файлы с тысячами, а иногда десятками тысяч строк! Мы, например, очень любим тестировать скорость работы PhpStorm на Mpdf.php. Это ядерная смесь из PHP, HTML и JS в одном флаконе объемом 1 МБ (порядка 40к строк кода). Обычно, если что-то работает быстро для mPDF, оно работает быстро для всего.


Тест производительности


Так вот, в новой версии задержки вывода символов на экран удалось сократить в четыре раза! Тем, кто работает с большими и огромными файлами, должно стать приятнее редактировать. Если же у вас в проекте ООП и по файлу на класс, вы разве что заметите слегка увеличившийся срок работы от батареи. Кстати, о батарее: Power save mode не только экономит энергию, но и ускоряет работу IDE.


Nullable-типы при рефакторинге


PhpStorm поддерживает большую часть нововведений PHP 7.1 с момента релиза, который состоялся почти год назад. Однако мы продолжаем улучшать продукт, чтобы еще больше упростить использование новой версии языка. В этот раз изменения коснулись рефакторингов Extract interface и Change signature.


Рефакторинг Change signature


Модификации, совершаемые упомянутыми рефакторингами, теперь сохраняют метку nullable (?) для типов параметров и возвращаемого типа. Диалоги же, в свою очередь, позволяют эту метку добавить или убрать.


Шаблоны генерации кода


Диалог создания нового класса теперь дает возможность выбирать не только из имеющегося набора типов (класс, интерфейс или типаж), но и из списка пользовательских шаблонов.


Диалог создания нового класса


Новая переменная ${NAMESPACE} позволяет подставить имя неймспейса в шаблон. Пригодится в проектах, использующих PSR-0 / PSR-4 пространства имен. Также во всех шаблонах PHPDoc теперь можно использовать переменные с текущей датой и/или временем.


Контроль исключений


PhpStorm уже давно умеет отслеживать выбрасываемые исключения. Инспекция Missing @throws tag(s) с 2012 года предлагает обновить PHPDoc, если в нем отсутствует соответствующий тег. Однако пользователям хотелось большего. Так появились сразу три новые инспекции: Unhandled exception, Redundant @throws tag и Redundant catch clause.


Инспекция Unhandled exception подсвечивает выражение, из которого может быть выброшено исключение. Выражение не должно быть обернуто в try-catch-блок, а исключение не должно быть задекларировано в вышележащей функции с помощью @throws. Чтобы быстро исправить проблему, сгенерируйте try-catch или добавьте @throws.


Инспекция Unhandled exception


Инспекции Missing @throws tag(s) давно нужна была пара. Если можно забыть задекларировать исключение, то можно забыть и лишнюю декларацию убрать, верно? Redundant @throws tag рапортует об исключениях, которые, по мнению анализатора, из функции не выбрасываются. PhpStorm предлагает @throws с таким исключением удалить или же обновить PHPDoc целиком.


Инспекции Missing @throws tag(s)


Завершает список Redundant catch clause. Если внутри catch-блока обрабатывается исключение, которое внутри него не выбрасывается, такой блок будет отмечен инспекцией как излишний. Для устранения проблемы предлагается такой блок удалить.


Инспекция Redundant catch clause


В отличие от уже существовавшей инспекции Missing @throws tag(s), три новые гораздо интенсивнее работают с кодом. Без доработки анализатора они бы существенно замедлили IDE. Однако скорость новой версии PhpStorm почти не изменилась, а отдельно взятая Missing @throws tag(s) стала быстрее в несколько раз — еще один пример работы над производительностью.


Тестирование


Диалог создания нового теста расширился шаблонами для тестов Codeception Unit, Codeception Functional и PHPSpec.


Диалог создания нового теста


Сам же диалог претерпел изменения и теперь позволяет выбрать один или несколько методов, для которых должны быть созданы заглушки.


Диалог создания нового теста


Если вы используете PHPUnit-аннотацию @dataProvider, то порадуетесь возможности перезапускать только один тест из упавшего набора.


Перезапуск теста


Кроме того, новый PhpStorm позволяет найти и сгенерировать недостающий провайдер.


Генерация недостающего провайдера


Twig


Появилась возможность вставлять различные языки между произвольными тегами или внутрь именованных блоков. Такие “инъекции” можно создавать как на лету, так и с помощью заранее подготовленных правил.


Инъекции


Кроме того, улучшено форматирование сложных структур. В частности, их выравнивание.


Форматирование сложных структур


Веб-технологии


Командой WebStorm была улучшена поддержка Vue.js. Например, автодополнение и навигация теперь работают для свойств и методов Vue-компонентов. Закрывающая фигурная скобка автоматически добавляется во время печати во Vue-шаблонах. А также добавлена коллекция снипетов, позволяющих ускорить написание распространенных кусков кода. Новый же шаблон Vue-файлов позволяет ускорить создание компонентов.


Vue.js


Обновилась и поддержка JavaScript. Теперь для автодополнения стандартных объектов и методов JS PhpStorm “под капотом” использует TypeScript declaration-файлы. Благодаря этому, в том числе, улучшилась документация для методов (она берется из этих файлов или скачивается из MDN).


MDN


Новый рефакторинг Pull member up позволяет перемещать методы JavaScript- или TypeScript-класса в родительский класс или интерфейс. Если же “родителя” еще нет, он может быть создан с использованием рефакторинга Extract superclass на основе полей и методов “ребенка”.


Рефакторинг Pull member up


Как обычно, все улучшения WebStorm 2017.3 доступны в соответствующей версии PhpStorm (либо “из коробки”, либо путем установки плагинов). А это, помимо вышеупомянутого: рефакторинги Extract type alias и Extract interface для TypeScript, поддержка нескольких версий JavaScript в одном проекте, улучшенная интеграция Jest, обновленная поддержка CSS, импорт стилей из ESLint и TSLint и многое другое.


Системы контроля версий


Платформа IntelliJ обновила поддержку систем контроля версий, а это значит, что PhpStorm, как одна из IDE на этой платформе, научился запоминать свое состояние для каждой ветки и восстанавливает его при переключении между ними.


Переключение между ветками


Дополнительно, во вкладке Shelf теперь можно переименовывать списки изменений, а также перетаскивать их между вкладками Shelf и Local Changes.


Базы данных


PhpStorm может все, что может DataGrip 2017.3. В частности: улучшенный просмотр баз данных, генерация SQL, автодополнение после выражения JOIN, поддержка SSH-туннелей.


Базы данных


В завершение


А еще мы переработали страницу настроек Code Style | PHP (избавившись от вкладки Other), добавили журнал операций Composer, улучшили конфигурацию запуска PHPUnit тестов, добавили возможность задавать область видимости полей при рефакторинге (Code Style | PHP | Code Generation).


Пожалуй, это все, о чем мы хотели бы вам рассказать. Но это далеко не все, что вошло в релиз. Полный список изменений, как всегда, можно найти в нашем выпускном альбоме release notes. Сообщайте о проблемах в нашем трекере, ну, или просто оставляйте свои комментарии под этим постом или в нашем блоге.


Спасибо за внимание!


Команда JetBrains PhpStorm
The Drive to Develop

Комментарии (108)


  1. vasIvas
    29.11.2017 14:27

    Вчера обновил webstorm и первое что реально порадовало за много лет, это проведенная оптимизация автокомплита. Теперь автокомплит успевает даже на очень слабых машинах. Это чудо!


    1. AxisPod
      30.11.2017 14:24

      Сегодня обновил WebStorm и что удивило, что Jest перестал работать, теперь валится где-то в недрах с ошибкой «RangeError: Maximum call stack size exceeded», так что пришлось откатываться. При этом генерируемая комманда работает из терминала нормально.


      1. SergeySimonchik
        30.11.2017 15:41
        +1

        Интересная проблема. А при запуске из IDE и из терминала используется одна и та же версия node? Был бы признателен, если можно было бы посмотреть на полный стектрейс этой ошибки, в идеале в виде бага на youtrack.jetbrains.com/issues/WEB :)
        Нет ли случайно открытого проекта, где это воспроизводится? Спасибо.


        1. AxisPod
          30.11.2017 15:45

          Постараюсь завтра выделить время на разбор проблемы и описать более детально. К сожалению не открытый и поделиться естественно им не могу.


  1. crocodile2u
    29.11.2017 14:28
    -1

    {applause} !!!


    (и да, можете минусовать за бессодержательность)


  1. Akuma
    29.11.2017 14:33

    О, так запоминания состояния на разных ветках небыло раньше? Блин, а я все время думал, что это у меня что-то глючит :)


  1. poxvuibr
    29.11.2017 14:39

    PhpStorm, как одна из IDE на этой платформе, научился запоминать свое состояние для каждой ветки и восстанавливает его при переключении между ними.

    Это касается Favorites ?


    1. artspb Автор
      29.11.2017 15:29

      Закладки общие.


      1. AmdY
        29.11.2017 17:18

        Переключение веток переключает tasks? Будет ли оно работать, если ветку сменю в консоли и потом вернусь в редактор, сменит ли он контекст?
        p.s. Извини, нет возможности сейчас самому проверить.


        1. artspb Автор
          29.11.2017 17:31

          По второму — нет, переключать ветки нужно в IDE. По первому сейчас уточню. Но у меня есть ощущение, что контекст из Tasks не отслеживается.


          1. artspb Автор
            29.11.2017 17:47

            Да, все так и есть — задачи при переключении веток переключаться не будут. Если очень хочется, то заведите, пожалуйста, тикет здесь.


      1. poxvuibr
        29.11.2017 18:37

        А если у меня в одной ветке файл есть, а в другой его нет и я туда закладку поставил, то после переключения на вторую ветку и обратно закладка пропадёт навсегда?


        1. artspb Автор
          29.11.2017 20:21

          Увы. Будет здорово, если Вы сообщите об этой проблеме по ссылке в моем комментарии выше.


  1. Akuma
    29.11.2017 14:55

    Хм. А почему Unhandled exception появляется в блоке catch (Throwable $e)?
    Ведь любое исключение в PHP 7.1 — Throwable. Да и система указывает на исключение которое наследуется от Exception.


    1. artspb Автор
      29.11.2017 15:23

      Можно пример кода?


      1. Akuma
        29.11.2017 16:25

        Конечно. Все классы есть в use, поэтому на неймспейсы не грешите.

        try{
            ...
        } catch (Throwable $e) {
            $this->exception($e); // Unhandled ....
            continue;
        }


        protected function exception(Throwable $e)
        {
            $this->exceptionCount++;
        
            if ($this->exceptionCount > $this->getMaxExceptionCount()) {
                throw new MyCustomException('текст ошибки', 0, $e);
            }
        }


        class MyCustomException extends \Exception
        {
        // Пустой класс
        }


        UPD: А, стоп. Оно ж в блоке catch. А выше там класс анонимный и оно не может определить его использование и верхний catch. Тогда вроде как все верно. Но лучше гляньте лишний раз.


        1. artspb Автор
          29.11.2017 16:33

          Ну да, внутри catch-блока выбрасывается MyCustomException. Если оно не задекларировано и выше нигде не ловится, то PhpStorm считате его необработанным.


          1. Akuma
            29.11.2017 16:37

            Анонимный класс, это «return new class extends MyAbstractClassEtc {...}».
            При этом такой объект создается через динамический require(), поэтому Шторм такое не засечет.

            В общем, суть та же что и с функциями


            1. artspb Автор
              29.11.2017 16:41

              Про анонимные классы — это я погорячился, с ними ситуация точно такая же, как и с обычными. Т.е. не имеет значения его дальнешее использование, важно либо задекларировать исключение в PHPDoc метода, либо его обработать внутри метода. Иная ситуация с анонимными функциями, но они тут не причем, поэтому я и отредактировал сообщение.


              1. Akuma
                29.11.2017 18:05

                Немного не в тему, но может подскажете как убрать комментарий «TODO: Change the autogenerated stub» при оверрайде методов? :) Запарился уже его удалять каждый раз.


                1. artspb Автор
                  29.11.2017 18:12

                  Editor | File and Code Templates | Code | PHP Overridden Method Body.


  1. greatkir
    29.11.2017 15:23

    Ребята, вы молодцы! Особенно контроль исключений — то, чего давно не хватало, так держать!


    1. artspb Автор
      29.11.2017 17:03

      Спасибо, стараемся :)


  1. GHostly_FOX
    29.11.2017 15:33

    По REST запросам интересная модификация, но вот 1 момент который все-же не дает пока перейти от Postman — Форматирование ответа.

    В Postman ответ в виде Json дерева, а тут получается весь Json в строку.
    Читать крайне неудобно.


    1. artspb Автор
      29.11.2017 15:43

      Мы планируем добавить возможность автоматического форматирования ответа (WEB-28672).


    1. ASGAlex
      29.11.2017 21:08

      Помимо форматирования ещё и содержимое кириллицы в ответе выводится как есть. Какое-нибудь \u041F\u0440\u0438\u0432\u0435\u0442 не особо читабельно, даже если его отформатировать.


      1. artspb Автор
        29.11.2017 21:27

        Мы всегда рады предложениям в трекере.


      1. GHostly_FOX
        30.11.2017 05:58

        У меня ответы идут в UTF-8 и с Кирилицей все нормально.

        Но вот вопрос появился, а как передать тело запроса?
        Например получить с Эластика агрегированные данные отправив такое тело:

        {
        	"aggs":
        	{
        		"agg_name":
        		{
        			"terms":
        			{
        				"field":"filed_name",
        				"order":{"_count":"desc"},
        				"min_doc_count":1
        			}
        		}
        	}
        }


        1. artspb Автор
          30.11.2017 13:52

          Пустая строка после заголовков, потом тело.


  1. vtvz_ru
    29.11.2017 16:26

    Что-то как-то для Codeception слабенько все. Не хватает нормальной возможности запускать отдельные тесты и кейсы, запуска с code coverage. Ещё хочется научиться запускать тесты внутри docker контейнера.
    И ещё что раздражает — результаты покрытия кода тестами никак не меняются при обновлении файла. Приходится вручную удалять и добавлять.


    1. maxa1
      29.11.2017 16:45

      Работа над Codeception продолжается, но многое из того, что вы перечислили уже поддерживается. Отдельные тесты и кейсы уже можно запускать — кликните правой кнопкой на методе и выберете Run или в Run Configuration выберете Method. Тесты внутри Docker контейнера тоже подерживаются — www.youtube.com/watch?v=UuiLnmWMvv0.

      Голосуйте за поддержку code coverage в Codeception — youtrack.jetbrains.com/issue/WI-34962 и за обновление — youtrack.jetbrains.com/issue/WI-25513.


    1. artspb Автор
      29.11.2017 16:54

      Про покрытие есть тикет (WI-34962), для всего остального предлагаю Вам не стеснятся и тикеты завести. Мы всегда рады обратной связи.


  1. saver
    29.11.2017 17:06

    Привет.
    Спасибо, очень клевые изменения. А можно как-то временно выключить «Контроль Исключений». У нас автотесты засветились, как Рождественская елка. :)


    1. artspb Автор
      29.11.2017 17:13

      В настройках Editor | Inspections | PHP, названия инспекций перечислены в тексте статьи. Можно отключить совсем или поменять уровень на "No highlighting", если планируете пользоваться квикфиксами. Там же можно задать область, в который инспекции должны работать. Это может быть полезно, если инспекции нежелательны только в тестах, но не в коде.


  1. LebedevEM
    29.11.2017 17:22

    JetBrains как всегда на высоте! Услышали меня с форматированием структур Twig. Может и следующее пожелание услышат:
    Хотелось бы, что бы была настройка Smart-Checkout при переключении между ветками, которая позволяла бы текущие незакомиченные изменения отправлять в Shelf автоматически и возвращать при переключении обратно.


    1. artspb Автор
      29.11.2017 17:37

      Есть такой тикет, голосуйте (IDEA-173936).


      1. LebedevEM
        29.11.2017 17:38

        Отлично, спасибо, пошел голосовать.


  1. Ariocx
    29.11.2017 20:08
    +1

    JetBrains, есть такой баг. Прошло 2 года… Новые фичи — это классно, но блин… 2 года прошло, а баг все еще бесит


    1. ifalur
      29.11.2017 21:38

      Поддерживаю приходится мышь трогать. Кстати возникает не всегда, а через раз, закономерность отследить не получилось


    1. barsuksergey
      30.11.2017 10:59

      Я щёлкаю по Shift 4-8 раз, читая мантру:
      Окошко, появись,
      Галочка, появись,
      Окошко, исчезни,
      Окошко, появись опять,
      Фокус!

      Тогда работает. Правда, в Ubuntu. Если Windows, то сложно — включается залипание.


      1. Gilberg
        30.11.2017 11:41

        А у меня другая комбинация, бесит меньше, чем один шифт жать:
        Shift-Shift
        Нет фокуса
        Alt-Tab
        Alt-Tab
        Shift-Shift
        Есть фокус)


        1. barsuksergey
          30.11.2017 12:33

          Надо конкурс на самый изощрённый способ получить фокус для Double-Shift фичи )


          1. artspb Автор
            30.11.2017 14:23

            Или пойти в тикет и приложить логи, которые помогут исправить проблему ;) Там же можно скачать тестовый билд, в котором проблема должна быть исправлена (см. последние комментарии).


    1. Mixxer
      30.11.2017 12:53

      Господи, я оказывается не один такой. На рабочем ноуте webstorm после апдейта на 2017.1 через какое-то время начал страдать этим. Причём дома с ней же — всё отлично. Переставлять не хочется, вроде баг мелкий, но такой противный.


  1. SerafimArts
    29.11.2017 21:23

    Что-то не работают новые исклюения. Теперь весь код светится не перехваченными ошибками, игнорируя throws.

    Картиночка


    1. artspb Автор
      29.11.2017 21:46

      Это Php Inspections плагин, все вопросы к автору.


      1. SerafimArts
        29.11.2017 22:03

        Понял, принято.


        1. artspb Автор
          30.11.2017 13:57

          Кстати, ребята починили вчера.


          1. SerafimArts
            30.11.2017 15:18

            Огонь!

            Кстати, а почему вы не хотите в ядро затащить этот плагин? Всё же статик анализ он предоставляет бесподобный.


            1. artspb Автор
              30.11.2017 15:36

              В ядре мы стараемся сохранять баланс функциональность/производительность. Добавление большой пачки инспекций замедлит работу PhpStorm у всех, даже у тех, кому они не нужны. В то же время над каждой новой своей инспекцией мы проводим большую работу по оптимизации ее производительности. Поэтому мы взяли за правило сотрудничать с авторами, а не брать их работу себе.


  1. VolCh
    29.11.2017 21:54

    Странно как-то: в PhpStorm анонсируют рефакторинги для JS, которых для PHP нет. Сегодня прочитал бегло анонс на английском перед одним мероприятием, после него побежал к компу обновляться и никак не мог понять где этот рефакторинг, что не так делаю. И только сейчас, уже дома, читая этот пост, понял, что не про PHP было написано. Пришлось ручками выделять суперкласс и интерфейс.


    1. artspb Автор
      30.11.2017 14:00

      А чего странного-то? В PhpStorm есть поддержка JavaScript, отчего бы нам не писать про новые JS фичи? К тому же, в тексте об этом сказано достаточно явно.


    1. artspb Автор
      30.11.2017 14:12

      Кстати, а каких рефакторингов-то не хватает?


      1. CrazyLazy
        30.11.2017 15:37
        +1

        Например:


        • Extract (function/field) to new superclass (в новый клас и сделать его родителем текущего)
        • Extract (function/field) to new Trait (в новый трейт и использовать в текущем)


      1. VolCh
        30.11.2017 17:31

        Создание суперклассов (возможно абстрактных) и интерфейсов. Добавление метода/константы в интерфейс. Как-то по аналогии с Pull Members Up, можно даже прямо в нём с возможностью создания нового суперкласса/интерфейса.


  1. Miraage
    29.11.2017 23:38

    Вечно включающийся ESLint (YouTrack Issue) никак не починят.
    А в 2017.3 у меня отломался автокомплит this.props в React компонентах.


    1. enDal
      30.11.2017 14:23

      this.props будет исправлен в 2017.3.1


  1. Alexufo
    30.11.2017 02:08

    Все та же проблема с gulp watcher. Не видит storm изменения внешних файлов, если оно сделано через gulp. Да, если я сделаю через блокнот изменения шторим увидит, но не через gulp.


    1. CrazyLazy
      30.11.2017 14:00

      Даже "File | Synchronize" не помогает?


      1. Alexufo
        30.11.2017 20:40

        Помогает наверное, но это не то. Там есть галочка Upload external changes так вот изменения от других программ она видит, но не от gulp.


        1. CrazyLazy
          30.11.2017 20:46

          Тут детали важны. Как я понимаю gulp просто работает в фоне (gulp watch или тому подобное) и при этом Вы не переключаетесь с одного приложения на другое (как при редактировании в блокноте, например). Если так, то да — PhpStorm не проверяет файлы на изменения в фоне — только при получении фокуса (когда альт-табишся с одного приложения на другое).


          Или у Вас другая ситуация?


          1. Alexufo
            30.11.2017 23:06

            Такая, но смена фокуса тут не причем. Изменения файлов это события файловой системы. Если автоаплоад включен можно со свернутым штормом блокнотом править файлы и он будет свернутым все заливать с галочкой Upload external changes.


  1. alexmat
    30.11.2017 05:16

    Как вернуть multiple carets по ctrl + alt + перетаскивание мышки, как было в старых версиях? Сейчас это по ctrl double click with arrow keys.


    1. artspb Автор
      30.11.2017 14:38

      multiple carets по ctrl + alt + перетаскивание мышки

      А когда такое было?


      1. CrazyLazy
        30.11.2017 15:29
        +1

        Оно и сейчас работает: только это Alt + Mouse selection (Default keymap; Windows 10)


        1. artspb Автор
          30.11.2017 15:31

          Ну, да. Вот мы тут и не очень поняли, о чем вообще речь.


  1. JSmitty
    30.11.2017 07:55

    Блин, да вы издеваетесь?
    image


    1. maxa1
      30.11.2017 12:38

      Этот пункт меню из стороннего плагина. Например, у Symfony плагина есть такой баг.


      1. JSmitty
        01.12.2017 08:57

        О, спасибо, помогло. Но ведь на предыдущей версии-то не было.


    1. zabidon
      30.11.2017 12:51

      Видимо это меню зависит от проекта/окружения. у меня там есть пункт создания тестов


  1. yujin1st
    30.11.2017 10:32

    Когда сделаете отключаемую проверку файлов на фтп? понятно что разные люди работают над разными вещами… но 7 лет игнорировать один из самых запрашиваемых реквестов… =((


  1. alexlcdee
    30.11.2017 12:52

    Composer из докер-контейнера запускаться еще не научили? Очень не хватает такой возможности, приходится через docker exec извращаться, чтобы композер не ругался на то, что на хосте нет расширений.


    1. artspb Автор
      30.11.2017 14:44

      Пока нет, но планируем (WI-23544).


  1. bioforge
    30.11.2017 12:52

    А когда будет возможность настраивать удалённый интерпретатор в docker контейнере для typescript и баз данных?


    1. artspb Автор
      30.11.2017 14:45

      А зачем TS и БД может понадобится интерпретатор? Что именно Вы бы хотели получить с появлением такой возможности?


      1. bioforge
        30.11.2017 19:50

        Интерпритатор node для Typescript(Languages & Frameworks > TypeScript). Сейчас можно настроить только для локально установленной nodejs, на машине разработчика. Не удобно тем, что имея nodejs в докере, приходится на хосте устанавливать nodejs.
        Для базы данных хочется иметь возможность настроить источник находящийся в докер контейнере.
        Хост ничего не знает о nodejs и базе данных, порты не пробрасываются.


        1. artspb Автор
          30.11.2017 20:38

          Для Node.js есть плагин. С БД вообще не должно быть проблем: поднимаете контейнер, создаете data source с соответствующим IP и портом. Если порты не пробрасываются — это вопрос конфигурации Докера, здесь мы ничем помочь не можем.


          1. bioforge
            01.12.2017 09:29

            Плагин уже установлен, возможность настроить удалённый интерпретатор не появляется. image

            В случае с БД, я понимаю что это вопрос конфигурации, поэтому и интересуюсь будет ли возможность без проброса портов пользоваться этим инструментом :)


            1. artspb Автор
              01.12.2017 10:48

              Его можно добавить при создании новой конфигурации (Run | Edit configurations...).


              Node.js

              Node.js


              1. VolCh
                01.12.2017 11:05

                Можно поднять контейнер с прокси, который пробросит порт :)


                Но у меня другая частая проблема — активно используется динамический проброс порта, то есть докер сам назначает порт на хосте. Нельзя ли как-то в источниках сделать чтобы можно было брать порт из метаданных контейнера, отбираемого по какому-то фильтру, например по регулярке/префиксу имени?


                1. artspb Автор
                  01.12.2017 12:09

                  Наверное, можно. Будет здорово, если Вы создадите тикет здесь. Тогда ответственные разработчики смогут задать необходимые уточняющие вопросы, если таковые возникнут.


  1. Radmin
    30.11.2017 12:52

    Выражаю огромную благодарность за добавление аутентификации с использованием key-агента при подключении к БД через ssh-туннель.


  1. a1ez
    30.11.2017 12:52

    Неудобно что в Unit-тестах с аннотацией @expectedException всё равно требует try-catch или @throws, а отключить это инспекцию, как понял, можно только на весь проект.


    1. CrazyLazy
      30.11.2017 14:02

      а отключить это инспекцию, как понял, можно только на весь проект.

      Да нет. Создайте отдельный Scope только для тестов и отключите эту инспекцию только для него.


    1. artspb Автор
      30.11.2017 14:06

      И правда неудобно. Завел (WI-38998), поправим.


  1. NerVik
    30.11.2017 14:01

    эх, а переходить по импортам import Anything from '@/components/anything'; в .vue файлах так и не научили ;( упорно заявляет:


    cannot find declaration to go


    1. enDal
      30.11.2017 14:04

      Подскажите, пожалуйста, как выглядит ваш webpack конфиг?


    1. yujin1st
      01.12.2017 04:45

      А каким образом это заработало? У меня пути не подсвечиваются и не доступны для перехода в принципе, а клик на компоненте лишь переносит к секции components


  1. kirill-93
    30.11.2017 15:02

    В ubuntu 17.10 не работает поиск. Нажимаешь «ctrl+f», появляется неактивное окошко поиска, в которое невозможно ничего вписать. Обновился блин…


    1. artspb Автор
      30.11.2017 15:30

      Нам о такой проблеме неизвестно. Не могли бы Вы создать тикет и приложить туда логи?


  1. evgenybuckharev
    30.11.2017 17:36

    Очень не хватает функции выгрузки файлов по ftp которые пришли по git pull, в истории они отображаются, а выделить и отправить нельзя, приходится искать корневые папки и отправлять все файлы


    1. artspb Автор
      30.11.2017 17:39

      Записали себе (WI-7372), учтем. Спасибо!


    1. yujin1st
      01.12.2017 04:42

      Если открыть панель version control, вкладку log, то там можно выбрать файлы в отдельных коммитах и залить на фтп шоткатом с клавиатуры


  1. anatooly
    30.11.2017 19:08

    Подскажите пожалуйста, как в macOS вернуть иконки PhpStorm для файлов (типов) в системе? Они затираются другими программами, но как восстановить оригинальные не понятно, переустановка Шторма иконки в Finder не меняет.


    1. artspb Автор
      01.12.2017 12:07

      Найти файл в Finder, открыть свойства и поменять программу по-умолчанию. Применить для всех файлов этого типа.


  1. darked
    01.12.2017 08:55

    Что — то вообще какая-то дичь с форматирование сложных twig файлов (множественные вложенные if) стала, все файлы поломались => отступы уходят вправо и не возвращаются…


    1. artspb Автор
      01.12.2017 10:50

      Было бы здорово увидеть конкретные куски кода, для которых сломалось форматирование.


      1. darked
        01.12.2017 12:28

        вот полное содержание файла на котором ломается форматирование:

        Содерждимое одного из файлов где всё ломается
        {% set itemsCount = 0 %}
        {% for subfolder in subfolders %}
            
            {% if subfolder.IsNotMade %}
                <div style="margin: 10px  10px 20px 0;">
                    <a style="color:#ccc; float:right;"
                       href="{{ base_url }}{{ subfolder.TreeAnchor }}">{{ subfolder.FolderName }}</a>
                </div>
                <div class="div_clear"></div>
            {% else %}
                
                {% set itemsCount = itemsCount + 1 %}
                
                {% if subfolder.Tip == constant('repository\\ViewModels\\TreeTip::GROUP') %}
                    {% if subfolder.Vid == constant('repository\\ViewModels\\TreeVid_Group::DYNAMIC') %}
                        <div class="content-block-header article-content-expander" {% if not subfolder.IsVisible %} style="display: none;" {% endif %}
                            data-bind="click: CollapseClick.bind($data, $('#models_{{ subfolder.FolderId }}'), $('#sign_{{ subfolder.FolderId }}'))">
                            <span class="left nowrap strong">
                                <a href="#" class="h2_node_link" style="color:#06c;">
                                    <span id="sign_{{ subfolder.FolderId }}"  style="font-size:10.5pt;">+</span>{{ subfolder.FolderName }}
                                </a>
                            </span>
                        </div>
                        
                        <div style="margin-bottom: 5px;{% if subfolder.IsVisible %}display: none;{% endif %}" class="to_show" data-expand="0"  id="models_{{ subfolder.FolderId }}">
                            {% if subfolder.Models %}
                                {% if subfolder.IsVisible %}
                                    {% include 'model_groups/models_table_without_header.twig' with {'models' : subfolder.Models} only %}
                                {% else %}
                                    {% if itemsCount == 1 %}
                                        {% include 'model_groups/models_table.twig' with {'models' : subfolder.Models} only %}
                                    {% else %}
                                        {% include 'model_groups/models_table_without_header.twig' with {'models' : subfolder.Models} only %}
                                    {% endif %}
                                {% endif %}
                            {% endif %}
                    
                            {% if subfolder.SubFolders %}
                                {% include 'model_groups/folders/subfolders.twig' with {'subfolders' : subfolder.SubFolders} only %}
                            {% endif %}
                        </div>
                
                    {% elseif subfolder.Vid == constant('repository\\ViewModels\\TreeVid_Group::HEADER') %}
                        {% if subfolder.SubFolders %}
                            <div id="mod_data" style="margin-bottom: 5px;">
                            {% include 'model_groups/models_table_without_header.twig' with {'models' : subfolder.Models} only %}
                            </div>
                
                            {% include 'model_groups/folders/subfolders.twig' with {'subfolders' : subfolder.SubFolders} only %}
                        {% else %}
                            <div id="mod_data" style="margin-bottom: 5px;">
                            {% include 'model_groups/models_table_without_header.twig' with {'models' : subfolder.Models, 'group_name' : subfolder.FolderName} only %}
                            </div>
                        {% endif %}
                
                    {% else %}
                        <div id="mod_data" style="margin-bottom: 5px;">
                            {% include 'model_groups/models_table_without_header.twig' with {'models' :subfolder.Models} only %}
                        </div>
                        {% include 'model_groups/folders/subfolders.twig' with {'subfolders' :subfolder.SubFolders} only %}
                    {% endif %}
                {% elseif subfolder.Tip == constant('repository\\ViewModels\\TreeTip::DIVISION') %}
                
                    {% if subfolder.Vid == constant('repository\\ViewModels\\TreeVid_Division::INDEPENDENT') %}
                
                        <div id="mod_data" style="margin-bottom: 5px;">
                            {% include 'model_groups/models_table_without_header.twig' with {'models' : subfolder.Models} only %}
                        </div>
                
                    {% elseif subfolder.Vid == constant('repository\\ViewModels\\TreeVid_Division::MAIN') %}
                        <div style="color:#666; margin:25px 0px 5px 30px; font-size:11pt;">
                            <strong>{{ subfolder.FolderName }}</strong>    
                        </div>
                        {% if subfolder.SubFolders %}
                            <div id="mod_data" style="margin-bottom: 5px;">
                            {% include 'model_groups/models_table.twig' with {'models' : subfolder.Models} only %}
                            </div>
                
                            {% include 'model_groups/folders/subfolders.twig' with {'subfolders' : subfolder.SubFolders} only %}
                        {% else %}
                            <div id="mod_data" style="margin-bottom: 5px;">
                            {% include 'model_groups/models_table.twig' with {'models' : subfolder.Models} only %}
                            </div>
                        {% endif %}
                
                    {% elseif subfolder.Vid == constant('repository\\ViewModels\\TreeVid_Division::FULL') %}
                        <div style="color:#666; margin:25px 0px 5px 30px; font-size:11pt;">
                            <strong>{{ subfolder.FolderName }}</strong>    
                        </div>
                        {% if subfolder.SubFolders %}
                            <div id="mod_data" style="margin-bottom: 5px;">
                            {% include 'model_groups/models_table_without_header.twig' with {'models' : subfolder.Models} only %}
                            </div>
                            {% include 'model_groups/folders/subfolders.twig' with {'subfolders' : subfolder.SubFolders} only %}
                        {% else %}
                            <div id="mod_data" style="margin-bottom: 5px;">
                            {% include 'model_groups/models_table_without_header.twig' with {'models' : subfolder.Models} only %}
                            </div>
                        {% endif %}
                
                    {% else %}
                        {% if subfolder.SubFolders %}
                            <div id="mod_data" style="margin-bottom: 5px;">
                            {% include 'model_groups/models_table_without_header.twig' with {'models' :subfolder.Models} only %}
                            </div>
                            {% include 'model_groups/folders/subfolders.twig' with {'subfolders' :subfolder.SubFolders} only %}
                        {% else %}
                            <div id="mod_data" style="margin-bottom: 5px;">
                            {% include 'model_groups/models_table_without_header.twig' with {'models' :subfolder.Models} only %}
                            </div>
                        {% endif %}
                    {% endif %}
                
                {% elseif subfolder.Tip == constant('repository\\ViewModels\\TreeTip::SUBSECTION') %}
                    <div style="color:#666; margin:25px 0px 0px 30px; font-size:11pt;">
                        <strong>
                            {% if subfolder.FolderIcon %}
                                <img src="{{ subfolder.FolderIcon }}"  style="vertical-align: middle; margin: 0px;">
                            {% endif %}
                        {{ subfolder.FolderName }}
                        </strong>    
                    </div>
                    {% if subfolder.SubFolders %}
                        <div id="mod_data" style="margin-bottom: 5px;">
                        {% include 'model_groups/models_table_without_header.twig' with {'models' :subfolder.Models} only %}
                        </div>
                        {% include 'model_groups/folders/subfolders.twig' with {'subfolders' :subfolder.SubFolders} only %}
                    {% else %}
                        <div id="mod_data" style="margin-bottom: 5px;">
                        {% include 'model_groups/models_table_without_header.twig' with {'models' :subfolder.Models} only %}
                        </div>
                    {% endif %}
                {% elseif subfolder.Tip == constant('repository\\ViewModels\\TreeTip::SECTION') %}
                    {% if subfolder.SubFolders %}
                        <div id="mod_data"  style="margin-bottom: 5px;">
                            {% include 'model_groups/models_table_without_header.twig' with {'models' :subfolder.Models} only %}
                        </div>
                        {% include 'model_groups/folders/subfolders.twig' with {'subfolders' :subfolder.SubFolders} only %}
                    {% endif %}
                {% else %}
                    {% if subfolder.SubFolders %}
                        <div id="mod_data" style="margin-bottom: 5px;">
                        {% include 'model_groups/models_table_without_header.twig' with {'models' :subfolder.Models} only %}
                        </div>
                        {% include 'model_groups/folders/subfolders.twig' with {'subfolders' :subfolder.SubFolders} only %}
                    {% else %}
                        <div id="mod_data"  style="margin-bottom: 5px;">
                        {% include 'model_groups/models_table_without_header.twig' with {'models' :subfolder.Models} only %}
                        </div>
                    {% endif %}
                    
                {% endif %}
            {% endif %}
        
        {% endfor %}
        


        1. artspb Автор
          01.12.2017 12:48

          Да, как-то ему нехорошо. Завел (WI-39018), спасибо.


          1. darked
            01.12.2017 13:13

            Вам спасибо. Буду ждать )


  1. VictoRD11
    01.12.2017 10:50

    Так вот, в новой версии задержки вывода символов на экран удалось сократить в четыре раза! Тем, кто работает с большими и огромными файлами, должно стать приятнее редактировать. Если же у вас в проекте ООП и по файлу на класс, вы разве что заметите слегка увеличившийся срок работы от батареи


    Запустил проект, открыл файл PHP на 2 тысячи строк, Второй файл на 4 тысячи, между ними переключался и просто листал трекпадом, phpstorm начал сильно жрать батарею + процесор поднимаеться на 10 градусов сразу, как то странно, вроде бы до этого не было ;(
    Если что Macbook, Highlighting = Inspection


    1. artspb Автор
      01.12.2017 10:55

      Если это воспроизводится, было бы здорово увидеть CPU-snapshot того, что так разогревает процессор (инструкция).


      1. VictoRD11
        01.12.2017 23:59

        Залил на dropbox Скачать


  1. lexxpavlov
    01.12.2017 14:35

    Вопрос про EAP, я не нашёл ссылок на лицензию EAP и официального объяснения.
    1) Я могу каждый месяц обновлять EAP-версию? Это легально, или такая уловка, которая не поощряется?
    2) Какие ограничения использования EAP?
    2.1) Могу ли использовать EAP-версию для коммерческого индивидуального использования?
    2.2) А в компании?..


    1. CrazyLazy
      01.12.2017 16:33

      Есть 2 вида EAP:


      • мажорная (2017.3) — любой может пользоваться ею. С каждой версией/билдом идет своя 30-дневная лицензия. Новые фичи, новые баги (вполне возможно, ибо это WIP — Work In Progress). Упор идет на добавление нового функционала а не на производительность (сначала сделать что бы работало, а когда уже работает то и оптимизировать можно); на более массовое тестирование нового функционала, выявление возможных при этом багов/возможных доработок.
      • багфиксная (2017.3.1, 2017.3.x) — самая обычная — нужна полноценная лицензия (либо стандартный 30-дневный триал). Это для тех кому нужны багфикси уже сейчас а не ждать официального релиза. Новый функционал здесь уже не очень то и появляется (более мелкие доработки), релиз считается стабильным, поэтому нужна лицензия.

      На данный момент EAP для мажорной уже закончен (ибо состоялся финальный 2017.3 релиз). Следующий EAP билд будет для 2017.3.1 и будет требовать лицензию. Бесплатным EAP будет опять для 2018.1


      1. lexxpavlov
        01.12.2017 17:14

        Спасибо!
        Багфиксная — это которая на сайте называется «Free 30-day trial»?
        Можно ли где-нибудь подробнее почитать об этом?


        1. CrazyLazy
          01.12.2017 17:59
          +1

          Багфиксная — это которая на сайте называется «Free 30-day trial»?

          "Багфиксная" это 2017.3.1, 2017.3.2 и т.д. Та что на сайте это 2017.3.0 final/release (то-есть уже не EAP но еще не багфикс релиз).


          Последний доступный EAP билд был для мажорной EAP — по идее Вы можете им пользоваться до окончания встроенной временной лицензии (я не помню есть ли требование мол "если финалка выпущена то нужно прекратить использование EAP билда" — раньше такого не видел да и лицензия у меня есть).


          Первый "багфиксный" EAP билд будет скорее всего в следующую среду (как правило они публикуют их в этот день недели; и он будет требовать лицензию) а официальный релиз 2017.3.1 состоится где-то через 2-3 недели (по идее).



  1. annenkov
    03.12.2017 01:52

    Спасибо, за крайне удобный шторм, но вот частенько сильно не хватает одной небольшой мелочи — невозможно перейти по ссылке вида Class::method или Class::$property. Такие ссылки встречаются довольно часто — в доках, сообщениях об ошибках и даже штормовская функция Copy Reference такую создает, а перейти по ней сам не может, печаль.
    Думал что-то найти не могу — писал в саппорт, но там мне только посоветовали юзать Ctrl+N и Class#method, иногда можно конечно воспользоваться, но постоянно исправлять :: на # уже раздражает и главное непонятно зачем дело стало, функционал то уже такой есть…