2016-08-03 14 views
0

Я хочу отправить выбранную группу строк в текущее окно ipython из текстового редактора (в этом случае это TextMate, но это в значительной степени не имеет значения.) Сценарий использует вызов bash поэтому он может принимать переменную, а затем вызов Applescript, чтобы вставить код в окно.Отправлять несколько строк цитируемого текста в IPython в окне терминала

Этот текущий скрипт работает, но он может отправлять только одну не вложенную строку за раз. Есть ли способ исправить это, поэтому я могу сразу отправить несколько не вложенных строк кода?

#!/bin/bash 

QUOTED_TEXT=${TM_SELECTED_TEXT//\"/\\\"} 
echo "$QUOTED_TEXT" 

osascript <<- APPLESCRIPT 
    tell application "Terminal" 
     set currentTab to (selected tab of (get first window)) 
     set tabProcs to processes of currentTab 
     set theProc to (end of tabProcs) 
     if theProc is not "Python" then 
      set currentTab to (do script "ipython") 
     end if 

     do script "$QUOTED_TEXT \n" in currentTab 
    end tell 
APPLESCRIPT 

ответ

1

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

  1. Никогда не передавайте аргументы AS такие: это ошибочная авария, которая просто ждет, чтобы произойти. Оберните свой код AS в обработчике on run argv ... end run, затем добавьте дополнительные аргументы в команду osascript при вызове в bash. Затем передаст эти аргументы непосредственно AppleScript в виде списка строк, назначенных переменной argv. Безопасный и простой.

  2. Вместо того, чтобы обернуть код AS в Баш скрипт, просто добавьте #!/usr/bin/osascript в верхней части кода AS, сохраните его в виде простого текстового файла в соответствующем месте (например, где-то на вашей оболочки $PATH, такие как /usr/local/bin) , затем выполните chmod +x /path/to/script, чтобы сделать его исполняемым. Это позволит вам запустить его непосредственно из терминала.

  3. Если вы хотите получить доступ к STDIN или переменным окружения непосредственно в сценарии оболочки AppleScript, используйте мост AppleScript-ObjC для вызова NSFileHandle's fileHandleWithStandardInput()'s readDataToEndOfFile() и NSProcessInfo's processInfo()'s environment() соответственно. Чтобы получить доступ к ARGV, используйте явный обработчик run, как описано выше.

  4. По умолчанию osascript автоматически записывает значение, возвращаемое обработчиком run в STDOUT; В качестве альтернативы вы можете напрямую писать в STDOUT в любое время через NSFileHandler (вы можете положить простой оператор return в конце обработчика run, чтобы он ничего не возвращал). И автоматически записывает результаты команд log в STDERR и устанавливает код возврата в ненулевое значение, когда ваш скрипт выдает неперехваченное исключение (например, используйте оператор error ERROR_STRING number ERROR_NUMBER для создания исключения непосредственно в коде AS).

(Кстати, я написал библиотеку файлов, не так давно, что включает в себя кучу очень хороших обработчиков для написания скриптов AS на основе я больше не развивать или поддерживать его сам,. Однако, различные люди имеют already forked it, поэтому, если вы много работаете с AS + shell, вы можете найти его полезным источником кода AS для вырезания и вставки или даже для использования как есть.)

+0

Что касается пункта 2, я знаю, что вы можете напрямую ссылаться на Applescript, но Насколько я понимаю, TextMate может передавать только переменные окружения Bash, Perl, PHP, Python или Ruby. – WildGunman

+0

Переменные среды не зависят от языка. См. № 3. – foo

+0

Не быть тупым здесь, но мост Objective-C в Applescript совершенно непрозрачен для не-разработчика. Есть ли хорошие примеры его использования для простых описаний Applescripts. – WildGunman