ตรวจจับโดยอัตโนมัติเมื่อฉันพิมพ์“ vi” แต่หมายถึง“ cd”?


21

ประมาณ 5 ครั้งต่อวันฉันพิมพ์ "vi" เมื่อฉันหมายถึง "cd" และท้ายที่สุดเปิดไดเรกทอรีใน vi มันทำให้ฉันถั่ว ดูเหมือนว่าควรมีวิธีการตรวจสอบเมื่อฉันพิมพ์ใน "vi + directory" และเปลี่ยนเป็น "cd + directory" โดยอัตโนมัติ คิด?


1
ฉันให้ทางเลือกที่คุณอาจพบว่ามีการหยุดพักเช่นกัน ^^ (อันที่ให้คุณแก้ไขที่มาของปัญหาในขณะที่หลีกเลี่ยงการหงุดหงิดจนถึงตอนนี้ ^^)
Olivier Dulac


1
มันทำให้ฉันผิดหวังมากจนกระทั่งฉันค้นพบว่าคุณสามารถใช้ Enter และลูกศรเพื่อนำทางไปยังไฟล์ที่อยู่ในโฟลเดอร์ เมื่อคุณคลิก Enter ในขณะที่เปิดอยู่
nuoritoveri

1
ด้วยจำนวนแง่มุมเล็กน้อย: เปลี่ยนเป็น zsh ตั้งค่าเพื่อให้เมื่อคุณพิมพ์ชื่อไดเรกทอรีมันจะเปลี่ยนเป็นไดเรกทอรีนั้น ใช้นามแฝงต่อท้ายเพื่อให้เมื่อคุณพิมพ์ * .sh, * .c, * .config ให้เปิดไฟล์ที่เกี่ยวข้องในไฟล์ vi คำเตือนที่นี่เป็นที่แน่นอนว่าคุณอาจพบว่าตัวเองละเว้น "vi" หรือ "cd" ในเชลล์ที่ไม่คุ้นเคย
mkingston

3
มันเกิดขึ้นได้อย่างไร?
JFA

คำตอบ:


38

ด้วยสมมติฐานที่คุณโทรหาviด้วยไดเรกทอรีเป็นอาร์กิวเมนต์สุดท้าย:

vi() {
    if [[ -d ${!#} ]]; then
        cd "$@"
    else 
        command vi "$@"
    fi
}

2
@Alex ฉันเดาว่าทั้งสองนี้เหมาะสำหรับกรณีที่หายากที่คุณพิมพ์ "vi" ไม่ถูกต้องแทนที่จะเป็น "cd" ในขณะเดียวกันก็สอนให้คุณพิมพ์ "vi" ทุกครั้งในตอนนี้) [คือหวังว่าคุณจะไม่บ่อยนัก ต้องใช้เซิร์ฟเวอร์ / เครื่องอื่นซึ่งฟังก์ชั่นนั้นจะไม่ช่วยให้คุณประหยัด ... ] [+1 สำหรับคำตอบนั้นแม้ว่ามันเป็นสิ่งที่ฉันต้องการจะตอบเช่นกันยกเว้นฉันแค่ทดสอบ "$ { 1} "[แล้ว cd" $ {1} "] แทน" $ {! #} "... ]
Olivier Dulac

5
@OlivierDulac ตกลงกัน - อันตรายในทำนองเดียวกันจะ aliasing rmไปrm -iซึ่งเป็นค่าเริ่มต้นในการกระจายจำนวนมาก โดยทั่วไปฉันคิดว่าวิธีที่ดีที่สุดในการแก้ปัญหาคือการแก้ปัญหาผู้ใช้แทนที่จะแก้ไขปัญหา
Chris Down

3
@OlivierDulac aliasing rmการrm -iอาจมีการบันทึกคุณปัญหาบางอย่างในอดีตที่ผ่านมา แต่อาจจะ (และอาจจะ) ให้คุณได้รับในปัญหามากในอนาคต ...
jlliagre

1
@ Alex ดีคุณไม่พูดviในคำถาม ...
คริสลง

2
@crisron: ${!#}อ้างอิงอาร์กิวเมนต์สุดท้ายโดยอ้อมและcommandจำเป็นเท่านั้นเพื่อหลีกเลี่ยงการเรียกใช้ฟังก์ชันซ้ำในอินสแตนซ์นี้
Chris Down

4

นอกเหนือจาก @ChrisDown คำตอบนี่เป็นอีกวิธีการหนึ่ง: เลี่ยงผ่านไดเรกทอรี

ด้วยวิธีนี้คุณสามารถ:

vi ./*

และมันจะเริ่มต้น vi บนไฟล์ทั้งหมดในไดเรกทอรีปัจจุบันแม้ว่าจะมีส่วนย่อยอยู่ก็ตามให้ข้ามส่วนย่อยเหล่านั้น

vi() {
  for arg do
    [ -d "$arg" ] || set -- "$@" "$arg"
    shift
  done
  [ "$#" -gt 0 ] && command vi "$@"
}

อันนี้เพิ่งทำ vi ในอาร์กิวเมนต์ใด ๆ ที่ไม่ใช่ไดเรกทอรี ... ดังนั้นมันจะไม่สอนให้คุณใช้ "vi" สำหรับ "cd";)

และจะไม่เรียก vi หากคุณเพิ่งทำ: vi somedirectory (เช่น mistyped vi แทนที่จะเป็น cd) แต่มันจะไม่ cd โดยอัตโนมัติดังนั้นคุณยังจำได้ว่าคุณต้องพิมพ์ cd ^^

ฉันใช้วิธี "เข้ากันได้" เพื่อเปลี่ยนรายการอาร์กิวเมนต์เพื่อให้สามารถพกพาไปยังหลาย ๆ แพลตฟอร์มได้


1
หมายเหตุ:: command somethingเริ่มคำสั่ง "บางอย่าง" (เช่นการเกิดขึ้นครั้งแรกของ "บางสิ่ง" ที่พบโดยใช้ $ PATH) แทนการใช้ฟังก์ชันนามแฝงหรือชื่อ "อะไร" \somethingจะข้ามนามแฝงเท่านั้น แต่จะยังคงฟังก์ชันหากมีอยู่ (และที่นี่นั่นหมายความว่าฟังก์ชั่น "vi" จะเรียกตัวเองและห่วง)
Olivier Dulac

@ChrisDown: เรากำลังพูดคุยช่วยเหลือกับผู้ใช้ซึ่งฉันหวังว่าจะไม่พยายามแฮ็คตัวเอง ^^ และ eval นั้นคือการตั้งค่าชุดอาร์กิวเมนต์ใหม่ (ชุด - ... ) ดังนั้นมันจึงอันตรายน้อยกว่าในตัวมันเอง
Olivier Dulac

@StephaneChazelas: ขอบคุณสำหรับการแก้ไข! ฉันพยายามเขียนแบบนั้น แต่ฉันกังวลเกี่ยวกับการวนซ้ำอย่างไม่สิ้นสุด [ฉันเชื่อว่าคุณจะไม่วนซ้ำ! 'for ARG' กำลังได้รับการประเมินก่อนที่การรักษาภายในจะเริ่มต้นดังนั้นรายการ "$ @" จะถูกบันทึกไว้และวนซ้ำและไม่เปลี่ยนแปลงแม้ว่าการรักษาภายในจะเปลี่ยน "$ @"?]
Olivier Dulac

1

ทางออกหนึ่งคือหยุดใช้cdทั้งหมด ใส่shopt -s autocdในของคุณ.bashrcหรือในของคุณsetopt autocd .zshrcจากนั้นเมื่อต้องการเปลี่ยนเป็นไดเร็กทอรีอื่นให้พิมพ์ชื่อไดเร็กทอรีโดยไม่มีคำสั่งใด ๆ

อย่าลืมพิมพ์viถ้าคุณต้องการแก้ไขไฟล์

หากคุณต้องการให้คำสั่งเดียวเปลี่ยนไดเรกทอรีหรือแก้ไขไฟล์คุณสามารถทำให้เป็นฟังก์ชันได้:

vi () {
  if [ $# -eq 1 ] && [ -d "$1" ]; then
    cd -- "$1"
  else
    command vi "$@"
  fi
}

-6

ใช้คุณสมบัตินามแฝงใน Unix เมื่อคุณนามแฝง cd ถึง vi ปัญหาจะได้รับการแก้ไข


5
... นี่จะหมายความว่าเราไม่สามารถใช้งานได้viหากไม่มีการแทนที่นามแฝงด้วยตนเองซึ่งดูเหมือนจะไม่เป็นที่ต้องการอย่างมาก
Chris Down

3
คำตอบนี้ตรงข้ามเป็นเรื่องเล็กน้อย มันจะตอบคำถามเดิมเนื่องจาก OP ไม่ได้ระบุว่าพวกเขาต้องการ vi ในไฟล์ คำตอบแม้ว่าจะค่อนข้างสนุก แต่ก็ไม่มีประโยชน์แน่นอน
gerrit

1
@ChrisDown หรือนี่จะสอนให้คุณใช้สิ่งที่ถูกต้องvimแทน
Kevin

@Kevin vim นั้นไม่ "เหมาะสม" มากกว่า vi - ในหลาย ๆ ระบบ vi คือทั้งหมดที่มีอยู่
คริสลง

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