วิธีการขยายนามแฝงแบบอินไลน์ในทุบตี?


84

มีวิธีในการขยายชื่อแทนแบบอินไลน์ในทุบตีหรือไม่?

$bash>alias ll='ls -l '
$bash>ll<tab>
$bash>ls -l 

คำตอบ:


107

คุณสามารถกดCtrl- Alt- eเพื่อดำเนินการฟังก์ชั่น readline shell-expand-lineซึ่งจะทำนามแฝงประวัติและการขยายคำ โปรดทราบว่าบนแป้นพิมพ์บางอย่างไม่ได้Meta Altคุณอาจต้องกดEscแล้วCtrl-e

ฟังก์ชั่นalias-expand-lineและhistory-and-alias-expand-lineจะไม่ผูกพันตามค่าเริ่มต้น แต่คุณสามารถผูกพวกเขาโดยการเพิ่มบรรทัดคล้ายกับต่อไปที่คุณ~/.inputrcไฟล์

"\e\C-l": alias-expand-line

ซึ่งจะทำให้Ctrl- Alt- l(ตัวพิมพ์เล็ก "ell") ดำเนินการขยายนามแฝงเท่านั้น


เราสามารถแมปการขยายชื่อแทนไปยัง <tab> โดยไม่กระทบต่อการทำ bash ให้สำเร็จหรือไม่?
asdfg

2
@asdfg: หากคุณทำเช่นนั้นจะเป็นการทำลายความสำเร็จอื่น ๆ มันอาจจะทำงาน (ยังไม่ทดลอง) เพื่อสร้างแผนที่ที่แสดงข้างต้นแล้วเพิ่มแผนที่เพิ่มเติมนี้เพื่อแทนที่หนึ่งที่มีอยู่สำหรับแท็บ: "\C-i": "\e\C-l\e\e"ซึ่งจะสร้างแมโครที่ดำเนินการทั้งในและalias-expand-line completeขึ้นอยู่กับการเชื่อมโยงจากคำตอบของฉันด้านบนและการเชื่อมโยงเริ่มต้นสำหรับ Esc-Esc ยังคงอยู่ คุณจะยังสามารถทำ Esc-Esc ได้หากคุณต้องการเริ่มต้นให้เสร็จสิ้น
Dennis Williamson

4
ใช้ESC C-eงานได้กับ Bash แต่C-x aทำงานเพื่อ Zsh ทดสอบด้วย OS X.
Blaz

หากคุณกำลังมองหาเพียง Ctrl + บางสิ่งบางอย่างที่บางสิ่งบางอย่างสามารถเป็น "x" Control-x: history-and-alias-expand-lineที่สำคัญคุณสามารถทำมันเช่นนี้ในบางระบบ:
igordcard

1
@ WeijunZhou: ขึ้นอยู่กับการจัดการหน้าต่างและการตั้งค่าแบบกำหนดเองใด ๆ ที่คุณมี ตัวอย่างเช่นสำหรับ Gnome ล็อคหน้าจอคือ Super + L
Dennis Williamson

2

นี่อาจเป็นวิธีที่ง่ายกว่ามากในการทำสิ่งที่คุณกำลังพยายาม ( bashรุ่น> = 4.2.29):

shopt -s direxpand
shopt -s expand_aliases

shopt's manหน้านี้: https://www.gnu.org/software/bash/manual/html_node/The-Shopt-Builtin.html


3
นี่เป็นสิ่งที่ผิด ตัวเลือกเชลล์ "direxpand" และ "expand_aliases" ไม่ได้ช่วยขยายชื่อแทนแบบอินไลน์ตามที่คำถามระบุ ฉันไม่ทราบว่าได้ใช้หมวก "direxpand" ... ? โดยค่าเริ่มต้น "expand_aliases" ถูกตั้งค่าไว้แล้ว หากคุณไม่ได้ตั้งค่าผลที่ได้คือโดยทั่วไปจะปิดใช้งานนามแฝงจากการทำงาน (พวกเขาจะไม่ขยายตัวก่อนที่จะตีความบรรทัดคำสั่ง) เช่นได้รับสมนาม alias ll='ls -lเชลล์จะตีความ 'll' เป็นคำสั่ง / ฟังก์ชัน 'll' ซึ่งน่าจะไม่มีอยู่
FooF

0

สิ่งนี้ใช้ไม่ได้ แต่ฉันคาดเดา / หวังว่าสิ่งนี้สามารถทำได้เพื่อทำสิ่งที่คุณต้องการทำ คุณจะต้องใช้สคริปต์เสร็จสมบูรณ์ของคุณเอง นี่คือวิธีที่คุณทำ:

_ll()
{
     COMPREPLY=(ls -l)
     #The next line does not work. I just hope there were a way to replace that word
     COMP_WORDS[COMP_CWORD-1]="ls -l"
}
complete -F _ll ll

ตอนนี้แหล่งที่มาเต็ม bash_completion ไฟล์ ( http://caliban.org/bash ) และวางสคริปต์ดังกล่าวข้างต้นในไฟล์ภายในไดเรกทอรี bash_completion.d ที่สคริปต์ที่คุณได้รับจากการอ้างอิง URL แจ้งให้เราทราบหากไม่ได้ผล

ขอบคุณ


0

สำหรับผู้ที่ติดตั้ง zsh กำลังมองหาวิธีแก้ปัญหาอย่างง่ายglobaliasอาจเป็นเพื่อนของคุณ

ขยายนิพจน์คำสั่งย่อยและชื่อแทนทั้งหมด (รวมถึงโกลบอล)

# .zsrc:
alias S="sudo systemctl"

$ S<space>
# expands to:
$ sudo systemctl

เพื่อติดตั้งเพียงเพิ่ม "globalias" ให้กับคุณรายการปลั๊กอิน. zshrc

plugins=(... globalias)

จากนั้นกดSPACEเพื่อเริ่มการขยายคำสั่งที่คุณเขียน

หากคุณต้องการแทรกช่องว่างโดยไม่ต้องขยายบรรทัดคำสั่งให้กด CTRL+SPACE

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