Как подключить вход к sublimetext на linux?
Как получить текст из stdin в редактор sublimetext? С помощью vim он работает следующим образом:
echo "potato potato potato" | vim -
То же самое работает с gedit, создавая новый документ с содержимым.
Sublimetext, похоже, только начинает редактирование файла с именем "-" на новой вкладке, есть ли другой трюк оболочки, который может работать?
Ответы
Ответ 1
Самое простое решение, если ваша возвышенная установка не поддерживает открытие STDIN (например, текущая версия в Linux), заключается в том, чтобы выгрузить вывод во временный файл, открыть файл в возвышенном виде и затем удалить файл. Я создал script под названием tosubl
в моем каталоге bin следующим образом:
#!/bin/bash
TMPDIR=${TMPDIR:-/tmp} # default to /tmp if TMPDIR isn't set
F=$(mktemp $TMPDIR/tosubl-XXXXXXXX)
cat >| $F # use >| instead of > if you set noclobber in bash
subl $F
sleep .3 # give subl a little time to open the file
rm -f $F # file will be deleted as soon as subl closes it
Затем вы можете использовать его, выполнив что-то вроде этого:
$ ifconfig | tosubl
Ответ 2
Я не знаю Sublime Text, но ваша проблема должна быть общей, поскольку она применима к любой программе, которая принимает имя файла как аргумент, но отказывается читать из stdin.
К счастью, Bash позволяет вам вывести stdout из одного процесса в какой-то временный файл, а затем передать имя этого файла другому процессу.
От man bash
:
Подстановка процесса поддерживается в системах, которые поддерживают именованные каналы (FIFO) или метод /dev/fd для именования открытых файлов. Он принимает форму < (list) или > (list). Список процессов запускается с его вводом или выводом, подключенным к FIFO или некоторому файлу в /dev/fd. Имя этого файла передается в качестве аргумента текущей команде в результате расширения. Если используется формa > (список), запись в файл будет содержать вход для списка. Если используется форма < (list), файл, переданный как аргумент, должен быть прочитан для получения вывода списка.
Предполагая, что SomeProcess создает выходные данные, которые вы хотите записать в своем редакторе:
sublimetext <(SomeProcess)
или
SomeProcess | sublimetext <(cat)
Если вы думаете, что будете печатать вручную вручную, тогда вы можете поместить sublimetext <(cat)
в оболочку script или псевдоним.
На всякий случай, если ваша ОС не поддерживает замещение процесса, вы всегда можете указать временный файл самостоятельно:
SomeProcess > /tmp/myoutput
sublimetext /tmp/myoutput
Ответ 3
Вы можете найти vipe
из moreutils. Если вы установите EDITOR='subl --wait'
, вы можете просто
echo 'potato potato potato' | vipe
Ответ 4
Спекуляция на fooobar.com/questions/250126/... немного, так как для меня это делает 90%, но не все:
Использование временного файла - это способ, который можно использовать практически с любым редактором. Еще лучше, если редактор поддерживает ожидание, пока файл не будет закрыт (Sublime sublime -w
для Sublime Text), вы можете редактировать его на лету, что делает его более универсальным. Для этого вам нужно изменить предоставленный скрипт @tylerl - скрипт с именем tosubl
в вашем PATH:
#!/bin/bash
TMPDIR=${TMPDIR:-/tmp} # default to /tmp if TMPDIR isn't set
F=$(mktemp $TMPDIR/tosubl-XXXXXXXX)
cat >| $F # use >| instead of > if you set noclobber in bash
subl -w $F # waits until the file is closed
cat $F # prints out the contents of the file to stdout
rm -f $F # clean up the file
Сейчас работает echo "hello" | tosubl > local.file
echo "hello" | tosubl > local.file
откроет вывод первого скрипта в Sublime и, как только вы local.file
его, сохраните его в local.file
.
Ответ 5
Если вы хотите отобразить цветной текст с escape-последовательностями ANSI (например, терминальным буфером), вы можете установить пакет ANSIescape и использовать следующую команду:
F=$(mktemp); cat > $F; subl $F; subl --command ansi; sleep.5; rm -f $F