창 관리자 키 바인딩에서 마지막으로 사용한 것과 동일한 디렉토리에서 새 터미널을 열려면 어떻게해야합니까?


25

타일링 창 관리자를 사용하고 gnome-terminal있으며 여러 탭 urxvt에서 창 관리자가 관리하는 여러 인스턴스 로 전환했습니다 . 내가 놓친 기능 중 하나는 마지막 터미널의 작업 디렉토리로 기본 설정되는 새 터미널을 여는 기능입니다.

한마디로 : 마지막으로 사용한 것의 $ PWD로 기본 설정되는 새로운 urxvt (bash)를 여는 방법이 필요합니다.

내 마음에 오는 유일한 해결책은 cd다음과 같이 모든 것에 현재 경로를 저장하는 것입니다.

echo $PWD > ~/.last_dir

이런 식으로 새 터미널의 경로를 복원하십시오.

cd `cat ~/.last_dir`

두 번째 명령을 소스로 만들 수는 .bashrc있지만 모든 디렉토리 변경에서 첫 번째 명령 을 실행하는 방법을 모르겠습니다. :)

포함되지 screen않거나 tmux사용 하지 않는 더 간단한 솔루션을 환영합니다.


" tabbed"perl extension of urxvt? " 을 사용하고 있습니까?
rozcietrzewiacz

탭이 없으며 WM에서 관리하는 새 터미널을 사용하고 있습니다
Luca

답변:


9

를 사용하는 세 가지 솔루션이 .last_dir있습니다. 다음 echo $PWD > ~/.last_dir중 하나 를 배치 할 수 있습니다 .

  1. 래퍼가되는 특수 함수에서 cd:

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

    이것을 당신의 위치에 놓고 새로운 작업 디렉토리를 저장할 때마다 cd 대신 ~/.bashrc사용 cd_하십시오.

  2. 귀하의 $PROMPT_COMMAND( 권장되지 않음 ) :

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

    터미널에서 직접 테스트하거나에 배치 할 수 있습니다 ~/.bashrc. 그러나이 솔루션은 프롬프트가 나타날 때마다 디스크 쓰기를 트리거하여 문제를 일으킬 수 있지만 다른 방법으로 .last_dir는 현재 디렉토리에 상관없이 현재 디렉토리를 포함합니다.

  3. 사용자 정의에서 펄 확장 스크립트 에 대한 rxvt. 필자는 직접 만들지 않았지만 웹에서 몇 가지 예를 찾을 수 있습니다.


PROMPT_COMMAND 그것이 내가 찾던 것입니다. 성능에 영향을 미치지 않기를 바랍니다.
Luca

솔직히 말해서 그것은 다소 거친 방법입니다. 개인적으로, 나는 마이클의 솔루션 최고의 :) 같은
rozcietrzewiacz

1
터미널 외부에서 작동 해야하는 경우 펄 확장 방법을 좋아합니다. 그것은 PROMPT_COMMAND가장 악용 된 환경 변수 중 하나 인 무언가를 해킹하는 것보다 더 깨끗한 것 같습니다
Michael Mrozek

$ PWD는 처음으로 평가되는 것 같습니다
Luca

@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_cdzsh 기능을 사용하는 경우 작동하지 않습니다 . zsh가 제공하는 후크를 사용할 수 있습니다. gist.github.com/jonleighton/1f0b96b49247a07dbaa30fbbe70b34f7
jonleighton

12

이것은 실제로 아주 사소합니다. urxvt기존 urxvt창 에서 실행 하면 새 창이 동일한 디렉토리에 있습니다. 이 이유로 인해 dup별칭 이 지정되었습니다 urxvt &. 핫키에 바인딩하려면 bash bind명령을 사용할 수 있습니다 . 예를 들어,을에 바인딩 F1:

$ bind '"\e[11~": "urxvt &\n"'

팁 고마워. 터미널 자식 프로세스가 상태를 유지한다는 것을 알았지 만 bash의 명령에 키를 바인딩 할 수 있다는 것을 몰랐습니다. 터미널에 집중하지 않기 위해 WM 에서이 작업을 수행하고 싶습니다.
Luca

나는 그것을 좋아한다. 디스크를 쓰지 않으며 새 터미널을 열려고 할 때만 실행됩니다.
rozcietrzewiacz

내가 바꾼 유일한 것은 ( urxvt & ) &>/dev/null배경 작업 대신 사용하는 것입니다.
rozcietrzewiacz

이 솔루션은 훌륭하고 유연하지만 두 개의 바인딩을 사용하는 것을 좋아하지 않습니다. 하나는 터미널을 시작하고 다른 하나는 새 것을 포크합니다.
Luca


4

물론 cd동작 을 수정 하는 효과적인 방법이지만 더 간단한 해결책을 보여주고 싶습니다. 에서 남자 bash는 (1) 나는 상호 작용하는 경우 발견 종료가 실행 ~/.bash_logout존재하는 경우. 따라서 cd마지막 경로를 호출 할 때마다 경로를 저장하는 대신 종료시 저장할 수 있습니다.

~/.bash_logout것은 매우 간단합니다 :

echo $PWD >~/.lastdir

그리고 내 어딘가에이 .bashrc줄을 배치했습니다.

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

1
종료 .bash_logout할 때만 실행 된다는 점에 유의하십시오 login shells. 항상 그런 것은 아닙니다.
henfiber

1
또는 다음을 사용하여 bash종료 할 때 마지막 경로를 저장하십시오 . trap "echo $PWD > ~/.lastdir" EXIT"
henfiber

@henfiber 귀하의 의견에 감사드립니다! 이 경우 쉘은 로그인 쉘이므로 올바르게 작동합니다. 반면에 trap접근 방식도 훌륭합니다.
TrueY

2

나는 종종 여러 개의 터미널 창을 한 번에 여러 탭으로 사용합니다. 예를 들어 : 소스 코드 개발 탭용 창 하나, 라텍스 파일 용 창 하나, R 실행 및 스크립팅 용 창 하나 등 하나의 창 내에서 새 탭 터미널을 해당 특정 창에서 마지막으로 사용되는 디렉토리로 변경하려고합니다. (이것은 과거에는 작동했지만 새로운 그놈 버전에서는 어떻게 든 작동하지 않습니다). 다음 더러운 솔루션은 저에게 잘 작동합니다. 나는 이것을 .bashrc에 넣었다.

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

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

이것은 완벽하다 ... wohoo! 감사. 나는 ... bash는 해킹에 대해 많이 알고 있지만, 나는 이미 그것을 사랑 해요 인간하지 않습니다
apil.tamang
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.