Mac迁移到Windows的开发体验
以前本文的标题是"windows不好用,但也能用", 写于2020年10月, 转眼已经一年又大半了(现在是2022年6月). window软硬件一直在进步.
以下是正文
本文从一个clojure/Emacs/iterm2的开发者的角度, 分享下从osx迁移到win的体验和过程.
先说结论: 充分配置以后, win10使用emacs开发clj/cljs的体验和osx下差别不大.
从纯软件层面, Emacs和Clojure是平台无关的, win和osx都可以执行.
性能过剩的今天, 操作习惯的兼容性, 键盘/触控版的体验更加直接.
用过电脑是华为的matebook pro 2020/Lenovo的Matebook 16+, 配置大致等于我当时使用的主力mac开发机.
值得说一下的是酷睿12性能/发热控制的很优秀, 以35%的价格做到了苹果M1系列的电脑95%的体验.
略遗憾的是emacs/git的速度依然感觉有点慢(对比osx和Linux). 可能是NT内核管理小文件和派生进程代价的问题, 即使使用内置的linux子系统, git和emacs的速度依然不快(甚至不如virtualbox).
总的来说, 达到了可以稳定舒适使用的程度.
键盘/触摸板使用建议
手感上键盘半斤八两, 触摸板一开始觉得不错, 仔细使用发现差的远(2022年使用touchpad bocker以后误触的问题完全解决).
- win上触摸板特别容易误触, 首先不是是触摸区域大小的问题, 触摸板就在那里, 敲击键盘的时候完手掌, 手腕全不碰是非常困难的. OSX上应该针对误触做了专门优化, 区分了指触和掌触, 手掌碰到触摸板不会被识别成鼠标左键按下. 后来发现windows上有个小工具touchpad blocker, 很好的解决了误触问题
- 苹果出品的magic-keybaord 和 magictrackpad可以在win下正常驱动, 正常驱动不等于正常使用.
但是键盘的
M-x系列快捷键不好用, 比如M-w不能正确copy选中内容. 触摸板的手势均无效. 建议使用普通键盘 - 笔记本自带键盘上fn和ctrl的位置和mac是相反的, 使用powertoys(scoop 安装)修改键盘映射, fn->control
- 触摸板在emacs上的滑动不受控, 基本上放弃使用触摸板来做代码滚动
- emacs热键冲突的问题, 在windows上更加突出, 以下应用都给我造成过麻烦, 需要手动控制关闭他们的快捷键
- 网易云音乐
- 微信
- 115浏览器
- 还有不知道的冲突比如说
paredit-forward-slurp-forward(C-S-0)就不知道和什么冲突, 现在也不好用.
终端
终端工具
windows termial + powershell
微软出品的windows terminal已经可用了, 多tab的管理powershell终端. Power shell是Win10的命令行工具, 这个应该是win10的原生选择
- 打开目录
ii .打开当前目录 - copy到命令行
clip |, &&等管道符号可用
我依然没有找到可以迅速移动到行首, 行尾, 跳转语句/段落的快捷键.
emacs + eshell + shell
当前windwos的shell的主要体验差距在于在shell的命令编辑, 查找, 复制/粘贴, 如果这个shell是运行在emacs, 体验会大上一个台阶. 推荐使用emacs中的eshell和shell
- eshell 本身是个独立的shell, 并不是个终端模拟器, 所以在windows下它依旧是个全功能的存在.
- shell 会调用powershell, 体验也可以接受.
脚本编程
没有我们熟悉的shell(zsh, bash)脚本编程确实很让人着急.
考虑到我们的技能构成, 可移植性, 更多使用babashka来做脚本编程吧.
比如说, 我需要拿到所有工程下的代码文件(clj,cljs,cljc)拼接成一个文件, 做著作权申请用
find . -name "*.{clj, cljs, cljc}" | # 找到所有的clojure文件
cat | # 拼接
sed -n '1,1500p' > report.clj # 指定起止行数, 写入replort.clj文件
下面的代码是等价的, 虽然稍微长那么一点点....
(require '[clojure.java.io :as io])
(import java.nio.file.FileSystems)
(def matcher (.getPathMatcher
(FileSystems/getDefault)
"glob:*.{clj,cljs,cljc}"))
(defn gen-report
"根据指定的路径和行数, 生成报告"
[src start-line end-line]
(->> src
io/file ;; 目录生成文件对象
file-seq ;; 遍历所有的文件(文件夹)
(filter #(.isFile %)) ;; 过滤, 只要文件
(filter #(.matches matcher (.getFileName (.toPath %)))) ;; 过滤, clj/cljs/cljc文件
(map slurp) ;; 读到所有的文件内容
(map #(clojure.string/split % #"\n")) ;; 切分每行
(apply concat) ;; 拼接为一个list
(take end-line)
(drop start-line)
(run! #(spit "report.clj" (str % "\n") :append true)))) ;; 输出,记得加回换行
(def src "../../sandbox/rc/customplatform/store-pc/src")
;; 生成报告一份报告, 行数采样: 10000 13100
(gen-report src 10000 13100)
scoop可以替代homebrew, 安装clojure开发的全部依赖, 以及其他的工具
scoop安装, 依赖raw.github.com 域名, 翻墙安装的, 墙内应该也可以. scoop安装后就不需要再翻墙下软件了.
scoop 需要配置几个bucket 增加的方式是:
scoop bucket add bucket-name/url, 我我已经配置的bucket有:PS C:\Users\li_zh> scoop bucket list Name Source Updated Manifests ---- ------ ------- --------- extras https://github.com/ScoopInstaller/Extras 2022/6/11 8:32:26 1536 java https://github.com/ScoopInstaller/Java 2022/6/10 19:56:11 220 main https://github.com/ScoopInstaller/Main 2022/6/11 8:33:26 1040 scoop-clojure https://github.com/littleli/scoop-clojure 2022/6/10 5:07:31 20 versions https://github.com/ScoopInstaller/Versions 2022/6/11 10:26:16 330clojrue开发基础依赖: git, java, openjdk, lein, kondo, babashka
# if you don't have git version control system installed # it is required for adding new external buckets to your scoop installer # you can skip this step otherwise scoop install git # add scoop bucket for Java scoop bucket add java # add scoop bucket for clojure build scoop bucket add scoop-clojure https://github.com/littleli/scoop-clojure # install Java runtime and compiler scoop install adoptopenjdk-lts-hotspot # install official clojure tools scoop install clojure # update to the newest version scoop update clojure- leiningen
scoop install leiningen - clj-kondo
scoop install clj-kondo - babashka
scoop install babashka
- leiningen
其他工具&软件
- emacs安装
scoop install emacs - ack
scoop install ack - ag
scoop install ag - 增加unix工具, aed, awk, diff等40几个常用工具命令:
scoop install unxutils - vim
scoop install vim - 键位映射:
scoop install powertoys - 视频播放器
scoop install mkv - 视频转码工具
scoop install ffmpeg - youtube-dl
scoop install youtube-dl - 数据库postgresql
scoop install postgresql - 增加postgrest(postgresql 的接口生成)
scoop install postgrest - 安装windwos的按键显示工具
scoop install carnac
- emacs安装
最后贴以下我用scoop安装过后的软件
PS C:\Users\li_zh> scoop list Installed apps: Name Version Source Updated Info ---- ------- ------ ------- ---- 7zip 21.07 main 2022-05-21 12:19:01 ag 2.2.5 main 2022-05-21 12:19:54 babashka 0.8.2 scoop-clojure 2022-05-21 14:34:30 clj-kondo 2022.04.25 scoop-clojure 2022-05-21 14:35:00 clojure 1.11.1.1113 scoop-clojure 2022-05-21 12:23:01 cmake 3.23.2 main 2022-06-04 20:41:24 dark 3.11.2 main 2022-05-26 07:20:09 ffmpeg 5.0.1 main 2022-06-01 09:13:03 gcc-llvm 11.2.0-13.0.0-9.0.0-r3 versions 2022-05-24 22:49:06 git 2.36.1.windows.1 main 2022-05-21 12:19:20 GraphViz 3.0.0 main 2022-05-26 09:45:27 imagemagick-ffmpeg 7.1.0-35 versions 2022-05-21 15:37:48 mpv 0.34.0 extras 2022-05-21 15:10:35 nodejs16 16.15.0 versions 2022-05-21 15:06:07 obs-studio 27.2.4 extras 2022-06-01 09:18:52 openjdk17 17.0.2-8 java 2022-05-21 12:27:10 pandoc 2.18 main 2022-06-10 10:41:21 perl 5.32.1.1 main 2022-06-08 09:52:05 python310 3.10.4 versions 2022-05-26 07:20:48 unxutils 2007.03.01 main 2022-05-21 12:19:45 vcredist2010 10.0.40219.473 extras 2022-06-01 09:14:07 vcredist2015 14.0.24215.1 extras 2022-05-21 14:34:21 wireshark 3.6.5 extras 2022-05-25 11:57:42 youtube-dl 2021.12.17 main 2022-06-01 09:14:20
编辑器
无论在win还是mac, Emacs都太好用以至于别的编辑器似乎都不值得折腾(对我而言) 至于你们喜欢的vscode, 基本可用.
- Calva, 照搬了Cider的大部分功能以后, 也渐渐做出了一些特色
- Emacs Friendly keymap
emacs 的配置
Emacs使用scoop安装的最新版, 当前是28.1, 安装完毕后, 可以按照purcell的配置, 注意在windows下用户的默认目录是 home\AppData\Roming\.emacs.d
cd ~/AppData/Roaming/
git clone https://github.com/purcell/emacs.d.git `/.emacs.d
;; 设置鼠标的平滑滚动
(setq mouse-wheel-scroll-amount '(1 ((shift) . 1) ((control) . nil)))
(setq mouse-wheel-progressive-speed nil)
(setq ring-bell-function 'ignore)
;; 保证时间显示正确.
(setq system-time-locale "C")
工程开发
- windows上的emacs和移植过来的命令行工具感觉要慢一些, 硬盘速度就显得很重要了 建议所有的代码\工具都放到sdd盘
- 其他体验和mac没什么区别
快捷键
- 截屏
ctrl+win+s - 浏览器多个Tab切换
Ctrl + TAB - emacs的快捷键没什么变化
- 关闭窗口
alt-space-c
最后(2020版)
回应我开篇的结论: 酷睿12代win11, 对于习惯命令行的emacsu用户,使用感受差异不大, 迁移体验良好.
习惯可以去适应, 但下面的几个问题是系统级的:
- windows上的软件有设置全局快捷键的习惯, 一旦和我现有的习惯冲突, 很难排查.
- windwos的shell, 即使是powershell, 和习惯的unix/linux shell的使用相差甚远.
- 没有找到osx上pbpaste的对应物,(pbcopy应该可以用clip替换)
- 终于自带ssh了, 可以不用putty, 但是不支持mosh
- windows上的emacs/git有点...慢 (使用scoop安装的版本), 留下我们思考的时间多一点.
- emacs偶尔崩溃, 崩溃以后emacs的java子进程不结束, 需要手动去任务管理器逐个干掉 (或者cider-connect上)
最后(2022版)
win上的powershell和terminal应用非常强大, 但是约定和使用方式和Unix终端相差甚远.
也能看到微软在不断的吸纳Unix终端的一些特性, 来吸引程序员社区.
简单举几个例子:
- pbcopy/pbpaste对应与powershell的Get-Clipboard/Set-Clipboard这两个cmdlet, 缩写是gcb/scb
- 允许用户删除正在使用中的文件
- 悄悄增加做了AF_SOCKET, 也就是unix socket
- win11甚至允许通过Linux子系统直接运行Linux的GUI程序