前言

工作关系,公司提供了一台 Windows 电脑进行开发,本来是用 Macbook 的,但懒得上下班来回背,于是就得在 Windows 上配置一下开发环境。

这些是我需要用到的一些环境和工具:

NodeJSGitEmacsFirefoxChrome一个好用的终端代理工具

代理工具

下载 2dust/v2rayN,然后配置即可。

一开始没有用代理,访问 GitHub 可能比较慢,以后考虑找个 U 盘存储一下, 避免到时访问不了 GitHub 的情况。

浏览器

浏览器主要用 Firefox, Chrome 也偶尔用。

下载 Firefox 时最好通过谷歌寻找下载链接,不然可能下载了国内的版本, 两个版本的账号是不互通的。

Emacs & 环境

最开始的时候,是直接下载 Windows 版本的 Git,NodeJS,Emacs,然后用 git bash 作为终端。

但是在 Windows 下使用终端实在很别扭,Windows 下的路径和 MacOS,Linux 的不同,不习惯。

之后了解到 WSL (Windows Subsystem for Linux), 可以通过它在 Windows 上装一个 Linux 子系统。

只要安装一个 Ubuntu 或者自己熟悉的 Linux 发行版,就能回到 Linux 那样的命令行环境了。

WSL

按照 Install Linux on Windows with WSL 安装即可,看看文档了解点基本用法。

建议使用 Windows 的 Microsoft Store 搜索 wsl 进行安装,然后根据 Systemd support is now available in WSL! 配置好 systemd。

Windows Terminal

WSL 文档中推荐搭配 microsoft/terminal 使用,相比于 Powershell,git bash,确实好用很多。

它支持了多个 tab,选择不同的 Profiles, 定制主题,字体等。

安装字体

参考 How to install Powerline fonts in Windows,步骤如下:

  • powerline/fonts 上,点击克隆的按钮,下载字体 zip 包,下载后解压 zip 包

  • WINDOW KEY + X 选择 Windows PowerShell(Admin), 然后 cd 到解压的 zip包中 .../fonts-master/fonts-master 目录

  • 执行 Set-ExecutionPolicy Bypass 设置可执行权限,然后执行 .\install.ps1 安装字体, 安装完成后,执行 Set-ExecutionPolicy Default 将权限重置回去

配置 Terminal

  • 将 Ubuntu 作为默认 Profiles

  • 设置 Ubuntu Profiles 的字体为 Fira, Nerd 之类的字体

按键绑定

Windows 有一些默认的全局绑定键,Terminal 里也有一些,按自己需要禁用。

目前我的键盘可以直接切换 Ctrl 和 Caps Lock ,但可能有些键盘不支持,可以下载 PowerToys 映射一下。

WSL 和 Windows 之间的复制粘贴

Windows -> WSL

Windows 上 Ctrl-C 复制,然后可以在 WSL Ctrl-V 粘贴,但是因为我使用 Emacs,Ctrl-V 在 Emacs 中是常用的翻页功能。

因此禁用了 Ctrl-V 作为粘贴快捷键,改为通过 Terminal 的 command 去粘贴:

在 Ternimal 中 Ctrl+Shift+P 呼出 command panel,然后找到 paste 命令执行即可。

WSL -> Windows

同样,在 Terminal 中用 Emacs,选中文字复制没法传递到 Windows 的剪贴板, 目前还没找到方便的操作。

当前的解决办法:

  • Emacs 中选择内容,然后写入到一个文件 ~/copy.txt

  • 执行命令 cat ~/copy.txt | clip.exe 把 copy 的文本写入剪切板 (可以绑定 alias 方便调用)

将以上流程封装为函数:

1
2
3
4
5
6
7
  (defun spike-leung/wsl-copy ()
    "Copy region to windows clipboard."
    (interactive)
    (progn
      (write-region (mark) (point) "~/copy.txt" nil nil nil nil)
      (shell-command "cat ~/copy.txt | clip.exe")
      ))

之后有时间把这个操作添加到 Emacs 的复制钩子里,这样 Emacs 复制时就能复制到 Windows 上了。

Ubuntu 环境配置

Git

Ubuntu 自带,直接用

systemd

配置过程中,提示 systemd 不可用,导致一些安装无法进行。

参考 WSL: System has not been booted with systemd as init system (PID 1) 解决:

1
2
3
4
5
6
7
8
  # Install git
  sudo apt install git

  # Run the script
  git clone https://github.com/DamionGans/ubuntu-wsl2-systemd-script.git
  cd ubuntu-wsl2-systemd-script/
  bash ubuntu-wsl2-systemd-script.sh
  # Enter your password and wait until the script has finished

zsh

参考 How to Install and Setup Zsh in Ubuntu 20.04:

1
2
3
4
5
6
7
8
9
  # Install
  sudo apt install zsh

  # Set zsh as default shell
  # chsh -s $(which "SHELL NAME")
  chsh -s $(which zsh)

  # Uninstall
  sudo apt --purge remove zsh

配置 Oh My ZSH & Starship, 一些插件参考: antfu/dotfiles

NodeJS

下载 nvm 进行配置:

1
2
3
4
5
6
  # install
  curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.2/install.sh | bash

  # 在 .zshrc 或者 .bashrc 中加入配置
  export NVM_DIR="$([ -z "${XDG_CONFIG_HOME-}" ] && printf %s "${HOME}/.nvm" || printf %s "${XDG_CONFIG_HOME}/nvm")"
  [ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh" # This loads nvm

Emacs

默认 apt 安装的是 Emacs 26 的版本,但是我的配置需要 27 以上

1
2
3
4
5
6
7
8
  sudo add-apt-repository ppa:kelleyk/emacs

  sudo apt update && sudo apt upgrade

  sudo apt install emacs27

  # Uninstall
  sudo apt autoremove --purge emacs27

安装 gcc,用于编译 emacsql:

1
  sudo apt install gcc

下载自己的 emacs.d 配置,切换成 windows 的分支,注意要安装子模块。

如果需要安装最新的 Emacs 版本,可以参考 How to Install Emacs on Ubuntu:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
  # install
  sudo apt-add-repository ppa:ubuntu-elisp/ppa

  sudo apt update && sudo apt upgrade

  sudo apt-get install emacs-snapshot

  # uninstall
  sudo add-apt-repository --remove ppa:ubuntu-elisp/ppa
  sudo apt remove emacs-snapshot
org-mode 打开链接, WSL 中找不到浏览器
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
  ;;; Package --- Summary
  ;; init-wsl
  ;;; Commentary:
  ;;; Code:
  ;;; https://adam.kruszewski.name/2017-09-16-emacs-in-wsl-and-opening-links.html

  (let ((cmd-exe "/mnt/c/Windows/System32/cmd.exe")
        (cmd-args '("/c" "start")))
    (when (file-exists-p cmd-exe)
      (setq browse-url-generic-program  cmd-exe
            browse-url-generic-args     cmd-args
            browse-url-browser-function 'browse-url-generic)))

  (provide 'init-wsl)
  ;;; init-wsl.el ends here
终端没有 GUI,因此一些 GUI 相关的显示会有些问题
  • fringe: 左侧显示的一些标志消失了,flycheck 找不到错误标志,不过可以通过其他方式显示错误,虽然不那么直观,但能接受

碎碎念

相对在 Windows 里开发,通过 WSL 用 Ubuntu 进行开发,要舒服很多,一些命令执行起来更方便,速度也不慢。

不过仍然存在不少问题需要去解决,例如复制粘贴,还有不少的 Emacs 按键和其他软件似乎有冲突……

后面解决了再来更新文章 :)