Wie lege ich Bash-Aliase und -Variablen innerhalb von Vim fest?

Wie lege ich Bash-Aliase und -Variablen innerhalb von Vim fest?

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 :shellzur ursprünglichen Shell zurückkehren .:stop^z

Antwort2

vimstartet eine Instanz einer nicht interaktiven bash(vorausgesetzt, bashes handelt sich um Ihre Login-Shell und Sie haben nichts geändert $SHELL) für jeden !Befehl (in !cmdwird vim ausgeführt bash -c cmd). Also:

  1. 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.
  2. basherweitert keine Aliase und liest nicht, ~/.bashrcwenn nicht interaktiv

Um das zu umgehen, können Sie $BASH_ENVetwas festlegen, das die Aliaserweiterung aktiviert und sich beim Beenden von neu schreibt, bashwobei 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

verwandte Informationen