本文介绍Windows平台上命令行开发相关工具,由于涉及软件众多,只做简介,不去深究。

1. 原生工具

Windows下有三个命令行工具:Command Prompt(cmd)、PowerShell和WSL Bash。

cmd历史悠久,虽然有诸多不足,但胜在启动快,各种命令也比较熟悉。

PowerShell功能强大,目前发展良好,但是启动偏慢,而且许多命令变化较大。

WSL Bash暂未用过,有文章说它有性能问题,但是我估计make和find这种初级应用应该没有影响,最大困难是要启动WSL,硬盘空间吃不消。

综合下来,还是cmd最常用。

2. 扩展工具

cmd很难配置。更改默认字体异常困难,唯一可用的是等距更纱黑体,效果也一般, 字体的宽度问题还会导致一些DOS窗口绘图出现偏差。更改主题颜色就更是难以实现,因为它不支持256色。

市面上已经有丰富的扩展工具。

(1)ConEmu

这是我每天在使用的工具,所以放在第一个介绍。

它相当于一个cmd的外壳,提供了外观美化、窗口管理、快捷键等多方面的增强。使用它能够很轻松的实现多个cmd平铺展开。

(2)cmder

它打包了ConEmu,FAR Manager,Clink等多个优秀工具,界面美观,功能强大,实现了一站式的cmd增强替代方案。 但是启动速度稍慢。

(3)Alacritty

它是Rust语言写的工具,Rust编的工具通常都很快,并且使用了GPU加速,显示效果上比较细腻。 现在还处于项目早期,感觉功能有限。

(4)Console2, ConsoleZ

早年间Console2是一个知名的cmd外壳,后来停止更新,ConsoleZ是它的继任者。

(5)Terminus, Hyper

这两个都是Web技术(Node.js)实现的工具,界面异常美观。追求炫酷的用户,它们非常适合。

(1)-(5)这些工具都只是一个外壳,后台可以调用cmd,powershell或bash等各种Shell。

(6)msys2, mingw, git-bash

它们都实现了一个小型Linux操作环境,可以获得类似Linux的使用体验。安装后会获得一个命令行窗口,后台调用bash。从我的使用体验上讲,bash的操作体验要优于cmd,但是又说不清哪里好。

(7)cygwin

cygwin是msys/mingw类似的工具套件,安装后也会获得有一个bash。

(8)MobaXTerm

它是一个基于cygwin的终端,功能很多,甚至包含一堆DOS游戏 😂,其中最让我心仪的是它支持串口通信!可以一边make程序,一边观察串口输出。

(9)Babun

它也是基于cygwin的一个工具套件,功能很丰富,但是已经停止更新几年了,作者在官网上很幽怨的说大家只想拿来用,现在想转手项目却找不到人。

(6)-(9)这些工具都是基于bash+mintty,彻底脱离了cmd。开发过程中用到的命令行工具,一部分兼容二者,另一些只在一种上好使。从开发角度,系统里安装一个msys2或cygwin总是必要的。

(10) vim, emacs, sublime_text, vscode

这几个工具自己内置shell,或通过扩展添加一个内部shell,当需要处理大量代码文件时候,在编辑器中开个shell更方便,避免来回跳转。

3. 辅助工具

我们使用命令行的时候常用操作可以总结为:

  • 目录的创建、查看、跳转、删除、复制、重命名、搜索
  • 文本的创建、查看、编辑、删除、复制、重命名、搜索
  • 文本内容搜索
  • 查看系统信息
mkdir/md创建文件夹
rm/del/rmdir删除文件、文件夹
cd目录跳转
dir/ls打印文件(夹)列表
find搜索文件、文件夹
grep搜索文件内容
diff/fc比较文件内容
echo/cat打印和读取
where/which获取某命令路径
cp/mv/ren复制、移动、重命名
path/env打印环境变量

我们在Windows上的大多数操作,都可以简化成这些命令或其组合。

以上命令中,有些是Windows命令,比如where,有些是Linux命令,比如为which,如果我们安装配置了msys2,则可以通用。

推荐安装一些辅助工具来提供工作效率,它们是:

  • clink:自动补全命令
  • far:资源管理器
  • fd:find增强版
  • fzf:find增强版,但是与fd用途不同
  • rg/ag:grep增强版
  • vim/gvim:无需赘言

其中clink一定要安装,没有clink的cmd是没有灵魂的。

4. 右键菜单

假如你也选择ConEmu,安装配置好以后,最好添加一个右键菜单“Open ConEmu Here”,这样就可以在当前文件夹打开ConEmu。

可以通过修改注册表完成。

(1)选中文件夹的右键菜单

Windows Registry Editor Version 5.00

[HKEY_CLASSES_ROOT\Directory\shell\ConEmu Here]
@="Open ConEmu"
"Icon"="C:\\Program Files\\ConEmu\\ConEmu64.exe,0"

[HKEY_CLASSES_ROOT\Directory\shell\ConEmu Here\command]
@="\"C:\\Program Files\\ConEmu\\ConEmu64.exe\" -here -dir \"%1\" -run {cmd} -cur_console:n"

(2)文件夹空白处的右键菜单

Windows Registry Editor Version 5.00

[HKEY_CLASSES_ROOT\Directory\Background\shell\ConEmu Here]
@="Open ConEmu"
"Icon"="C:\\Program Files\\ConEmu\\ConEmu64.exe,0"
"NoWorkingDirectory"=""

[HKEY_CLASSES_ROOT\Directory\Background\shell\ConEmu Here\command]
@="\"C:\\Program Files\\ConEmu\\ConEmu64.exe\" -here -dir \"%V\" -run {cmd} -cur_console:n"

(完)

下载安卓的nrf connect等APP,国内用户很困难。

推荐使用下图所示的APP软件,它是一个安卓APP应用商店,能够直接下载nrf系列APP,包括nrf connect,nordic thingy,nrf toolbox,以及lightblue等。(你没看错,Lightblue也出安卓版了。)

 

这里上传了它的安装包:链接,密码见评论区。

(完)

Segger Embedded Studio(简称SES)有许多使用技巧,本文介绍几个我比较常用的。

(1)自定义快捷键

通过菜单项:Tools –> Options –> Keyboard,实现自定义快捷键。

我所改的几个功能:

  • DebugDownloadActive(F8):下载当前工程。
    在Keil中,下载功能使用快捷键F8,与Build功能(F7)毗邻,这里设置成相同快捷键。
  • EditGoToDeclaration(F11):跳转到函数声明。
    跳转到函数定义快捷键是Alt+G和F12,后者是隐藏快捷键,这里设置成F11与之毗邻。

另外,在Tools –> Options –> Text Editor中,将Ctrl + Left Click Action设为Go To Definition,即可实现类似Source Insight中的“Ctrl+点击”的方式跳转函数定义。

(2)外部工具

SES可以添加外部工具,但是入口很隐晦。

打开菜单项:File –> Open Studio Folder –> External Tool Configuration,将打开tools.xml文件。

在<tools></tools>之间加入如下代码,参考链接

<item name="Tool.CMSIS_Config_Wizard" wait="no">
    <menu>&amp;CMSIS Configuration Wizard</menu>
    <text>CMSIS Configuration Wizard</text>
    <tip>Open a configuration file in CMSIS Configuration Wizard</tip>
    <key>Ctrl+Y</key>
    <match>*config*.h</match>
    <message>CMSIS Config</message>
    <commands>
    java -jar &quot;$(CMSIS_CONFIG_TOOL)&quot; &quot;$(InputPath)&quot;
    </commands>
</item>

此时对sdk_config.h文件点右键,右键菜单中将多出一个CMSIS Configuration Wizard的菜单项,快捷键是Ctrl+Y。如下:

CMSIS Configuration Wizard是一个可视化的设置sdk_config.h的工具,SDK14.2中已经自带了该工具:

同时可以看到,右键菜单中还有我自定义的擦除芯片(Erase the Chip)的命令。

(3)定位注释中的变量

有的代码注释会引用外部变量,如下:

enum BLE_GAP_EVTS
{
  BLE_GAP_EVT_DISCONNECTED,     /**< See @ref ble_gap_evt_disconnected_t.*/
  BLE_GAP_EVT_CONN_PARAM_UPDATE,/**< See @ref ble_gap_evt_conn_param_update_t.*/
  // ...
}

注释中提到了ble_gap_evt_disconnected_t,我想查看该类型变量的定义,由于它位于注释中,无法直接按F12跳转。

最直观的方法是”全局搜索“,再从搜索结果中筛选,但这样做效率很慢(而且SES的全局搜索功能还有陈年bug)。

一个快速的方式是,调用菜单项:Navigate –> Find Symbol(Alt + Y),在符号查找窗口中输入ble_gap_evt_disconnected_t,然后就能够快速定位到该变量的定义,如下:

(4)移除Code/Data列

在项目文件浏览器中,显示了各文件的Code/Data大小,这两列宽度无法调小,在笔记本屏幕上非常浪费空间。

在工具栏的右边角落里有个设置菜单,可以在菜单中隐藏这两列,如下图:

(5)简化工程选项(Project Options)

打开工程选项的常规做法是先选中工程,再右键选择Edit Options项。但是Options中的条目太多,看着麻烦,希望能够只显示我们关心的条目。

操作方法是,打开(4)中提到菜单,做如下设置:

然后在项目文件浏览器中会自动增加一个Project Options目录,里面存放了我们修改过的选项。

如果手动修改了Project Options中的条目,被修改的条目会自动添加到这里。注意,不可以随意删除这些条目,删除操作意味着将其值恢复为默认值。

最终效果如下:

(6)按等号对齐

写代码时候经常遇到这样情况:

p_yqs->conn_handle = BLE_CONN_HANDLE_INVALID;
p_yqs->data_handler = p_yqs_init->data_handler;
p_yqs->is_notification_enabled = false;

希望这些赋值操作按等号对齐,实现如下效果:

p_yqs->conn_handle             = BLE_CONN_HANDLE_INVALID;
p_yqs->data_handler            = p_yqs_init->data_handler;
p_yqs->is_notification_enabled = false;

很简单,选中这几行,调用菜单项:Edit –> Column Tidy功能,即可自动以按等号对齐。

(7)跳转到头文件

假设当前打开的文件为peer_manager.c,希望跳转到peer_manager.h文件中。

调用菜单项:Navigate –> Go To Header (Alt + L)即可。

反过来,从头文件中跳转到源文件,只要找一个函数,按F12跳转到定义即可。

 

(未完待续)