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)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2025年11月6日 20:43:10
下一篇 2025年11月6日 20:43:56

相关推荐

  • CSS元素设置em和transition后,为何载入页面无放大效果?

    css元素设置em和transition后,为何载入无放大效果 很多开发者在设置了em和transition后,却发现元素载入页面时无放大效果。本文将解答这一问题。 原问题:在视频演示中,将元素设置如下,载入页面会有放大效果。然而,在个人尝试中,并未出现该效果。这是由于macos和windows系统…

    2025年12月24日
    200
  • 如何模拟Windows 10 设置界面中的鼠标悬浮放大效果?

    win10设置界面的鼠标移动显示周边的样式(探照灯效果)的实现方式 在windows设置界面的鼠标悬浮效果中,光标周围会显示一个放大区域。在前端开发中,可以通过多种方式实现类似的效果。 使用css 使用css的transform和box-shadow属性。通过将transform: scale(1.…

    2025年12月24日
    200
  • 如何用HTML/JS实现Windows 10设置界面鼠标移动探照灯效果?

    Win10设置界面中的鼠标移动探照灯效果实现指南 想要在前端开发中实现类似于Windows 10设置界面的鼠标移动探照灯效果,有两种解决方案:CSS 和 HTML/JS 组合。 CSS 实现 不幸的是,仅使用CSS无法完全实现该效果。 立即学习“前端免费学习笔记(深入)”; HTML/JS 实现 要…

    2025年12月24日
    000
  • 如何用前端实现 Windows 10 设置界面的鼠标移动探照灯效果?

    如何在前端实现 Windows 10 设置界面中的鼠标移动探照灯效果 想要在前端开发中实现 Windows 10 设置界面中类似的鼠标移动探照灯效果,可以通过以下途径: CSS 解决方案 DEMO 1: Windows 10 网格悬停效果:https://codepen.io/tr4553r7/pe…

    2025年12月24日
    000
  • 如何用前端技术实现Windows 10 设置界面鼠标移动时的探照灯效果?

    探索在前端中实现 Windows 10 设置界面鼠标移动时的探照灯效果 在前端开发中,鼠标悬停在元素上时需要呈现类似于 Windows 10 设置界面所展示的探照灯效果,这其中涉及到了元素外围显示光圈效果的技术实现。 CSS 实现 虽然 CSS 无法直接实现探照灯效果,但可以通过以下技巧营造出类似效…

    2025年12月24日
    000
  • 使用 Mask 导入本地图片时,如何解决跨域问题?

    跨域疑难:如何解决 mask 引入本地图片产生的跨域问题? 在使用 mask 导入本地图片时,你可能会遇到令人沮丧的跨域错误。为什么会出现跨域问题呢?让我们深入了解一下: mask 框架假设你以 http(s) 协议加载你的 html 文件,而当使用 file:// 协议打开本地文件时,就会产生跨域…

    2025年12月24日
    200
  • HTML、CSS 和 JavaScript 中的简单侧边栏菜单

    构建一个简单的侧边栏菜单是一个很好的主意,它可以为您的网站添加有价值的功能和令人惊叹的外观。 侧边栏菜单对于客户找到不同项目的方式很有用,而不会让他们觉得自己有太多选择,从而创造了简单性和秩序。 今天,我将分享一个简单的 HTML、CSS 和 JavaScript 源代码来创建一个简单的侧边栏菜单。…

    2025年12月24日
    200
  • 前端代码辅助工具:如何选择最可靠的AI工具?

    前端代码辅助工具:可靠性探讨 对于前端工程师来说,在HTML、CSS和JavaScript开发中借助AI工具是司空见惯的事情。然而,并非所有工具都能提供同等的可靠性。 个性化需求 关于哪个AI工具最可靠,这个问题没有一刀切的答案。每个人的使用习惯和项目需求各不相同。以下是一些影响选择的重要因素: 立…

    2025年12月24日
    300
  • 带有 HTML、CSS 和 JavaScript 工具提示的响应式侧边导航栏

    响应式侧边导航栏不仅有助于改善网站的导航,还可以解决整齐放置链接的问题,从而增强用户体验。通过使用工具提示,可以让用户了解每个链接的功能,包括设计紧凑的情况。 在本教程中,我将解释使用 html、css、javascript 创建带有工具提示的响应式侧栏导航的完整代码。 对于那些一直想要一个干净、简…

    2025年12月24日
    000
  • 布局 – CSS 挑战

    您可以在 github 仓库中找到这篇文章中的所有代码。 您可以在这里查看视觉效果: 固定导航 – 布局 – codesandbox两列 – 布局 – codesandbox三列 – 布局 – codesandbox圣杯 &#8…

    2025年12月24日
    000
  • 隐藏元素 – CSS 挑战

    您可以在 github 仓库中找到这篇文章中的所有代码。 您可以在此处查看隐藏元素的视觉效果 – codesandbox 隐藏元素 hiding elements hiding elements hiding elements hiding elements hiding element…

    2025年12月24日
    400
  • 居中 – CSS 挑战

    您可以在 github 仓库中找到这篇文章中的所有代码。 您可以在此处查看垂直中心 – codesandbox 和水平中心的视觉效果。 通过 css 居中 垂直居中 centering centering centering centering centering centering立即…

    2025年12月24日 好文分享
    300
  • 如何在 Laravel 框架中轻松集成微信支付和支付宝支付?

    如何用 laravel 框架集成微信支付和支付宝支付 问题:如何在 laravel 框架中集成微信支付和支付宝支付? 回答: 建议使用 easywechat 的 laravel 版,easywechat 是一个由腾讯工程师开发的高质量微信开放平台 sdk,已被广泛地应用于许多 laravel 项目中…

    2025年12月24日
    000
  • 如何在移动端实现子 div 在父 div 内任意滑动查看?

    如何在移动端中实现让子 div 在父 div 内任意滑动查看 在移动端开发中,有时我们需要让子 div 在父 div 内任意滑动查看。然而,使用滚动条无法实现负值移动,因此需要采用其他方法。 解决方案: 使用绝对布局(absolute)或相对布局(relative):将子 div 设置为绝对或相对定…

    2025年12月24日
    000
  • 移动端嵌套 DIV 中子 DIV 如何水平滑动?

    移动端嵌套 DIV 中子 DIV 滑动 在移动端开发中,遇到这样的问题:当子 DIV 的高度小于父 DIV 时,无法在父 DIV 中水平滚动子 DIV。 无限画布 要实现子 DIV 在父 DIV 中任意滑动,需要创建一个无限画布。使用滚动无法达到负值,因此需要使用其他方法。 相对定位 一种方法是将子…

    2025年12月24日
    000
  • 为什么在 React 组件中无法获得 Tailwind CSS 语法提示?

    为什么在 React 组件中无法获得 Tailwind CSS 语法提示? 你在 VSCode 中编写 HTML 文件时,可以正常获取 Tailwind CSS 语法提示。但当你尝试在 React 组件中编写 Tailwind CSS 时,这些提示却消失不见了。这是什么原因造成的? 解决方案 要解决…

    2025年12月24日
    000
  • 移动端项目中,如何消除rem字体大小计算带来的CSS扭曲?

    移动端项目中消除rem字体大小计算带来的css扭曲 在移动端项目中,使用rem计算根节点字体大小可以实现自适应布局。但是,此方法可能会导致页面打开时出现css扭曲,这是因为页面内容在根节点字体大小赋值后重新渲染造成的。 解决方案: 要避免这种情况,将计算根节点字体大小的js脚本移动到页面的最前面,即…

    2025年12月24日
    000
  • Nuxt 移动端项目中 rem 计算导致 CSS 变形,如何解决?

    Nuxt 移动端项目中解决 rem 计算导致 CSS 变形 在 Nuxt 移动端项目中使用 rem 计算根节点字体大小时,可能会遇到一个问题:页面内容在字体大小发生变化时会重绘,导致 CSS 变形。 解决方案: 可将计算根节点字体大小的 JS 代码块置于页面最前端的 标签内,确保在其他资源加载之前执…

    2025年12月24日
    200
  • Nuxt 移动端项目使用 rem 计算字体大小导致页面变形,如何解决?

    rem 计算导致移动端页面变形的解决方法 在 nuxt 移动端项目中使用 rem 计算根节点字体大小时,页面会发生内容重绘,导致页面打开时出现样式变形。如何避免这种现象? 解决方案: 移动根节点字体大小计算代码到页面顶部,即 head 中。 原理: flexível.js 也遇到了类似问题,它的解决…

    2025年12月24日
    000
  • 如何在 VSCode 中为 React 组件启用 Tailwind CSS 提示?

    在 vscode 中为 react 组件启用 tailwind css 提示 如果你在使用 vscode 编写 react 组件时,发现 tailwind css 提示无法正常显示,这里有一个解决方法: 安装 tailwind css intellisense 插件 这是实现代码提示的关键,确保你已…

    2025年12月24日
    200

发表回复

登录后才能评论
关注微信