Существует ли способ зеркально отразить изменения каталога в Терминаторе?

Я нахожусь на Ubuntu 12.04 и использую Терминатора в качестве своего основного терминала. Мне нравится он, потому что это позволяет мне сохранить интерпретатор Python и колотить терминал, открытый одновременно в том же представлении.

То, что является раздражающим, - то, что я заканчиваю тем, что переместился между каталогами A LOT, и затем я должен сделать это дважды. Существует ли способ настроить конфигурацию разделителя, чтобы сделать это? Чтобы иметь разделитель зеркально отражают изменения каталога.

Я предполагаю, что я не единственный, который находит тот срыв!

3
задан 19 August 2014 в 20:18

1 ответ

Хорошо. Если я понимаю правильно, у Вас в основном есть окно Terminator в представлении разделения, где один буфер является оболочкой Bash, и другой интерпретатор Python. Теперь, каждый раз, когда Вы вводите команду как cd Pictures/ в буфере Bash Вы хотите автоматически отправить команду os.chdir("Pictures/") к буферу Python, так, чтобы это изменило каталоги одновременно с Вашей оболочкой Bash. Отчасти как в этом изображении:

enter image description here

... где os.chdir команда в буфере Python должна быть введена автоматически когда Вы тип a cd команда в буфере Bash.Правильно? Если да, вот...

Решение

Шаг 1: Присвойте два буфера той же группе

Терминатор поддерживает группы окон. Мы присвоим те два буфера той же группе для позже использования функции Терминатора широковещательной передачи команд к окнам в той же группе. В этом примере я присвою оба буфера группе под названием Tau (подлинное имя не имеет значения, но удостоверяется, что это - то же для обоих буферов).

enter image description here

Шаг 2: Определите сочетания клавиш для включения и выключения широковещательной передачи группы

Терминатором по умолчанию не имеет сочетаний клавиш для них, но нам нужны они теперь, таким образом, мы определим их с помощью Меню свойства Терминатора. Я использовал Ctrl+Insert для включения широковещательной передачи группы и Ctrl+Delete для выключения его. Можно выбрать любые другие сочетания клавиш, которые Вы любите, хотя необходимо будет адаптировать Шаг 3 соответственно.

enter image description here

Теперь, можно нажать Ctrl+Insert, и независимо от того, что Вы вводите в одном буфере, появится в другом буфере. Путем ввода Ctrl+Delete Вы деактивируете то поведение снова.

Если интерпретатор Python понял команду такой как cd Pictures/, для изменения каталога в обоих буферах все, что необходимо было бы сделать теперь, будет чем-то как Ctrl+Insertcd Pictures/Ctrl+Delete, для широковещательной передачи команды, как. Но нормальный интерпретатор Python не понимает это cd команда. Вы могли использовать IPython, который действительно понимает это вместо чистого интерпретатора Python. Однако я предполагаю, что (1) Вы хотите чистый интерпретатор Python и (2) Вы не хотите иметь необходимость не забыть нажимать эти сочетания клавиш прежде и после каждого cd команда. Так, давайте направляться в Шаг 3.

Шаг 3: Переведите и отправьте cd управляйте автоматически к буферу Python

Мы повторно исказим встроенный Bash cd команда, чтобы сделать немного больше прежде на самом деле изменить рабочий каталог в текущей оболочке. А именно, каждый раз, когда пользователь вводит cd somewhere,

  1. Мы переводим команду в Python
  2. Мы используем xdotool моделировать нажатие Ctrl+Insert
  3. Мы используем xdotool моделировать ввод переведенной команды
  4. Мы используем xdotool моделировать нажатие Return
  5. Мы используем xdotool моделировать нажатие Ctrl+Delete

Таким образом переведенная команда будет отправлена на буфер Python. Если у Вас нет его, установка xdotool:

sudo apt-get install xdotool 

Сценарий, для которого мы хотим как псевдоним cd будет выглядеть примерно так:

function cd_to_pybuf {
  xdotool type "#"
  xdotool key Ctrl+Insert
  xdotool type "os.chdir(\"$1\")"
  xdotool key Return
  xdotool key Ctrl+Delete
  cd "$1"
}
cd_to_pybuf

Объяснение: Когда мы искажаем cd к вышеупомянутому сценарию, затем каждый раз, когда мы вводим cd somewhere, Bash переводит это в OURSCRIPT somewhere. Так как наш сценарий заканчивается вызовом функции cd_to_pybuf, это на самом деле вызовет функцию cd_to_pybuf с somewhere как аргумент (доступный как $1 в функции; обратите внимание, что расширение удара не работало бы здесь, таким образом, мы не можем использовать что-то как !* достигать аргументы исходной команды, и $BASH_COMMAND проблематично также). Эта функция выполняет точно шаги, перечисленные выше. На заметке на полях мы также моделируем ввод # прежде чем мы моделируем нажатие Ctrl+Insert, потому что независимо от того, что мы вводим после того, как это появится в обоих буферах, и Bash не понимает os.chdir команда, таким образом, с этим # знак мы превращаем его в комментарий для Bash. После xdotool материал, мы также выполняем фактическое cd команда в буфере Bash.

Таким образом, теперь мы повторно искажаем cd к тому сценарию и тесту это:

enter image description here

Работает! Это os.chdir("..") команда в буфере Python была введена автоматически. Я не сделал этого. Все, что я сделал, было ввести cd .. в буфере Bash. Вы видите что команда #os.chdir("..") был также автоматически введен в буфер Bash, но так как это - комментарий, это не имело никакого реального эффекта.

Для внесения этого изменения постоянным поместите тот псевдоним в ~/.bashrc, т.е. в Вашем ~/.bashrc добавьте строку:

alias cd='function cd_to_pybuf { xdotool type "#"; xdotool key Ctrl+Insert; xdotool type "os.chdir(\"$1\")"; xdotool key Return; xdotool key Ctrl+Delete; cd "$1"; }; cd_to_pybuf'

И voilà!Вот и все.

Премия: псевдоним для pwd

Иногда можно хотеть проверить то, что текущий рабочий каталог находится в обоих буферах сразу. Мы можем использовать ту же самую технику что касается cd, и перепсевдоним pwd. Следующая команда добьется цели, и можно также поместить ее в Ваш ~/.bashrc если Вам нравится:

alias pwd='function pwd_to_pybuf { xdotool type "#"; xdotool key Ctrl+Insert; xdotool type "os.getcwd()"; xdotool key Return; xdotool key Ctrl+Delete; pwd; }; pwd_to_pybuf'

Что необходимо будет помнить

Чтобы это работало в будущем, каждый раз, когда Вы открываете представление разделения с Bash и буфером Python, необходимо будет сделать две вещи:

  1. Присвойте оба буфера той же группе в Терминаторе
  2. import os в Вашем буфере Python

Это все.

Поиск и устранение неисправностей

Это не прекрасно. Существуют некоторые незначительные проблемы:

  1. Это немного ужасно что это #os.chdir штука печатается к буферу Bash также. Это является действительно косметическим, но Вы могли бы рассмотреть выполнение чего-то другого, например, после моделирования ввода команды и прежде, чем моделировать нажатие Return деактивируйте широковещательную передачу временно и удалите ту команду (например, моделируйте много клавиш Backspace или последовательность Ctrl+A, Ctrl+K) от буфера Bash или что бы то ни было.

  2. Некоторые специальные аргументы cd не будет работать. Вещи как cd - (изменение в $OLDPWD), cd ~ (изменение в $HOME), или cd (без аргументов также изменитесь на $HOME). Здесь также, сценарий мог быть улучшен для составления таких особых случаев (проверка, если $1 является особенным, и переведите соответственно). Такими вещами должен быть кусок пирога отсюда, все же.

  3. Дополнительные параметры к cd, такой как, например, cd -P somewhere, не будет работать, потому что перевод был бы os.chdir("-P") здесь. Вы могли использовать $@ вместо $1 для рассмотрения всех аргументов, и затем делают соответствующую вещь.

Надежда я мог помочь :) Это была интересная задача!

11
ответ дан 17 November 2019 в 19:13

Другие вопросы по тегам:

Похожие вопросы: