独立的便携式emacs

问题描述 投票:0回答:4

我正在尝试编译和静态链接 Emacs,因为在工作中我被迫在运行 CentOS 5.1 的生产服务器上通过 ssh 进行 JavaScript 开发,该服务器运行的包管理器配置损坏,而 Emacs21 没有 js 模式每当我尝试安装和使用 js[23]-mode.el 或 javascript.el 时都会产生错误,而我没有时间在工作中进行调试。

c 模式缩进所有内容

$().ready(function() {
            like();
            $(this).andIOnlyHave1024Pixels(function () {
                                               etc ();
                                               etc ();

我将如何制作更现代版本的 Emacs 的便携式副本?或者改变 c 模式? (或者任何避免使用 vi 的方法...)

谢谢


emacs indentation portability static-linking
4个回答
3
投票

我想我已经开始有了答案。 首先,您需要能够在与运行时机器具有相同架构的某些机器上构建 Emacs。 您可以通过交叉编译来解决这个问题,但这会使一切变得更加复杂。

tar xf emacs.tar.bz2
cd emacs
./autogen.sh
./configure --with-x=no --prefix=/usr/local
make
mkdir install
make DESTDIR=$PWD/install install

您可以添加任何您想要的前缀,它必须是您要在运行时计算机上安装 Emacs 的位置。 X 被禁用,因为它大大减少了所需的库的数量,而且无论如何你都是通过 ssh 运行的。

现在弄清楚运行 Emacs 需要哪些共享库。 快速浏览一下 Emacs 附带的所有可执行文件就会发现,这是整个 Emacs 安装所需的库的超集。

$ ldd install/usr/local/bin/emacs
linux-vdso.so.1 (0x00007fff427fe000)
libasound.so.2 => /usr/lib/libasound.so.2 (0x00007f66b25a0000)
librt.so.1 => /usr/lib/librt.so.1 (0x00007f66b2398000)
libdbus-1.so.3 => /usr/lib/libdbus-1.so.3 (0x00007f66b2151000)
libxml2.so.2 => /usr/lib/libxml2.so.2 (0x00007f66b1de9000)
libgpm.so.2 => /usr/lib/libgpm.so.2 (0x00007f66b1be2000)
libncursesw.so.5 => /usr/lib/libncursesw.so.5 (0x00007f66b1983000)
libgnutls.so.28 => /usr/lib/libgnutls.so.28 (0x00007f66b1673000)
libpthread.so.0 => /usr/lib/libpthread.so.0 (0x00007f66b1457000)
libm.so.6 => /usr/lib/libm.so.6 (0x00007f66b1159000)
libc.so.6 => /usr/lib/libc.so.6 (0x00007f66b0dac000)
libdl.so.2 => /usr/lib/libdl.so.2 (0x00007f66b0ba8000)
/lib64/ld-linux-x86-64.so.2 (0x00007f66b2897000)
libz.so.1 => /usr/lib/libz.so.1 (0x00007f66b0992000)
liblzma.so.5 => /usr/lib/liblzma.so.5 (0x00007f66b076f000)
libp11-kit.so.0 => /usr/lib/libp11-kit.so.0 (0x00007f66b054e000)
libtasn1.so.6 => /usr/lib/libtasn1.so.6 (0x00007f66b033a000)
libnettle.so.4 => /usr/lib/libnettle.so.4 (0x00007f66b010c000)
libhogweed.so.2 => /usr/lib/libhogweed.so.2 (0x00007f66afedd000)
libgmp.so.10 => /usr/lib/libgmp.so.10 (0x00007f66afc66000)

因此,将所有这些库复制到安装树中的某个目录中。

linux-vdso.so
是虚拟的,不能/不需要复制。

mkdir install/usr/local/solib
cp /usr/lib/libasound.so.2 /usr/lib/librt.so.1 /usr/lib/libdbus-1.so.3 /usr/lib/libxml2.so.2 /usr/lib/libgpm.so.2 /usr/lib/libncursesw.so.5 /usr/lib/libgnutls.so.28 /usr/lib/libpthread.so.0 /usr/lib/libm.so.6 /usr/lib/libc.so.6 /usr/lib/libdl.so.2 /lib64/ld-linux-x86-64.so.2 /usr/lib/libz.so.1 /usr/lib/liblzma.so.5 /usr/lib/libp11-kit.so.0 /usr/lib/libtasn1.so.6 /usr/lib/libnettle.so.4 /usr/lib/libhogweed.so.2 /usr/lib/libgmp.so.10 install/usr/local/solib/

全部存档。 我最近很喜欢squashfs,如果你愿意的话可以使用tar。

mksquashfs install/usr/local emacs.sfs -noappend

在运行时计算机上,提取文件并将其复制到前缀。 有了squashfs,我们就可以挂载它了。

mount emacs.sfs /usr/local

启动 emacs,并将

LD_LIBRARY_PATH
设置为使用您之前复制的库。

LD_LIBRARY_PATH=/usr/local/solib /usr/local/bin/emacs

希望这会起作用。 我在一台与我构建的操作系统相当相似的虚拟机中进行了测试,因此当它们相差很大时,可能会出现问题。


2
投票

如果您可以在计算机中编译 emacs,则可以从那里运行而无需安装它。 只需执行编译为您创建的二进制文件(您可能需要更改路径,因为来自不同版本的 emacsclient 可能无法很好地协同工作)。

我知道这不是您想要的(因为 emacs 不可移植,并且您可能在那台机器上缺少编译环境),但这个技巧可能对您有用。

当然,assem 建议的 TRAMP over ssh 方法是更好的解决方案(也是我个人使用的)


1
投票

我通常使用

sshfs
来挂载远程文件系统并使用 Emacs 编辑其中的文件。它工作得相当可靠。

另一个不错的选择是 Emacs 克隆 mg,因为它更小、更简单,将其编译成静态可执行文件应该更容易。即使它缺少真正的 Emacs 的大部分功能,您仍然会有宾至如归的感觉。


0
投票

有一个名为 Portacle 的便携式 Lisp 开发环境,可以从 USB 记忆棒运行。

Portacle 包括 Emacs 等。

它适用于 MS Windows、Linux 和 MacOS。

https://portacle.github.io/

© www.soinside.com 2019 - 2024. All rights reserved.