如何在OSX中从命令行启动GUI Emacs?
我已从http://emacsformacosx.com/下载并安装了Emacs。
我会接受满足以下所有条件的答案:
答案 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窗口在我的终端窗口前面打开。
醇>
它将始终打开前景(使用x-focus-frame)。
- 键入“emacs”会启动GUI Emacs窗口。在该窗口中查找文件将默认查看我启动Emacs的目录。
醇>
它将以直接模式打开现有的emacs窗口。
- 当foo.txt存在时,键入“emacs foo.txt”会启动加载了foo.txt的GUI Emacs窗口。
醇>
如果emacs已经在运行且有服务器,那么它将在现有窗口中打开并进入前台。
- 当foo.txt不存在时键入“emacs foo.txt”会启动一个GUI Emacs窗口,其中包含一个名为“foo.txt”的空文本缓冲区。在该缓冲区中执行^ X ^ S会将foo.txt保存在我启动Emacs的目录中。
醇>
正确。
额外一次:
键入命令后,控制立即返回终端会话。
〜/斌/ 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 .
环境:
答案 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 [...]
ec
参数传递给emacsclient并且不要(-n
)等待emacs继续之前。
2> /dev/null
)1
([[ $? == 1 ]]
)
答案 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 &)
行将启动它。
E
开头的应用名称(例如:Emacs-x86_64-10_14.app
),基于此您可以检查 emacs
守护进程是否在后台运行。立>