Ricarica variabili d'ambiente


10

Questa domanda è stata posta al superutente : c'è un modo per ricaricare le variabili di ambiente in emacs , ma non è stata data una buona soluzione.

Sto usando EmacsClient con spesso più di 30 buffer aperti, se cambio una variabile d'ambiente nella shell, devo uscire da EmacsClient (e riaprire tutti i buffer) o devo impostare manualmente la variabile d'ambiente anche in Emacs. Trovo fastidioso non poter aggiornare facilmente le variabili di ambiente in Emacs. Eventuali suggerimenti?


Non esiste un modo semplice per farlo, poiché la modifica di una variabile di ambiente nel processo padre non aggiornerà il suo valore come esportato in un figlio.
Erik Hetzner,

Risposte:


7

exec-path-from-shell fornisce il exec-path-from-shell-copy-envcomando, che consente di copiare il valore delle variabili di ambiente nelle sessioni Emacs. Ad esempio, M-x exec-path-from-shell-copy-env RET FOOimposta anche il valore di $FOOin Emacs.

Nota che exec-path-from-shell-copy-envgenera una nuova shell per estrarre il valore della variabile d'ambiente. Quindi funzionerà solo per le variabili impostate nei file di configurazione della shell (ad es. .bashrc), Ma non per le variabili impostate solo in una sessione della shell in esecuzione export. L'estrazione di queste variabili è generalmente impossibile senza hack contorti che ispezionano /proc/o API simili per i processi in esecuzione.


Per quanto riguarda gli ultimi valori / transitori, se Emacs è in esecuzione come server, passare i valori aggiornati a emacsclient direttamente da quella shell sarebbe abbastanza semplice.
phils,

@phils Grazie, vedi la mia risposta aggiornata ..
Håkon Hægland

5

Come soluzione alternativa, è possibile utilizzare quanto segue (Linux, Bash):

  • Prima esecuzione printenv -0 > env.txtdalla finestra del terminale Bash,
  • Quindi, da Emacs, corri
(defun my-update-env ()
  (interactive)
  (let ((str 
         (with-temp-buffer
           (insert-file-contents "env.txt")
           (buffer-string))) lst)
    (setq lst (split-string str "\000"))
    (while lst
      (setq cur (car lst))
      (when (string-match "^\\(.*?\\)=\\(.*\\)" cur)
        (setq var (match-string 1 cur))
        (setq value (match-string 2 cur))
        (setenv var value))
      (setq lst (cdr lst)))))

Aggiornare

Ho scoperto che questo può essere fatto in modo più elegante usando l' --evalopzione del emacsclientcomando: Definisci uno script Bash update_emacs_env:

#! /bin/bash

fn=tempfile
printenv -0 > "$fn" 
emacsclient -s server_name -e '(my-update-env "'"$fn"'")' >/dev/null

dov'è server_nameil nome del tuo server Emacs ed my-update-envè una funzione definita dal tuo ~/.emacsfile:

(defun my-update-env (fn)
  (let ((str 
         (with-temp-buffer
           (insert-file-contents fn)
           (buffer-string))) lst)
    (setq lst (split-string str "\000"))
    (while lst
      (setq cur (car lst))
      (when (string-match "^\\(.*?\\)=\\(.*\\)" cur)
        (setq var (match-string 1 cur))
        (setq value (match-string 2 cur))
        (setenv var value))
      (setq lst (cdr lst)))))

Ora puoi semplicemente digitare update_emacs_envdalla riga di comando della shell per aggiornare le variabili di ambiente di Emacs.


E potresti anche eseguire "printenv" dall'interno della funzione ...
mankoff

@mankoff In realtà, penso che non potresti .. :) (Stampa i vecchi valori allora)
Håkon Hægland

Non puoi generare una shell con flag di accesso? O source.bashrc, .bash_profile, ecc.?
mankoff,

Sì .. ma non sarebbe d'aiuto nel caso speciale se esporto nella shell direttamente dalla riga di comando, usandoexport VAR=value
Håkon Hægland

Sì, non ho pensato a quel caso. Soluzione elegante con il cliente!
mankoff

3

Prima usavo questo:

function export-emacs {
    if [ "$(emacsclient -e t)" != 't' ]; then
        return 1
    fi

    for name in "${@}"; do
        value=$(eval echo \"\$${name}\")
        emacsclient -e "(setenv \"${name}\" \"${value}\")" >/dev/null
    done
}

Consente di esportare una variabile con nome, ad esempio:

export EDITOR=vim
export-emacs EDITOR
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.