В этой статье я расскажу об одном из очень важных и нужных хоткеев в 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. Но позже я понял, что мне не нужно хранить ссылки на эти кнопки. Мне просто нужно обработать клик на кнопки. Вот как я справился с этим с помощью мультикурсора:



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

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


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

Если вы еще не используете его, я настоятельно рекомендую вам попробовать!
Поделиться с друзьями
-->

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


  1. bfDeveloper
    19.09.2016 18:25
    +13

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


    1. bugy
      19.09.2016 18:39
      +5

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


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


    1. nightvich
      19.09.2016 18:41
      +4

      "хихи"…
      Самое детальное описание одного хоткея, что я видел…


    1. VioletGiraffe
      19.09.2016 21:04
      -2

      Видел мультивыделение вживую единственный раз — коллега попытался использовать эту неведомую фигню в Visual Studio, но не вспомнил, как :) За все 10 лет, что занимаюсь программированием, никогда не сталкивался. Обычно там, где это нужно, автозамена аещё быстрее работает.


  1. TimsTims
    19.09.2016 19:06
    +7

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


    1. perfect_genius
      19.09.2016 19:36

      Жаль, что мало кто использует гифки в статьях. Преимуществ же много, правда создавать муторно — вот главная проблема.


      1. TimsTims
        19.09.2016 20:06
        +2

        Иногда одной гифкой можно целую статью заменить, поэтому иногда оно того стоит ) Интересно, ализар так сможет?))


        1. lolipop
          20.09.2016 02:26
          +5

          Ализара самого можно заменить одной гифкой.


      1. Carburn
        20.09.2016 07:53

        В чем сложность использовать любую программу для записи, например ScreenToGif?


        1. perfect_genius
          20.09.2016 19:39

          Не всегда достаточно просто записать экран, часто надо рисовать схемы, презентации, анимации.


  1. saboteur_kiev
    19.09.2016 19:10
    -2

    В примерах «обычных», без хоткея, я вижу как вы выделяете, и правите текст.
    Все примеры с мультикурсором — только выделение, никаких исправлений. Как-то непонятно, зачем выделять? Я что-то пропустил?

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


    1. bugy
      19.09.2016 21:43

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


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

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


      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


      1. saboteur_kiev
        20.09.2016 13:33

        Просто странно, что для других способов, в статье гифки показывают процесс целиком, а для мультизамены — только сам процесс выделения, и если у меня под ругой нет IDE, я никак не пойму как оно работает. Зачем тогда гифки?


      1. Maccimo
        21.09.2016 00:37

        К тому же некоторые вещи через замену делать ну очень не с руки. Например вы использовали названия myCat и myDog, но затем решили что cat и dog выглядят лучше:

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

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

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

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


        1. bugy
          21.09.2016 09:52

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


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

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


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


  1. dezconnect
    19.09.2016 19:34
    +8

    Дет сад какой-то…


  1. AmdY
    19.09.2016 20:02
    +2

    Здесь та же проблема как у любителей вима — сразу пишется кривой код на основании копипаста, а затем героически с этим борются, но копипаст остаётся.


  1. j_wayne
    19.09.2016 20:49
    +3

    Не работал с андроидом, поэтому возник вопрос — почему не старый добрый enum?


    1. anton9088
      20.09.2016 00:43
      +1

      потому что жрет много памяти
      https://developer.android.com/training/articles/memory.html#Overhead


      1. fRoStBiT
        20.09.2016 03:04
        +1

        Вот что-то, а не использовать enum потому, что он жрёт много памяти — это, IMHO, вообще бред.
        Преимущества значительно перевешивают недостатки.
        Память, занимаемая всеми ссылками на enum'ы, обычно значительно меньше той, которую приложение забивает всякой ерундой. Это могло бы быть актуально на JavaME (но увы, там фич Java 5 вообще нет), но когда приложению доступны мегабайты памяти, отказываться от enum нет смысла.


    1. VRoy
      20.09.2016 03:24

      enum потребляет в 2 больше памяти, раньше в документации было написано

      Enums often require more than twice as much memory as static constants. You should strictly avoid using enums on Android.


      на сколько я понял, это уже исправили


    1. mobimaks
      20.09.2016 03:25

      Занимает много памяти


  1. Akdmeh
    19.09.2016 22:30

    Удобная вещь, оценил, когда использовал некоторое время Sublime.
    Говорят, что наконец в NetBeans появится, так как жутко не хватает.
    Но вообще, нужно с осторожностью, так как по статьях о анализаторе C++, который тут время от времени рекламируется, сделал главный вывод: процентов 20 странных мест случается из-за копи-паста фрагментов кода.


    1. Ghedeon
      20.09.2016 14:06

      Вообще, нужно с осторожностью к NetBeans: https://tproger.ru/news/oracle-abandoned-netbeans/


      1. Akdmeh
        20.09.2016 14:12

        Да community у редактора хорошее, не думаю, что это сильно повлияет на разработку.
        Да и аналогов сейчас больше чем нужно. Когда наступит момент, что программу окончательно забросят — всегда есть Eclipse, Sublime, JetBrains, Notepad++ с плагинами, Atom…
        Какая разница, главное, чтобы писать качественный код. Пока для этого NetBeans хватает.


  1. Grief
    19.09.2016 23:43
    +2

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


  1. samodum
    20.09.2016 00:10
    +2

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


    1. kolipass
      20.09.2016 08:07
      +2

      и прочих техник

      Это вы про boilerplate code generation?


      1. samodum
        20.09.2016 23:36

        вообще-то, к «прочим техникам» можно относить всё, что угодно, что сокращает код.


    1. iqiaqqivik
      20.09.2016 10:54
      +1

      У многих даже есть специальный прикрепленный джуниор, который отзывается на «набросай мне тут case-сниппет на восемь веток, я пока покурю схожу».


    1. Statyan
      20.09.2016 12:55

      Осталось дождаться критического количества тру-программеров, которые создадут такой мета-язык, в котором вообще не надо никакого кода писать. Чистая алгоритмика. Ну почти как Wolfram, наверное… Что бы людям остался только творческий процесс. Ну, знаете, как в цивилизациях, где все роботизировано и автоматизировано. А то лямбды и дженерики — это неспортивно:))


  1. Statyan
    20.09.2016 03:25
    +1

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


  1. bromzh
    20.09.2016 06:17
    +1

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


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


    1. FelixTheMagnificent
      20.09.2016 13:15

      Просто Cmd+щелчок дает возможность использовать мультикурсор :)


  1. kpower
    20.09.2016 07:46

    Ни в одной статье так не разрывало от желания плюсовать почти каждый комментарий. Круче — только статья про кнопку… ну, Backspace там, PgUp.


  1. Volchik
    20.09.2016 13:16

    А в Xcode такое есть? Кто нибудь знает?


  1. zondor
    20.09.2016 14:22

    Сколько коментов посыпалось на Автора :)
    Из опыта могу сказать, такя «фича» в начале радовала немерено, теперь для меня это инструмент для рефактора гов… кода при пеер-ревю или анализ всяких логов файлов и консольного шлака. В осатльном функция «рефактор» в нормальном IDE справляеться лучше.


  1. Ghedeon
    20.09.2016 14:32

    Автор, не обращай внимание, хорошая статья. Заботиться о своей производительности правильно и мультикурсор в продуктах JetBrains это не «тупо хоткей». Кому интересно, этот парень собирает у себя в блоге подобные фишки (в основном тривиальные, но с гифками, да!): https://plus.google.com/collection/wtO0PB. Ну, или часовое видео от серьезного дяди: https://blog.jetbrains.com/idea/2015/10/intellij-idea-tips-and-tricks/. Хихикающие вимеры могут и дальше править свои пол-скрипта в консоли.


  1. vladimirov001
    22.09.2016 09:27

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