Perintah yang dijalankan dari vim tidak mengenali alias perintah bash

97

Saya menggunakan bash di mac dan salah satu aliasnya seperti ini

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

Namun ketika saya melakukannya

 :! gitlog

saya mendapat

/bin/bash: gitlog: command not found 

Saya tahu saya bisa menambahkan alias seperti ini di .gitconfig saya

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

Namun saya tidak ingin menambahkan semua alias bash saya ke .gitconfig. Itu tidak KERING.

Apakah ada solusi yang lebih baik?

Nick Vanderbilt
sumber
Jika alias ada di .gitconfig, Anda tidak perlu mengulanginya di alias Bash, dan semua yang menggunakan git akan mengetahuinya, bukan hanya Bash. Jadi, KERING itu mengagumkan, tetapi ada juga TITIK (Titik Kebenaran Tunggal), dan menempatkan TITIK Anda di tempat yang tepat berarti lebih mudah untuk menjadi KERING juga.
Jonathan Leffler
Kemungkinan duplikat situs silang dari: superuser.com/questions/47821/vim-ignores-aliases
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功

Jawaban:

114

Bash tidak memuat .bashrc Anda kecuali jika bersifat interaktif. Menggunakan

:set shellcmdflag=-ic

untuk membuat :!shell Vim berperilaku seperti command prompt Anda.

Josh Lee
sumber
6
edit file .vimrc Anda (vim ~ / .vimrc) dan letakkan di baris di sana (tanpa :)
skeept
9
Ini bagus tetapi saya mengalami masalah - jika saya mengaktifkan mode interaktif (bendera i), maka saya dapat menjalankan perintah shell alias saya dengan baik, tetapi segera setelah perintah selesai dijalankan, vim keluar yang tidak diinginkan. Mis, saya mencoba melakukan:! Ls dengan shellcmdflag = -ic: [4] + Berhenti vi ~ / .vimrc
ashgromnies
6
@Kevin: tidak ada cara untuk mendapatkan perilaku normal viw dengan bash interaktif? (jalankan perintah, tunggu tombol apa saja, kembali ke vim)
Mayeu
7
Bagi saya, memiliki perintah dalam .vimrc mengarah ke suspended (tty output)When i usegit commit
has2k1
27
Memberi tahu Vim untuk selalu menggunakan shell interaktif dapat menimbulkan masalah. Solusi yang lebih baik adalah mencari tahu apa dalam konfigurasi bash Anda yang menyiapkan alias dan bagaimana Anda dapat memindahkannya ke tempat yang dimuat bahkan di shell non-interaktif. Misalnya, zshell hanya memuat ~/.zshrcuntuk shell interaktif, tetapi memuat ~/.zshenvuntuk semua shell, jadi saya memindahkan setup alias saya ke sana dan sekarang berfungsi dari dalam Vim. Lihat man zsh(atau halaman manual shell Anda) untuk lebih lanjut.
Nathan Long
83

Saya tahu pertanyaan ini sebelumnya sudah "dijawab", tetapi saya punya masalah dengan jawabannya. Shell tidak perlu disetel ke interaktif di Vim. Lihat utas ini untuk jawaban alternatif tanpa harus keluar dari shell interaktif.

Jika Anda menginginkan shell non-interaktif (sebagai default) tetapi merupakan perluasan alias bash, letakkan definisi alias Anda dalam sebuah file, misalnya .bash_aliases dan secara eksplisit aktifkan perluasan alias dalam file ini:

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

Kemudian tambahkan ini ke .vimrc Anda sehingga file alias benar-benar dibaca setiap kali Anda menjalankan perintah shell dari dalam vim:

let $BASH_ENV = "~/.bash_aliases"

Solusi ini disarankan oleh "Jakob". Lihat tautan di bawah untuk aslinya. Saya menguji ini di Mac OS X 10.9 dan bekerja dengan sempurna!

vim - tidak mengenali alias saat dalam mode interaktif?

EmpathicSage
sumber
7
Solusi terbaik sejauh ini. Secara pribadi, saya menetapkan $BASH_ENVvar di my .bashrc(sebelum pemeriksaan mode interaktif kustom), sehingga saya dapat menggunakan semua alias saya di seluruh aplikasi.
el.atomo
2
Ini mungkin solusi terbaik di halaman ini karena cakupan perubahan akan dibatasi dalam Vim. Seseorang bahkan bisa melangkah lebih jauh dan let $BASH_ENV="~/.vim/vim_bash", dan ini akan digunakan untuk semua :!pemanggilan dalam Vim.
Teeeeeeeeeeeeeeeeeeeeeeeeeeeej
Ini tidak berfungsi di shell default macOS 10.15.2, sayangnya zsh.
Ben Quigley
8

Perhatikan bahwa tergantung bagaimana bash dotfiles Anda dikonfigurasi, Anda mungkin ingin menggunakan opsi -l daripada opsi -i. Ini akan meluncurkan shell sebagai shell login.

pengguna836003
sumber
4
dreftymac menulis: "Untuk membuat ini bekerja untuk saya, perlu untuk melakukan opsi -lic, jika tidak vim mengembalikan 'perintah tidak ditemukan'"
dreftymac
8

Saya tahu ini mungkin pertanyaan lama, namun tidak ada jawaban di atas yang sesuai untuk saya. Jadi untuk yang datang ke sini dari googling dan untuk pengguna (oh-my-) zsh:

Solusi saya untuk ini semudah menyalin .zshrc ke .zshenv - sesuai http://zsh.sourceforge.net/Intro/intro_3.html :

`.zshenv 'bersumber dari semua pemanggilan shell, kecuali opsi -f disetel. Ini harus berisi perintah untuk mengatur jalur pencarian perintah, ditambah variabel lingkungan penting lainnya. `.zshenv 'tidak boleh berisi perintah yang menghasilkan output atau menganggap shell dilampirkan ke tty.

Aku $ cp ~/.zshrc ~/.zshenvakan melakukannya.

Damian Borowski
sumber
Terima kasih untuk ini! Hanya ingin mencatat bahwa jika Anda memiliki alias shell dalam file, Anda dapat mengambilnya saja di .zshenv. Sesuatu seperti: . $HOME/.aliases
scifisamurai
2

Saya tidak merasa terlalu nyaman dengan pengaturan opsi -i, karena ini berdampak cukup besar dan saya sering menggunakan shell dari vim. Yang akan saya lakukan adalah sesuatu seperti:!bash -c ". ~/.alias; gitlog"

pfnuesel.dll
sumber
Ini sepertinya solusi terbaik, tetapi tidak berhasil untuk saya. Masih tertulis perintah tidak ditemukan
still_dreaming_1