พารามิเตอร์สุดท้ายของคำสั่งสุดท้ายใน bash ในโหมด vi


19

ฉันเชื่อมั่น (มากกว่าที่ Stack Overflow) เพื่อใช้ทุบตีรักของฉันในโหมด vi จนถึงตอนนี้ฉันก็คุ้นเคยกับมันค่อนข้างดีและฉันก็ชอบ

อย่างไรก็ตามฉันคิดถึงคุณสมบัติหนึ่งอย่างเดียว: ในโหมด emacs คุณสามารถป้อนพารามิเตอร์สุดท้ายของคำสั่งก่อนหน้าโดยกด "ESC" (นั่นคือกดหลบหนีตามด้วย.)

มีการโยงดีฟอลต์เพื่อแทรกพารามิเตอร์สุดท้ายในโหมด vi หรือไม่? ฉันหามันไม่เจอและฉันคิดถึงคำสั่งนี้จริงๆ ...

คำตอบ:


9

ไม่มีค่าเริ่มต้น การเชื่อมโยงสำหรับ 'yank-last-arg' (ตามที่ระบุโดย 'bind -p') จะหายไปเมื่อคุณเปลี่ยนไปใช้โหมด vi

bind '"\e."':yank-last-arg

จะให้ผลผูกพันเดิมกับคุณ (หรือเลือกอย่างอื่น)


1
โคลนสำหรับ zshbindkey "\e." insert-last-word
jhvaras

ฉันใช้ zsh มาหลายปีและทุกครั้งที่ฉันถูกบังคับให้ใช้ bash (เช่นบนเซิร์ฟเวอร์ในที่ทำงาน) ฉันลืมไปเรื่อย ๆ ว่าฉันไม่เคยคิดเลยว่าจะตั้งมันไว้ใน bash ได้อย่างไร ไม่อีกแล้ว! สิ่งนี้ประกอบกับhistory-search-backwardsมีค่าสำหรับผู้ใช้บรรทัดคำสั่งที่ร้ายแรง
Sridhar Sarnobat

11

มี (vi-yank-arg) โดยค่าเริ่มต้นจะแมปกับ "_" ควรทำสิ่งที่คุณต้องการ (ในโหมดคำสั่ง)


+1 ฉันไม่แน่ใจว่าทำไมคำตอบนี้ไม่ได้รับการยอมรับ
Sathyam

7

ไม่เหมือนกัน!$ทุกประการแต่ในโหมดใดโหมดหนึ่งคุณสามารถพิมพ์ได้และจะถูกแทนที่ด้วยคำสุดท้ายของคำสั่งก่อนหน้า ค้นหาสิ่งต่างๆมากขึ้นในคู่มือการใช้งาน


ใกล้พอที่จะรับการโหวต แต่ไม่เหมือนกัน ... ฉันพลาดความเป็นไปได้ที่จะแก้ไขบรรทัดก่อนดำเนินการ แต่ขอบคุณมาก!
Mo.

5

~ / .inputrcไฟล์สามารถกำหนดค่าคีย์แผนที่ (คุณสามารถสร้างได้โดยคู่มือถ้ามันไม่สามารถพบได้) เพิ่มคำสั่งต่อไปนี้ลงใน~ / .inputrc :

"\e.": yank-last-arg
"\e_": yank-last-arg

~ / .inputrc ของฉันคือ:

set completion-ignore-case on
set show-all-if-ambiguous on
set show-all-if-unmodified on

set editing-mode vi
set keymap vi-insert

"\C-p": previous-history
"\C-n": next-history
"\C-a.":beginning-of-line
"\C-e.":end-of-line

"\e.": yank-last-arg
"\e_": yank-last-arg

คุณสามารถค้นหารายละเอียดเกี่ยวกับReadLineและbind -pนี่: http://linux.about.com/library/cmd/blcmdl3_readline.htm

และข้อมูลบางอย่างเกี่ยวกับVi keyblindings ใน bashและReadline VI Cheat Sheet Cheat Sheet


3

ใน. bashrc ของคุณเพิ่มเหล่านี้:

set -o vi
bind -m vi-command ".":insert-last-argument
bind -m vi-insert "\C-l.":clear-screen
bind -m vi-insert "\C-a.":beginning-of-line
bind -m vi-insert "\C-e.":end-of-line
bind -m vi-insert "\C-w.":backward-kill-word

สิ่งเหล่านี้จะคืนค่าการทำงานเริ่มต้นของ ESC-dot ไม่เพียง แต่จะใช้ Ctrl-A, Ctrl-E, Ctrl-W และ Ctrl-L ดังนั้นคุณสามารถเพลิดเพลินไปกับโหมด bash vi-normal และยังคงใช้ทางลัดที่คุณรู้จักและชื่นชอบ หากคุณต้องการการกระทำเพิ่มเติมเพียงทำเครื่องหมายที่ "man bash" เพื่อค้นหาชื่อของการดำเนินการ readline ที่คุณต้องการ (เช่น "clear-screen", "end-of-line" ฯลฯ )


0

คุณสามารถใช้$_เพื่ออ้างถึงอาร์กิวเมนต์สุดท้ายของคำสั่งก่อนหน้า

ข้อเสียคือ:

  1. คุณไม่สามารถตรวจสอบก่อนกด Enter ว่าสิ่งที่แทรกไว้เป็นสิ่งที่คุณต้องการแทรก

  2. หากคุณใช้ PROMPT_COMMAND หรือกับดัก DEBUG (ฉันไม่แน่ใจว่าสาเหตุของปัญหานั้นคืออะไรฉันมีทั้งใน. bashrc ของฉัน) เพื่อทำสิ่งแฟนซีเช่นใส่คำสั่ง running ลงในชื่อ xterm มันจะอุด$_ตัน

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