Các lệnh được thực thi từ vim không nhận dạng được bí danh lệnh bash


96

Tôi sử dụng bash trên mac và một trong những bí danh như thế này

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

Tuy nhiên khi tôi làm

 :! gitlog

tôi có

/bin/bash: gitlog: command not found 

Tôi biết mình có thể thêm các bí danh như thế này trong .gitconfig của mình

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

Tuy nhiên, tôi không muốn thêm tất cả các bí danh bash của mình vào .gitconfig. Đó không phải là KHÔ.

Có giải pháp nào tốt hơn không?


Nếu bí danh nằm trong .gitconfig, thì bạn sẽ không cần phải lặp lại chúng trong bí danh Bash của mình và mọi thứ sử dụng git sẽ biết chúng, thay vì chỉ Bash. Vì vậy, KHÔ thật đáng ngưỡng mộ, nhưng cũng có SPOT (Điểm chân lý duy nhất), và việc đặt SPOT của bạn ở đúng vị trí có nghĩa là KHÔ cũng dễ dàng hơn.
Jonathan Leffler


Câu trả lời:


113

Bash không tải .bashrc của bạn trừ khi nó tương tác. Sử dụng

:set shellcmdflag=-ic

để làm cho trình :!bao của Vim hoạt động giống như dấu nhắc lệnh của bạn.


6
chỉnh sửa tệp .vimrc của bạn (vim ~ / .vimrc) và đặt nó vào một dòng ở đó (không có dấu :)
xiên vào

9
Điều này là tốt nhưng tôi đang gặp vấn đề - nếu tôi bật chế độ tương tác (cờ i), thì tôi có thể thực hiện các lệnh shell bí danh của mình tốt, nhưng ngay sau khi các lệnh được thực thi xong, vim sẽ thoát ra, điều không mong muốn. ! Ex, tôi đã cố gắng thực hiện: ls với shellcmdflag = ic: [4] + Stopped vi ~ / vimrc
ashgromnies

6
@Kevin: không có cách nào để có được hành vi bình thường của viw với bash tương tác? (thực hiện lệnh, chờ đợi cho một phím bất kỳ, trở về với vim)
Mayeu

7
Đối với tôi, có lệnh trong tiềm vimrc đến suspended (tty output)Khi tôi sử dụnggit commit
has2k1

27
Việc bảo Vim luôn sử dụng shell tương tác có thể tạo ra vấn đề. Giải pháp tốt hơn là tìm ra những gì trong cấu hình bash của bạn thiết lập bí danh và cách bạn có thể di chuyển bí danh đó đến một nơi được tải ngay cả trong các trình bao không tương tác. Ví dụ: zshell chỉ tải ~/.zshrccho các trình bao tương tác, nhưng nó tải ~/.zshenvcho tất cả các trình bao, vì vậy tôi đã chuyển thiết lập bí danh của mình ở đó và hiện nó hoạt động từ bên trong Vim. Xem man zsh(hoặc các trang người dùng của shell của bạn) để biết thêm.
Nathan Long

83

Tôi biết câu hỏi này trước đây đã được "trả lời", nhưng tôi có một vấn đề với câu trả lời. Vỏ không cần phải được đặt thành tương tác trong Vim. Xem chủ đề này để biết câu trả lời thay thế mà không cần phải thoát khỏi trình bao tương tác.

Nếu bạn muốn shell không tương tác (như mặc định) nhưng mở rộng bí danh bash, hãy đặt các định nghĩa bí danh của bạn vào một tệp, ví dụ: .bash_aliases và bật rõ ràng mở rộng bí danh trong tệp này:

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

Sau đó, thêm tệp này vào .vimrc của bạn để tệp bí danh thực sự được đọc mỗi khi bạn chạy lệnh shell từ bên trong vim:

let $BASH_ENV = "~/.bash_aliases"

Giải pháp này được đề xuất bởi "Jakob". Xem liên kết bên dưới để biết bản gốc. Tôi đã thử nghiệm điều này trên Mac OS X 10.9 và nó hoạt động hoàn hảo!

vim - không nhận ra bí danh khi ở chế độ tương tác?


7
Giải pháp tốt nhất cho đến nay. Cá nhân tôi đặt $BASH_ENVvar trong của tôi .bashrc(trước khi kiểm tra bất kỳ chế độ tương tác tùy chỉnh nào), vì vậy tôi có thể sử dụng tất cả các bí danh của mình trên các ứng dụng.
el.atomo

2
Đây có lẽ là giải pháp tốt nhất trên trang này vì phạm vi thay đổi sẽ được giới hạn trong Vim. Người ta thậm chí có thể đi xa hơn let $BASH_ENV="~/.vim/vim_bash", và điều này sẽ được sử dụng cho tất cả các lệnh :!gọi trong Vim.
Teeeeeeeeeeeeeeeeeeeeeeeeeeeej

Thật không may, điều này không hoạt động trong trình bao mặc định của macOS 10.15.2, zsh.
Ben Quigley

8

Lưu ý rằng tùy thuộc vào cách cấu hình tệp dotfiles bash của bạn, bạn có thể muốn sử dụng tùy chọn -l thay vì -i. Thao tác này sẽ khởi chạy trình bao dưới dạng trình bao đăng nhập.


4
dreftymac viết: "Để có được điều này để làm việc đối với tôi, nó là cần thiết để làm tùy chọn -lic, nếu không vim trở 'command not found"
dreftymac

8

Tôi biết nó có thể là một câu hỏi cũ, tuy nhiên không có câu trả lời nào ở trên phù hợp với tôi như mong muốn. Vì vậy, đối với những người đến đây từ googling và người dùng zsh (oh-my-):

Giải pháp của tôi cho vấn đề này chỉ đơn giản là sao chép .zshrc sang .zshenv - theo http://zsh.sourceforge.net/Intro/intro_3.html :

`.zshenv 'có nguồn gốc trên tất cả các lệnh gọi của shell, trừ khi tùy chọn -f được đặt. Nó phải chứa các lệnh để đặt đường dẫn tìm kiếm lệnh, cùng với các biến môi trường quan trọng khác. `.zshenv 'không được chứa các lệnh tạo ra đầu ra hoặc giả sử trình bao được gắn với một tty.

Vì vậy, $ cp ~/.zshrc ~/.zshenvsẽ làm điều.


Cảm ơn vì điều này! Chỉ muốn lưu ý rằng nếu bạn có bí danh shell của mình trong một tệp, bạn có thể chỉ cần nguồn chúng trong .zshenv. Một cái gì đó như: . $HOME/.aliases
scifisamurai,

2

Tôi không cảm thấy quá thoải mái với việc thiết lập tùy chọn -i, vì nó có tác động khá lớn và tôi đang sử dụng shell thường xuyên từ vim. Thay vào đó, những gì tôi muốn làm là:!bash -c ". ~/.alias; gitlog"


Đây có vẻ như là giải pháp tốt nhất, nhưng nó không hoạt động với tôi. Nó vẫn thông báo không tìm thấy lệnh
vẫn_dreaming_1
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.