Я хотел бы настроить что-то в оболочке, чтобы получить опыт, подобный IDE, используя только оболочку (без X). Самое близкое, что я сделал, это использовал tmux, с vim в одной панели и командной строкой в другой. Таким образом, из vim я могу .w !bash
запустить строку.
Но меня это не устраивает, поскольку среда не сохраняется между командами, выполняемыми по отдельности.
Если я запущу:
var1=FOO
а потом
echo $var1
каждое использование .w !bash
, FOO
не будет отображено.
Что я действительно хочу сделать, так это просмотреть текстовый файл в одной панели и использовать сочетание клавиш для отправки строки в терминал в другой панели в рамках этого сеанса терминала. Какова правильная комбинация инструментов для достижения этого? Я понимаю, что emacs можно настроить для выполнения чего-то подобного с помощью собственного эмулятора терминала, но мне бы хотелось решение, которое работает со стандартными инструментами (например, в установщике).
Редактировать: tmux select-copy-paste не так уж и плох, но все равно немного неудобен.
решение1
Прототипное решение с sh
, vim
и tmux
, быстрое и грубое доказательство концепции.
Ваш .w !bash
запускается bash
и отправляет текущую строку в свой stdin. Давайте заменим bash
скриптом, который вставляет строку из своего stdin в другую панель в tmux
.
Вот базовый сценарий:
#!/bin/sh
pane="$(tmux list-panes -F '#{pane_active} #D' | awk '$1==0 {print $2;exit}')"
IFS= read -r line
tmux send-keys -l -t "$pane" "$line"
tmux send-keys -t "$pane" 'C-j'
Процедура, краткое объяснение:
- Определите неактивную панель.
- Прочитать строку из stdin.
- Отправьте строку на панель, как если бы она была напечатана.
- Отправить Enterна панель.
Сохраните его как trun
, сделайте его исполняемым и доступным через $PATH
. Теперь, если у вас есть две панели tmux
и вы запустите trun
одну из них, введете строку и нажмете Enter, то строка будет внедрена в другую панель.
Вместо vim
invoke это должно работать. Привяжите это .w !bash
к .w !trun
клавише для легкого доступа.
Примечания:
- Скрипт не проверяет, есть ли ровно две панели.
- Скрипту все равно, что выполняется в целевой панели; он просто отправляет ключи.