เสร็จสิ้นคำบนหน้าจอเช่นเดียวกับใน VIM (Bash หรือ Tmux)


10

ฉันจะกำหนดค่า Bash, Zsh หรือ Tmux เพื่อทำให้ตัวระบุที่ตรงกันล่าสุดบนหน้าจอสมบูรณ์ได้อย่างไร พิจารณาสถานการณ์สมมติทั่วไปนี้:

$ git fetch
remote: Counting objects: 16, done.
remote: Compressing objects: 100% (9/9), done.
remote: Total 9 (delta 4), reused 0 (delta 0)
Unpacking objects: 100% (9/9), done.
From /opt/git/thunder
 * [new branch]      issue540   -> origin/issue547314
   e9204cf..4d42c3f  v2.1       -> origin/v2.1

ฉันจะทำให้ Bash / Zsh / Tmux ให้เสร็จสมบูรณ์issue547บน CLI ได้อย่างไร? เมื่อฉันกดTabหลังจาก$ git checkout isGit เป็นประโยชน์ที่จะเสร็จสมบูรณ์issueแต่ฉันจะต้องกรอกตัวเลขด้วยตัวเองเพราะทุกตัวเลขก่อนหน้านี้ในความเป็นจริงการแข่งขันที่มีอยู่สาขา Git

ใน VIM การกดCtrl+ Pสำหรับ omnicomplete จะเสร็จสิ้นเหมือนกับการแข่งขันก่อนหน้าดังนั้นในกรณีนี้issue547314จะเสร็จสมบูรณ์ ฉันจะรับพฤติกรรมนี้ใน Bash, Zsh หรือ Tmux ได้อย่างไร?

ปัจจุบันฉันใช้ Bash 4.2 และ Tmux 1.10 บนเซิร์ฟเวอร์ Ubuntu (ปกติคือ 12.04 LTS) ฉันสามารถอัพเดทเป็น Ubuntu Server LTS ล่าสุด (14.04) ได้ถ้าต้องการ

แก้ไข : ฉันจะไม่รังเกียจวิธีแก้ปัญหาใด ๆ ที่ใช้ Bash, Zsh หรือ Tmux ตราบใดที่มันใช้งานได้ไม่ยาก ดังนั้นTabหรือCtrl+ Pหรือทางลัดอื่น ๆ จะดี แต่ไม่ได้Alt+ Meta+ Super+ +Shiftא


ค่อนข้างแน่ใจว่านี่จะเป็นการแก้ไขแหล่งทุบตีที่ค่อนข้างใหญ่
Kevin

@ เควิน: ฉันคิดมาก แต่หวังว่าทั้ง zsh ที่น่าทึ่งสามารถจัดการได้หรือบางที tmux
dotancohen

คำตอบ:


4

ฉันคิดว่าคุณสมบัติที่ OP กำลังมองหาเรียกว่าdabbrev-expandใน Emacs โลก:

ขยายคำในบัฟเฟอร์ก่อนที่จะชี้เป็นตัวย่อแบบไดนามิกโดยการค้นหาในบัฟเฟอร์สำหรับคำที่ขึ้นต้นด้วยตัวย่อนั้น (v-expand)

xtermนอกจากนี้ยังมีdabbrev-expandคุณสมบัติ แต่มันเป็นบิตสมาร์ทน้อยกว่า Emacs คู่ แต่ก็มากxtermประโยชน์กับฉันและเป็นหนึ่งในเหตุผลที่ผมเปลี่ยนไป ภายในxtermหน้าต่างหนึ่งสามารถใช้การเชื่อมโยงคีย์แบบกำหนดเองที่ระบุใน~/.Xresourcesการเรียกใช้dabbrev-expandบนสตริงที่กำหนด ตัวอย่างเช่นฉันมีรายการต่อไปนี้ในของฉัน~/.Xresources(ฉันใช้uxtermxterm รุ่น Unicode):

UXTerm*VT100.Translations: #override \n\
     Meta <Key>/:dabbrev-expand() \n\

ภายในxtermหน้าต่างที่ฉันสามารถใช้M-/( ALT + /) dabbrev-expandจะก่อให้เกิด xtermจะมองหาสตริงทั้งหมดที่ปรากฏบนหน้าจอที่เริ่มต้นด้วยตัวอักษรที่ฉันพิมพ์ ตัวอย่าง:

$ echo a_very_long_string bye by
$ a_v

ถ้าผมกดM-/ตอนนี้xtermจะขยายตัวไปa_v a_very_long_stringน่าเสียดายที่ฉันบอกว่าxtermมันไม่ฉลาดนักและdabbrev-expandฟีเจอร์ของมันจะใช้ได้กับสตริงเต็มเท่านั้น ดังนั้นในกรณีของคุณisจะขยายออกไปissue540และไม่ใช่issue547314เพราะissue547314เป็นส่วนหนึ่งของorigin/issue547314(คิดเกี่ยวกับมัน\bในการแสดงออกปกติมันค่อนข้างคล้ายกันแม้ว่าเครื่องมือการแสดงออกปกติส่วนใหญ่จะจับทั้งสองเกิดขึ้นของissueสตริงใน\bissue.+\b) แต่คุณสามารถพิมพ์orแล้ว M-/pres xtermก่อนจะขยายorไปorigin/v2.1นี้ไม่ได้เป็นสิ่งที่เราต้องการเพื่อให้กดM-/อีกครั้งและจะขยายไปยังxterm origin/issue547314ตอนนี้ถ้าคุณใช้ทุบตีคุณสามารถทำM-b,C-wและC-eลบorigin/ส่วนหนึ่งออก สรุปแล้วdabbrev-expandข้างในxtermไม่ดีเท่าใน Emacs (และฉันเรียกว่า Vim) แต่ก็ยังเร็วกว่าการเขียนสตริงยาว ๆ ด้วยมือและพิมพ์ได้ง่ายกว่า และในกรณีส่วนใหญ่มันจะขยายโดยตรงกับสายที่ต้องการโดยไม่จำเป็นต้องลบส่วนที่ซ้ำซ้อน คุณเพียงแค่ต้องคุ้นเคยกับมัน - ดูที่สตริงที่คุณต้องการให้มีเคอร์เซอร์และดูว่ามันไม่ได้นำหน้าด้วยอย่างอื่นและถ้ามันเป็นส่วนที่พิมพ์ก่อนหน้านี้และลบออกหลังจากการขยายตัว

โปรดทราบxtermว่าไม่ได้รวบรวมdabbrev-expandคุณลักษณะตามค่าเริ่มต้นและคุณต้องเปิดใช้งานอย่างชัดเจน อย่างไรก็ตามรุ่นของที่xtermเก็บใน Ubuntu นั้นถูกคอมไพล์ด้วยdabbrev-expandและคุณสามารถใช้งานได้ทันที


ขอบคุณ Arkadiusz ดูเหมือนว่าจะใกล้เคียงกับสิ่งที่ฉันต้องการ โปรดทราบว่าฉันไม่สามารถใช้งานได้! บางทีอาจจะเป็นของฉันxtermและuxtermยังไม่ได้เรียบเรียงสำหรับ dabbrev ขยาย, -helpฉันสามารถหาเอ่ยถึงคุณลักษณะในไม่มี ฉันจะดูธงคอมไพล์ (เช่นเดียวกับvim --version) ได้อย่างไร โปรดทราบว่าฉันยังลองบรรทัดการกำหนดค่า~/.XresourcesตามMeta <KeyPress> /: dabbrev-expand() \n\ ที่พบที่นี่แต่ก็ไม่ได้ช่วยเช่นกัน
dotancohen

อาจเป็นเพราะ xterm ของคุณได้รับการรวบรวมโดยไม่มีการขยาย dabbrev คุณติดตั้ง xterm ได้อย่างไร? หลังจากแก้ไข ~ / .Xresources ให้ทำxrdb -merge .Xresourcesใน xterm
Arkadiusz Drabczyk

แน่นอนที่สุดแล้วนั่นคือ Arkadiusz! ขอบคุณ!
dotancohen

ฉันจะถามคำถามอีกสองสามชั่วโมงจนกว่าจะถึงช่วงเวลาสิ้นสุดเงินรางวัล แต่ฉันค่อนข้างแน่ใจว่าคุณเป็นคนเข้ารองเท้า ปัญหาเดียวคือข้อกำหนดสำหรับ xterm ซึ่งแย่มาก! แต่ตอนนี้ที่ฉันรู้ว่าชื่อที่เหมาะสมสำหรับคุณลักษณะที่ฉันสามารถ google มันสำหรับโปรแกรมอื่นขอบคุณ!
dotancohen

ขอบคุณ Arkadiusz! แม้ว่าฉันจะไม่ใช้โซลูชัน xterm แต่คุณได้ชี้ให้ฉันอย่างถูกต้องแล้ว เห็นได้ชัดzshว่ามีสิ่งอำนวยความสะดวกนี้
dotancohen

1

Bash เป็นสิ่งอำนวยความสะดวกที่คล้ายกันที่เรียกว่า bash completetion คุณสามารถใช้มันได้โดยกดปุ่มTabเมื่อมีการขัดแย้งกับคำสั่งเมื่อคุณพิมพ์

ตัวอย่าง

หากฉันเริ่มต้นด้วยการพิมพ์lsแล้วกดปุ่มTabสองครั้งคุณจะได้รับ Bash เพื่อแสดงรายการไฟล์ที่ตรงกัน (และสวิตช์บรรทัดคำสั่ง) ให้กับคำสั่งใดก็ตามที่คุณพยายามใช้:

$ ls <---- hit Tab x 2
Display all 232 possibilities? (y or n)

และนี่คือตัวอย่างของสวิตช์

$ ls -- <---- hit Tab x 2
--all                 --format=                                  --quote-name
--almost-all          --group-directories-first
....
....

ติดตั้ง?

การติดตั้งของฉันได้รวมกฎสำหรับgit:

/etc/bash_completion.d/git

การติดตั้งไฟล์นี้ทำเมื่อฉันติดตั้งgitแพ็คเกจ ฉันอยู่ใน Fedora 19 แต่ distros อื่น ๆ ควรทำสิ่งนี้เช่นกัน

$ rpm -qf /etc/bash_completion.d/git
git-1.8.3.1-1.fc19.x86_64

ดูที่ไฟล์ rules มันอธิบายว่ามันจะช่วยให้การเติมข้อความอัตโนมัติในสถานการณ์ต่อไปนี้:

# The contained completion routines provide support for completing:
#
#    *) local and remote branch names
#    *) local and remote tag names
#    *) .git/remotes file names
#    *) git 'subcommands'
#    *) tree paths within 'ref:path/to/file' expressions
#    *) file paths within current working directory and index
#    *) common --long-options
#

ดังนั้นควร "ทำงาน" สำหรับคุณ


2
Bash เสร็จและทำงาน Git เสร็จแล้ว (อย่างที่ฉันพูดถึงใน OP) การเปลี่ยนแปลงที่ฉันต้องการจะดำเนินการคือการทำให้แท็บแรกเสร็จสมบูรณ์กดค่าทางกฎหมายล่าสุดที่แสดงบนหน้าจอ นี่เป็นวิธีที่ VIM Omnicompletion ทำงาน
dotancohen

@dotancohen - ฉันไม่เห็นว่าตอนนี้จะเป็นไปได้เกินกว่าที่ฉันได้อธิบายไว้
slm

1

คุณสามารถทำสิ่งนี้กับextrakto :

  • กด tmux prefix + tabเพื่อเริ่มต้น extrakto
  • เลือนหาข้อความ / เส้นทาง / url
  • กด
    • tab เพื่อแทรกลงในบานหน้าต่างปัจจุบัน
    • enter เพื่อคัดลอกไปยังคลิปบอร์ด
    • ctrl-o เพื่อเปิดเส้นทาง / url หรือ
    • ctrl-e เพื่อแก้ไขด้วย $EDITOR
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.