作者 :Christine Dodrill(已获授权),全栈开发
译者:弯月
来源:CSDN(ID:CSDNnews)
以下为译文:
本文表达的观点可能与你的看法有所不同。本文没有针对任何个人或组织,只是我个人在 Windows 上开发时屡屡受挫有感而发。文中的观点只代表个人。
最近,由于我需要在 Oculus Quest 2(VR一体机)上使用 VR,因此不得不经常使用 Windows。为了使用 Virtual Desktop,我必须把 Windows 作为主力机器。下文记录了我在 Windows 上尝试一些“基本”的开发任务时,所遭遇的痛苦经历。
01
文本编辑器
多年以来,我已经习惯了使用 Vim,以至于我的思维方式都习惯了 Vim。工作时,我只需要使用键盘专心致志地工作,因为我的注意力都集中在当前的输入上。另外,我已经习惯了 Emacs 的设置,而且特别依赖于 Vim 模拟和各种稀奇古怪的小设置。
我努力尝试在 Windows 上使用同样的 Emacs 设置(并去掉一些显然不可能的操作,比如在 Windows 上使用 Nix 等),但很快我就发现,这完全是在浪费时间。将 Linux/macOS 的配置改成 Windows 需要修改的地方太多了。算了,我还是直接使用 VSCode 吧。它在 NixOS 上运行良好,所以在 Windows 上应该问题不大吧?
Vim 模拟
首先我安装了 Vim 插件 vscodevim。安装好插件后,我打开了一个文件夹。用 :open 可以打开一个文件然后进行输入。然后,我想使用 :vsplit 垂直打开另一个文件,于是我输入了 :vsplit bar.txt,结果当前窗口却被垂直分割了,而不是在垂直分割的窗口中打开我需要的文件。当然,这也许是我非常习惯的另一个技巧而已(尽管这个行为在原版vim上非常好用),我询问过的其他人都不这么用(甚至有人完全不知道这个命令还能这么用),但这个动作已经深入了我的肌肉记忆,因此丧失这种用法让我倍感沮丧。我不得不重新训练十多年的肌肉记忆。
whichwrap
Vim 有一个叫做 whichwrap 的功能,当光标移动到行尾或行首时,可以使用方向键将光标移动到下一行的行首,或上一行的行尾。我从 2013 年 11 月就在 Vim 中加入了这个设置,然后甚至忘了自己曾经加过这个设置,以至于我以为这是 Vim 的默认行为。
但是,很显然我错了。
要想改正这个问题,只能在 VSCode 的 settings.json 中加入下面这一行:
代码语言:javascript复制{
"vim.whichwrap": "h,l,<,>,[,]"
}
很烦人,但至少可以正常使用。
删除寄存器 != 剪贴板
Vim 中有寄存器的概念,有命名和未命名之分,近似于大多数桌面环境中的剪贴板,在我的 Emacs 设置中,剪贴板和删除寄存器是一样的。如果复制一大段文字到删除寄存器中,实际上就是放到剪贴板中。如果我向剪贴板中放入一些内容,实际也会自动放到删除寄存器中。这个操作其实非常方便。
然而这并不是 vscodevim 中的默认操作,不过有个选项可以实现这一点:
代码语言:javascript复制{
"vim.useSystemClipboard": true
}
这样删除寄存器就与我想象的一样了。
插件的加载顺序
Emacs 可以控制插件的加载顺序。如果需要在语言支持插件加载之前加载项目本身的插件,这个功能就会非常有用,这样可以保证在语言服务器运行之前设置正确的环境变量。
据我所知,VSCode 无法配置这一点。在某个项目中我必须禁用 Go 插件并重载 VSCode,等待 direnv 设置生效之后,再重新启用 Go 插件。如果能指定插件加载顺序,实现这一点就非常容易,但显然 VSCode 不允许你控制加载顺序。
02
开发工具
我使用的终端是 st,shell 是 fish。这个组合其实非常好,因为加载速度很快,并且 fish 支持很多好用的功能,例如基于历史的自动补齐等。更不用说,st 还支持选择即复制、右键粘贴的功能,在需要快速移动文本时非常方便。
Git
Git 并不是默认开发工具之一。这一点非常令我非常惊讶。我手工安装了 Git,但发现它安装了自己的 bash、perl 和 coreutils。这一点在意料之中(许多 Git 的命令都是用 Perl 和 shell 脚本写的),但这已经是我的系统中安装的第三份 bash 了。
作为一个 NixOS 用户,这应该并不是什么大问题。我的 NixOS 上至少有 8 个不同版本的 bash。但是,安装那些 bash 的主要原因是我可以切换到不同的版本,并回到某个过去的旧系统。然而这三个 bash 都是有用的,但它们互相不知道彼此的存在(而安装这些 bash 的应用程序似乎也是对的,它们采用了保守的策略,自己安装自己的 bash,减少兼容性问题)。
安装完之后 git 就可以正常用了。我很高兴地发现 Windows 会默认安装 ssh 甚至 ssh-keygen。这一点非常方便,我不需要再装一个 bash 了。
Windows Terminal
Windows Terminal 许多方面的设计都还不错,但也犯了许多错误。我很高兴看到它实现了与 xterm 的兼容性。测试这一点的常见做法是打开一个使用鼠标的 curses 应用(如 Weechat 或终端版的 Emacs),然后随便点击鼠标。这样就可以看出终端模拟器是否与之兼容。我用ssh连接到服务器,登录到 tmux 中,然后点击了 Weechat 中的一个频道名。
结果什么都没有发生。
我又点击了一次,还是什么都没有发生。
我很奇怪,做了一些调查,然后发现原来是 Windows 自带的 ssh 版本太老了。这一点可以理解,在 Windows 系统中加入某个工具时,最好还是选择比较老的版本,这样才能保证长期的兼容性。这并不是最好的选择,但从长期支持的角度来看,也是一种方案。网上建议我下载新版的 OpenSSH。
我下载了 zip 包并解压,然后发现了许多二进制文件,而且没有任何说明该如何安装。好吧,毕竟是系统的核心部分。另一个评论说,WSL 中修复了该问题,我试试看。
WSL
WSL(Windows下的Linux子系统)是一个技术奇迹,有了它,Windows 用着就顺手多了。当然,如果它的默认选择不是 Ubuntu 就更好了。当然,我不是说 Ubuntu 不好。我只是说它并不是我习惯的发行版而已。
但是,我可以用它 ssh 到我的服务器上,然后实现 Weechat 中的点击。
也许我应该看看在 WSL 中运行类 NixOS 的系统难不难,但 WSL 没办法运行 systemd,所以还是算了。
PowerShell
有人说,通过命令行界面基本命令(如改变目录、列出文件、下载文件等)的设计方式可以学到很多知识。在 PowerShell 中,这些命令是 Get-ChildItem、Set-Location 和 Invoke-WebRequest。而它也提供了别名 ls、dir、cd 和 wget(这些别名的选项并不一定兼容,所以如果你想做一些特别的事情,就需要习惯PowerShell的用法)。
另一个讨厌的地方是 Ctrl-D 并不会结束会话。不过这一点可以通过以下方式实现:
PS C:Usersxena> code $profile
然后向.ps1文件中加入:
Set-PSReadlineOption -EditMode Emacs
保存并重新打开PowerShell。
如果是第一次编辑 PowerShell 配置,那你必须修改执行策略,才能在本机执行脚本。我理解为什么要这样做,因为 PowerShell 很强大,这个策略能避免很多脚本攻击。但这个策略同样禁止了 profile 的执行。所以你需要选择 PowerShell 脚本的安全级别。通常,我会选择 RemoteSigned。
主题
我使用的主题是 oh my fish,所以搜索了一下 oh my powershell,希望能找到一些功能完备的工具。结果很幸运。
一番研究后我看到了一个名为 sorin 的主题,大致如下:
项目本地依赖
我必须在 WSL 中利用Nix实现这一点。VSCode 有很好的集成,但我希望能更加有更加原生的方法。
03
Windows的优点
对于开发人员而言,Windows 最大的优点是向后兼容。过去 30 年的任何程序都可以直接安装,并且都能运行。
所有我玩过的游戏都是 Windows 的,也不需要像 Linux 版 Steam 那样修改设置才能运行游戏。所有与 VR 有关的功能也都运行良好。所有下载下来的游戏都能玩,不需要修改 GPU 驱动的路径。而且几乎报告的任何问题都能得到妥善解决。
总的来说,我想我可以忍受 Windows 上的开发体验。虽然不是最理想的设置,但确实可以坚持完成工作。尽管我很怀念 NixOS。NixOS 会惯坏你,给你留下许多不切实际的习惯,而且一旦养成很难遗忘。
所以最后的结论就是没有结论。
原文链接:https://christine.website/blog/windows-pain-2021-03-03
声明:本文为CSDN翻译,转载请注明来源。