vim에서 실행 된 명령이 bash 명령 별칭을 인식하지 못합니다.


98

Mac에서 bash를 사용하고 별칭 중 하나는 다음과 같습니다.

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에 추가하고 싶지 않습니다. 그것은 DRY가 아닙니다.

더 나은 해결책이 있습니까?


별칭이 .gitconfig에 있으면 Bash 별칭에서 반복 할 필요가 없으며 git을 사용하는 모든 것이 Bash가 아니라이를 알고있을 것입니다. 따라서 DRY는 훌륭하지만 SPOT (Single Point Of Truth)도 있으며 SPOT을 올바른 위치에두면 DRY도 더 쉬워집니다.
Jonathan Leffler


답변:


116

Bash는 대화 형이 아닌 한 .bashrc를로드하지 않습니다. 사용하다

:set shellcmdflag=-ic

Vim의 :!쉘이 명령 프롬프트처럼 동작하도록합니다.


6
.vimrc 파일 (vim ~ / .vimrc)을 편집하고 거기에 한 줄에 넣습니다 (:없이)
2011 년

9
이것은 좋지만 문제가 있습니다. 대화 형 모드 (i 플래그)를 활성화하면 별칭이 지정된 쉘 명령을 제대로 실행할 수 있지만 명령 실행이 완료되면 vim이 종료되어 바람직하지 않습니다. 예를 들어 :! ls with shellcmdflag = -ic : [4] + Stopped vi ~ / .vimrc
ashgromnies

6
@Kevin : 대화 형 bash로 viw의 정상적인 동작을 얻을 수있는 방법이 없습니까? (명령 실행, 아무 키나 기다렸다가 vim으로
돌아옴

7
나를 위해 .vimrc에서 명령을 suspended (tty output)사용하면 When i usegit commit
has2k1 2013-08-13

27
Vim에 항상 대화 형 쉘을 사용하도록 지시하면 문제가 발생할 수 있습니다. 더 나은 해결책은 bash 구성에서 별칭을 설정하는 항목과 비대화 형 셸에서도로드되는 위치로이를 이동하는 방법을 파악하는 것입니다. 예를 들어 zshell ~/.zshrc은 대화 형 셸에 대해서만로드 되지만 ~/.zshenv모든 셸에 대해 로드 되므로 별칭 설정을 그곳으로 옮겼으며 이제 Vim 내에서 작동합니다. 자세한 내용은 man zsh(또는 셸의 맨 페이지)를 참조하십시오.
Nathan Long

83

이 질문이 이미 "답변"되었다는 것을 알고 있지만 답변에 문제가 있습니다. 셸은 Vim에서 대화 형으로 설정할 필요 가 없습니다 . 대화 형 셸을 종료하지 않고도 대체 답변을 보려면이 스레드를 참조하십시오.

비대화 형 셸 (기본값)을 원하지만 bash 별칭을 확장하려면 별칭 정의를 파일 (예 : .bash_aliases)에 넣고이 파일에서 별칭 확장을 명시 적으로 활성화합니다.

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

그런 다음 이것을 .vimrc에 추가하여 vim 내에서 쉘 명령을 실행할 때마다 aliases 파일을 실제로 읽도록합니다.

let $BASH_ENV = "~/.bash_aliases"

이 솔루션은 "Jakob"에서 제안했습니다. 원본은 아래 링크를 참조하십시오. 나는 이것을 Mac OS X 10.9에서 테스트했고 완벽하게 작동했습니다!

vim-대화 형 모드에서 별칭을 인식하지 못합니까?


7
지금까지 최고의 솔루션입니다. 개인적으로 (사용자 정의 대화 형 모드 확인 전에) $BASH_ENVvar를 설정하여 .bashrc응용 프로그램에서 모든 별칭을 사용할 수 있습니다.
el.atomo

2
변경 범위가 Vim 내로 제한되기 때문에이 페이지에서 가장 좋은 솔루션 일 것입니다. 하나는 더 나아가고 let $BASH_ENV="~/.vim/vim_bash", 이것은 :!Vim 내의 모든 호출에 사용됩니다 .
Teeeeeeeeeeeeeeeeeeeeeeeeeeeej

불행히도 macOS 10.15.2 기본 셸인 zsh에서는 작동하지 않습니다.
Ben Quigley

8

bash dotfiles 구성 방법에 따라 -i 옵션 대신 -l을 사용할 수 있습니다. 그러면 셸이 로그인 셸로 시작됩니다.


4
dreftymac 썼다 : "나를 위해 일이를 얻기 위해서는, 그렇지 않으면 정력 반환, '찾을 수 없음 명령'-lic 옵션을 할 필요가 있었다"
dreftymac

8

나는 그것이 오래된 질문 일 수 있음을 알고 있지만 위의 답변 중 어느 것도 원하는대로 작동하지 않았습니다. 따라서 인터넷 검색에서 여기로 온 사람들과 (oh-my-) zsh 사용자를 위해 :

이에 대한 내 솔루션은 http://zsh.sourceforge.net/Intro/intro_3.html에 따라 .zshrc를 .zshenv에 복사하는 것만 큼 간단했습니다 .

`.zshenv '는 -f 옵션이 설정되지 않은 경우 모든 쉘 호출에서 소스입니다. 명령 검색 경로를 설정하는 명령과 기타 중요한 환경 변수가 포함되어야합니다. `.zshenv '는 출력을 생성하거나 쉘이 tty에 연결되어 있다고 가정하는 명령을 포함하지 않아야합니다.

그래서 $ cp ~/.zshrc ~/.zshenv일을 할 것입니다.


감사합니다! 파일에 셸 별칭이있는 경우 .zshenv로 소스를 지정할 수 있습니다. : 같은 뭔가 . $HOME/.aliases
scifisamurai

2

나는 -i 옵션을 설정하는 것이 너무 편하지 않다. 그것은 상당한 영향을 미치고 vim에서 자주 쉘을 사용하고 있기 때문이다. 대신 내가 할 일은 다음과 같습니다.:!bash -c ". ~/.alias; gitlog"


이것은 최선의 해결책처럼 보이지만 나를 위해 작동하지 않습니다. 아직 명령을 찾을 수 없습니다 말한다
still_dreaming_1
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.