
Im Befehlszeilenmodus funktionieren die folgenden Beispiele bei mir nicht.
!alias lol='echo lol'
!lol='echo lol'
Antwort1
Wenn Sie den Befehl verwenden :!
, wird innerhalb von Vim eine neue Shell gestartet. In dieser Shell wird der Alias festgelegt, aber unmittelbar danach wird die Shell beendet und alles ist verloren.
Am besten definieren Sie die Aliase in der Shell, die Vim startet. Umgebungsvariablen können Sie auch in Vim über festlegen :let $VAR = 'value'
und in Befehlen verwenden :!
. Außerdem können Sie mit eine Shell in Vim starten oder Vim anhalten und mit oder :shell
zur ursprünglichen Shell zurückkehren .:stop
^z
Antwort2
vim
startet eine Instanz einer nicht interaktiven bash
(vorausgesetzt, bash
es handelt sich um Ihre Login-Shell und Sie haben nichts geändert $SHELL
) für jeden !
Befehl (in !cmd
wird vim ausgeführt bash -c cmd
). Also:
- Ein in einem !-Befehl definierter Alias wäre in der anderen Shell, die durch den nächsten !-Befehl gestartet wird, nicht verfügbar, da es sich um einen völlig anderen Prozess handelt.
bash
erweitert keine Aliase und liest nicht,~/.bashrc
wenn nicht interaktiv
Um das zu umgehen, können Sie $BASH_ENV
etwas festlegen, das die Aliaserweiterung aktiviert und sich beim Beenden von neu schreibt, bash
wobei die Liste der neuen Aliase enthalten ist. Etwas wie (in ~/.vimrc
):
let $BASH_ENV = $HOME . "/.bashvimrc." . getpid()
au VimLeave * silent !exec rm -f "$BASH_ENV"
silent !echo 'vim_setup() { shopt -s expand_aliases; trap write_aliases EXIT; eval "$@"; }; write_aliases() { typeset -f vim_setup write_aliases; alias; echo vim_setup \"\$@\";} > "$BASH_ENV"; vim_setup "$@"' > "$BASH_ENV"
set shell=/bin/bash