วิธีสร้างนามแฝง. 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.