Emacs — включение аргумента командной строки с запятой в elisp

#emacs #elisp

#emacs #elisp

Вопрос:

Поскольку точка с запятой является разделителем комментариев в elisp , существует ли альтернативный метод для включения аргумента командной строки (содержащего точку с запятой) в elisp функцию? Командная строка отлично работает в терминале, но я в недоумении относительно того, как использовать ее как часть функции, содержащей start-process оператор — Emacs не распознает закрывающие круглые скобки / кавычки после точки с запятой, и Emacs, естественно, жалуется при загрузке.

 ssh user@server -t "cd /some/directory; bash --login"
  

Вот ссылка на связанный поток, который предоставил рабочую командную строку: https://superuser.com/a/250538/206164

Вот аргумент командной строки, который в конечном итоге будет включен в функцию, содержащую start-process . Из всех вариантов, которые я пробовал сегодня днем / вечером, следующая командная строка — единственная, которая успешно работает в терминале для входа в iphone и перехода к определенному каталогу одним махом — т. Е. username@server.name:/path/ Не работает на iphone. Когда все будет запущено и запущено, процесс запуска будет использоваться совместно с rsync для односторонней синхронизации.

 /Users/HOME/.0.data/.0.emacs/elpa/bin/sshpass -p 'alpine' ssh -p '2222' -l root localhost -t "cd /var/mobile/Applications/F30B1574-5979-4764-8742-7F9DB2863094/Documents/.0.data; bash --login"
  

Комментарии:

1. Как выглядит ваш вызов start-process ? Вы уверены, что не оставили некоторые двойные кавычки без экранирования внутри строки?

2. @phils — Функция запуска процесса, которая должна включать rsync, еще не работает, но вот черновик: (start-process "rsync-process" "*rsync*" "/usr/bin/rsync" "--dry-run" "--delete" "-arzh" "/Users/HOME/.0.data/" "--rsh="/Users/HOME/.0.data/.0.emacs/elpa/bin/sshpass -p 'alpine' ssh -p '2222' -l root localhost"" "-t" "cd /var/mobile/Applications/F30B1574-5979-4764-8742-7F9DB2863094/Documents/.0.data amp;amp; bash --login")

3. Передаются ли последние два аргумента в ssh или в rsync? В любом случае, если я изменю ваш amp;amp; на ; , я не вижу никаких проблем с Emacs, считывающим общее выражение. (Я запускаю магистраль Emacs с 2014-05-03.)

4. @phils @ Хммм … вы правы — теперь он работает с точкой с запятой. Должно быть, я допустил ошибку раньше с одним или несколькими кавычками; однако я не сохранил старый черновик. Что касается rsync, я действительно понятия не имею, как заставить его работать — он отлично работает с двумя локальными каталогами — в Google я не смог найти примеров, которые имели бы дело с удаленной целью через ssh, только с удаленным источником. Простая версия выглядит так из командной строки: /usr/bin/rsync --dry-run --delete -arvzh --progress /Users/HOME/.0.data/ /Volumes/DATA/OFFICE/06_28_2014

5. Я бы не подумал, что ssh имеет значение. Вы хотите сказать, что можете успешно выполнить передачу в одном направлении, но не в другом?

Ответ №1:

Я удивлен, что это не работает как есть, поскольку строки Emacs, безусловно, могут содержать точки с запятой, но если это вызывает проблемы, вы должны иметь возможность изменить команду для использования amp;amp; вместо ; :

 ssh user@server -t "cd /some/directory amp;amp; bash --login"
  

Эта команда будет выполняться только bash --login в случае cd успешного завершения, о чем свидетельствует возвращаемое значение 0. Я полагаю, что это ваше намерение.

Подробности см. в документации Bash по спискам команд. (Все другие оболочки, отличные от Windows, с которыми я знаком, также поддерживают этот синтаксис).

Комментарии:

1. Обратите внимание, что вы никогда не должны использовать точку с запятой для объединения команд в цепочку, если не хотите , чтобы последующие команды все еще выполнялись, если предыдущая не удалась. В большинстве ситуаций желательно, чтобы ошибка прерывала всю последовательность, поэтому вам следует привыкнуть использовать amp;amp; по умолчанию.