{ pkgs, ... }: {
  programs.neovim = {
    plugins = [{
      plugin = pkgs.vimPlugins.markdown-preview-nvim.overrideAttrs (old: {
        postPatch = toString [
        # use cjk2ch.js
        (let
          cjk2ch_js = pkgs.fetchurl {
            url = "https://github.com/xieby1/markdown_revealjs/raw/c9c91257d06b63adcf67d3464efbc392f55677ff/share/markdown_revealjs/cjk2ch.js";
            sha256 = "0d2xjy8g89zq8677ggklfpr3f9jd8lny37lbcdqr0asvmiqjgx9x";
          };
        # 添加cjk2ch.js
        # 给混淆过的index.js打补丁(这生成代码居然直接放git,😼😼😼啧啧啧,源码是index.jsx)
        # 通过code:not(:has(span))来识别哪些code可能是ascii art
        # 在refreshContent最后,即renderDot的后面调用cjk2ch(...)
        in ''
          cp ${cjk2ch_js} app/_static/cjk2ch.js
          sed -i 's,<head>,&<script src="/_static/cjk2ch.js"></script>,' app/out/index.html
          sed -i 's,}var e;G(),;cjk2ch("code:not(:has(span))");&,' app/out/_next/static/s7O4q0ISzv1r8jtwIkXLb/pages/index.js
        '')
        # set port to 7700~7799
        ''
          sed -i 's/port = port ||.*/port = port || (7700 + Number(`''${Date.now()}`.slice(-2)))/' app/server.js
        ''
        # set line-height of <pre></pre>
        ''
          sed -i 's/line-height: 1.45;/line-height: 1em;/' app/_static/markdown.css
        ''];
      });
      config = ''
        " allow LAN
        let g:mkdp_open_to_the_world = 1
        let g:mkdp_theme = 'light'

        " Use chromium-like browser to open rendered markdown instead of firefox,
        " because firefox only copy css in selected region, causing lost of styles!
        " See same bug report here:
        " https://discourse.mozilla.org/t/copy-rich-text-from-firefox-does-not-capture-style/97862/3
        function OpenMarkdownPreview (url)
          " run chromium in app mode in background
          execute "silent ! chromium --app='" . a:url . "' &"
        endfunction
        let g:mkdp_browserfunc = 'OpenMarkdownPreview'
      '';
    }];
  };
}