Як я можу відкрити новий термінал у тому самому каталозі останнього, що використовувався, з клавішного менеджера вікон?


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_замість cd кожен раз, коли ви хочете, щоб ваш новий робочий каталог зберігався.

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

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

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

  3. У спеціальному сценарії розширення Perl для rxvt. Я ніколи сам не створював цього, але ви можете знайти в Інтернеті досить багато прикладів.


PROMPT_COMMAND - це те, що я шукав. Я спробую це рішення, сподіваючись, що воно не вплине на вистави.
Лука

Ну, це досить сирий спосіб, відверто кажучи. Особисто мені найкраще подобається рішення Майкла :)
rozcietrzewiacz

1
Мені подобається спосіб розширення perl, якщо йому потрібно працювати поза терміналом; здається, чистіше, ніж щось зламати PROMPT_COMMAND, одна з найбільш зловживаних змінних оточення всіх часів
Майкл Мрозек

Схоже, що $ PWD оцінюється лише вперше
Лука

@neon Aaah ... Вибач. Проблема полягає в тому, як котирується 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 це?
Абділла

Це працює, і схоже, що це насправді найкраще рішення при запуску / розробці
Ajax

4

Звичайно, це працездатний підхід до зміни cdповедінки, але я хотів би показати більш просте рішення. У man bash (1) я виявив, що якщо інтерактивний виходить, він працює, ~/.bash_logoutякщо він існує. Тож замість зберігання шляху при кожному виклику cdостаннього шляху можна зберегти при виході.

Моя ~/.bash_logoutдуже проста:

echo $PWD >~/.lastdir

І десь у своєму місці .bashrcя розмістив цей рядок:

[ -r ~/.lastdir ] && cd $(<~/.lastdir)

1
Зауважте .bash_logoutлише, що працює лише при login shellsвиході, це не завжди так.
henfiber

1
Крім того, збережіть останній шлях, коли bashtrap "echo $PWD > ~/.lastdir" EXIT"
виходите

@henfiber Дякуємо за ваші коментарі! Я думаю, що в цьому випадку оболонка - це оболонка для входу, тому це буде вести себе належним чином. З іншого боку, trapпідхід також приємний, мені це подобається!
Дійсно

2

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

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

function cd ()
{
    builtin cd "$@"
    echo $PWD > $dirfilename
}

Це ідеально ... wohoo! Спасибі. Я не знаю багато про хакерський баш, але людину, яку я вже люблю ...
apil.tamang
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.