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


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.