2012-01-12 25 views
16

Câu hỏi tương tự như Commands executed from vim are not recognizing bash command aliases tuy nhiên giải pháp không hoạt động.vim - không nhận ra bí danh khi ở chế độ tương tác?

tôi thiết lập các biến trong tôi ~/vimrc:

set shellcmdflag=-ic 
set shell=/bin/bash\ -i 

và tôi có một bí danh trong tôi ~/.bash_aliases:

rgr() { if [ ! -z "$2" ]; then grep -rI --exclude=\*.svn\* "$1" * --include=$2 ; else grep -rI --exclude=*svn* "$1" * ; fi ; } 

mà hoạt động khi thực hiện từ dòng lệnh, nhưng khi tôi cố gắng gọi nó từ vim (:!rgr test), tôi nhận được thông báo lỗi và thoát vim:

bash: rgr: command not found 

[4]+ Stopped     vi ~/somefile 

Nếu tôi tắt chế độ tương tác, tôi chỉ nhận được thông báo "lệnh không tìm thấy" và vim không thoát.

Tôi làm cách nào để nhận dạng bí danh của mình? Tôi đã sao chép hành vi này trên cả OS X và Ubuntu.

+3

Worth lưu ý rằng 'rtr' là một hàm, không phải là một bí danh. – richo

+0

Khi bạn đặt 'set shell =/bin/bash \ -i' vào' ~/.vimrc' và mở 'vim', nó có giữ nguyên không? (': set shell' sẽ cho bạn biết bạn đang sử dụng shell nào). Có vẻ như bạn đang gọi nó bằng 'vi' (hoặc nó là một' vi' thực sự?), Có lẽ bạn cần sử dụng '~/.virc' để thay thế. – Kevin

+0

Kevin: Nó in ra "/ bin/bash -i" khi tôi làm: đặt shell, nhưng ngay sau khi tôi thử chạy chức năng của tôi: bash: rgr: lệnh không tìm thấy [2] + Ngưng vim -u ~ /.vimrc – ashgromnies

Trả lời

9

Tôi đã thực hiện điều này, thông qua t trang người đàn ông của anh ấy cho bash:

set shell=/bin/bash\ --rcfile\ ~/.bash_profile 

Tương tự, --init-file hoạt động.

Lưu ý rằng \ -ilà không cần thiết, mặc dù nó có thể được thêm vào lệnh:

set shell=/bin/bash\ --rcfile\ ~/.bash_profile\ -i 

Ví dụ:

~/.bash_profile chứa

source ~/.bash_aliases 

~/.bash_aliases chứa

alias rdc="open -a \"Remote Desktop Connection\"" 

~/.vimrc chứa

set shell=/bin/bash\ --rcfile\ ~/.bash_profile 
    map ,r :!rdc &<cr> 
+1

@ashgromnies, tính năng này có phù hợp với bạn không? Nếu vậy, và những người khác thì không, tôi có thể có tiền thưởng không? Cảm ơn :) – kikuchiyo

+0

Nó không làm việc cho tôi. '-i' có, nhưng tôi phải gõ' fg' ở cuối để quay lại vim. – cdunn2001

+0

Hi @ cdunn2001, bạn đang sử dụng hệ điều hành nào? Tôi có thể cố gắng để mô phỏng và đến với sửa chữa có thể nếu bạn vẫn còn có vấn đề. – kikuchiyo

0

Tôi có điều này trong ~/.vimrc tôi:

set shell=bash\ -i 

Tất cả các chức năng tùy chỉnh:

mkcd() { 
    mkdir -p "$*" 
    cd "$*" 
} 

và bí danh:

alias lsvn='svn list -vR' 

làm việc khi sử dụng từ Vim.

Nhưng tôi không sử dụng ~/.bash_aliases, tôi đã thêm chúng trực tiếp vào ~/.bashrc của tôi.

Bạn có nguồn ~/.bash_aliases từ ~/.bashrc không?

+0

Yup. nếu [-f ~/.bash_aliases]; sau đó . ~/.bash_aliases fi – ashgromnies

+1

Điều đó có thể hiệu quả đối với một số người, nhưng vì tôi chạy một tập lệnh (mà tôi không sở hữu) chiếm quyền kiểm soát thiết bị đầu cuối, khi nó kết thúc, vim bị treo. Sau đó tôi phải gõ 'fg' để quay lại vim. Không lý tưởng. Nếu tôi cần một trình bao tương tác, có vẻ như đơn giản hơn để vim lưu trạng thái, thoát, chạy lệnh và khởi động lại vim. – cdunn2001

+2

'' thì 'fg' rất hữu ích. – romainl

22

Hãy thử thêm dòng này để ~/.vimrc của bạn:

set shell=/bin/bash\ -i 

Sau đó vim sẽ sử dụng một vỏ tương tác (-i) mà đọc từ ~/.bashrc, theo mặc định. Xem :h shell để biết thêm thông tin về shell.


Tôi thấy điều này về bản chất giống như các câu trả lời trước mà bạn nói không hoạt động. Vui lòng thử phiên mẫu dưới đây trên máy của bạn để xem bạn có kết quả tương tự hay không (và đăng bất kỳ lỗi/phân kỳ nào từ kết quả bạn thấy trong mẫu).

$ cat .bash_aliases 
alias test_alias="echo test alias" 
test_func() { 
     echo test func 
} 
$ vim 
[vim]:set shell=/bin/bash 
[vim]:!type test_alias 
/bin/bash: line 0: type: test_alias: not found 

shell returned 1 

Press ENTER or type command to continue 
[vim]:!type test_func 
/bin/bash: line 0: type: test_func: not found 

shell returned 1 

Press ENTER or type command to continue 
[vim]:set shell=/bin/bash\ -i 
[vim]:!type test_alias 
test_alias is aliased to `echo test alias' 

Press ENTER or type command to continue 
[vim]:!type test_func 
test_func is a function 
test_func() 
{ 
    echo test func 
} 

Press ENTER or type command to continue 

Đối với lý do tại sao nó không được làm việc để bắt đầu với, khi bash chỉ đơn giản là chạy (ví dụ:không tương tác cũng không đăng nhập; mặc định cho vim và hầu hết các mục đích khác), nó đọc bất cứ tập tin được quy định tại $BASH_ENV:

When bash is started non-interactively, to run a shell script, for 
    example, it looks for the variable BASH_ENV in the environment, expands 
    its value if it appears there, and uses the expanded value as the name 
    of a file to read and execute. Bash behaves as if the following com‐ 
    mand were executed: 
      if [ -n "$BASH_ENV" ]; then . "$BASH_ENV"; fi 
    but the value of the PATH variable is not used to search for the file 
    name. 

Bằng cách thêm -i, chúng tôi làm cho vỏ tương tác và do đó nó nó đọc ~/.bashrc:

When an interactive shell that is not a login shell is started, bash 
    reads and executes commands from /etc/bash.bashrc and ~/.bashrc, if 
    these files exist. This may be inhibited by using the --norc option. 
    The --rcfile file option will force bash to read and execute commands 
    from file instead of /etc/bash.bashrc and ~/.bashrc. 

Các Các tệp *profile được đọc khi bắt đầu trình bao đăng nhập:

When bash is invoked as an interactive login shell, or as a non-inter‐ 
    active shell with the --login option, it first reads and executes com‐ 
    mands from the file /etc/profile, if that file exists. After reading 
    that file, it looks for ~/.bash_profile, ~/.bash_login, and ~/.profile, 
    in that order, and reads and executes commands from the first one that 
    exists and is readable. The --noprofile option may be used when the 
    shell is started to inhibit this behavior. 
27

Nếu bạn muốn vỏ không tương tác (như mặc định) nhưng mở rộng các bí danh bash, đặt định nghĩa bí danh của bạn trong một tập tin, ví dụ .bash_aliasescho phép một cách rõ ràng mở rộng alias trong tập tin này:

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

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

let $BASH_ENV = "~/.bash_aliases" 
+2

Đối với bất kỳ ai khác trên máy Mac, giải pháp này hoạt động với Mac OS X 10.9 Mavericks. Làm tốt lắm! – Zahnon

+2

Làm việc cho OS/X Yosemite. Đây là nỗ lực thứ 30 để khắc phục vấn đề này. Nó là tuyệt vời có bao nhiêu câu trả lời sai có ra khỏi đó. Một cái khác cho đến cái này. Điều duy nhất tôi sẽ thêm là bạn chỉ cần đặt "shopt -s expand_aliases" trong .bashrc/.bash_profile của bạn trước bất kỳ bí danh nào. –

+0

Cho đến nay, câu trả lời _bashiest_ của tất cả :) –

Các vấn đề liên quan