LINUX.ORG.RU

emacs async-shell-command несколько проблем

 


0

0
(global-set-key (kbd "C-x r") (lambda ()
                                (interactive)
								    (async-shell-command "./test.py")))

внутри test.py

import tempfile
import os
from subprocess import call

EDITOR = os.environ.get('EDITOR', 'vim')  # that easy!

initial_message = ""  # if you want to set up the file somehow

with tempfile.NamedTemporaryFile(suffix=".tmp") as tf:
    tf.write(initial_message)
    tf.flush()
    call([EDITOR, tf.name])

    # do the parsing with `tf` using regular File operations.
    # for instance:
    tf.seek(0)
    edited_message = tf.read()
    print edited_message

Проблема №1

При аналогичном запуске из-под vim при запуске скрипта открывается новый vim, вводим текст. Выходим из-под вим и видим результат выполнения скрипта. В эмаксе запуск скрипта приводит к

      $
      $
      $
      $
      $
      $
      $
      $
      $
      $
      $
      $
      $
      $
      $
      $
      $
      $
      $
      $                    0x0 format=unix enc=utf-8 [1,0] All

Проблема №2 Есть скрипт деплоя, который при исполнении запрашивает у меня кое-какие данные с подтверждением. Так вот пример работы из-под vim:

[user@127.0.0.1:22] run: ./manage.py createsuperuser --username admin --email admin@exmaple.com
[user@127.0.0.1:22] out: Password:
[user@127.0.0.1:22] out: Password (again):
[user@127.0.0.1:22] out: Superuser created successfully.
[user@127.0.0.1:22] out:

[user@127.0.0.1:22] run: mkdir -p apps

Пример работы в эмакс:


 441│ [user@127.0.0.1:22] run: ./manage.py createsuperuser --username admin --email admin@exmaple.com
 442│ [user@127.0.0.1:22] out: Password: somepassword                                 |
 443│                                                                                 |
 444│                                                                                 |
 445│ [user@127.0.0.1:22] out: Password (again):                                      |
 446│ [user@127.0.0.1:22] out: Error: Your passwords didn't match.                    |
 447│ [user@127.0.0.1:22] out: Password:

Попытка 2

 441│ [user@127.0.0.1:22] run: ./manage.py createsuperuser --username admin --email admin@exmaple.com
 442│ [user@127.0.0.1:22] out: Password: somepassword                                   |
 443│ somepassword                                                                      |
 444│                                                                                   |
 445│ [user@127.0.0.1:22] out: Password (again): somepassword                           |
 446│                                                                                   |
 447│ [user@127.0.0.1:22] out: 1Superuser created successfully.                         |
 448│ [user@127.0.0.1:22] out:                                                          |
Все поняли что произошло ?

★★★★

async-shell-command для другого. попробуй term или ansi-term. И возьми за привычку читать документацию - ты будешь удивлен, но там всё это есть.

feofan ★★★★★
()

А вообще, я бы перенес всю интерактивщина на elisp, а скрипт переписал бы на запуск с флагами. Или, если от интерактивности в скрипте уйти нельзя, переделал бы взаимодействие на сетевое (смотри, например, CIDER + nREPL). Не использую я term/ansi-term/multi-term в emacs'е - мне удобнее отдельный терминал с zsh.

feofan ★★★★★
()

Ты же зарёкся: «переход нецелесообразен ввиду отсутствия киллерфич у эмакса, по сравнению с вим». Зачем опять начинаешь?

Puzan ★★★★★
()
Ответ на: комментарий от feofan

term/ansi-term работают ровно до того момента, как появится запуск скрипта с аргументом т.е ./script.py deploy:project.com

   1│ ..: 1: [: ./script.py: unexpected operator                                      |
   2│ ..: 1: exec: ./script.py deploy:project.com: not found                          |
                                                                                      |
      Process *ansi-term* exited abnormally with code 127                             |

CIDER + nREPL --> вообще за пределами понимания зачем оно мне нужно.

bryak ★★★★
() автор топика
Последнее исправление: bryak (всего исправлений: 1)
Ответ на: комментарий от Puzan

Изыди. Дай мне моё pre-осеннее обострение пережить)

bryak ★★★★
() автор топика
Ответ на: комментарий от bryak

Есть подозрение, что

not found
намекает, например, на то, что ты пытаешься запустить этот скрипт не из той директории. А вообще лучше дождись того, кто term в emacs использует.

feofan ★★★★★
()
Ответ на: комментарий от feofan

Я туповатый, но те тупой. Я сразу же после увиденного(до того, как ты это написал тут) сделал типа «cd full_path;./script.py». Этот финт ушами не увенчался успехом:)

bryak ★★★★
() автор топика
Последнее исправление: bryak (всего исправлений: 2)
Ответ на: комментарий от bryak

C-h a term. Почитай документацию для разнообразия. Вангую проблемы, связанные с разным окружением. Для теста запусти что-нибудь не питоновое.

feofan ★★★★★
()
Ответ на: комментарий от feofan

ansi-term is an interactive compiled Lisp function. | | (ansi-term PROGRAM &optional NEW-BUFFER-NAME) | | Start a terminal-emulator in a new buffer. | | [back]

term is an interactive compiled Lisp function. | | (term PROGRAM) | | Start a terminal-emulator in a new buffer. | The buffer is in Term mode; see `term-mode' for the | commands to use in that buffer. | | Type C-c b to switch to another buffer. | | [back]

Что тут читать-то ?

bryak ★★★★
() автор топика
Последнее исправление: bryak (всего исправлений: 1)
Ответ на: комментарий от feofan

случайно так, потом еще делал типа (term "./script.py" «deploy:project.com»)

с норм ковычками deploy(лор свои поставил)

bryak ★★★★
() автор топика
Последнее исправление: bryak (всего исправлений: 1)
Ответ на: комментарий от bryak

Ну так теперь еще раз посмотри документацию. Функция term принимает единственный аргумент - имя программы. Или запускается без аргументов в интерактивном режиме.

feofan ★★★★★
()
Ответ на: комментарий от feofan

Окей, заюзываю async-shell-command. Там-то можно запустить имя программы с двумя или более аргументами. Но есть проблема.

:)

bryak ★★★★
() автор топика
Последнее исправление: bryak (всего исправлений: 4)
Ответ на: комментарий от feofan

Да нечего там читать. Есть трабла просто в async-shell-command. Она некорректно обрабатывает первый <CR>. Что, за 25 лет не один кодер не запускал скрипт с подтверждением данных ?

bryak ★★★★
() автор топика
Последнее исправление: bryak (всего исправлений: 1)
Ответ на: комментарий от feofan

CIDER + nREPL ? Да там вообще какое-то мракобесие. Я даже вникать в это не хочу. Ради чего это ? Чтобы запускать свои скрипты с параметром ? Не крутовато, нет ?

bryak ★★★★
() автор топика
Ответ на: комментарий от bryak

Тебе нужно постоянное взаимодействие или один-два раза передать в скрипт какие-то данные и получить результат?

feofan ★★★★★
()
Последнее исправление: feofan (всего исправлений: 1)
Ответ на: комментарий от feofan

Я через 32 года выхожу на пенсию. Вот тогда будет время заняться этим делом.

bryak ★★★★
() автор топика
Ответ на: комментарий от feofan

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

bryak ★★★★
() автор топика
Ответ на: комментарий от bryak

поставляй данные в этот скрипт с помощью флагов и выполняй его в пакетном режиме. Данные, которые нужно подставить в эти флаги запроси в emacs интерактивно перед запуском скрипта.

feofan ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.