CTRL + G — хоткей, полностью изменивший принцип моей работы



    В этой статье я расскажу об одном из очень важных и нужных хоткеев в Android Studio, который позволит вам значительно повысить вашу производительность. Кейсы, описанные здесь, встречаются наиболее часто при рефакторинге уже готового кода, поэтому рекомендую досконально изучить статью и выучить описанные хоткеи.

    Внимание: Данный пост является очень вольным переводом этой статьи. Целью ставилось донести смысл текста, поэтому в некоторых местах текст может не совпадать с оригиналом.

    Также советую посмотреть:

    » Правильная настройка Android Studio
    » Группирующий плагин для Android Studio

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


    CTRL+G (Alt + J для Windows). Выделите текст и нажмите CTRL + G. Таким образом вы выделите вхождение выделенного текста далее в коде (таким образом создав новый курсор):



    CTRL + G

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



    Комбинации клавиш для выделения


    Изучите эти три комбинации клавиш:




    Я мог бы попытаться объяснить что они делают, но лучше попробовать самому.

    Важно: комбинации можно использовать без зажатой клавиши Shift для простого перемещения коду.

    Примеры реального использования


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

    @IntDef


    Я очень люблю Support Annotations и использую их постоянно. @IntDef позволяет отказаться от использования перечислений, и просто создать кучу int’ов вместо enum. Посмотрите как мультикурсор может помочь мне с этим.

    Вот что мне нужно:



    Вот как я могу получить это:

    Стандартный способ





    Простое копирование-вставка



    И переименование

    Мультикурсор





    CTRL + G

    Я мог бы использовал его для выделения других вещей ("=", «1», ";" и т. д.), для примера я выбрал «int».

    Создание последовательности


    Если вы не хотите использовать плагин String Manipulation вы можете сделать это вручную. Вот как это выглядит с использованием плагина:



    Последнее, возможно, было сделать при помощи SHIFT + ←



    (Я обычно использую комбинацию клавиш C + 5, но здесь сделал это с помощью мыши для наглядности)

    Копирование модифицированной версии строк


    А вот, где действительно происходят “чудеса”:



    Готово.

    Извлечение стилей из xml-макета


    Мультикурсор может легко работать с XML-макетом, а также. В моем конкретном случае было немного сложнее – мне нужно было извлечь стили из нескольких View.

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

    Предположим, есть такой макет:



    Вот как мультикурсор можете помочь мне с процессом извлечения:



    И вот как я применяю извлеченные стиль к XML (также с мультикурсором):



    OnClick в Butterknife


    Это пример того, что произошло со мной несколько дней назад.

    У было 5 кнопок в виде сложной View я использовал плагин Android Studio для генерации переменных с Bind. Но позже я понял, что мне не нужно хранить ссылки на эти кнопки. Мне просто нужно обработать клик на кнопки. Вот как я справился с этим с помощью мультикурсора:



    Легко и быстро

    И многое другое...


    Для меня это началось как небольшой трюк, который я использую один или два раза. Но, как это бывает с новыми вещами, во время работы я находил все больше и больше применений для него, и вдруг я поймал себя на мысли: “Как я мог жить без него раньше?”.

    Если вы еще не используете его, я настоятельно рекомендую вам попробовать!
    AdBlock has stolen the banner, but banners are not teeth — they will be back

    More
    Ads

    Comments 39

      +13
      При всём том качестве гифок и объёме проделанной работе, пост про один хоткей? Вы серьёзно? При том что фича весьма известная и обычный мультикрусор по альту умеет множество редакторов. Вимеры вообще тихо хихикают от подобных «фич».
        +5

        Статья не совсем про хоткий, а скорее про саму идею мультиселекта. Из коллег-разработчиков, я замечал что от силы 20% используют эту "фичу", и ещё меньше делают это наполную.
        Важное отличие приведенных примеров от мультикурсора по альту это именно выделение шаблонов. Из своего опыта, в 90% использовании мультиселекта одним альтом не обойдешься.
        Вимеры могут хихикать, но тут вопрос не холивара, а повышения производительности тех, кто уже выбрал темную сторону IDE. Вимеры могут игнорировать посты про Android studio.


        пс я работаю с основном с идеей, и там хоткий другой по умолчанию (alt+j). И мне кажется в студии вряд ли он ctrl+g (ибо это стандартный переход на строку).
        Кстати, если вдруг кто будет читать, альтернатива для alt+select на клавиатуре (без мыши) ctrl+ctrl и стрелки. По крайней мере в идее именно так

          +4
          "хихи"…
          Самое детальное описание одного хоткея, что я видел…
            –2
            Видел мультивыделение вживую единственный раз — коллега попытался использовать эту неведомую фигню в Visual Studio, но не вспомнил, как :) За все 10 лет, что занимаюсь программированием, никогда не сталкивался. Обычно там, где это нужно, автозамена аещё быстрее работает.
            +7
            Спасибо, что вставили гифки.так гораздо проще усваивается статья, чем если бы была полностью описана текстом. Плюс время секономили
              0
              Жаль, что мало кто использует гифки в статьях. Преимуществ же много, правда создавать муторно — вот главная проблема.
                +2
                Иногда одной гифкой можно целую статью заменить, поэтому иногда оно того стоит ) Интересно, ализар так сможет?))
                  +5
                  Ализара самого можно заменить одной гифкой.
                  0
                  В чем сложность использовать любую программу для записи, например ScreenToGif?
                    0
                    Не всегда достаточно просто записать экран, часто надо рисовать схемы, презентации, анимации.
                –2
                В примерах «обычных», без хоткея, я вижу как вы выделяете, и правите текст.
                Все примеры с мультикурсором — только выделение, никаких исправлений. Как-то непонятно, зачем выделять? Я что-то пропустил?

                Чем плоха обычная автозамена текста в выделенном блоке?
                  0

                  Постараюсь ответить за автора:


                  только выделение, никаких исправлений

                  Если я правильно понял ваш вопрос, то там после выделения выполняется несколько действий:


                  1. выделили
                  2. перешли в конец и выделили числа (почему не сразу выделили числа, я не знаю)
                  3. преобразовали их в последовательность
                  4. подготовили константы, добавив "Example." и перенесли их в IntDef

                  Чем плоха обычная автозамена текста в выделенном блоке?

                  Ничем, в большинстве случаев они взаимозаменяемы. Но как по мне, то работа с мультиселектом более быстрая и удобная (не нужно переходить в специальное поле и там что-то писать). Вы просто продолжаете писать код. До того, как в идею добавили мультиселект, я тоже не понимал в чем разница, а потом распробовал.
                  К тому же некоторые вещи через замену делать ну очень не с руки. Например вы использовали названия myCat и myDog, но затем решили что cat и dog выглядят лучше:


                  1. С помощью мультиселекта выделяем все " my",
                  2. удаляем my
                  3. выделяем следующую букву через шифт
                  4. делаем lowercase.

                  Хотя по большей части разница использовать мультиселект или нет — не такая большая. На "полностью изменивший принцип моей работы" явно не тянет. Но попробовать я бы точно советовал.


                  пс у идеи была неплохая гифка по юз кейзу этой фичи, когда она вышла: https://d3nmt5vlzunoa1.cloudfront.net/idea/files/2014/03/multiple_selections.gif

                    0
                    Просто странно, что для других способов, в статье гифки показывают процесс целиком, а для мультизамены — только сам процесс выделения, и если у меня под ругой нет IDE, я никак не пойму как оно работает. Зачем тогда гифки?
                      0
                      К тому же некоторые вещи через замену делать ну очень не с руки. Например вы использовали названия myCat и myDog, но затем решили что cat и dog выглядят лучше:

                      С помощью мультиселекта выделяем все " my",
                      удаляем my
                      выделяем следующую букву через шифт
                      делаем lowercase.

                      Вы выбрали неудачный пример.
                      Ищем с включёнными regex: my(\w+)
                      Заменяем на: \L$1\E

                      Это определённо удобнее, чем танцы с курсорами.

                      Не говоря уже о том, что если мы говорим про IDEA и язык, для которого поддерживается рефакторинг, то правильнее будет просто нажать Shift-F6, стоя на нужном нам идентификаторе.
                        0

                        Все мы разные, у всех свои привычки, сильные и слабые стороны. Лично для меня искать с регексом и делать паттерн для замены гораздо дольше, чем выделить 3 символа, нажать 1 хоткий, нажать delete.
                        Я с радостью стал применять мультиселект вместо автозамены в большинстве случаев, когда джет брейнс реализовали эту фичу. Но до этого не понимал, зачем нужен мультиселект, если есть автозамена. Хотя на тот момент мне было известно только про селект через alt+выделение, который действительно редко нужен.


                        Не говоря уже о том, что если мы говорим про IDEA и язык, для которого поддерживается рефакторинг, то правильнее будет просто нажать Shift-F6, стоя на нужном нам идентификаторе.

                        В примере я привел 2 идентификатора осознанно. В данном случае рефакторинг бы потребовался для обоих. К тому же рефакторинг доступен далеко не всегда: текст в джаве, текстовые файлы и т.п.


                        Всему свое время и место. Если есть возможность использовать рефакторинг, лучше использовать его. Если предстоит сложная замена, то лучше использовать её. Однако если нужно заменить несколько одинаковых паттернов в пределе одного небольшого метода, то для меня мультиселект лучше и быстрее по ряду причин.

                    +8
                    Дет сад какой-то…
                      +2
                      Здесь та же проблема как у любителей вима — сразу пишется кривой код на основании копипаста, а затем героически с этим борются, но копипаст остаётся.
                        +3
                        Не работал с андроидом, поэтому возник вопрос — почему не старый добрый enum?
                          +1
                          потому что жрет много памяти
                          https://developer.android.com/training/articles/memory.html#Overhead
                            +1
                            Вот что-то, а не использовать enum потому, что он жрёт много памяти — это, IMHO, вообще бред.
                            Преимущества значительно перевешивают недостатки.
                            Память, занимаемая всеми ссылками на enum'ы, обычно значительно меньше той, которую приложение забивает всякой ерундой. Это могло бы быть актуально на JavaME (но увы, там фич Java 5 вообще нет), но когда приложению доступны мегабайты памяти, отказываться от enum нет смысла.
                            0
                            enum потребляет в 2 больше памяти, раньше в документации было написано
                            Enums often require more than twice as much memory as static constants. You should strictly avoid using enums on Android.


                            на сколько я понял, это уже исправили
                              0
                              Занимает много памяти
                              0
                              Удобная вещь, оценил, когда использовал некоторое время Sublime.
                              Говорят, что наконец в NetBeans появится, так как жутко не хватает.
                              Но вообще, нужно с осторожностью, так как по статьях о анализаторе C++, который тут время от времени рекламируется, сделал главный вывод: процентов 20 странных мест случается из-за копи-паста фрагментов кода.
                                0
                                Вообще, нужно с осторожностью к NetBeans: https://tproger.ru/news/oracle-abandoned-netbeans/
                                  0
                                  Да community у редактора хорошее, не думаю, что это сильно повлияет на разработку.
                                  Да и аналогов сейчас больше чем нужно. Когда наступит момент, что программу окончательно забросят — всегда есть Eclipse, Sublime, JetBrains, Notepad++ с плагинами, Atom…
                                  Какая разница, главное, чтобы писать качественный код. Пока для этого NetBeans хватает.
                                +2

                                А разве это только в android studio имеется? Мне кажется, во всех IDE от jetbrains, включая IntelliJ IDEA есть такие функции.

                                  +2
                                  Не, это не спортивно.
                                  Программисты ленивые люди и им лень запоминать все эти комбинации, которые варьруются от IDE к IDE и на которые нельзя полагаться.
                                  Тру-программеры сокращают вышеприведённый спагетти-код с использованием дженериков, лямбды и прочих техник
                                    +2
                                    и прочих техник

                                    Это вы про boilerplate code generation?
                                      0
                                      вообще-то, к «прочим техникам» можно относить всё, что угодно, что сокращает код.
                                      +1
                                      У многих даже есть специальный прикрепленный джуниор, который отзывается на «набросай мне тут case-сниппет на восемь веток, я пока покурю схожу».

                                        0
                                        Осталось дождаться критического количества тру-программеров, которые создадут такой мета-язык, в котором вообще не надо никакого кода писать. Чистая алгоритмика. Ну почти как Wolfram, наверное… Что бы людям остался только творческий процесс. Ну, знаете, как в цивилизациях, где все роботизировано и автоматизировано. А то лямбды и дженерики — это неспортивно:))
                                        +1
                                        Вместо копирования-вставки можно использовать Ctrl+D (В маке, видимо, CMD + D). Ну и не согласен с комментаторами насчет детсада. Хоткеи, конечно, можно и нужно изучить, но всегда можно «провтыкать» что-то или не оценить каких-то возможностей. Люди для того и делятся информацией, что она кому-то может оказаться полезной. Если она кому-то очевидна, то это не значит, что она не нужна кому-то другому. Считать, иначе и есть как раз детсад и инфантилизм в чистом его проявлении. Никто же не мешает увидеть, что информация для читающего неактуальна и просто закрыть статью верно? :)
                                          +1

                                          Спасибо! В сублайме/атоме знал про Ctrl-D (Cmd-D в маках), а в идеях всё забывал посмотреть хоткей. Хочу добавить, что ещё курсоров можно надобавлять, если зажать Ctrl-Alt-Shift (Cmd-Alt-Shift в маках) и ткнуть мышкой на место, или вести мышкой по строкам. Ещё вариант — дважды нажать Ctrl (Alt на маках) и нажимать стрелочки.
                                          Удобно, если надо добавить/убрать курсоры на определённой позиции или добавить курсоры сразу на несколько подряд идущих строк.


                                          https://www.jetbrains.com/help/idea/2016.2/multicursor.html

                                            0
                                            Просто Cmd+щелчок дает возможность использовать мультикурсор :)
                                            0
                                            Ни в одной статье так не разрывало от желания плюсовать почти каждый комментарий. Круче — только статья про кнопку… ну, Backspace там, PgUp.
                                              0
                                              А в Xcode такое есть? Кто нибудь знает?
                                                0
                                                Сколько коментов посыпалось на Автора :)
                                                Из опыта могу сказать, такя «фича» в начале радовала немерено, теперь для меня это инструмент для рефактора гов… кода при пеер-ревю или анализ всяких логов файлов и консольного шлака. В осатльном функция «рефактор» в нормальном IDE справляеться лучше.
                                                  0
                                                  Автор, не обращай внимание, хорошая статья. Заботиться о своей производительности правильно и мультикурсор в продуктах JetBrains это не «тупо хоткей». Кому интересно, этот парень собирает у себя в блоге подобные фишки (в основном тривиальные, но с гифками, да!): https://plus.google.com/collection/wtO0PB. Ну, или часовое видео от серьезного дяди: https://blog.jetbrains.com/idea/2015/10/intellij-idea-tips-and-tricks/. Хихикающие вимеры могут и дальше править свои пол-скрипта в консоли.
                                                    0
                                                    А мне понравилось, а то обычно напускают много пыли, сотрясают воздух, а выхлопа нет.

                                                    Only users with full accounts can post comments. Log in, please.