14 возможностей ReSharper по навигации и редактированию

    Инструменты – средство усиления вашего таланта. Чем они лучше и чем лучше вы ими владеете, тем больше вы сможете сделать.
    Энди Хант и Дейв Томас «Программист-прагматик. Путь от подмастерья к мастеру»

    DISCLAIMER: это не заказная и совершенно не проплаченная статья (JetBrains, я ни на что не намекаюJ). Здесь представлены лишь возможности популярного расширения для VisualStudio (а иногда и аналогичные возможности самой студии), которые я лично использую в повседневной деятельности.

    Инструменты не являются панацеей от кривых рук и сами по себе не сделают из заурядного специалиста аццкого сатану, способного рвать любую задачу, как известные четвероногий друг тряпку. Они не решают сами ваши задачи, а лишь помогают снять с плеч некоторые рутинные вещи и дают возможность сосредоточиться на главном, не задумываясь о таких мирских вещах, как добавление нужных директив using, проблемах форматирования или навигации по коду. Многие инструменты (в особенности ReSharper) могут помочь в решении и других, не мене важных задач, таких как поиск ошибок в коде, следование стандартам кодирования, запуск юнит-тестов и многих других. И хотя все эти возможности являются мегафичами сами по себе, но сегодня речь в основном пойдет о возможностях навигации и поиска.

    Формат описания следующий: названия фичи, а затем в скобках горячие клавиши для схемы Visual Studio, а затем для схемы IDEA.

    Например: Go To Type (Ctrl + T, Ctrl + N).


    1. Import Symbol Completion (Shift + Alt + Space, Ctrl + Alt + Space)

    Все знают о навороченном IntelliSense-е ReSharper-а, да и в 10-й студи он весьма неплох. Но особенность IntelliSense-а заключается в том, что он работает только по символам, уже импортированным с помощью директивы using. Но бывает ситуация, когда вы знаете имя типа (или его часть), но не очень уверены, в каком пространстве имен оно расположено. В этом случае можно вбить полное имя типа, а потом с помощью Alt + Enter добавить нужное пространство имен (см. п. 9. Auto-importusingdirectives), но этот способ не будет работать, если вы знаете только часть имени. Да и в любом случае, придется топтать все буквы, что не всегда удобно.

    В отличие от стандартного механизма code completion-а, ImportSymbolCompletion будет искать соответствие вводимого слова не только среди «видимых» типов, но и среди всех типов, доступных текущей сборке.



    2.. Поиск файлов и типов

    В состав Visual Studio 2010 наконец-то добавили хоть какие-то возможности навигации в виде команды NavigateTo (команда Edit.NavigateTo, подробности см. в заметке Скота Гаттри Search and Navigation Tips/Tricks with Visual Studio). Однако, в отличие от стандартной версии этой команды из состава VS2010, в ReSharper-е есть не одна, а несколько команд: поиск типа, поиск файла и поиск символа. С одной стороны, это требует запоминания большего количества горячих клавиш, но позволяет быстрее найти нужный класс или файл.

    Все возможности поиска поддерживают CamelCase completion, так что при вводе tmc мы найдем TextMessageCommand, TestMonoCompiler и т.д.

    GotoType (Ctrl + T, Ctrl + N) – поиск по имени типа (ищет классы, интерфейсы, перечисления, структуры)

    Go to File (Ctrl + Shift + T, Ctrl + Shift + N) – поиск по имени файла

    Go to Symbol (Shift + Alt + T, Ctrl + Shift + Alt + N) – аналог Navigate To из VS2010, ищет по именам типов или членов внутри этих типов.

    Кстати, между всеми тремя видами поиска (точнее между четырьмя, поскольку есть еще и GotoFileMember) можно переключаться, не закрывая текущий поиск (т.е. не придется строку поиска вбивать заново, если вы вдруг начали искать тип, а нужно все-таки искать файл).

    ПРИМЕЧАНИЕ
    По сути, NavigateTo из VS2010 наиболее близка к команде ReSharper-а GotoSymbol, однако NavigateTo ищет еще и имена файлов, что иногда приводит к неожиданно большому количеству «шумов» в виде файлов с архитектурными диаграммами и некоторых других файлов, которые нас явно не интересовали.

    Ниже представлены скрины с перечисленными возможностями ReSharper: Go to Type, Go to Filename и Go to Symbol:







    3. Go to File Member (Alt + \, Ctrl + F12)

    В составе Visual Studio есть возможность перехода к имени члена внутри конкретного файла (эта фича называется Navigation Bar, команда Window.MoveToNavigationBar), однако аналогичная возможность ReSharper-а немного более удобна. Во-первых, GotoFileMember поддерживает те же возможности фильтрации и поиска, что и поиск типа или файла (т.е. поддерживает CamelCase поиск). Во-вторых, Go to File Member выводит список членов не в порядке объявления, а несколько в ином порядке (конструкторы, поля, свойства, методы), что делает переход к конструктору максимально удобным.



    4. Navigate To (Alt + “`”, Ctrl + Shift + G)

    ReSharper поддерживает большой набор возможностей по навигации: переход к объявлению и реализации, переход к базовым классам и наследникам и многие другие. Для каждой из команд есть соответствующие горячие клавиши, но поскольку их чуть более чем дофига, то запоминать их все как-то не хочется. Для начала достаточно запомнить одну команду, из которой можно получить доступ ко всем возможностям навигации – это команда навигации под названием NavigateTo, из которой уже можно выбрать конкретное действие. (Не путайте эту команду с NavigateTo из состава Visual Studio, которая упоминалась при обсуждении поиска типов и файлов).



    Большинство команд навигации довольно хорошо известны, но одну хочется выделить отдельно. Это Go to Implementation (Ctrl + F112, Ctrl + Shift + Alt + B).

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



    5. Навигация по «последним файлам»

    1. [VS] NavigateBackward (View.NavigateBackward, Ctrl + -), NavigateForward (View.NavigateForward, Ctrl + Shift + -)

    2. [R#] RecentFiles (Ctrl + “,”, Ctrl + E) – список последних просмотренный файлов

    3. [R#] RecentEdits (Ctrl + Shift + “,”, Ctrl + Shift + Alt + Backspace) – список последних измененных файлов

    4. [R#] Locate File in Solution Explorer (Shift + Alt+ L, Shift + Alt + L) – показать положение текущего файла в Solution Explorer-е

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

    Самым простым способом вернуться на один или несколько шагов назад (или вперед), является использование стандартных команд Visual Studio – Navigate Backward/Forward. Однако если нужно перейти сразу на несколько уровней назад, то проще поискать в списке последних файлов (RecentFiles) (кстати, как и в других фичах, Recent Files поддерживает возможность поиска и фильтрации нужного файла, включая CamelCase поиск).



    Отдельно хочу отметить возможность показать положение текущего файла в Solution Explorer-е (LocateFileinSolutionExplorer).

    6. Move code up, down, left, right (Ctrl + Alt + Shift + Up/Down/Left/Right)

    Команда позволяет структурировать члены классов, а также перемещать блоки кода внутри метода (можно, например, внести или вынести код внутрь блоков if/for etc).



    7. Go to next member/tag (Alt + Down), Go to previous member/tag (Alt + Up)

    Это такой себе аналог перемещения по абзацам в Word-е с помощью Ctrl + Up/Down, только в этом случае «абзацами» выступают члены класса (методы, свойства, события, поля).

    8. GenerateCode (Alt + Insert)

    ReSharper поддерживает довольно много разных плюшек для генерации кода, большая часть которых доступна по Alt + Insert. Из Solution Explorer-а доступны шаблоны генерации классов/структур/перечислений (можно добавлять и изменять собственные шаблоны):



    А из классов доступна другая команда для генерации конструкторов, свойств, перегрузки методов и т.д.



    Как минимум стоит обратить внимание на генерацию конструкторов, перегруженных методов и методов сравнения (методы сравнения – это отдельная тема и написать их правильно, как минимум утомительно).

    9. Auto-import using directives (Alt + Enter)

    Еще одной полезной возможностью, которой я пользуюсь постоянно, является автоматический импорт директив using.



    На рисунке выше показаны возможности как ReSharper-а, так и встроенные средства Visual Studio (контекстное меню с фиксами от Visual Studio называется “Smart Tag” (View.ShowSmartTag) доступны по Alt + Shift + F10 или по Ctrl + “.”). Помимо использования разных горячих клавиш, отличие между двумя реализации состоит в том, что ReSharper ищет указанные типы не только в добавленных сборках, но еще и во всех других сборках солюшена, что может быть очень удобно, например, при работе над проектом с юнит-тестами, когда в нем еще не добавлены некоторые проекты.



    10. FindCodeDependentonModule

    Иногда бывает полезным понять, что конкретно используется из определенной сборки. Для этих целей в 6-м ReSharper-е добавили возможность поиска кода, зависимого от определенной сборки; доступно это следующим образом: Solution Explorer -> References -> System.Xml.Linq -> Find Code Dependent on Module.



    11. Duplicate a line or selection (Ctrl + D)

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

    Кстати, здесь стоит упомянуть еще об одной схожей возможности (на этот раз, это возможность студии, а не ReSharper-а), которой я частенько пользуюсь: удаление строки целиком без ее выделения – CutorDeletetheCurrentLine (Edit.LineCut, Edit.LineDelete, Ctrl + L, Shift + Del).

    12. Parameters Info (Ctrl + Shift + Space, Ctrl + P)

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

    Но есть и более простой вариант – использование команды Parameters Info. Данная функция доступна как в Visual Studio (сочетание клавиш такое же: Ctrl + Shift + Space), так и в ReSharper-е, разница заключается лишь в том, какой IntelliSense будет вызван.



    13. QuickDocumentation

    Еще одна возможность, которая есть как в Visual Studio, так и в ReSharper-е, однако с небольшими отличиями в юзабилити.

    [VS] Quick Info (Edit.QuickInfo, Ctrl + K, I)


    [R#] Quick Documentation (Ctrl + Shift + F1, Ctrl + Q)


    К сожалению, если вам вдруг приглянулось контрактное программирование, то ни один из этих инструментов не показывает нормально предусловия и постусловия, а точнее, они не показывают их вовсе. Есть расширение к студии, под названием Code Contracts Editor Extensions, которое добавляет эту информацию в tool tip от Visual Studio, но стабильность этого расширения очень уж низкая.

    14. ReSharperNamespaceProvider

    Одной из стандартных идиом именования является согласование логической (пространств имен) и физической структуры проекта (папок); это значит, что имя открытого (public) класса должно совпадать с именем файла, а пространства имен (namespace) должны совпадать со структурой папок, в котором расположен этот файл.

    Чаще всего такой схеме разумно придерживаться и именно так думает анализатор ReSharper-а, и если вы не будете этому следовать, то он будет жаловаться, предлагать одуматься и использовать правильные пространства имен.



    Однако всегда следовать подобным принципам сложно, а отключать эту функцию ReSharper-а не хочется. Решается это дилемма довольно просто: достаточно зайти в свойства папки и выставить NamespaceProvider в False.



    Заключение

    ReSharper уже давно является приличным монстром с огромным количеством возможностей и здесь показана лишь часть из них, которыми я постоянно пользуюсь. Это не значит, что все перечисленные возможности будут удобны всем или что нет других полезных возможностей. Так, например, я осознанно не касался рефакторингов, quick fix-ов, средств обеспечения стиля кодирования, запуска юнит-тестов, темплейтов и много другого. Что же касается Visual Studio, то это еще бОльший монстр, с огромным количеством фич; часть из них весьма удобна, а часть – довольно посредственна (JetBrains-у и подобным ребятам тоже нужно как-то на жизнь зарабатывать). Среди удобных фич самой студии стоит отметить возможность вертикального редактирования (немного подробнее об этом я писал тут), сокрытие произвольных участков кода, мощные средства поиска и замены и многое другое. Но это уже тема отдельного поста.

    Дополнительные ссылки

    1. ReSharper Features

    Да, я знаю, что никто не любит читать официальную документациюJ, но иногда в ней можно найти много чего полезного!

    2. ReSharper Default Keymap

    Visual Studio scheme pdf
    ReSharper 2.x / IDEA scheme pdf

    Распечатать в 3-х экземплярах и повесить перед рабочим столом!

    3. Лучшие посты Скота Гаттри (Scott Guttrie) за 2010 год

    Пост Скотта содержит весьма достойный набор ссылок, большая часть которых посвящена новым возможностям Visual Studio 2010. Хотя моя статья в основном посвящен ReSharper-у, но даже в ней я неоднократно касался общих возможностей, так что дополнительный источник информации именно по студии будет полезным.
    Поделиться публикацией

    Похожие публикации

    Комментарии 22

      +22
      ХАБРАКАТ!
        +3
        Проснулся, так проснулся:))

        После вчерашнего обновления хабра у меня вообще проблемы некоторые были: кнопка создания поста появилась только с третьего раза, да и кнопки хабракат до сих пор нет. Влепил тек ката по памяти, но промазал.
        –11
        А Хабр как бэ говорит, что нехорошо сначала в своём блоге размещать, а потом на Хабр тянуть. Стыдно, Сергей!
          +3
          Хабр такого не говорит, он говорит, что нельзя включать в пост на Хабре ссылки на свои блоги. И да, что здесь стыдного?
          –4
          WTF? на самом деле могу сказать больше, но думаю и это достаточно точно выражает суть
            0
            А Вы скажите. Лично я не понял, о чём вы
              0
              Подозреваю на момент публикации комментария не все в порядке было с хабракатом.
              Сейчас комментарий понятно больше не актуальный.
            +1
            Пропустили возможность установки закладок (вроде как это решарперовская фича по Ctrl+number) на строках.

            А найти файл в солюшене гораздо проще если сразу включить синхронизацию файла и положения в солюшене — это умеет и сама студия.

            А еще очень достойная фича — FileStructure, решарперовская очень удобна и последние месяца она у меня не выключается вообще. Для больших скриптов, например msbuild — незаменимая вещь.

            Самая пичалька что все это довольно ощутимо тормозит студию, учитывая что она сама становится все монструознее в некоторых аспектах…
              0
              Закладки — ОК. А вот синхронизация положения файла в солюшн эксплорере — не уверен. Мне не настолько часто нужно синхронизировать положение текущего файла, чтобы смириться с постоянными изменениями в UI, которые происходят при навигации.
                0
                А зачем вы вообще его ищете если есть Ctrl+Shift+T — открыть по имени? Я им не пользуюсь, я в солюшен вообще редко заглядываю…
                  0
                  Например, нужно закоммитить изменения, добавить новый файл рядом etc.
                    0
                    Избегаю пользоваться интеграцией VCS в студию. А с выходом TSvn 1.7 — отпала необходимость даже для rename
                0
                >А найти файл в солюшене гораздо проще если сразу включить синхронизацию файла и положения в солюшене — это умеет и сама студия.
                а можно поподробнее?
                  +1
                  Way to kill your perfomance:
                  Tools -> Options -> Projects and Solutions -> General -> «Track Active Item in Solution Explorer»
                  +1
                  >А найти файл в солюшене гораздо проще если сразу включить синхронизацию файла и положения в солюшене — это умеет и сама студия.

                  В самом солюшене ReSharper всего 300 проектов, но «track active file in solution explorer» уже ЖОСКО увеличивает время открытия файла во время навигации. Просто попробуйте отключить, на огромных солюшенах будете приятно удивлены :)

                  Как по мне, то у «Locate File in Solution Explorer» плюс в том, что оно открывает свёрнутый solution explorer.
                    0
                    Я не пользуюсь track по той же причине. мне даже Solution Navigator из PPT не нужен после того как я случайно набрел на Ctrl+Shift+T решарпера. Ну просто быстрее набрать файл по имени чем искать его в дереве.
                    А вообще лично я VS Default Keymap для Resharper, пришпиленную рядом с рабочим местом, изредка перечитываю ;)
                  +1
                  Очень простая, но, пожалуй, наиболее частоиспользуемая мной фича — это расширение выделения Extend Selection (Ctrl, + Alt + Right, Ctrl + W). И его собрат — сужение выделения Shrink Selection (Ctrl, + Alt + Left, Ctrl + Shift + W)
                    0
                    Да, фича ОК, но я так и не запомнил нужные сочетания. Все больше по старинке выделяю блоки кода.
                      0
                      Ну, куда уж проще чем Ctrl + W?!
                      Копирование/вставку в буфер ведь запомнили. ;)
                        –1
                        Здесь дело не в сложности сочетания, а в том, что запоминание этой комбинации пока не дает ощутимых преимуществ лично для меня, чтобы ее запомнить.

                        Я, кстати, не спорю, что это очень полезная фича, но как я написал во введении, я привел не просто абстрактный набор фич решарпера (их любой может посмотреть в хелпе), это те возможности, которыми лично я пользуюсь. А комменты, вроде этого позволяют дополнить приведенный список фич, другими, не менее полезными.
                    –11
                    Хабракат для мудаков?
                      0
                      Однако всегда следовать подобным принципам сложно, а отключать эту функцию ReSharper-а не хочется.

                      А что сложного в том, чтобы следовать этому элементарному правилу?

                      Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

                      Самое читаемое