如何从OSX中的命令行启动GUI Emacs?


91

如何在OSX中从命令行启动GUI Emacs?

我已经从http://emacsformacosx.com/下载并安装了Emacs 。

我将接受一个满足以下所有条件的答案:

  1. emacs窗口我的终端窗口前面打开。
  2. 键入“ emacs”将启动GUI Emacs窗口。在该窗口中查找文件将默认为在我启动Emacs的目录中查找。
  3. 当foo.txt存在时,键入“ emacs foo.txt”会启动GUI Emacs窗口,其中会加载foo.txt。
  4. 如果存在foo.txt,则键入“ emacs foo.txt” 将启动GUI Emacs窗口,其中包含一个名为“ foo.txt”的空文本缓冲区。在该缓冲区中执行^ X ^ S会将foo.txt保存在我启动Emacs的目录中。

通过在终端提示符下输入'emacs'不能满足哪些条件?您的要求描述了Linux上的默认行为。我已经有一段时间没有使用Mac了,但我认为诀窍只是找到合适的程序来执行-emacs.app也许?
泰勒2012年

8
泰勒(Tyler),来自Linux背景,一路与您同在;我只需要在提示符下输入“ emacs”即可。在OSX上执行此操作会在终端窗口中启动文本模式Emacs(因此无法通过标准1),这不是我想要的。
约翰·沃尔斯

1
约翰-在此期间您找到解决方案了吗?我在同样的问题上挣扎,并考虑开始赏金。尤其令人讨厌的是,从命令行调用emacs(而不是Emacs.app)会在后台打开一个窗口...
alexurba 2012年

1
@DougHarris我的要求符合任何Linux发行版上的现实,这就是它们的来源。很高兴您找到适合您的工作流程。干杯!
Johan Walles 2013年

2
我不知道它是否可以在OSX上运行,但是您可以尝试:emacsclient -c -a "" "$@"命令
jfs

Answers:


113

将以下脚本称为“ emacs”并将其放在您的PATH某个位置:

#!/bin/sh
/Applications/Emacs.app/Contents/MacOS/Emacs "$@"

涵盖#2,#3和#4。

对于#1,请将其放在.emacs文件中的某个位置:

(x-focus-frame nil)

现在,emacsformacosx.com网站上有一个“操作方法”页面,这是顶部代码段的来源。有关运行emacsclient和将Emacs连接到的更多信息git mergetool


1
谢谢大卫,你治好!
Johan Walles 2013年

1
效果很好。赏金即将到来。
Tamzin Blake 2013年

2
在Mavericks上,如果我在文件夹中~/foo并想打开bar.txt,请键入,gmacs bar.txt但它会在创建一个新文件~/bar.txt而不是打开~foo/bar.txt。难道我做错了什么?
丹尼尔·康普顿2014年

2
.emacs文件在哪里?
布伦

1
您不能在任何地方添加(x-focus-frame nil),它必须在(custom-set-variables)表达式内,一旦通过自定义设置任何内容,emacs就会为您创建。只需从菜单栏中自定义某些内容,例如将“闪烁的光标”设置为打开(如果您不喜欢,则将其关闭),然后将在.emacs中创建该部分。另外,这是否经过测试?我不确定Cocoa上的emacs是否会遵守此设置。
Chuck Adams

70

在您的Shell中,别名命令'emacs'指向OSX emacs应用程序

在我的shell(运行默认的bash)中,我有以下内容(在我的.bashrc中)

alias emacs='open -a /Applications/Emacs.app $1'

然后,在命令行上键入emacs来启动emacs应用程序。

但是,我建议您打开emacs的副本,并使其保持正常运行。如果是这种情况,并且要将文件加载到emacs的现有副本中,则可以通过将以下内容放在.bashrc中来使用emacsclient:

alias ec='/Applications/Emacs.app/Contents/MacOS/bin/emacsclient'

然后将以下内容添加到您的.emacs文件中,以启动emacs服务器(它将接收emacsclient调用)

;;========================================
;; start the emacsserver that listens to emacsclient
(server-start)

然后你可以输入

ec .bashrc

将.bashrc的副本加载到现有的emacs会话中!


4
克里斯,你好!您的第一个答案不符合条件2和4。您的第二个答案不符合条件2。我正在寻找一种能够满足所有编号条件的解决方案。此致/ Johan
Johan Walles 2012年

3
如果仅使用emacs本身来加载文件,而不是每次都依靠命令行来启动新实例,似乎所有问题都可以解决。我通常在一天的开始时启动emacs(如果它仍未运行),并使用它来加载文件,更改目录,创建新文件以及我想要的任何其他内容,而无需触碰终端窗口。
克里斯·麦克马汉 Chris McMahan)2012年

我不得不说,这个站点上有几个问题可以解决这个问题,但这是唯一可以以简短的雄辩方式完全解决打开文件问题的方法。
tylerthemiler 2012年

3
@tylerthemiler,完全解决问题的答案在哪里?此答案中的两个答案均未通过准则2,第一个也未通过准则4。
约翰·沃尔斯

5
一点技巧可以使问题得到解答。有点谷歌搜索。
duma

10

通过在后台启动Emacs 可以改善David Caldwell的回答

#!/bin/sh
$(/Applications/Emacs.app/Contents/MacOS/Emacs "$@") &

如另一个答案中所述,这涵盖了#2,#3和#4。对于#1,请将其放在.emacs文件中的某个位置:(x-focus-frame nil)

请注意,下列哪项为我工作-它不会在命令行上指定的目录启动Emacs(例如emacs .

# NOT RECOMMENDED
#!/bin/sh
/Applications/Emacs.app/Contents/MacOS/Emacs "$@" &

1
这解决了OSX的问题(也许从10.9 Mavericks开始)。从10.9开始,“不推荐”方法失败,直到至少10.6,不推荐的方法才同步了外壳$ PWD和Emacs(pwd)。大卫的答案可能在其他地方,但是您如何使搜索引擎理解:“ pwd not pwd”?
infogizmo

5

我想你要么:

  • 登录时启动emacs守护程序
  • .emacs中有(服务器启动)
  • 不要介意运行大量单独的emacs副本

如果是这样,那么我认为这可以满足最初的四个标准,再加上一个:

  1. emacs窗口在我的终端窗口前面打开。

它将始终向前景打开(带有x-focus-frame)。

  1. 键入“ emacs”将启动GUI Emacs窗口。在该窗口中查找文件将默认为在我启动Emacs的目录中查找。

它将以转向模式打开现有的emacs窗口。

  1. 当foo.txt存在时,键入“ emacs foo.txt”会启动GUI Emacs窗口,其中会加载foo.txt。

如果emacs已经在运行并且具有服务器,则它将在现有窗口中打开并进入前台。

  1. 如果不存在foo.txt,则键入“ emacs foo.txt”将启动GUI Emacs窗口,其中包含一个名为“ foo.txt”的空文本缓冲区。在该缓冲区中执行^ X ^ S会将foo.txt保存在我启动Emacs的目录中。

正确。

一个额外的:

键入命令后,控制权立即返回到终端会话。

〜/ bin / emacs

#!/bin/bash
EMACSPATH=/Applications/Emacs.app/Contents/MacOS

# Check if an emacs server is available 
# (by checking to see if it will evaluate a lisp statement)

if ! (${EMACSPATH}/bin/emacsclient --eval "t"  2> /dev/null > /dev/null )
then
    # There is no server available so,
    # Start Emacs.app detached from the terminal 
    # and change Emac's directory to PWD

    nohup ${EMACSPATH}/Emacs --chdir "${PWD}" "${@}" 2>&1 > /dev/null &
else
    # The emacs server is available so use emacsclient

    if [ -z "${@}" ]
    then
        # There are no arguments, so
        # tell emacs to open a new window

        ${EMACSPATH}/bin/emacsclient --eval "(list-directory \"${PWD}\")"
    else    
        # There are arguments, so
        # tell emacs to open them

        ${EMACSPATH}/bin/emacsclient --no-wait "${@}"
    fi

    # Bring emacs to the foreground

    ${EMACSPATH}/bin/emacsclient --eval "(x-focus-frame nil)"
fi

太棒了!看来您的args和no-args分支已切换。
eriksensei


4

简单的解决方案...

这里发布了许多非常复杂的解决方案。这很公平,因为它看起来并不平凡。

但是,此解决方案对我来说确实很好。

ec() {
  emacsclient -n $@ 2> /dev/null
  if [[ $? == 1 ]]; then
    open -a Emacs.app  -- $@
  fi
}

用法

ec file [...]

让我们解压缩发生的事情:

  1. 将所有ec参数传递给emacsclient,不要(-n)等待emacs继续。
    1. 如果Emacs已经在运行,那么我们已经完成,您正在编辑。
  2. 当没有emacs运行时,吞下emacsclient发布的错误消息。(2> /dev/null
  3. 手动处理退出代码1[[ $? == 1 ]]
    1. 打开Emacs.app并将文件参数传递给它(路径将正确打开。)
    2. 大功告成,Emacs已打开文件。


3

以下是我为David James所做的进一步改进的工作:

根据说明从终端打开文件的说明,该终端位于http://www.emacswiki.org/emacs/EmacsForMacOS#toc20

open -a /Applications/Emacs.app <file-name>

结合David Jame的回答,我创建了以下emax bash脚本,并将其放在〜/ bin的路径中

#!/bin/bash
(open -a /Applications/Emacs.app "$@") &

警告:为了让emacs在Dired by name模式下打开当前目录,您需要使用

emax .

环境:

  • OS X Yosemite版本10.10.2
  • 2014年11月13日的GNU Emacs 24.4.2(x86_64-apple-darwin14.0.0,NS apple-appkit-1343.14)

这仅适用于现有的文件,它不会产生一个,如果它不存在
Stíofán。

我正在使用macOS 10.15(Catalina),看来这是第一次工作(当Emacs尚未打开时),但是第二次却没有工作(当Emacs窗口已打开时)。你知道如何解决这个问题吗?
user102008 '19

1

这里的其他答案对我而言并不奏效。特别是在我的机器上,bash脚本

#!/bin/sh
/Applications/Emacs.app/Contents/MacOS/Emacs "$@" 

总是在主目录中打开emacs。要使其在当前工作目录中打开,我必须做

#!/bin/sh
/Applications/Emacs.app/Contents/MacOS/Emacs "$PWD/$@"

代替。


1
我特定的构建/安装没有问题,但是您的解决方案有问题。如果您尝试打开多个文件,则只有第一个文件会扩展到PWD目录。其余的将没有前缀$ PWD路径。
kmarsh

0

根据以下步骤编译Emacs:

./configure --with-x --prefix=/usr
make
sudo make install

完成了!下载和安装XQuartz可能会有所帮助,但这只是我的看法。


0

这是我在osx上打开emacs / emacsclient的脚本。

#!/bin/bash

# Ensure (server-start) is added in your emacs init script.

EMACS=/Applications/MacPorts/Emacs.app/Contents/MacOS/Emacs
EMACSCLIENT=/Applications/Macports/Emacs.app/\
Contents/MacOS/bin/emacsclient

# test if client already exsit.
$EMACSCLIENT -e "(frames-on-display-list)" &>/dev/null

# use emacsclient to connect existing server.
if [ $? -eq 0 ]; then
    $EMACSCLIENT -n "$@"
# open emacs.app instead.
else
    `$EMACS "$@"` &
fi

0

在上述所有情况下,使用“打开”时-确保使用“ --args”选项

不要这样做:

alias emacs='open -a /Applications/Emacs.app $1'

相反,这是:

alias emacs='open -a /Applications/Emacs.app --args $1'

--args选项可防止“ open”使用用于Emacs的各种选项。

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.