◆

Windows Cygwin 使用技巧与 WebStorm 配置

2023-09-25 12:460

在 Windows 上写代码,一个绕不开的摩擦点是命令行。cmd 和 PowerShell 的命令跟服务器上、跟 mac 上的那套完全是两个体系,同一个操作要记两遍。Cygwin 的思路是在 Windows 上提供一层 POSIX 兼容实现,把 bash 和常见的 GNU 工具链搬过来,让日常敲的命令能和线上环境保持一致。

这篇记的是我用 Cygwin 过程中几个实际卡住过的地方,以及配到 webstorm 里当默认终端的写法。这些点单独看都不复杂,但第一次遇到时都要查一会儿。

进入硬盘命令修改

第一个不习惯的地方是盘符。Cygwin 把 Windows 的盘符统一挂到 /cygdrive 下面,C 盘是 /cygdrive/c,D 盘是 /cygdrive/d。逻辑上很清楚,但每次 cd 都要敲一长串前缀,写脚本时路径也显得很啰嗦。

解决办法是在根目录下给常用盘符各做一个软链接,之后 cd /d 就等于进 D 盘,和习惯的写法接近很多。

如下做了一个软链接处理

ln -s /cygdrive/c /c
ln -s /cygdrive/d /d

这个链接是建在 Cygwin 自己的虚拟根目录里的,也就是安装目录下面,不会在真实的 C 盘根目录里多出东西。要注意它只对 Cygwin 环境内部有效,Windows 原生程序不认识 /d 这种路径,往外传路径参数时还是得用 Windows 格式。

webstorm 配置 cygwin 终端

装好之后自然会想让 IDE 内置的终端也用上它,省得在两个窗口之间切。

设置中的终端 path 设置为:

D:\software\cygwin64\bin\env.exe CHERE_INVOKING=1 /bin/bash -l

重要的就是后面这段参数 CHERE_INVOKING=1 /bin/bash -l,直接用 /bin/bash 会有很多命令无法执行

拆开来看这行在干什么。前面那段是 Cygwin 安装目录里 env.exe 的绝对路径,用它来带一个环境变量启动后面的程序,这个路径要按自己的安装位置改。

CHERE_INVOKING=1 解决的是打开位置问题。不加这个变量,Cygwin 的登录流程会把工作目录切到用户主目录,IDE 里开终端本来是想直接落在当前项目根目录的,切走就失去意义了。这个变量的作用就是告诉它别切,保持在被调用时的目录。

-l 是让 bash 以登录 shell 的方式启动,这才是「很多命令无法执行」的关键。非登录 shell 不会去读那套登录期的初始化脚本,而 Cygwin 的 PATH 恰恰是在那里拼出来的,结果就是 PATH 里只剩下从 Windows 继承来的一部分,Cygwin 自己 /usr/bin 下的工具全都找不到,敲什么都是 command not found。加上 -l 让它走完整的登录初始化,PATH 才是完整的。

环境变量同步

我不止一台机器,.bash_profile 里攒的别名和函数不想每台重配一遍,所以把它放进了跟着仓库走的配置目录里。

使用硬链接同步

ln /home/wfly/.bash_profile /d/code/wfly/other/resource/link-config/win/

这里用的是硬链接而不是软链接,注意没有 -s 参数。区别在于硬链接的两个路径指向同一份实际数据,从任意一边编辑,另一边立刻就是新内容,也不存在「链接指向的目标不见了」这种情况。用软链接的话,一旦仓库目录被移动或者临时改名,shell 启动时读配置就会失败。

硬链接的限制是不能跨分区,两个路径必须在同一个盘上,跨盘会直接报错。另外它只能用于文件,目录不行。

没有 vim 或者其他命令

这是 Cygwin 最容易让人困惑的一点。它不像 Linux 发行版那样默认给一套完整的常用工具,安装时勾选的包很少,vim、wget、unzip、make 这些默认都不在里面。所以命令找不到,多半不是环境坏了,是压根没装。

首先判断是否真的没有,如 vim 可以发送 vim --version 进行测试

这一步是为了区分两种情况:如果返回版本号,说明装了,那问题在 PATH,回去看上面那段 -l 参数;如果返回 command not found,那就是真的没装。

如果没有,打开 setup.exe,搜索对应命令名称进行安装即可

需要说明的是,Cygwin 没有独立的包管理命令,装新包是重新跑一次当初那个安装程序,在选包界面搜索名称、把状态从 Skip 改成版本号,然后走完流程。这个安装程序不要删,它就是包管理器,后续每次装东西都要它。搜的时候建议按包名而不是命令名找,个别命令所在的包名和命令名不一致。

隐藏主机名用户名

默认的提示符会把用户名和主机名都打出来,在自己机器上这两段信息没什么价值,还占掉半行宽度。项目路径一深,提示符加路径就能顶到屏幕右边,命令被挤到换行,看着很乱。录屏或者截图分享的时候,用户名和主机名也算是不太想露出去的信息。

编辑环境变量

vi ~/.bash_profile

增加

export PS1='\[\033[1;32m\]\w\[\033[0m\] \n\$ '

解释一下这串转义。PS1 是 bash 的主提示符模板变量。\w 是当前工作目录,主目录会显示成 ~。\n 是换行,把命令输入区单独放到下一行,这样路径再长也不会挤压可用宽度。\$ 在普通用户下显示 $,root 下显示 #。

中间那两段方括号包起来的是 ANSI 颜色控制序列,1;32m 是亮绿色,0m 是恢复默认。\[ 和 \] 这对包裹符不能省,它们的作用是告诉 bash 里面的字符不占显示宽度。漏掉的话 bash 会把颜色码也算进行长度,光标位置计算就会错位,表现为用方向键或者退格编辑长命令时字符错乱、重复显示。

生效

source ~/.bash_profile

source 是在当前 shell 里重新执行一遍这个文件,所以改动立刻作用于眼前这个会话,不用关掉重开。要是直接执行文件而不是 source,脚本会在子进程里跑,export 出来的变量随子进程一起结束,当前会话不受影响,这是新手容易困惑的一点。

💬留言板0

还没有留言,来发表第一条吧~

PAGE LOAD / LIVEWindows Cygwin 使用技巧与 WebStorm 配置加载中