วิธีสร้างนามแฝง. bashrc พร้อมใช้งานภายในคำสั่ง vim shell (:! …)


99

ฉันใช้ bash บน mac และหนึ่งในนามแฝงเป็นแบบนี้

alias gitlog='git --no-pager  log -n 20 --pretty=format:%h%x09%an%x09%ad%x09%s --date=short --no-merges'

อย่างไรก็ตามเมื่อฉันทำ

 :! gitlog

ฉันเข้าใจ

/bin/bash: gitlog: command not found 

ฉันรู้ว่าฉันสามารถเพิ่มนามแฝงแบบนี้ใน. gitconfig ของฉันได้

[alias]
    co = checkout
    st = status
    ci = commit
    br = branch
    df = diff

อย่างไรก็ตามฉันไม่ต้องการเพิ่มนามแฝง bash ทั้งหมดของฉันใน. gitconfig นั่นคือไม่แห้ง

มีทางออกที่ดีกว่านี้หรือไม่?


หากนามแฝงอยู่ใน. gitconfig คุณก็ไม่จำเป็นต้องทำซ้ำในนามแฝง Bash ของคุณและทุกสิ่งที่ใช้ git จะรู้จักพวกเขาแทนที่จะเป็น Bash ดังนั้น DRY จึงเป็นสิ่งที่น่าชื่นชม แต่ก็มี SPOT (Single Point Of Truth) ด้วยและการทำให้ SPOT ของคุณถูกที่หมายถึงการทำให้ DRY ง่ายขึ้นด้วย
Jonathan Leffler


ข้ามไซต์ที่เป็นไปได้ที่ซ้ำกัน: superuser.com/questions/47821/vim-ignores-aliases
Ciro Santilli 郝海东冠状病六四事件法轮功

คำตอบ:


116

Bash ไม่โหลดของคุณ.bashrcเว้นแต่จะมีการโต้ตอบ

เรียกใช้:set shellcmdflag=-icเพื่อตั้งค่าเป็นแบบโต้ตอบสำหรับเซสชันปัจจุบัน

หากต้องการทำให้การตั้งค่าเป็นแบบถาวรให้เพิ่มชุดset shellcmdflag=-icที่ท้าย.vimrcไฟล์ของคุณ

ใช้ปัง ( !) ก่อนส่งคำสั่งไปยังเชลล์ ตัวอย่างเช่น: :! cd folder/.


6
แก้ไขไฟล์. vimrc ของคุณ (vim ~ / .vimrc) และวางไว้ในบรรทัดที่นั่น (โดยไม่มี :)
skeept

9
นี่เป็นสิ่งที่ดี แต่ฉันมีปัญหา - ถ้าฉันเปิดใช้งานโหมดโต้ตอบ (แฟล็ก i) ฉันสามารถรันคำสั่งเชลล์นามแฝงของฉันได้ดี แต่ทันทีที่คำสั่งเสร็จสิ้นการเรียกใช้กลุ่มจะออกจากสิ่งที่ไม่พึงปรารถนา เช่นฉันลองทำ:! ls ด้วย shellcmdflag = -ic: [4] + หยุด vi ~ /
.vimrc

6
@ เควิน: ไม่มีทางที่จะรับพฤติกรรมปกติของ viw ด้วยการทุบตีโต้ตอบ? (ดำเนินการคำสั่งรอคีย์ใด ๆ กลับมาที่กลุ่ม)
Mayeu

7
สำหรับฉันการมีคำสั่งใน. vimrc นำไปสู่suspended (tty output)เมื่อฉันใช้git commit
has2k1

27
การบอกให้ Vim ใช้เชลล์แบบโต้ตอบเสมอสามารถสร้างปัญหาได้ ทางออกที่ดีกว่าคือการหาว่าอะไรในการกำหนดค่า bash ของคุณตั้งค่านามแฝงและวิธีที่คุณสามารถย้ายไปยังตำแหน่งที่โหลดได้แม้ในเชลล์ที่ไม่โต้ตอบ ตัวอย่างเช่น zshell จะโหลด~/.zshrcสำหรับเชลล์แบบโต้ตอบเท่านั้น แต่โหลดได้~/.zshenvสำหรับเชลล์ทั้งหมดดังนั้นฉันจึงย้ายการตั้งค่านามแฝงไปที่นั่นและตอนนี้ใช้งานได้จากภายใน Vim ดูman zsh(หรือหน้าคนของเชลล์) สำหรับข้อมูลเพิ่มเติม
Nathan Long

84

ฉันรู้ว่าคำถามนี้เคย "ตอบแล้ว" ก่อนหน้านี้แล้ว แต่ฉันมีปัญหากับคำตอบ เชลล์ไม่จำเป็นต้องตั้งค่าเป็นแบบโต้ตอบในกลุ่ม ดูหัวข้อนี้สำหรับคำตอบอื่นโดยไม่ต้องออกจากเชลล์แบบโต้ตอบ

หากคุณต้องการเชลล์ที่ไม่โต้ตอบ (เป็นค่าเริ่มต้น) แต่ขยายนามแฝง bash ให้ใส่คำจำกัดความนามแฝงของคุณในไฟล์เช่น. bash_aliases และเปิดใช้งานการขยายนามแฝงอย่างชัดเจนในไฟล์นี้:

shopt -s expand_aliases  
alias la='ls -la'

จากนั้นเพิ่มสิ่งนี้ลงใน. vimrc ของคุณเพื่อให้ไฟล์นามแฝงถูกอ่านทุกครั้งที่คุณรันคำสั่งเชลล์จากภายในกลุ่ม:

let $BASH_ENV = "~/.bash_aliases"

วิธีนี้แนะนำโดย "จาคอบ" ดูลิงค์ด้านล่างสำหรับต้นฉบับ ฉันทดสอบสิ่งนี้บน Mac OS X 10.9 และทำงานได้อย่างไม่มีที่ติ!

กลุ่ม - ไม่รู้จักนามแฝงเมื่ออยู่ในโหมดโต้ตอบ?


7
ทางออกที่ดีที่สุด โดยส่วนตัวฉันตั้งค่า$BASH_ENVvar ในของฉัน.bashrc(ก่อนการตรวจสอบโหมดโต้ตอบที่กำหนดเองใด ๆ ) ดังนั้นฉันจึงสามารถใช้นามแฝงทั้งหมดในแอปพลิเคชันได้
el.atomo

2
นี่อาจเป็นวิธีแก้ปัญหาที่ดีที่สุดในหน้านี้เนื่องจากขอบเขตของการเปลี่ยนแปลงจะ จำกัด อยู่ใน Vim หนึ่งสามารถไปได้ไกลกว่าlet $BASH_ENV="~/.vim/vim_bash"นี้และจะใช้สำหรับ:!การเรียกใช้ทั้งหมดภายใน Vim
Teeeeeeeeeeeeeeeeeeeeeeeeeeeeeej

สิ่งนี้ใช้ไม่ได้ในเชลล์เริ่มต้นของ macOS 10.15.2 zsh น่าเสียดาย
Ben Quigley

8

โปรดทราบว่าขึ้นอยู่กับการกำหนดค่า bash dotfiles ของคุณคุณอาจต้องการใช้ -l แทนตัวเลือก -i สิ่งนี้จะเปิดเชลล์เป็นเชลล์ล็อกอิน


4
dreftymac เขียนว่า: "เพื่อให้สิ่งนี้ใช้งานได้สำหรับฉันมันจำเป็นต้องใช้ตัวเลือก do -lic มิฉะนั้นกลุ่มจะส่งกลับ 'command not found'"
dreftymac

8

ฉันรู้ว่ามันอาจจะเป็นคำถามเก่า แต่คำตอบข้างต้นไม่ได้ผลสำหรับฉันอย่างที่ต้องการ ดังนั้นสำหรับผู้ที่มาที่นี่จาก googling และสำหรับผู้ใช้ zsh (oh-my-):

วิธีแก้ปัญหาของฉันก็แค่คัดลอก. zshrc เป็น. zshenv - ตามhttp://zsh.sourceforge.net/Intro/intro_3.html :

".zshenv 'มีที่มาจากการเรียกใช้เชลล์ทั้งหมดเว้นแต่จะตั้งค่าอ็อพชัน -f ควรมีคำสั่งเพื่อกำหนดเส้นทางการค้นหาคำสั่งรวมถึงตัวแปรสภาพแวดล้อมที่สำคัญอื่น ๆ ".zshenv 'ไม่ควรมีคำสั่งที่สร้างเอาต์พุตหรือถือว่าเชลล์แนบกับ tty

ดังนั้น$ cp ~/.zshrc ~/.zshenvจะทำสิ่งนั้น


ขอบคุณสำหรับสิ่งนี้! แค่อยากทราบว่าหากคุณมีเชลล์นามแฝงในไฟล์ที่คุณสามารถซอร์สได้ใน. zshenv สิ่งที่ชอบ: . $HOME/.aliases
scifisamurai

2

ฉันไม่รู้สึกสบายใจกับการตั้งค่าตัวเลือก -i มากนักเนื่องจากมันมีผลกระทบค่อนข้างมากและฉันใช้เชลล์จากกลุ่มบ่อยๆ สิ่งที่ฉันจะทำแทนก็คือ:!bash -c ". ~/.alias; gitlog"


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