有没有人想做一个emacs的离线安装文件的?

公司网是离线的,安装emacs比较费劲。近期又要到其他单位去搞开发,他们都不用emacs,系统上也没有安装,且我自己装的话还要重新配置。我在想有没有可能搞一个离线的自己配置好的安装包,可以在不同的linux系统下执行的那种,比如.appimage形式的包,不需要软件是最新版的,只要是一个稳定版就可以。有没有大神给提供个思路啥的。

创建

使用 guix 的 guix pack 功能来创建一个,可以在同CPU架构,同是Linux的机器上运行的程序包: 甚至你的 openwrt x86_64, android x86_64 上面都能执行

guix pack \
-RR \
-S /opt/emacs/bin=bin \
-S /opt/emacs/lib=lib \
-S /opt/emacs/etc=etc \
glibc-utf8-locales emacs-no-x emacs-rime ... 插件,或者工具

执行这个命令会得到一个压缩包, 这个压缩包包括了所有依赖库和你需要的包。

使用

需要做的只是发送压缩包到目标机器上, 然后解压得到 gnu 和 opt 文件夹 可以解压在任何地方,也可以解压到 /

并创建个进入环境的脚本:

#!/bin/sh

# 需要在解压的地方放置此脚本
POS=$(dirname $(realpath ${0}))
# 如果解压到/就要更改POS为
#POS=/

# 中文显示
export GUIX_LOCPATH=${POS}/opt/emacs/lib/locale
if [ -z ${LANG} ]
then
export LANG=en_US.UTF-8
fi

# 添加需要的环境变量
export PATH=${POS}/opt/emacs/bin:${PATH}
source ${POS}/opt/emacs/etc/profile

# 执行你的shell或者bash
$SHELL || bash

然后需要做的就是在 ${HOME}/.emacs.d 或者其他地方放置你的emacs配置文件

执行刚才的脚本进入环境

然后执行:

emacs

就可以使用你想要的Emacs环境了

补充

-RR 里面有 proot 和 user namespace 的后端,可以保证在绝大多数地方都能执行

当然,你也可以把环境一块打包里面,比如:

...
--ad-hoc coreutils util-linux gawk grep sed findutils diffutils patch \
--ad-hoc git ccls python-language-server gcc-toolchain make clang-toolchain \
--ad-hoc tmux screen fish \
...
# 只要guix有的打包,你就可以放进去。

我的一个 emacs-with-rime 示例:

gnu/store 下面的结构:

ls gnu/store

01b4w3m6mp55y531kyi1g8shh722kwqm-gcc-7.5.0-lib/            fvhj74pghapbjvsvj27skvkra1by1965-bash-minimal-5.0.16/
0g0j5j7m52mcfwazd8scip4qb7r001m9-attr-2.4.48/              hifh6nqwi9yzrcj5msmmqpd43x8c62ar-info-dir/
0n6nnvzgxyisg0bszb5zqxp2gzdwh7h3-pack-audit.so             i5a9qb07y9xjh9ry8hp6km43kji16nmd-libltdl-2.4.6/
17vxkkfggl0m15c73yd21nkgcr0flavd-emacs-no-x-27.2R/         i8h2pcxqdq07ijm3ibkka8f4smn1w48v-bzip2-1.0.8/
18hp7flyb3yid3yp49i6qcdq0sbi5l1n-guile-3.0.2/              ig9ynfhzji7ds1pb2ai3lmlyvws8f0fp-capnproto-0.8.0/
1hyfryzw145ipq8yn0k2399snmw34z6r-opencc-1.1.1/             klrqcn5m4axr58lbp1nzhcnlw2armb52-leveldb-1.22/
1zhd9fk3xjnz2cgdcjwngi5yw882xggx-glog-0.4.0/               krpyb0zi700dcrg9cc8932w4v0qivdg9-pkg-config-0.29.2/
2gl9vhwb805pfmknizxni9bi84xlflkm-emacs-popup-0.5.8R/       kx2q4fnwkdlzmdmv350s3qvgbq6sd4xr-emacs-rime-1.0.4/
2ql96jy3ilx219ddra32a6bdm8abzpzg-yaml-cpp-0.6.3/           mmhimfwmmidf09jw1plw3aw1g1zn2nkh-bash-static-5.0.16/
2sac9zy7af0r9975rwcwzp0a5iwq4pcf-emacs-dash-2.18.1R/       mz5fvdfks10rmwxf29n95bp9bim6wq7g-nettle-3.5.1/
2wqjj3mkqdvsvksndr2hpjpi7qqwi7kr-icu4c-66.1/               pwcp239kjf7lnj5i4lkdzcfcxwcfyk72-bash-minimal-5.0.16/
35afkywncrr5xsb4cxcljf6rpjcb7f61-gmp-6.2.0/                pzm72ywfyqv1g0h4571p6zlhg566cwwd-libidn2-2.3.0/
3kzq9gr6px2rbc26y73r7i9hcdc18xsa-rime-data-0.38.20200623/  qqib9cfwcpr4x8m2306sg0zi3p31wlyp-glibc-utf8-locales-2.31R/
4i9lvjz9z9j4kj412jpqv4zxjcik9qcb-libunistring-0.9.10/      r7k859hmcnkazf492fasqvk25jflnfk6-xz-5.2.4/
5gbblqc44adpbc87s34csnsq62wvnwkw-marisa-0.2.6/             rgydar9dfvflqqz2irgh7njj34amaxc6-glibc-utf8-locales-2.31/
5yvzilh78996627i8avq532sl2c03i95-gnutls-3.6.15/            rykm237xkmq7rl1p0nwass01p090p88x-zlib-1.2.11/
6nw2xslykar9g67n70j6jb9w8lqy5vfs-emacs-dash-2.18.1/        sdmy0v0nl29j5bw48r3b2rq162vi7y8g-profile/
760kd4dbz3l88crwmckcls6riah4jhrs-libfakechroot.so          sh7fvkvwhwa2a8k8g4q3qail5gypx2ch-emacs-posframe-1.0.2R/
7c32nw1dwdh96bk4zxn5v5qabra9s0m9-proot-static-5.1.0/       v5rgf8v6cjxjbngkzjcznj98dkxj8svg-jansson-2.12/
8jkmy3n06cqmq2w5gcrs8apjnx6lzqmb-emacs-posframe-1.0.2/     vb12knxd3cdrgnk548l4f6m628ikg8pf-libtasn1-4.16.0/
97p5gvb7jglmn9jpgwwf5al1798wi61f-acl-2.2.53/               vfkr7aaahpi68d08wan04rfmyfc1axgy-librime-1.6.1/
9860f1abqj8wjjnwl8a9v54pdcc3bhgf-xz-5.2.4/                 vp2s1nxsc9vvc1ix66xpbf041f8nacxr-boost-1.72.0/
9b07hm07vmd9ab2k2d66nshjyqz8aj4c-emacs-popup-0.5.8/        vwf622r52hxawb1fxix3djshzcf1ydzw-manual-database/
bw15z9kh9c65ycc2vbhl2izwfwfva7p1-libffi-3.3/               w5xwq1l2ayif2p264lklaii7r9nhy1qn-emacs-rime-1.0.4R/
c8w9z48vvx2a3q3k44ch9yn00wk1qwhb-libxml2-2.9.10/           z1iyvbvnkd7zkjxsx157n6qx2iwzxq7p-alsa-lib-1.2.4/
cx3lbyhspkharxnrknsqg96p9wa1yp5f-emacs-no-x-27.2/          zg126cjicrpm2p6zc08ra5vh4ddag7ww-libgc-8.0.4/
djn4r0klwccqglwr4lwm5dpkkcdzffv4-snappy-1.1.8/             zzkly5rbfvahwqgcs7crz0ilpi7x5g5p-ncurses-6.2/
fa6wj5bxkj5ll1d7292a70knmyl7a0cr-glibc-2.31/

如果要32位的:

guix pack -s i686-linux

当然,也可以给其他平台生成:

交叉编译方式:

guix pack --target=aarch64-linux-gnu # aarch64-linux
guix pack --target=arm-linux-gnueabihf # armhf-linux
guix pack --target=i586-gnu # gnu hurd

但是需要注意的是当前为止(2021.05): 有些build-system没有实现交叉编译.而且有的软件需要额外的设置才能交叉编译成功.

所以建议qemu-binfmt方式

qemu-binfmt方式:

guix pack -s aarch64-linux
guix pack -s armhf-linux
3赞

急速体验MatthewZMD私人发行版M-EMACS - Emacs-general - Emacs China (emacs-china.org)

参考之前我发的这个帖子中的链接,基于docker 镜像。 只要目标宿主可以支持docker那么就可以运行。 配置啥的都可以固定下载。 可以保证迁移不同系统都保持环境一致。

具体可参考以下仓库中的脚本。 github.com

允许用自己电脑的话,用自己本机的 emacs 搭配 标配的 tramp 编辑远程文件。