安装Emacs Windows支持库的最简单方法


15

我安装了Windows的Emacs 24.4的二进制文件,并想要安装WindowsEmacs README中描述的支持库。ezwinports项目提供了最新的预编译库,但是安装它们会花费一些时间。我必须选择Emacs的README文件中提到的所有库,扫描ezwinports README文件是否有其他先决条件,并下载每个zip存档。然后解压缩它们,将它们移动到永久位置,然后将各个目录添加到我的PATH变量中。这些档案中有重复的文件,因此我很警惕将它们全部解压缩到同一目录而不检查它们是否相同。

有自动化的方法吗?


据我所知,二进制下载包含所有先决条件,因此即使自述文件中列出了这些前提条件,您也无需费心单独下载它们。这就是为什么您在不同的程序包中有重复的文件。
艾伦(Alan)2015年

Answers:


10

从Emacs 25开始,Emacs Windows下载目录现在包括一个deps软件包,其中包括特定体系结构的所有依赖项。例如,对于x86_64,请使用emacs-25-x86_64-deps.zip

我使用以下脚本自动安装Emacs。它应该适用于WSL或Cygwin。它必须在海拔高度下运行,并且已经Set-ExecutionPolicy -Scope CurrentUser -ExecutionPolicy RemoteSigned在PowerShell中运行。

#!/usr/bin/env bash

set -o nounset -o pipefail -o errexit

emacs_major=26
emacs_minor=1
emacs_ver="$emacs_major.$emacs_minor"
arch="x86_64"
emacs_url_root="https://ftpmirror.gnu.org/emacs/windows/emacs-$emacs_major"

emacs_deps_zip="emacs-$emacs_major-$arch-deps.zip"
emacs_zip="emacs-$emacs_ver-$arch.zip"

if [[ "$(uname -r)" == *Microsoft ]]; then
    programfiles="$(bin/wslpath "%ProgramFiles%")"
    programfilesx86="$(bin/wslpath "%ProgramFiles(x86)%")"
    allusersprofile="$(bin/wslpath "%AllUsersProfile%")"
    public_desktop="$(bin/wslpath "%Public%\\Desktop")"
    desktop="$(bin/wslpath "%UserProfile%\\Desktop")"
else
    CSIDL_PROGRAM_FILES=38
    CSIDL_PROGRAM_FILESX86=42
    CSIDL_COMMON_APPDATA=35
    CSIDL_COMMON_DESKTOPDIRECTORY=25
    CSIDL_DESKTOP=0

    programfiles="$(cygpath -F "$CSIDL_PROGRAM_FILES")"
    programfilesx86="$(cygpath -F "$CSIDL_PROGRAM_FILESX86")"
    allusersprofile="$(cygpath -F "$CSIDL_COMMON_APPDATA")"
    public_desktop="$(cygpath -F "$CSIDL_COMMON_DESKTOPDIRECTORY")"
    desktop="$(cygpath -F "$CSIDL_DESKTOP")"
fi

emacs_root="$programfiles/Emacs"

old_tmpdir="${TMPDIR:-}"
TMPDIR="$(mktemp -dt install-windows-pkgs.XXXXXXXXXX)"
export TMPDIR

on_exit () {
    rm -rf "$TMPDIR"
}

trap on_exit EXIT

unzip_dest () {
    local zip="$1"
    local dest="$2"

    if [[ ! -d "$dest" ]]; then
        if ! mkdir -p "$dest"; then
            result="$?"
            echo "Can't create '$dest'. Try running under elevation" >&2
            exit "$result"
        fi

        unzip -n "$zip" -d "$dest"
    fi
}

install_emacs_pkg () {
    local zip="$1"
    local dest="$2"

    # XXX: move to tmp
    if [[ ! -d "$dest" ]]; then
        wget --directory-prefix "$TMPDIR" "$emacs_url_root/$zip"
        unzip_dest "$TMPDIR/$zip" "$dest"
    fi
}

on_exit
trap EXIT
TMPDIR="$old_tmpdir"

# XXX: Set-ExecutionPolicy -Scope CurrentUser -ExecutionPolicy RemoteSigned
# XXX: sticking cmd.exe /c start before this causes all nature of space-quoting problems
powershell.exe windows\\add_path.ps1 "%ProgramFiles%\\Emacs\\emacs-$emacs_ver\\bin" "%ProgramFiles%\\Emacs\\emacs-$emacs_major-deps\\bin"

# XXX: would be nice to pin runemacs.exe to taskbar, but the need to edit
# that is probably best seen as Emacs bug/flaw

5

这不是一个完全自动化的解决方案,但这是其中的一部分。据我所知,当前的支持库及其前提条件是:

  • libpng-1.6.12
  • 开罗1.12.16
  • gdk-pixbuf-2.30.2
  • giflib-5.1.0
  • glib-2.38.2
  • Gnutls-3.0.9
  • jpeg-v9a
  • libcroco-0.6.8
  • libffi-3.0.13
  • librsvg-2.40.1-2
  • libxml2-2.7.8
  • lzo-2.06
  • pango-1.36.1-2
  • 像素人0.32.4
  • 蒂夫-4.0.3
  • zlib-1.2.8-2

将所有这些文件ezwinports文件区域下载到暂存目录。然后,使用unp将这些文件解压到各自的目录中。使用renameCygwin中的命令消除任何-w32-bin后缀。

rename -- -w32-bin "" *-w32-bin

使用以下命令获取要添加到目录中的目录列表PATH

command ls -1 | perl -pe 's/^/C:\\Program Files (x86)\\/; s/\n/\\bin;/'

然后,您可以将所有这些移动到C:\Program Files (x86)


2
由于支持库可能会发生变化,因此我不愿意花费大量时间尝试清理或自动化整个过程。取消和重命名实际上不是必需的,因为您可以将unzip这些文件简单地放入所需的位置。但是我周围都有它们,因此使用起来更容易。
Michael Hoffman

4

我知道这是一个老问题,但是如果有人偶然发现了这个问题:请尝试emacsbinw64emacsbin。它们包含所有必需的dll,您不必手动解决依赖关系。


请注意,它似乎已停止更新。
NetMage
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.