title

(本文约 5400 字,阅读时间约 15 min)

Visual Assist 多年来始终是 Visual Studio 开发环境下的一款难以逾越的经典辅助插件。难得的是,这些年来它的重心一直围绕着 C++ 程序的编写辅助和增强。近年来,逐渐开放的微软加快了 Visual Studio 的演进速度,持续地吸收了不少 VA 的特性,但多年的积累使得 VA 的对应实现仍有着很强的竞争力。就拿代码重构里最基本的“重命名”来说,VA Rename 就比 VS Rename 步骤更少,速度更快,也更为方便和顺手一些。

在上个月偶然间了解到新加的静态分析功能之后,我这两天下载了最新版本的 VA,发现比自己用了好一阵的老版本多了不少新东西,就想试着集中梳理一下。这篇文章里,那些经典功能如符号查找 (Find Symbols / Find References),函数列表 (List Methods in File),代码片段 (VA Snippets) 我就不再多说了,只是对相对较新的特性和技巧做了整理。

特性和功能

Code Inspection 静态分析和快速修正

VA 开始支持基于 LLVM/Clang 的代码静态分析了。与 VS 原生的 Code Analysis 不同的是,VA 支持直接一键修复提示的问题。

ci1

可以在汇总窗口里查看所有静态分析时找到的问题。

ci2

并选中关心的项目,右键 “Apply Quick Fixes” 修复。

ci3

对那些不关心的项目,也可以在选项里关掉单条提示类型,或是调整它们所在的 Level (就像 Warning Level 那样)。

ci4

Debugging - VA Step Filter

可以显式指定调试的时候自动跳过的函数 (比如标准库的函数 std::sort()),比 VS 自带的 autoexp.dat 好用很多

  • 可随时把当前函数添加到过滤列表,并即时生效
  • 可随时开启关闭任意一个指定的函数 (就像开启关闭一个或多个断点)

stepFilterBuiltInFilters

Debugging - Address Resolver

当 callstack 仅包含地址信息时,可以用这个工具来还原堆栈。

addressResolver

关于定位 pdb,基址设置等方面更多的技巧在这里

Debugging - Pdb Explorer

这个工具可以查看,搜索和定位 pdb 内的符号。

pdbExplorer

在调试的时候,可以直接把特定的符号拖到 Disassembly 窗口,非常方便。

explorerGoto

此工具更多的信息在这里

Debugging - Memory View

用来调试 Dump 的内存查看窗口,可以显示特定的地址处的情形,通常配合 Disassembly 窗口和 Memory 窗口使用。

vaMemoryViewDissasembly

此工具更多的信息在这里

快捷键设定窗口

这个全新设计的面板列出了 VA 的所有快捷键及作用域,并可以跳转到 VS 的设置面板上去修改。

hotkey

但是我实际上很少更改默认的快捷键设置,因为工作需要,会需要在不熟悉的机器上的 VS 内工作,如果自己的快捷键是定制的,就常常会遇到肌肉记忆不断失败的情况。总是用默认的快捷键位就可以避免这一点。

技巧

开启 Ctrl + 鼠标滚轮对 Smart Select 的支持

在新版的 VA 的选项 Options | Mouse 中找到下面两项并按照下图中的方式选择

mouse

我们知道 Ctrl + 鼠标滚轮本来是用来即时调整字体大小的,但实际上很少会如此频繁地去放大和缩小代码的字体,有时候还容易造成误操作。换成 Smart Select 之后就可以非常快捷地选择光标所在的代码块了,比如说你的光标在下面的代码段里注释所在的地方:

vaSmartSelect

那么按下 Ctrl 后,随着滚动鼠标滚轮,你会选中 if 的所有代码,继续滚动的话,接下来是 for 的所有代码,然后逐级向上,DoSomething,Bar,Foo,最后是整个文件。(选中顺序与图中左侧折叠代码块的 Outlining Bar 保持一致)而反向滚动则会逐级退回。熟练以后你会发现这个功能非常好使,会很少再需要手动去掐头去尾,选中一段代码了。

VA Hashtags 增强注释——可跳转可聚合的代码内书签

比书签 Bookmark 更好的是,hashtags 是代码的一部分,所有人共享并签入版本库,可跳转,相同的 tag 自动聚合到一起。

vaHashtags

可以快速标出某个常用代码的位置 (如 main() 函数的位置):

hashtagMain

可以交叉引用并跳转:

hashtagSeeDoSomething

可以在窗口内管理,搜索,分组和隐藏:

commaHash

这个功能特别灵活,它本质上是对一堆信息做最小组织 (minimal-structuring) 的过程,特点是即使数据量再大也始终能保持最小的维护负担

其实我们日常信息处理时,有很多分组/分目录都不合适的情况——比如发过的所有的朋友圈,只需要在单条记录内任意位置打上 #旅行 / #摘抄 / #笔记 等等… 假如朋友圈支持按照 hashtags 聚合,就可以一键找到所有的相关项。

我的日常日志也依赖这类标记,比如 #电影 #2016 就可以一下找到我 2016 年看的所有电影。

总的来说我现在非常偏爱这一类平坦组织结构,无需额外的抽象 (abstract) 和层次 (hierarchy),不用成天纠结分组/分类等问题,比树状的类文件夹系统实用和轻便很多。

Flat is better than nested.

VA Outline 大纲视图的快捷操作

这个视图浓缩了当前文件的大纲,便于随时跳转和审视整体结构。

vaOutline

可以直接在这个视图上拖拽来挪动代码块。

vaOutline2

也可以直接在这个视图上选中一个或多个 block,右键执行各类重构命令,或者整体注释。

vaOutline3

这个窗口本质上是把单个的代码块原子化了,简化了操作步骤,也避免了很多误操作。

更多的小技巧

  • Goto Related 跳转到相关的各类符号 (声明/类型/使用地点) 是 Goto Implementation 的增强版
  • Clone Find References Results 可以将查找结果复制到独立窗口,这一过程可重复产生多个窗口,不像 Find in Files 只允许两个结果窗口
  • 一些用起来很顺手的文件操作相关的重构

    • Rename Files... 一键重命名同名的 .h/.cpp
    • Move Selection to New File... 一键把选中的代码挪入新文件
    • Move Implementation to Source File / Header File 太常用不解释了
  • 大项目会产生若干 GB 级别的缓存文件,可以使用 Options | Clear 来清理这些磁盘空间

  • 有时在代码库里做了较大的更新之后,会出现新版本的代码下缓存失效没有及时更新,导致一些功能不起作用的情况。这时使用 Options | Rebuild 可以重建符号数据库(注意,上面的 Clear 不会影响符号数据库

  • 如果VS没有安装在固态硬盘,把 VA_X.dll 的目录 mklink /j 符号链接到 ssd 上面会快很多。(谢谢评论中 Tyung 同学的补充)

能看到这里说明你一定是真·VA粉了,如果你有什么独门技巧,欢迎在留言里与大家分享~ [抱拳]

(完)

Gu Lu

[2017-04-15]


  • [2017-04-29] posted (.5h)
  • [2017-04-16] revised (.5h)
  • [2017-04-15] initially written (3h)

Comments
Write a Comment
  • 感谢分享!已推荐到《开发者头条》:https://toutiao.io/posts/6et3vl 欢迎点赞支持!

    欢迎订阅《游戏开发杂货铺》https://toutiao.io/subject/528

知识共享许可协议
本作品由Gu Lu创作,采用知识共享Attribution-NonCommercial-NoDerivatives 4.0 国际许可协议进行许可。