Как я могу открыть новый терминал в той же директории, что и последний использованный, из привязки клавиш менеджера окон?

25

Я использую оконный менеджер листов и переключился gnome-terminalс нескольких вкладок на несколько urxvtэкземпляров, управляемых оконным менеджером. Одна из функций, которые мне не хватает, - это возможность открыть новый терминал, который по умолчанию соответствует рабочему каталогу последнего.

Вкратце: мне нужен способ открыть новый urxvt (bash), который по умолчанию равен $ PWD последнего использованного.

Единственное решение, которое приходит мне в голову, это сохранить текущий путь на каждом cdс помощью чего-то вроде этого:

echo $PWD > ~/.last_dir

и восстановите путь на новом терминале следующим образом:

cd `cat ~/.last_dir`

Я могу получить вторую команду, .bashrcно я не знаю, как выполнить первую при каждом изменении каталога :)

Любое более простое решение, которое не связано с использованием screenили tmuxприветствуется.

Лука
источник
Используете ли вы " tabbed" расширение Perl urxvt?
rozcietrzewiacz
Нет вкладок, я использую новые терминалы под управлением WM
Лука

Ответы:

9

Я вижу три решения с использованием .last_dir. Вы можете разместить echo $PWD > ~/.last_dirлибо:

  1. В специальную функцию, которая будет оберткой для cd:

    function cd_
    {
      [[ -d "$@" ]] || return 1
      echo "$@" > ~/.last_dir
      cd "$@"
    }

    Поместите это в свой файл ~/.bashrcи затем используйте cd_вместо компакт-диска каждый раз, когда вы хотите сохранить новый рабочий каталог.

  2. По вашему $PROMPT_COMMAND( не рекомендуется ):

    PROMPT_COMMAND="$PROMPT_COMMAND; pwd > ~/.last_dir"

    Вы можете проверить это прямо из терминала или поместить его в ~/.bashrc. Это решение, однако, запускает запись на диск каждый раз, когда появляется подсказка, что может вызвать проблемы, но, с другой стороны, .last_dirбудет содержать текущий каталог независимо от того, как вы туда попали.

  3. В пользовательском сценарии расширения perl для rxvt. Я никогда не создавал его сам, но вы можете найти немало примеров в Интернете.

rozcietrzewiacz
источник
PROMPT_COMMAND это то, что я искал. Я попробую это решение, надеясь, что оно не повлияет на производительность.
Лука
Ну, честно говоря, это довольно грубый путь. Лично мне больше всего нравится решение Майкла :)
rozcietrzewiacz
1
Мне нравится способ расширения Perl, если он должен работать за пределами терминала; это кажется чище, чем взломать что-то PROMPT_COMMAND, одну из самых злоупотребляемых переменных среды всех времен
Майкл Мрозек
Похоже, что $ PWD оценивается только в первый раз
Лука
@ neon Ааа ... Извините. Проблема заключается в том, как PROMPT_COMMAND цитируется. (Или , скорее, как $PWDбыл не в кавычках.) Позвольте мне исправить это ... Там. Это должно сделать это.
rozcietrzewiacz
13

В настоящее время я использую эту версию решения № 1

# save path on cd
function cd {
    builtin cd $@
    pwd > ~/.last_dir
}

# restore last saved path
if [ -f ~/.last_dir ]
    then cd `cat ~/.last_dir`
fi

внутри моего .zshrc

Лука
источник
Я тоже использую решение № 1 и добавляю, trap "[ -f ~/.last_dir ] && rm ~/.last_dir" EXITя хочу всегда начинать у себя дома, кроме случаев, когда я открываю новую вкладку
rkmax
Это не работает, если используется auto_cdфункция Zsh. Оказывается, мы можем использовать хук, который предоставляет zsh: gist.github.com/jonleighton/1f0b96b49247a07dbaa30fbbe70b34f7
jonleighton
12

Это на самом деле довольно тривиально; если вы запускаете urxvtиз существующего urxvtокна, новое окно будет в том же каталоге. Я dupпсевдонимы , чтобы urxvt &по этой причине. Если вы хотите, чтобы он был связан с горячей клавишей, вы можете использовать bindкоманду bash . Например, чтобы связать это с F1:

$ bind '"\e[11~": "urxvt &\n"'
Михаил Мрозек
источник
Спасибо за совет. Я знал, что конечные дочерние процессы поддерживают состояние, но я не знал, что вы можете связать ключ с командой в bash. Я хотел бы сделать это из WM, чтобы не фокусировать терминал.
Лука
Мне нравится это. Нет записи на диск, и единственное выполнение происходит, когда вы собираетесь открыть новый терминал.
rozcietrzewiacz
Единственное, что я хотел бы изменить, это использовать ( urxvt & ) &>/dev/nullвместо фона.
rozcietrzewiacz
Это решение отличное и более гибкое, но я не люблю использовать 2 привязки: одну для запуска терминала и одну для разветвления новой.
Лука
4

Просто добавьте . /etc/profile.d/vte.shв свой, ~/.bashrcчтобы получить ту же функцию

Дэвид Вилла
источник
Эта работа, однако, зачем -1 это?
Абдилла
Это работает, и похоже, что это на самом деле предпочтительное решение для панели запуска / разработчиков gnome-терминала: bugs.launchpad.net/ubuntu/+source/gnome-terminal/+bug/1132700
Ajax,
4

Конечно, это рабочий подход для изменения cdповедения, но я бы хотел показать более простое решение. В man bash (1) я обнаружил, что если интерактивный выходит, он запускается, ~/.bash_logoutесли существует. Таким образом, вместо сохранения пути при каждом вызове cdпоследний путь может быть сохранен при выходе.

Мой ~/.bash_logoutочень прост:

echo $PWD >~/.lastdir

И где-то в моем .bashrcя разместил эту строку:

[ -r ~/.lastdir ] && cd $(<~/.lastdir)
TrueY
источник
1
Просто обратите внимание, что .bash_logoutработает только при login shellsвыходе, это не всегда так.
henfiber
1
Также можно сохранить последний путь при bashвыходе с помощью: trap "echo $PWD > ~/.lastdir" EXIT"
henfiber
@henfiber Спасибо за ваши комментарии! Я думаю, что в этом случае оболочка является оболочкой входа в систему, поэтому она будет вести себя правильно. С другой стороны, trapподход тоже хорош, мне нравится!
TrueY
2

Очень часто я использую несколько окон терминала одновременно, в каждом из которых есть несколько вкладок. Например: одно окно для вкладок разработки исходного кода, одно окно для латексных файлов, одно окно для выполнения R и сценариев и т. Д. В одном окне я хочу, чтобы новый терминал с вкладками изменился на каталог, который используется последним в этом конкретном окне (раньше это работало, но с новой версией gnome это почему-то не работает). Следующее грязное решение прекрасно работает для меня. Я положил это в .bashrc.

dirfilename="/tmp/.lastdir-$WINDOWID"
[ -r "$dirfilename" ] &&  {
    savdir=`cat $dirfilename`
    cd "$savdir"
}

function cd ()
{
    builtin cd "$@"
    echo $PWD > $dirfilename
}
BartT
источник
Это прекрасно ... ухо! Спасибо. Я не знаю много о взломе Bash, но человек, я уже люблю его ...
apil.tamang