Làm cách nào tôi có thể mở một thiết bị đầu cuối mới trong cùng thư mục của thiết bị được sử dụng cuối cùng từ bàn phím của trình quản lý cửa sổ?


25

Tôi đang sử dụng trình quản lý cửa sổ ốp lát và tôi đã chuyển từ gnome-terminalnhiều tab sang nhiều urxvttrường hợp được quản lý cửa sổ quản lý. Một trong những tính năng tôi bỏ lỡ là khả năng mở một thiết bị đầu cuối mới mặc định cho thư mục làm việc của thiết bị cuối cùng.

Tóm lại: Tôi cần một cách để mở một urxvt (bash) mới mặc định là $ PWD của cái được sử dụng cuối cùng.

Giải pháp duy nhất nảy ra trong đầu tôi là lưu lại con đường hiện tại trên mỗi cdthứ như thế này:

echo $PWD > ~/.last_dir

và khôi phục đường dẫn trên thiết bị đầu cuối mới theo cách này:

cd `cat ~/.last_dir`

Tôi có thể nhập lệnh thứ hai .bashrcnhưng tôi không biết cách thực hiện lệnh đầu tiên trên mỗi thay đổi thư mục :)

Bất kỳ giải pháp đơn giản hơn không liên quan screenhoặc tmuxsử dụng đều được chào đón.


Bạn có đang sử dụng tabbedphần mở rộng " " perl urxvtkhông?
rozcietrzewiacz

Không có tab, tôi đang sử dụng thiết bị đầu cuối mới được quản lý bởi WM
Luca

Câu trả lời:


9

Tôi thấy ba giải pháp sử dụng .last_dir. Bạn có thể đặt một echo $PWD > ~/.last_dirtrong hai:

  1. Trong một chức năng đặc biệt sẽ là một trình bao bọc cho cd:

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

    Đặt cái này trong của bạn ~/.bashrcvà sau đó sử dụng cd_thay vì cd mỗi khi bạn muốn thư mục làm việc mới của bạn được lưu trữ.

  2. Trong của bạn $PROMPT_COMMAND( không được đề xuất ):

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

    Bạn có thể kiểm tra điều này trực tiếp từ thiết bị đầu cuối hoặc đặt nó vào ~/.bashrc. Tuy nhiên, giải pháp này kích hoạt ghi đĩa mỗi khi dấu nhắc xuất hiện, điều này có thể gây rắc rối - nhưng mặt khác, .last_dirsẽ chứa thư mục hiện tại bất kể bạn đến đó bằng cách nào.

  3. Trong một kịch bản mở rộng perl tùy chỉnh cho rxvt. Tôi chưa bao giờ tự tạo một cái, nhưng bạn có thể tìm thấy một vài ví dụ trên web.


PROMPT_COMMAND đó là những gì tôi đang tìm kiếm. Tôi sẽ thử giải pháp này với hy vọng nó không ảnh hưởng đến màn trình diễn.
Luca

Vâng, đó là một cách khá thô thiển, thẳng thắn. Cá nhân tôi thích giải pháp của Michael nhất :)
rozcietrzewiacz 23/212

1
Tôi thích cách mở rộng perl, nếu nó cần làm việc bên ngoài thiết bị đầu cuối; có vẻ sạch sẽ hơn hack một cái gì đó vào PROMPT_COMMAND, một trong những biến môi trường bị lạm dụng nhất mọi thời đại
Michael Mrozek

Có vẻ như $ PWD chỉ được đánh giá lần đầu tiên
Luca

@neon Aaah ... Xin lỗi. Vấn đề là với cách thức trích dẫn PROMPT_COMMAND. (Hay đúng hơn, làm thế nào $PWDđược không trích dẫn). Hãy để tôi có sửa lỗi này .... Điều đó nên làm điều đó.
rozcietrzewiacz

13

Tôi hiện đang sử dụng phiên bản giải pháp số 1 này

# 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

bên trong tôi .zshrc


Tôi cũng đang sử dụng giải pháp số 1 và thêm trap "[ -f ~/.last_dir ] && rm ~/.last_dir" EXITtôi muốn bắt đầu luôn ở nhà trừ khi tôi mở một tab mới
rkmax

Điều này không hoạt động nếu sử dụng auto_cdtính năng của zsh. Hóa ra chúng ta có thể sử dụng một cái móc mà zsh cung cấp: gist.github.com/jonleighton/1f0b96b49247a07dbaa30fbbe70b34f7
jonleighton

12

Điều này thực sự khá tầm thường; nếu bạn chạy urxvttừ trong urxvtcửa sổ hiện tại của mình , cửa sổ mới sẽ nằm trong cùng thư mục. Tôi đã dupbí danh urxvt &cho lý do này. Nếu bạn muốn nó bị ràng buộc với một phím nóng, bạn có thể sử dụng bindlệnh của bash . Ví dụ: để ràng buộc nó với F1:

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

Cảm ơn vì tiền hỗ trợ. Tôi biết rằng các tiến trình con thiết bị đầu cuối duy trì trạng thái nhưng tôi không biết rằng bạn có thể liên kết một khóa với một lệnh trong bash. Tôi muốn làm điều này từ WM để tránh tập trung vào thiết bị đầu cuối.
Luca

Tôi thích nó. Không có đĩa ghi và thực thi duy nhất diễn ra khi bạn sắp mở thiết bị đầu cuối mới.
rozcietrzewiacz

Điều duy nhất tôi thay đổi là sử dụng ( urxvt & ) &>/dev/nullthay vì chỉ tạo nền.
rozcietrzewiacz

Giải pháp này rất hay và linh hoạt hơn nhưng tôi không muốn sử dụng 2 liên kết, một để khởi chạy thiết bị đầu cuối và một để rẽ nhánh một cái mới.
Luca


4

Tất nhiên đó là một cách tiếp cận hiệu quả để sửa đổi cdhành vi của tôi, nhưng tôi muốn chỉ ra một giải pháp đơn giản hơn. Trong bash man (1) tôi thấy rằng nếu một tương tác thoát ra thì nó sẽ chạy ~/.bash_logoutnếu tồn tại. Vì vậy, thay vì lưu trữ đường dẫn tại mỗi lần gọi cdđường dẫn cuối cùng có thể được lưu ở lối ra.

Của tôi ~/.bash_logoutrất đơn giản:

echo $PWD >~/.lastdir

Và ở đâu đó trong tôi .bashrctôi đã đặt dòng này:

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

1
Chỉ cần lưu ý rằng .bash_logoutchỉ chạy khi login shellsthoát, không phải lúc nào cũng như vậy.
henfiber

1
Hoặc, lưu đường dẫn cuối cùng khi bashthoát bằng: trap "echo $PWD > ~/.lastdir" EXIT"
henfiber

@henfiber Cảm ơn ý kiến ​​của bạn! Tôi nghĩ trong trường hợp này shell là shell đăng nhập, vì vậy điều này sẽ hoạt động đúng. Mặt khác, trapcách tiếp cận cũng tốt, tôi thích nó!
TrueY

2

Tôi thường sử dụng nhiều cửa sổ đầu cuối cùng một lúc, mỗi cửa sổ có nhiều tab. Ví dụ: một cửa sổ cho các tab phát triển mã nguồn, một cửa sổ cho các tệp latex, một cửa sổ để thực thi và tạo tập lệnh R, v.v ... Trong một cửa sổ, tôi muốn một thiết bị đầu cuối được gắn thẻ mới thay đổi thành thư mục được sử dụng cuối cùng trong cửa sổ cụ thể đó (điều này đã từng hoạt động trong quá khứ, nhưng với phiên bản gnome mới, bằng cách nào đó nó không hoạt động). Các giải pháp bẩn sau đây hoạt động tốt cho tôi. Tôi đã đặt cái này vào .bashrc.

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

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

Điều này thật hoàn hảo ... wohoo! Cảm ơn. Tôi không biết nhiều về hack bash, nhưng người đàn ông tôi đã yêu nó ...
apil.tamang
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.