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

时间:2012-04-16 09:02:43

标签: macos emacs command-line

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

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

我会接受满足以下所有条件的答案:

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

14 个答案:

答案 0 :(得分:108)

调用以下脚本“emacs”并将其放在PATH某处:

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

涵盖#2,#3和#4。

对于#1,将其放在.emacs文件中的某处:

(x-focus-frame nil)

emacsformacosx.com网站现在有一个How-To page,这是顶级代码段的来源。有关于运行emacsclient并将Emacs挂钩到git mergetool的更多信息。

答案 1 :(得分:69)

在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会话中!

答案 2 :(得分:8)

通过在后台启动Emacs来改进David Caldwell's answer

#!/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 "$@" &

答案 3 :(得分:5)

我假设你:

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

如果是这样,那么我认为这符合原来的四个标准,再加上一个:

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

它将始终打开前景(使用x-focus-frame)。

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

它将以直接模式打开现有的emacs窗口。

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

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

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

正确。

额外一次:

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

〜/斌/ 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

答案 4 :(得分:4)

在Mountain Lion上,我使用Yamamoto Mitsuharu的端口https://github.com/railwaycat/emacs-mac-port,其中包含以下别名:

alias emacs=/Applications/Emacs.app/Contents/MacOS/Emacs

它满足您的所有标准。

答案 5 :(得分:3)

根据本指南,使用自制程序包管理器构建了emacs: http://www.emacswiki.org/emacs/EmacsForMacOS 与brew安装--cocoa emacs 之后应该启动.app版本来获取gui,在我的例子中是/usr/local/Cellar/emacs/24.3/Emacs.app/Contents/MacOS/Emacs

答案 6 :(得分: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约塞米蒂版本10.10.2
  • GNU Emacs 24.4.2(x86_64-apple-darwin14.0.0,NS apple-appkit-1343.14) 2014-11-13

答案 7 :(得分:1)

这里的其他答案对我来说并不合适。特别是在我的机器上,bash脚本

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

始终在主目录中打开emacs。要在当前工作目录中打开它,我必须做

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

代替。

答案 8 :(得分:1)

简单解决方案......

此处发布了许多非常复杂的解决方案。这很公平,因为它似乎并非无足轻重。

然而,这个解决方案对我来说非常有用。

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已打开您的文件。

答案 9 :(得分:0)

按照以下步骤编译Emacs:

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

你做完了!下载和安装XQuartz可能会有所帮助,但这只是我的意见。

答案 10 :(得分: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

答案 11 :(得分:0)

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

不要这样做:

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

相反:

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

--args选项可防止“打开”使用旨在用于Emacs的各种选项。

答案 12 :(得分:0)

top answer很好,但是我希望emacs进程在后台运行,所以我仍然可以使用我的shell。 This answer似乎可以满足我的要求,但是并未在正确的目录中启动emacs,这意味着需要绝对路径(或者将pwd附加到无法在所有情况下都无法工作的路径中的黑客) 。此外,仅使用&意味着如果我杀死了终端,emacs也将被杀死。

我决定使用screen和bash函数,以下解决方案对在装有brew的macOS 10.15.6和emacs 26.2上适用:

function emacs() {
    screen -d -m /Applications/Emacs.app/Contents/MacOS/Emacs "$@"
}

对于-d -m命令行标志的含义,当它们一起使用时,它们具有特殊的含义,因此从本质上可以看作一个命令行标志。解释在联机帮助页中:

以“分离”模式启动屏幕。这将创建一个新会话,但不会附加到该会话。这对于系统启动脚本很有用。

答案 13 :(得分:0)

open_emacs() {
    num=$(ps aux | grep -E "[E]macs-x86_64-10_14 --|[e]macs --" | wc -l)
    if [ $num -eq 0 ]; then
        echo "## starting emacs"
        # Run in a subshell to remove notifications and close STDOUT and STDERR:
        (&>/dev/null emacsclient -t -q &)
    fi
}

alias e="open_emacs"

如果 emacs 守护进程不在后台运行,则第 (&>/dev/null emacsclient -t -q &) 行将启动它。

  • macOS 可能定义了以 E 开头的应用名称(例如:Emacs-x86_64-10_14.app),基于此您可以检查 emacs 守护进程是否在后台运行。