Как я могу отправить выбранный текст (или строку) в TextMate2 на R, работающий на терминале
Как вы знаете, версия 2 TextMate находится в стадии разработки, и текущая версия для разработки очень перспективна: https://github.com/textmate/textmate/blob/master/README.md
В моем случае я использую R в терминале (MacOSX Mountain Lion), и я разрабатываю свой код с TextMate2. В предыдущей версии TextMate (1.5.11) я использовал следующую хитрость для отправки выделенного текста или строк в мое окно терминала:
-> См. Как я могу отправить выбранный текст (или строку) в TextMate на R, работающий на терминале
Этот трюк работал отлично для меня, но я не могу понять, как получить аналогичное поведение с TextMate2.
Любая идея? Заранее благодарю за вашу драгоценную помощь.
4 ответа
Это работает для меня, и это правильно идет в конец выбора. Я просто добавил часть osascript в предыдущем ответе и вставил ее в код, который был в исходном R-комплекте, написанном Хансом-Йоргом Бибико. Установите "селектор области действия" на "source.r" и "output" на "discard". Установите "Input" в "line", и он сделает то, что мне нужно: отправьте строку, если ничего не выделено, и отправьте выбор в противном случае.
редактировать: он отлично работает с выборками, но не со строкой. Когда вы не выделяете текст, он просто перезапускает все с начала файла
edit2: решено, я написал Ханс-Йоргу Бибико, и он указал мне на выбор "Вход".
#!/usr/bin/env bash
# input is selection or document
rawText="$(cat | sed 's/ / /g;')"
curDir=''
if [[ ${#TM_DIRECTORY} -gt 0 ]]; then
curDir="$TM_DIRECTORY"
fi
osascript -e 'on run(theCode)' \
-e ' tell application "Terminal"' \
-e ' do script theCode in window 1' \
-e ' end tell' \
-e 'end run' -- "$rawText"
if [ "$TM_LINE_NUMBER" != "" ]; then
"$TM_MATE" -l "$(($TM_LINE_NUMBER+1)):1000000"
elif [[ $TM_SELECTION =~ [1-9][0-9]*:?[0-9]*-([1-9][0-9]*):?[0-9]* ]]; then
# Regular Selection
"$TM_MATE" -l "$((${BASH_REMATCH[1]}+1)):1000000"
elif [[ $TM_SELECTION =~ [1-9][0-9]*:?[0-9]*x([1-9][0-9]*):?[0-9]* ]]; then
# Block (option) selection
"$TM_MATE" -l "$((${BASH_REMATCH[1]}+1)):1000000"
else
"$TM_MATE"
fi
На самом деле, основываясь на предыдущем ответе ( Как я могу отправить выбранный текст (или строку) в TextMate на R, запущенный на Терминале), я создал свой Пакет в TextMate 2, используя следующий код:
#!/bin/bash
source "$TM_SUPPORT_PATH/lib/bash_init.sh" # might not be necessary
# input is selection or document
rawText="$(cat | sed 's/ / /g;')"
osascript -e 'on run(theCode)' \
-e ' tell application "Terminal"' \
-e ' do script theCode in window 1' \
-e ' end tell' \
-e 'end run' -- "$rawText"
open "txmt://open?line=$(($TM_LINE_NUMBER+1))&column=1000000" &
Смотрите скриншот ниже.
Единственная проблема заключается в том, что при выделении фрагмента текста курсор переходит на первую строку документа, что очень раздражает. Изменение "Input" с "Line" на "Selection" не решает проблему.
Какие-нибудь мысли?
Немного косвенного ответа: я использую пакет R в Textmate 2 (который также работал в Textmate 1). Просто выберите строки, которые вы хотите запустить, и "Отправить выделение в / R App" (у меня оно привязано к command-R, но я не уверен, что это оригинальная привязка)
В первый раз он открывает приложение R и выполняет код. В последующие времена он просто вставляет код и запускает его.
Это не совсем "отправить в терминал", но все еще работает
Я получил это, работая с несколькими изменениями в ответе Бхайбеки. Очевидно, $TM_LINE_NUMBER пуст, и это заставляет курсор перейти к первой строке документа. Избавившись от последней строки, это решает часть проблемы.
#!/bin/bash
[[ -f "${TM_SUPPORT_PATH}/lib/bash_init.sh" ]] && . "${TM_SUPPORT_PATH}/lib/bash_init.sh"
rawText="`cat`"
osascript -e 'on run(theCode)' \
-e ' tell application "Terminal"' \
-e ' do script theCode in window 1' \
-e ' end tell' \
-e 'end run' -- "$rawText" > /dev/null
Другая проблема заключается в том, как переместить курсор в конец выделения. Я заставил его работать, вставив пустой вывод в конце выделения (на правой панели: Вывод:"Вставить после ввода" и Формат:"Текст"). Возможно, это не самый элегантный способ сделать это, но это работает.