本文由 ImportNew - elviskang 翻译自 dzone。欢迎加入翻译小组。转载请见文末要求。

在前面的文章里,我介绍了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 功能——输入目标文件名中的一部分,列表将仅显示匹配项。

2、结构菜单(Structure popup)

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

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

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

3、跳转至导航栏

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

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

4、跳转至指定类

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

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

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

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

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

6、跳转至指定符号

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

7、在…中选定

如果需要在特定的工具窗口(如Project/Changes View,甚至Explorer/Finder)中选定正在编辑的文件,那么通过快捷键Alt+F1来使用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),便能在它们之间来去自如:

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

11、跳至上方的层级

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

12、跳至下方的层级

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

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

13、方法层级图

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

14、图解菜单(Diagram popup)

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

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

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

15、方法调用层级结构

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

16、显示使用情况

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

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

17、最近编辑的文件

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

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

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

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

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

20、数据库相关导航模式

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

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

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

21、书签

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

总结

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

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

via:http://www.importnew.com/15462.html

IntelliJ IDEA 导航的 20 大特性的更多相关文章

  1. IntelliJ IDEA导航特性Top20

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

  2. jdk8十大特性并代码demo(转)

    一.十大特性 1.Lambda表达式 2.Stream函数式操作流元素集合 3.接口新增:默认方法与静态方法 4.方法引用,与Lambda表达式联合使用 5.引入重复注解 6.类型注解 7.最新的Da ...

  3. Volatile的3大特性

    Volatile volatile是Java虚拟机提供的轻量级的同步机制 3大特性 1.保证可见性 当多个线程同时访问同一个变量时,一个线程修改了这个变量的值,其他线程能够立即看得到修改的值 案例代码 ...

  4. AngularJS-chapter1-2-四大特性

    4大特性 MVC MVC实例  数据模型,控制器,视图 HelloAngular_MVC.html 图中的 ng-controller="HelloAngular"  定义了Hel ...

  5. ES6的十大特性和认知

    ---恢复内容开始--- ES6(ECMAScript2015)的出现,无疑给前端开发人员带来了新的惊喜,它包含了一些很棒的新特性,可以更加方便的实现很多复杂的操作,提高开发人员的效率.本文主要针对E ...

  6. 优秀设计师应当知道的20大UI设计原则

    世界级图形设计大师Paul Rand(保罗.兰德)曾经说过:"设计绝不是简单的排列组合与简单地再编辑,它应当充满着价值和意义,去说明道理,去删繁就简,去阐明演绎,去修饰美化,去赞美褒扬,使其 ...

  7. java的3大特性

    java的3大特性 1.继承: * 继承是从已有类得到继承信息创建新类的过程. * 提供继承信息的类被称为父类(超类.基类):得到继承信息的类被称为子类(派生类). * 继承让变化中的软件系统有定的延 ...

  8. 有了这 4 大特性,CDN 好用到飞起

    随着 CDN 市场的快速发展和网络新技术的不断涌现,目前的 CDN 已不仅仅是当初简单的内容分发,同时也是新特性研发.新技术推广及实践的平台.这些新技术.新特性,或者能够保障 CDN 安全性,或是提升 ...

  9. 互联网安全中心(CIS)发布新版20大安全控制

    这些最佳实践最初由SANS研究所提出,名为“SANS关键控制”,是各类公司企业不可或缺的安全控制措施.通过采纳这些控制方法,公司企业可防止绝大部分的网络攻击. 有效网络防御的20条关键安全控制 对上一 ...

随机推荐

  1. JVM调优常用参数和注意点备忘录

    本文主要是工作过程中总结的一些jvm调优的参数和注意的地方,作为一个备忘录,先占个坑,有时间在来细化具体的实例. gc日志是覆盖的方式如果文件名字固定会导致上一次被覆盖可以采用这个-Xloggc:ba ...

  2. Node.js这么下去...

    Node.js是基于javascript的.event驱动的单进程服务器(也能实现cluster模式,只要一个fork()语句,类似于C语言的进程创建). 所以大胆估计:Node.js会把很多大网站吞 ...

  3. disruptor 高性能之道

    disruptor是一个高性能的线程间异步通信的框架,即在同一个JVM进程中的多线程间消息传递.应用disruptor知名项目有如下的一些:Storm, Camel, Log4j2,还有目前的美团点评 ...

  4. mysql及python交互

    mysql在之前写过一次,那时是我刚刚进入博客,今天介绍一下mysql的python交互,当然前面会把mysql基本概述一下. 目录: 一.命令脚本(mysql) 1.基本命令 2.数据库操作命令 3 ...

  5. Python3 与 NetCore 基础语法对比(就当Python和C#基础的普及吧)

    Jupyter排版:https://www.cnblogs.com/dotnetcrazy/p/9102030.html 汇总系列:https://www.cnblogs.com/dunitian/p ...

  6. IIS配置Url重写实现http自动跳转https的重定向方法(100%解决)

    引言 本文推荐阅读地址:https://www.52abp.com/BlogDetails/10008 这种文章网上可以说一搜一大把,但是我为什么还要写呢,因为一搜一把没把我气死,都是东抄西挪的东西, ...

  7. 基于node.js的博客搭建

    一个博客应当具备哪些功能? 前台展示 点击下一页,可以点击分类导航. 可以点击进入到具体博文页面 下方允许评论.显示发表时间.允许留言分页. 右侧有登录注册界面. 后台管理 管理员账号:登陆后看到页面 ...

  8. [Loadrunner参数化]一个文件输两列参数的取值

    关于LoadRunner参数化的内容,在脚本开发中属于非常重要的一个知识点.关于这部分知识,在书上和网上到处都能找到,本篇只讲一种特殊情况:一个参数化文件为File类型,有多列值,如何进行参数化取值. ...

  9. Day10 Python基础之特殊函数(八)

    一些特殊函数 1.递归函数(recursion) 递归函数的定义:在函数内部,可以调用其他函数.如果一个函数在内部调用自身本身,这个函数就是递归函数. 递归函数的优点:是定义简单,逻辑清晰.理论上,所 ...

  10. fun = [lambda x: x*i for i in range(4)] 本质解析/原理,LEGB规则 闭包原理

    命名空间,闭包原理,参考点击本文 一.问题描述 fun = [lambda x: x*i for i in range(4)] for item in fun: print(item(1)) 上述式子 ...