IntelliJ IDEA导航特性Top20

在前面的文章里,我介绍了IntelliJ IDEA(以下称IntelliJ)中与代码补全重构相关的特性。今天我将介绍另外一个利器——IntelliJ的导航(Navigation),只要运用得当,它将节约你大把的时间。

作为一个IntelliJ的用户,你应先明确一点——IntelliJ是用来让你专注于代码的工具。只有这样我们才能充分利用并享受它的魔力。因此,大部分的时间里你应该专心工作于代码编辑器中,仅把导航当做在不同位置的代码间快速切换的好帮手。

本文旨在介绍IntelliJ的导航在工程文件(project files)、代码块(block of code),及工具窗口(tool window)、编辑器标签等UI元素上的特性。

1、最近编辑的文件

如果停下来仔细分析你所有的导航行为(Navigation Pattern),你会意识到,在大部分的时间里你只固定的一些文件上工作。这就很好地解释了为什么Recent files是IntelliJ用户的常用特性。一旦能熟练使用它,你就会将其逐渐引入到你大部分的导航操作中去。而使用这一特性只需使用快捷键Ctrl+E(OS X为Cmd+E)。

请注意,该功能默认选中最后访问的文档,所以只需使用回车或者鼠标单击便能跳转到此文件。如果想减少列表中的候选项,则可以借助Speed Search 功能——输入目标文件名中的一部分,列表将仅显示匹配项。

IntelliJ导航配图

2、结构菜单(Structure popup)

另一个你每天都会做的,就是要在当前打开的文件中四处奔波,而文件有一个共性:它们有自己的文件结构。例如,一个Java的类文件含有字段和方等成员组成的结构。XML和HTML文 件包含一个标签树(tags tree)结构。如果想快速的导航到文件结构的某一部分,那就快按下Ctrl+F12(OS X 上为Cmd+F12)来选 择想跳转的地方吧。(同样的,Speed  Search亦可用于减少列表中的候选项)

structure_popup_1

有时,你对信息的需求可能会影响Structure popup中显示的内容。例如,一个Java类的结构图可能包含了与其相关的基类或接口的结构信息。不过在默认情况下,IntelliJ会隐藏它们,如果确实需要,那么再按一次快捷键即可。

IntelliJ会贴心地记录你在Structure popup中的操作偏好,并在下一次调用它时体现出来。

3、跳转至导航栏

通常,屏幕中只显示含代码的编辑器是一件喜闻乐见的事情。但也有人希望看到项目树(project tree),因为它有助于理解或者快速修改项目的上下文。 事 实上,在项目树和编辑器之间切换是IntelliJ中极其容易的事情。不过事实上,项目树并非最佳选择。老练的IntelliJ用户知道一个更好的替代 品:导航栏。新用户常以为那只不过是一个面包屑菜单(breadcrumb)罢了,但在有经验的开发者眼中,这可是一把瑞士军刀!按下快捷键 Alt+Home(OS X为Alt +   )执行Jump to navigation bar的操作,我们就能感受到它的威力——利用它我们可以跳转至项目的每一处,可以创建和修改任一文件以及其他许许多多有意义的事情。

navigation_bar_1

值得一提的是,即便在导航栏隐藏时,我们也可以执行此操作。

navigation_bar_2

 4、跳转至指定类

你可能会想:Go to a class这么一个简单的操作有什么好说的?也许你已经知道Ctrl+N(OS X中为Cmd+N)能够在类之间跳转,但不见得你就知道这个功能比它看起来强大得多。除了各家IDE都支持的简单通配符、驼峰式命名、包名前缀以外,IntelliJ还可以将中间名匹配(middle name matching)、行号后缀、快速文档、定义菜单(definition popups)等方法引入这一功能:

go_to_class

默认情况下,Go to a class功能的搜索仅会在你的项目中执行。若没有匹配项,再按一下快捷键,搜索将在项目引用的库中展开。

在IntelliJ中,我们完全可以不借用鼠标便轻易地执行类间跳转:当菜单出现的时候,输入或修改查询语句,最后利用键盘的上下键选择目标即可。若你曾试图在其他IDE中尝试这种方法,你肯定知道我在说什么。

5、跳转至指定的文件或目录

当你需要打开项目中特定的文件,利用快捷键Ctrl+Shift+N(OS X中为Cmd + Shift + N )是个不二的选择。除了实现其基本的功能外,你还可以借由通配符、驼峰式命名以及目录名前缀等方法进行搜索。

go_to_file

6、跳转至指定符号

终于要介绍Go to…特性家族里的最后一位重要成员了——Go to a symbol。 通过快捷键Ctrl + Shift + Alt + N (OS X为Cmd + Shift + Alt + N ),便能在不用全文搜索(full-text search)的情况下导航到指定的符号处。因为IntelliJ会一直维护项目及库中所有符号的索引,所以无论项目规模多么庞大,它依旧可以在通过相应 表达式在几秒内轻易地找到匹配的方法或字段。

go_to_symbol

7、在…中选定

如果需要在特定的工具窗口(如Project/Changes View,甚至Explorer/Finder)中选定正在编辑的文件,那么通过快捷键Alt+F1来使用Select in…的功能是再方便不过了。

select_in

8、切换至指定的工具窗口

IntelliJ的大多数工具窗口都分配了简单的快捷键组合。通过快捷 键,你便能快速呼出对应的工具窗口并使其获得焦点。在工具窗口获得焦点时再按一次快捷键,工具窗口将会隐藏,你便能返回编辑器上工作啦。这种方法实在是方 便,更重要的是,它让你完全摆脱了鼠标——每当需要某一个特定的工具窗口或者想返回编辑器,按快捷键就好了。

确保你至少能记住以下几个快捷键:

  • Project工具窗口:Alt + 1 (OS X中为Cmd + 1
  • Changes工具窗口:Alt + 9(OS X中为Cmd + 9
  • Terminal工具窗口:Alt + F12

9、返回编辑器

很多人都不知道IntelliJ的一个小窍门——按下Escape就能返回编辑器。当你使用这种方法时,此前被呼出的工具窗口仍保持其可视状态。当然啦,如 果你不想看到这些窗口,按下快捷键Ctrl + Alt + F12(OS X为Cmd+ Alt + F12)即可。

译注: 在本地测试时该快捷键对应File Path,而Shift+F12才是正确的快捷键

10、跳转至关联的单元测试

当你正在编写代码,特别是想同时确保代码顺心如意,常用的导航功能是什么呢?当然是在类和对应的单元测试中来回切换啦。IntelliJ可以识别每一个类所关联的测试,并且提供Go to a test的工能。按下Ctrl + Shift + T (OS X 为Cmd + Shift + T),便能在它们之间来去自如:

go_to_test

如果在使用这一功能的类没有相关联的测试,则IntelliJ会好心地帮你生成一个。

11、跳至上方的层级

另 一个常见的行为是,你会为了某个类或者其某个方法,需要浏览该类的层级结构。在大多数IDE中,你能看到一个图标出现在与方法定义处于同一行的 gutter里(译注:gutter即编辑器左侧的窄条,可见特性21)。通过点击这个图标,就导航到了父类(或接口)中该方法定义的位置。除此以 外,IntelliJ独创了一个叫Super Method的功能,按下快捷键Ctrl + U (OS X为Cmd + U )即可。它在无不借助鼠标的情况下实现向上跳转一级。

12、跳至下方的层级

既然可以向上跳转,凭啥不能向下呢?话虽如此,事实上,鲜有 IDE实现了这一功能,所幸IntelliJ就是其中的一个。除了提供跳转至父类的图标,IntelliJ同样提供一个可导航至子类对应方法的定义位置的 图标,所以,在IntelliJ的世界,可谓“上天入地”(up and down)无所不能。

navigate_up_down

如果想不用鼠标,并更快地导航至下层,那就使用快捷键Ctrl + Alt + B (OS X 为 Cmd + Alt + B for OS X)调用Implementations来实现吧,它将列出所有实现了当前类的子类让你挑选:

go_to_implementations

13、方法层级图

那要是想查看有关所有实现或者覆写了当前方法的类的结构图呢?在IntelliJ中,有一个Method Hierarchy的功能,可以通过快捷键Ctrl + Shift + H (OS X 为 Cmd + Shift + H )来调用。这个功能让你能导航至所有符合这一关系的类中:

method_hierarchy

14、图解菜单(Diagram popup)

我们刚学习了一些在有关方法定义的层级结构中导航的门路。可能在某些时候还要在当前的类(或者说光标所处的类,无论它有多少的方法)的层次结构中使用导航。大多数IDE通过提供单个类或接口的层级结构,以实现这一需求。在IntelliJ里这种功能称为类型层级(Type Hierarchy,其快捷键为Ctrl+H

type_hierarchy

如你所见,该功能返回一个树形结构。有些人可能觉得这种格式难以理解,所以IntelliJ同时提供了另一个称为Diagram popup——快捷键为Ctrl + Alt + U (OS X 为Cmd + Alt + U)——的功能,以UML图的方式替代树形结构来描述给定的类的层级结构:

diagram_popup

不用提醒你就能知道,通过它我们可以导航到任何由图形所表示的类或接口中。

15、方法调用层级结构

除了类和方法定义的层级结构以外,我们还有一个特殊的导航行为:在方法调用的层级结构中导航。每一个方法会调用很多调用另一些方法的方法,以此类推。这就是为什么有时你需要导航到被当前方法所调用或者调用了它的方法中去。通过快捷键Ctrl + Alt + H来借助Call Hierarchy功能,便可让IntelliJ为你快速地呈现当前方法的调用层级结构:

method_call_hierarchy

16、显示使用情况

导航到使用了光标指定的符号的位置,亦是一件常有的事。为了做到这一点,每个IDE都会提供一个Find usages的功能。但这个功能的缺点在于,它通常实现得十分“笨重”——它不仅要单独启动一个长时间运行的进程,还需要创建一个工具窗口来显示结果。为此IntelliJ提供了一个轻量级的解决方案——Show usages,其快捷键为Alt + Ctrl + F7 (OS X 为Cmd + Alt + F7 ):

 show_usages

这个功能以菜单的形式展示结果,并且默认情况下只在工程级别(Project level)的范围内运行。如果再调用一次该功能,其运行范围将扩充至工程和库级别(Project and libraries level)。

17、最近编辑的文件

在前面的内容中我介绍了如何导航至最近访问的文件。那么如果我希望在筛选出最近被编辑过的文件呢?在IntelliJ中只需通过快捷键Ctrl + Shift + E (OS X中为Cmd + Shift + E)调用Recently Edited Files功能便能轻易满足这一需求:

recent_files_1

18、在视图与控制器中间导航

你认为一个IDE只了解项目的文件中最基本的关系(如类的层次结构,测 试覆盖率,使用情况等)便够了吗?那些特殊的关系呢?按下Ctrl+ Alt + Home (OS X为Cmd + Alt + Home),即可借助IntelliJ IDEA 提供的Related symbol的功能,让你能够获得基于这些特殊关系(如在Sping MVC、Grails、甚至JavaFX应用的views和controllers之间)的导航功能。

go_to_related_file

19、导航至特性视图控制器(View controller)

既然IntelliJ能够弄清项目中的一些特殊关系,那么它还具有哪些专用的导航功能呢?如果你是一个Web App开发者,可以通过输入与view controller相关联的URL,调用Go to a symbol功能,快捷地找到它:

go_to_url

20、数据库相关导航模式

IntelliJ的那些数据库工具也提供特殊的导航行为。在数据库工具窗口中,调用Go to a symbol,并键入表(table)的名字,便能快速地跳转至表中:

go_to_table

如果在一个表或者一个列(column)中使用Find usages功能,IntelliJ便将展示所有引用了它的表:database_find_usages

更让人欣喜若狂的是,IntelliJ可以根据主键的使用情况,将你导航到其它表中。比如,你可以要求IDE显示在其它表中,哪些行引用了当前行的主键值:

database_go_to_declaration

21、书签

我 们接着来看看最后一个重要的行为——通过书签导航导航至任何你感兴趣的位置。IntelliJ提供了非常方便的工具实现这一功能。按下F11,便可将当前 的位置在书签表中添加(或删除)。一旦完成添加操作,你便能在gutter里看到一个相应的图标。之后,每当想返回保存为书签的那个位置,按一下 Shift+F11,然后从列表中选择即可:

bookmarks

总结

希望这篇文章让你初步了解了如何利用IntelliJ强大的导航功能,实现在自己工作的代码中快速地切换,以保证自己专注于代码之中。换句话说,如果能让自己在切换上所花的时间越少,你的生产效率就会越高。

另外,请记住——对自己所使用的IDE了解得更多,你的编程生活就会变得更加惬意。

原文链接: dzone 翻译: ImportNew.com - elviskang
译文链接: http://www.importnew.com/15462.html
[ 转载请保留原文出处、译者和译文链接。]



相关文章

发表评论

Comment form

(*) 表示必填项

4 条评论

  1. Neil 说道:

    感谢分享!以前只知道部分,这个很全

    Thumb up 1 Thumb down 0

  2. kevd 说道:

    “在前面的文章里”,这前面在哪里?

    Thumb up 0 Thumb down 0

跳到底部
返回顶部