October 5, 2020
By: Kevin

Mac迁移到Windows的开发体验

  1. 键盘/触摸板使用建议
  2. 终端
    1. 终端工具
      1. windows termial + powershell
      2. emacs + eshell + shell
    2. 脚本编程
  3. scoop可以替代homebrew, 安装clojure开发的全部依赖, 以及其他的工具
  4. 编辑器
  5. emacs 的配置
  6. 工程开发
  7. 快捷键
  8. 最后(2020版)
  9. 最后(2022版)

以前本文的标题是"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上更加突出, 以下应用都给我造成过麻烦, 需要手动控制关闭他们的快捷键
    • 网易云音乐
    • QQ
    • 微信
    • 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       330
    
  • clojrue开发基础依赖: 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
  • 其他工具&软件

    • 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
  • 最后贴以下我用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用户,使用感受差异不大, 迁移体验良好.

习惯可以去适应, 但下面的几个问题是系统级的:

  1. windows上的软件有设置全局快捷键的习惯, 一旦和我现有的习惯冲突, 很难排查.
  2. windwos的shell, 即使是powershell, 和习惯的unix/linux shell的使用相差甚远.
    • 没有找到osx上pbpaste的对应物,(pbcopy应该可以用clip替换)
    • 终于自带ssh了, 可以不用putty, 但是不支持mosh
  3. windows上的emacs/git有点...慢 (使用scoop安装的版本), 留下我们思考的时间多一点.
  4. emacs偶尔崩溃, 崩溃以后emacs的java子进程不结束, 需要手动去任务管理器逐个干掉 (或者cider-connect上)

最后(2022版)

win上的powershell和terminal应用非常强大, 但是约定和使用方式和Unix终端相差甚远.

也能看到微软在不断的吸纳Unix终端的一些特性, 来吸引程序员社区.

简单举几个例子:

  1. pbcopy/pbpaste对应与powershell的Get-Clipboard/Set-Clipboard这两个cmdlet, 缩写是gcb/scb
  2. 允许用户删除正在使用中的文件
  3. 悄悄增加做了AF_SOCKET, 也就是unix socket
  4. win11甚至允许通过Linux子系统直接运行Linux的GUI程序
Tags: windows