ฉันจะเปิดเทอร์มินัลใหม่ในไดเรกทอรีเดียวกันของสิ่งที่ใช้ล่าสุดจาก keybind จัดการหน้าต่างได้อย่างไร


25

ฉันใช้ตัวจัดการหน้าต่างเรียงต่อกันและฉันเปลี่ยนจากgnome-terminalแท็บหลายแท็บเป็นหลายurxvtอินสแตนซ์ที่จัดการโดยตัวจัดการหน้าต่าง หนึ่งในคุณสมบัติที่ฉันพลาดคือความสามารถในการเปิดเทอร์มินัลใหม่ซึ่งเป็นค่าเริ่มต้นไปยังไดเรกทอรีการทำงานของอันสุดท้าย

กล่าวโดยย่อ: ฉันต้องการวิธีในการเปิด urxvt ใหม่ (ทุบตี) ที่เป็นค่าเริ่มต้นที่ $ PWD ของรายการที่ใช้ล่าสุด

ทางออกเดียวที่อยู่ในใจของฉันคือการบันทึกเส้นทางปัจจุบันในทุก ๆcdสิ่ง:

echo $PWD > ~/.last_dir

และกู้คืนพา ธ บนเทอร์มินัลใหม่ด้วยวิธีนี้:

cd `cat ~/.last_dir`

ฉันสามารถสั่งคำสั่งที่สองได้.bashrcแต่ฉันไม่รู้วิธีเรียกใช้คำสั่งแรกในทุกการเปลี่ยนแปลงของไดเรกทอรี :)

ยินดีต้อนรับทางออกที่ง่ายกว่าที่ไม่เกี่ยวข้องscreenหรือtmuxการใช้งาน


คุณใช้tabbedส่วนขยายของ "" perl urxvtหรือไม่?
rozcietrzewiacz

ไม่มีแท็บฉันใช้เทอร์มินัลใหม่ที่จัดการโดย WM
Luca

คำตอบ:


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. ในการกำหนดเองสคริปต์ขยาย Perlrxvtสำหรับ ฉันไม่เคยสร้างด้วยตัวเอง แต่คุณสามารถหาตัวอย่างได้สองสามอย่างบนเว็บ


PROMPT_COMMAND นั่นคือสิ่งที่ฉันกำลังมองหา ฉันจะลองใช้วิธีนี้โดยหวังว่าจะไม่มีผลกับการแสดง
Luca

มันเป็นวิธีที่ค่อนข้างหยาบตรงไปตรงมา โดยส่วนตัวแล้วฉันชอบทางออกของไมเคิลดีที่สุด :)
rozcietrzewiacz

1
ฉันชอบวิธีการขยาย perl ถ้ามันต้องทำงานนอกอาคาร; ดูเหมือนว่าจะสะอาดกว่าการแฮ็กข้อมูลบางอย่างซึ่งเป็น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_cdคุณสมบัติของ zsh ปรากฎว่าเราสามารถใช้เบ็ดที่ zsh มอบให้: gist.github.com/jonleighton/1f0b96b49247a07dbaa30fbbe70b34f7
jonleighton

12

นี่มันช่างน่ารำคาญจริง ๆ หากคุณเรียกใช้urxvtจากภายในurxvtหน้าต่างที่มีอยู่ของคุณหน้าต่างใหม่จะอยู่ในไดเรกทอรีเดียวกัน ฉันใช้dupนามแฝงurxvt &ด้วยเหตุผลนี้ หากคุณต้องการมันถูกผูกไว้กับฮอตคุณสามารถใช้bindคำสั่งของทุบตี ตัวอย่างเช่นการผูกไว้กับF1:

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

ขอบคุณสำหรับทิป. ฉันรู้ว่ากระบวนการย่อยเทอร์มินัลรักษาสถานะ แต่ฉันไม่ทราบว่าคุณสามารถผูกคีย์เพื่อคำสั่งในการทุบตี ฉันต้องการทำเช่นนี้จาก WM เพื่อหลีกเลี่ยงการมุ่งเน้นไปที่สถานี
Luca

ฉันชอบมัน. ไม่มีการเขียนดิสก์และการดำเนินการเพียงอย่างเดียวจะเกิดขึ้นเมื่อคุณกำลังจะเปิดเทอร์มินัลใหม่
rozcietrzewiacz

สิ่งเดียวที่ฉันเปลี่ยนคือการใช้( urxvt & ) &>/dev/nullแทนที่จะเป็นแบ็คกราวน์
rozcietrzewiacz

โซลูชันนี้ยอดเยี่ยมและมีความยืดหยุ่นมากกว่า แต่ฉันไม่ชอบที่จะใช้ 2 การเชื่อมโยงหนึ่งเพื่อเปิดใช้งานเทอร์มินัลและอีกหนึ่งเพื่อแยกใหม่
Luca

4

เพียงเพิ่ม. /etc/profile.d/vte.shของคุณ~/.bashrcเพื่อรับคุณสมบัติเดียวกัน


ทำงานนี้อย่างไรรบกวน -1 นี่ทำไม
Abdillah

ใช้งานได้และดูเหมือนว่าจะเป็นโซลูชันที่ต้องการบน launchpad / ของ devs-gnome-terminal: bugs.launchpad.net/ubuntu/+source/gnome-terminal/+bug/1132700
Ajax

4

แน่นอนว่ามันเป็นวิธีการทำงานในการปรับเปลี่ยนcdพฤติกรรม แต่ฉันต้องการแสดงวิธีแก้ปัญหาที่ง่ายขึ้น ในคนทุบตี (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วิธีการก็ดีฉันชอบ!
TrueY

2

บ่อยครั้งที่ฉันใช้หน้าต่างเทอร์มินัลหลายเครื่องพร้อมกันแต่ละอันมีหลายแท็บ ตัวอย่างเช่น: หนึ่งหน้าต่างสำหรับแท็บการพัฒนาซอร์สโค้ด, หนึ่งหน้าต่างสำหรับไฟล์ลาเท็กซ์, หนึ่งหน้าต่างสำหรับการประมวลผล R และสคริปต์, ภายในหน้าต่างเดียว, ฉันต้องการให้เทอร์มินัลแบบแท็บใหม่เปลี่ยนเป็นไดเรกทอรีที่ใช้ล่าสุดในหน้าต่างนั้น ๆ (สิ่งนี้เคยทำงานในอดีต แต่ด้วยคำพังเพยรุ่นใหม่ไม่เช่นนั้น) โซลูชันที่สกปรกต่อไปนี้ใช้ได้ดีสำหรับฉัน ฉันได้ใส่สิ่งนี้ใน. bashrc

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

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

นี่มันสมบูรณ์แบบ ... ว้าว! ขอบคุณ ฉันไม่รู้มากเกี่ยวกับการแฮ็กทุบตี แต่คนที่ฉันรักมันอยู่แล้ว ...
apil.tamang
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.