Открыть приложение emacs в определенном режиме для заданного пути

Я использовал emacs в командной строке и использовал следующую команду, чтобы открыть текущий каталог git в режиме magit:

emacs -nw -f magit-status --eval "(call-interactively #'delete-other-windows)"

Я переключился на использование приложения emacs вместо того, чтобы открывать его в командной строке. Я использую следующий псевдоним команды:

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

Из-за этого команда magit больше не работает. Есть ли способ добиться той же функциональности с приложением Emacs?

Кроме того, попробовал эту функцию, как было предложено в комментариях:

function magit() {
 open -a /Applications/Emacs.app --args -f magit-status $1
}

С уважением,
Паван.


person webdev    schedule 09.05.2019    source источник
comment
Используйте аргумент —args для open для передачи аргументов приложению.   -  person nega    schedule 09.05.2019
comment
Спасибо почему-то не работает. Я предполагаю, что emacs приложения и терминала работают совершенно по-разному. Есть ли способ узнать флаги, которые я могу передать при открытии приложения emacs?   -  person webdev    schedule 10.05.2019
comment
Что вы делали и как это не сработало? Если вы все еще пытаетесь втиснуть его в псевдоним, подумайте об использовании вместо этого функции.   -  person nega    schedule 10.05.2019
comment
Извините, нужно было добавить больше информации. Я также попробовал функцию. Он просто фокусируется на существующем открытом окне emacs, а затем ничего не делает. Я пытался закрыть все окна, но в этом случае эта команда просто открывает emacs.   -  person webdev    schedule 13.05.2019
comment
Добавлена ​​функция в основной пост. дайте мне знать, если я упустил что-то очевидное.   -  person webdev    schedule 13.05.2019
comment
В функции оболочки sh/bash (по крайней мере) $1 передает только первый аргумент (и при этом без кавычек). Это никогда не то, что вы хотите от функции-оболочки. Если это то, что здесь происходит, вам действительно нужен "$@", который передает все аргументы, каждый из которых цитируется соответствующим образом.   -  person phils    schedule 08.06.2021
comment
И наоборот, я вообще не знаю, что $1 делает в вашем определении оболочки alias. Когда вы используете псевдоним, все, что следует за псевдонимом в команде, добавляется к расширению псевдонима. Вы, вероятно, добавляете туда пустую строку без кавычек, что будет безвредно; но это все еще ошибка, судя по всему.   -  person phils    schedule 08.06.2021


Ответы (1)


При запуске нового сеанса Emacs функция

function magit() {
 open -a Emacs --args --file "$1" -f magit-status
}

будет делать то, что вы хотите. То есть загрузите файл в буфер (через find-file) и запустите функцию magit-status в этом буфере. Обратите внимание, что порядок учитывается в командной строке Emacs. Хотя open -a Emacs myfile --args -f magit-status и open -a Emacs --args -f magit-status myfile верны с точки зрения open, они неверны с точки зрения Emacs. (magit-status выполняется ни на чем, а затем открывается myfile. Не то, что вы хотите.)

Если вы хотите сделать это с запущенным в данный момент сеансом Emacs, вы не сможете. Подсказка находится на справочной странице open.

--args
    All remaining arguments are passed to the opened application in the argv parameter to main().  These argu-
    ments are not opened or interpreted by the open tool.

main() уже выполнено, поэтому вы не можете передать ему больше параметров, поэтому --args фактически игнорируется. Итак, вам придется проявить творческий подход к серверу Emacs и emacsclient.

Если у вас есть открытый сеанс Emacs со связанным сервером (например, через server-start), вы можете сделать следующее, чтобы загрузить и выполнить файл

# my emacs will load *.log files in `fundamental-mode`
# this will load them in `text-mode`

$ emacsclient -e '(find-file "/tmp/foo.log")' -e '(text-mode)'

# or

$ emacsclient -e '(progn (find-file "/tmp/foo.log") (text-mode))'
person nega    schedule 13.05.2019