Windows 的开发好痛苦

windows 的开发好痛苦作者: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 插件 vscodevim。安装好插件后,我打开了一个文件夹。用 :open 可以打开一个文件然后进行输入。然后,我想使用 :vsplit 垂直打开另一个文件,于是我输入了 :vsplit bar.txt,结果当前窗口却被垂直分割了,而不是在垂直分割的窗口中打开我需要的文件。当然,这也许是我非常习惯的另一个技巧而已(尽管这个行为在原版vim上非常好用),我询问过的其他人都不这么用(甚至有人完全不知道这个命令还能这么用),但这个动作已经深入了我的肌肉记忆,因此丧失这种用法让我倍感沮丧。我不得不重新训练十多年的肌肉记忆。

Vim 有一个叫做 whichwrap 的功能,当光标移动到行尾或行首时,可以使用方向键将光标移动到下一行的行首,或上一行的行尾。我从 2013 年 11 月就在 Vim 中加入了这个设置,然后甚至忘了自己曾经加过这个设置,以至于我以为这是 Vim 的默认行为。

但是,很显然我错了。

要想改正这个问题,只能在 VSCode 的 settings.json 中加入下面这一行:

代码语言:javascript代码运行次数:0运行复制“`javascript{ “vim.whichwrap”: “h,l,,[,]”}

很烦人,但至少可以正常使用。

Vim 中有寄存器的概念,有命名和未命名之分,近似于大多数桌面环境中的剪贴板,在我的 Emacs 设置中,剪贴板和删除寄存器是一样的。如果复制一大段文字到删除寄存器中,实际上就是放到剪贴板中。如果我向剪贴板中放入一些内容,实际也会自动放到删除寄存器中。这个操作其实非常方便。

然而这并不是 vscodevim 中的默认操作,不过有个选项可以实现这一点:

代码语言:javascript代码运行次数:0<svg fill="none" height="16" viewbox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="M6.66666 10.9999L10.6667 7.99992L6.66666 4.99992V10.9999ZM7.99999 1.33325C4.31999 1.33325 1.33333 4.31992 1.33333 7.99992C1.33333 11.6799 4.31999 14.6666 7.99999 14.6666C11.68 14.6666 14.6667 11.6799 14.6667 7.99992C14.6667 4.31992 11.68 1.33325 7.99999 1.33325ZM7.99999 13.3333C5.05999 13.3333 2.66666 10.9399 2.66666 7.99992C2.66666 5.05992 5.05999 2.66659 7.99999 2.66659C10.94 2.66659 13.3333 5.05992 13.3333 7.99992C13.3333 10.9399 10.94 13.3333 7.99999 13.3333Z" fill="currentcolor">运行<svg fill="none" height="16" viewbox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path clip-rule="evenodd" d="M4.5 15.5V3.5H14.5V15.5H4.5ZM12.5 5.5H6.5V13.5H12.5V5.5ZM9.5 2.5H3.5V12.5H1.5V0.5H11.5V2.5H9.5Z" fill="currentcolor" fill-rule="evenodd">复制```javascript{ "vim.useSystemClipboard": true}

这样删除寄存器就与我想象的一样了。

Emacs 可以控制插件的加载顺序。如果需要在语言支持插件加载之前加载项目本身的插件,这个功能就会非常有用,这样可以保证在语言服务器运行之前设置正确的环境变量。

据我所知,VSCode 无法配置这一点。在某个项目中我必须禁用 Go 插件并重载 VSCode,等待 direnv 设置生效之后,再重新启用 Go 插件。如果能指定插件加载顺序,实现这一点就非常容易,但显然 VSCode 不允许你控制加载顺序。

02

开发工具

我使用的终端是 st,shell 是 fish。这个组合其实非常好,因为加载速度很快,并且 fish 支持很多好用的功能,例如基于历史的自动补齐等。更不用说,st 还支持选择即复制、右键粘贴的功能,在需要快速移动文本时非常方便。

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 许多方面的设计都还不错,但也犯了许多错误。我很高兴看到它实现了与 xterm 的兼容性。测试这一点的常见做法是打开一个使用鼠标的 curses 应用(如 Weechat 或终端版的 Emacs),然后随便点击鼠标。这样就可以看出终端模拟器是否与之兼容。我用ssh连接到服务器,登录到 tmux 中,然后点击了 Weechat 中的一个频道名。

结果什么都没有发生。

腾讯AI 开放平台 腾讯AI 开放平台

腾讯AI开放平台

腾讯AI 开放平台 161 查看详情 腾讯AI 开放平台

我又点击了一次,还是什么都没有发生。

我很奇怪,做了一些调查,然后发现原来是 Windows 自带的 ssh 版本太老了。这一点可以理解,在 Windows 系统中加入某个工具时,最好还是选择比较老的版本,这样才能保证长期的兼容性。这并不是最好的选择,但从长期支持的角度来看,也是一种方案。网上建议我下载新版的 OpenSSH。

我下载了 zip 包并解压,然后发现了许多二进制文件,而且没有任何说明该如何安装。好吧,毕竟是系统的核心部分。另一个评论说,WSL 中修复了该问题,我试试看。

WSL(Windows下的Linux子系统)是一个技术奇迹,有了它,Windows 用着就顺手多了。当然,如果它的默认选择不是 Ubuntu 就更好了。当然,我不是说 Ubuntu 不好。我只是说它并不是我习惯的发行版而已。

但是,我可以用它 ssh 到我的服务器上,然后实现 Weechat 中的点击。

也许我应该看看在 WSL 中运行类 NixOS 的系统难不难,但 WSL 没办法运行 systemd,所以还是算了。

有人说,通过命令行界面基本命令(如改变目录、列出文件、下载文件等)的设计方式可以学到很多知识。在 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 的主题,大致如下:

Windows 的开发好痛苦项目本地依赖

我必须在 WSL 中利用Nix实现这一点。VSCode 有很好的集成,但我希望能更加有更加原生的方法。03

Windows的优点

对于开发人员而言,Windows 最大的优点是向后兼容。过去 30 年的任何程序都可以直接安装,并且都能运行。

所有我玩过的游戏都是 Windows 的,也不需要像 Linux 版 Steam 那样修改设置才能运行游戏。所有与 VR 有关的功能也都运行良好。所有下载下来的游戏都能玩,不需要修改 GPU 驱动的路径。而且几乎报告的任何问题都能得到妥善解决。

总的来说,我想我可以忍受 Windows 上的开发体验。虽然不是最理想的设置,但确实可以坚持完成工作。尽管我很怀念 NixOS。NixOS 会惯坏你,给你留下许多不切实际的习惯,而且一旦养成很难遗忘。

所以最后的结论就是没有结论。

原文链接:https://www.php.cn/link/76ef690583787dbd1405245dc8d9d72a

声明:本文为CSDN翻译,转载请注明来源。

以上就是Windows 的开发好痛苦的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/404704.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
浙江大学最新Nano Letters:面向实时网络入侵检测系统的自整流忆阻器
上一篇 2025年11月6日 20:43:19
Akka tell 操作消息顺序性深度解析:保证与限制
下一篇 2025年11月6日 20:43:48

相关推荐

  • 在Java中静态方法能否被重写

    静态方法属于类而非实例,不参与运行时动态绑定,因此不能被重写;2. 子类定义同名静态方法时发生方法隐藏,调用时机由引用类型在编译阶段决定;3. 如示例所示,Parent p = new Child() 调用 p.display() 输出 “Parent static method&#82…

    2026年9月21日
    000
  • Linux怎么监控特定进程的运行状态

    Linux怎么监控特定进程的运行状态Linux怎么监控特定进程的运行状态Linux怎么监控特定进程的运行状态Linux怎么监控特定进程的运行状态

    监控Linux进程需综合使用ps、top、htop、pgrep和systemctl等工具,结合资源占用、进程状态、日志输出和进程数量判断是否异常,并通过systemd的Restart机制或看门狗脚本实现自动重启,同时利用journalctl、sar、atop及Prometheus+Grafana等方…

    2026年9月21日 用户投稿
    000
  • 为什么VSCode的语法高亮有时会失效?

    语法高亮失效通常由语言模式识别错误、扩展冲突或配置问题导致。1. 检查右下角语言模式并手动切换为正确类型,确保文件有正确扩展名;2. 禁用近期安装的扩展或以 code –disable-extensions 启动排查冲突;3. 切换至默认主题并检查 settings.json 是否覆盖颜…

    2026年9月21日
    500
  • 如何为VSCode配置一个高效的PHP开发环境?

    搭建高效PHP开发环境需配置VSCode扩展与工具链:①安装PHP Intelephense实现智能补全;②配置Xdebug实现断点调试;③集成PHP CS Fixer或Prettier实现保存时自动格式化;④利用GitLens和集成终端提升协作与操作效率,一次性配置可长期提升编码质量与开发速度。 …

    2026年9月21日
    000
  • 在Java中变量和常量有什么区别

    变量的值可修改,常量(用final修饰)一旦赋值不可变;变量用于动态数据,常量用于固定值,如PI或配置参数。 在Java中,变量和常量的主要区别在于它们的值能否被修改。变量的值可以在程序运行过程中改变,而常量一旦赋值就不能再更改。 变量(Variable) 变量是用于存储数据的基本单元,其值在程序执…

    2026年9月21日
    100
  • mysql如何启用binlog日志

    MySQL启用binlog需修改配置文件添加log-bin和server-id,重启服务后执行SHOW VARIABLES LIKE ‘log_bin’验证是否为ON,确认启用。 MySQL启用binlog日志需要修改配置文件并重启服务,同时可进行简单验证确保生效。以下是具体…

    2026年9月21日
    000
  • Linux命令行如何查看登录用户

    Linux命令行如何查看登录用户Linux命令行如何查看登录用户Linux命令行如何查看登录用户Linux命令行如何查看登录用户

    答案是 who、w 和 users 命令用于查看Linux系统登录用户,其中 who 显示登录用户及终端信息,w 还显示用户正在执行的命令和系统负载,users 仅输出用户名列表。 在Linux命令行下,要查看当前系统上有哪些用户登录,最直接、最常用的命令包括 who 、 w 和 users 。它们…

    2026年9月21日 用户投稿
    100
  • 外媒称虚幻5是PS5 Pro的克星:多款大作的优化已“翻车”

    外媒称虚幻5是PS5 Pro的克星:多款大作的优化已“翻车”外媒称虚幻5是PS5 Pro的克星:多款大作的优化已“翻车”外媒称虚幻5是PS5 Pro的克星:多款大作的优化已“翻车”外媒称虚幻5是PS5 Pro的克星:多款大作的优化已“翻车”

    作为PS5的强化版本,PS5 Pro的目标是缩小与当代PC在硬件性能上的差距,借助PSSR技术为玩家带来更流畅的帧率、更强的视觉表现力以及更细腻的图像质量。然而,根据外媒twistedvoxel的最新报道,多款大型游戏的表现问题表明,虚幻五引擎可能正成为PS5 Pro难以攻克的技术瓶颈。 以恐怖大作…

    2026年9月21日 用户投稿
    100
  • VSCode怎么编译运行视频_VSCode处理视频资源的扩展与操作指南

    VSCode通过扩展和外部工具支持视频处理。推荐使用Code Runner或ffmpeg-kit扩展运行FFmpeg命令,或结合Python(MoviePy/OpenCV)、Node.js(fluent-ffmpeg)等编程方式实现视频格式转换、裁剪等操作,具体工具选择取决于技能栈和需求。 VSCo…

    2026年9月21日
    100
  • Windows系统下的兼容性问题

    windows兼容性问题严重是因为系统演进快、硬件和软件环境多样。处理此问题需:1.了解目标系统版本和配置;2.使用低版本api或兼容性模式;3.检测操作系统版本并调整程序行为;4.避免依赖特定版本的库,提供多版本安装包;5.考虑硬件依赖性,提供备选方案;6.进行跨版本性能测试和优化。 在Windo…

    2026年9月21日
    000
  • Linux如何限制用户执行特定命令

    Linux如何限制用户执行特定命令Linux如何限制用户执行特定命令Linux如何限制用户执行特定命令Linux如何限制用户执行特定命令

    首选sudo进行命令限制,因其灵活且可审计;通过visudo配置精确的用户权限,结合白名单、命令别名和!语法实现允许或拒绝特定命令;同时防范绕过手段如全路径执行、间接调用、脚本执行等,需多层防御并辅以日志监控。 在Linux环境中,限制用户执行特定命令,最直接有效且灵活的方法通常是利用 sudo 权…

    2026年9月21日 用户投稿
    000
  • 在Java中如何使用方法重载

    方法重载允许类中多个同名方法共存,只要参数列表不同即可。例如Calculator类中add方法可接受不同数量、类型或顺序的参数,Java根据传入参数自动匹配对应方法,提升调用灵活性与代码可读性。 方法重载(Overloading)是Java中实现多态的一种方式,它允许在一个类中定义多个同名方法,只要…

    2026年9月21日
    200
  • win11怎么设置默认终端为cmd或powershell_Win11默认终端设置方法

    通过系统设置可更改Windows 11默认终端:1. 进入“设置→隐私与安全性→开发者选项”,在“终端”中选择默认应用;2. 或通过命令提示符属性的“终端”选项卡设定;3. 若使用Windows Terminal,可在其设置中将CMD或PowerShell设为默认配置文件;4. 高级用户可通过修改注…

    2026年9月21日
    100
  • VSCode的括号着色功能如何帮助你避免语法错误?

    VSCode括号着色功能通过彩色高亮匹配括号,帮助用户直观识别嵌套结构、提升代码可读性,并快速发现遗漏或多余括号,减少语法错误。 VSCode的括号着色功能通过视觉方式帮你快速识别代码中的匹配和嵌套结构,减少语法错误的发生。当你在编写代码时,成对出现的括号(如()、[]、{})会被高亮显示为相同或相…

    2026年9月21日
    000
  • Linux如何创建符号链接和硬链接

    Linux如何创建符号链接和硬链接Linux如何创建符号链接和硬链接Linux如何创建符号链接和硬链接Linux如何创建符号链接和硬链接

    符号链接是快捷方式,指向文件或目录路径,原文件删除后链接失效;2. 硬链接共享同一inode,不能跨文件系统或链接目录;3. 使用ln -s创建符号链接,ln创建硬链接;4. 符号链接可跨分区,硬链接删除原文件后仍可访问数据。 在Linux中,创建符号链接(软链接)和硬链接是管理文件和目录的常用操作…

    2026年9月21日 用户投稿
    000
  • ThinkPHP生产环境部署的注意事项

    在生产环境中部署thinkphp应用需要注意以下几点:1.确保服务器环境满足thinkphp要求,使用php 7.2+和支持的web服务器;2.配置php.ini和application/config.php文件,关闭调试模式,设置合适的日志级别和数据库连接;3.采取安全措施,保护应用目录结构,使用…

    2026年9月21日
    100
  • Java中如何将嵌套列表对象转换为扁平化单元素列表

    本文探讨了在java中将包含嵌套列表的对象集合转换为新列表的多种策略,旨在使新列表中每个对象仅包含其嵌套列表中的一个元素。通过详细介绍java 7的传统迭代方法、java 8-15的stream api `flatmap`操作,以及java 16及更高版本的`mapmulti`方法,文章提供了清晰的…

    2026年9月21日
    100
  • Linux如何查看sudo执行的历史记录

    Linux如何查看sudo执行的历史记录Linux如何查看sudo执行的历史记录Linux如何查看sudo执行的历史记录Linux如何查看sudo执行的历史记录

    要追溯sudo执行的命令,需查看系统日志或配置sudo日志;在Ubuntu/Debian中查/var/log/auth.log,CentOS/RHEL中查/var/log/secure,或使用journalctl _COMM=sudo筛选;通过配置/etc/sudoers中的Defaults log…

    2026年9月21日 用户投稿
    300
  • 如何为VSCode安装新的字体?

    先在操作系统安装字体文件,再在VSCode设置中指定字体名称。1. Windows右键安装.ttf/.otf文件,macOS用字体册安装,Linux复制到~/.fonts并运行fc-cache -fv;2. VSCode中通过设置界面或编辑settings.json修改”editor.f…

    2026年9月21日
    000
  • 如何制作抖音点单小程序:全面指南与实用技巧

    引言: 随着移动互联网的飞速发展,抖音已不仅仅是短视频平台,更成为商家连接用户的重要入口。越来越多企业开始关注抖音点单小程序的搭建,以提升服务效率和用户体验。本文将为您系统讲解抖音点单小程序的制作流程,并分享实用技巧与真实案例,助您快速打造专属的小程序,实现流量变现与销售增长。 1. 明确核心需求与…

    2026年9月21日
    200

发表回复

登录后才能评论
关注微信