Ortam değişkenlerini yeniden yükle


10

Bu soru süper kullanıcıda emacs-yeniden-yükleme-çevre-değişkenleri-var-bir yol var , ama iyi bir çözüm verilmemiştir.

Kabuktaki bir ortam değişkenini değiştirirsem, EmacsClient'ten çıkmam (ve tüm arabellekleri yeniden açmam) gerekiyorsa EmacsClient'i genellikle 30'dan fazla arabellek açık olarak kullanıyorum veya ortam değişkenini Emacs'ta da manuel olarak ayarlamalıyım. Emacs'ta ortam değişkenlerini kolayca güncelleyemediğimi sinir bozucu buluyorum. Herhangi bir öneri?


Üst işlemdeki bir ortam değişkeninin değiştirilmesi, değeri bir alt öğeye dışa aktarıldığı şekilde güncelleştirmeyeceğinden, bunu yapmanın kolay bir yolu yoktur.
Erik Hetzner

Yanıtlar:


7

exec-path-from-shell , exec-path-from-shell-copy-envortam değişkenlerinin değerini Emacs oturumlarına kopyalamanızı sağlayan komutu sağlar. Örneğin, Emacs M-x exec-path-from-shell-copy-env RET FOOiçindeki değerini de ayarlar $FOO.

Not exec-path-from-shell-copy-envolarak çoğaltılır, bir yeni ortam değişkeni değerinin elde etmek için kabuk. Bu nedenle, yalnızca kabuk yapılandırma dosyalarınızda (örneğin .bashrc) ayarladığınız değişkenler için çalışır, ancak yalnızca çalışan bir kabuk oturumunda ayarlanan değişkenler için çalışmaz export. Bu değişkenleri çıkarmak genellikle /proc/çalışan işlemleri denetleyen kıvrımlı hackler veya benzeri API'ler olmadan imkansızdır .


İkinci / geçici değerlerle ilgili olarak, Emacs bir sunucu olarak çalışıyorsa, güncellenmiş değerleri doğrudan bu kabuktan emacclient'e geçirmek yeterince kolay olacaktır.
phils

@phils Teşekkürler, güncellenmiş cevabımı görün ..
Håkon Hægland

5

Çözüm olarak aşağıdakiler kullanılabilir (Linux, Bash):

  • İlk printenv -0 > env.txtönce Bash terminal penceresinden,
  • Sonra Emacs'ın içinden koş
(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)))))

Güncelleme

Bu komutun --evalseçeneği kullanılarak daha zarif yapılabilir ki ortaya çıkıyor emacsclient: Bir Bash komut dosyası tanımlayın update_emacs_env:

#! /bin/bash

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

nerede server_namesizin Emacs sunucu adıdır ve my-update-envsenin tarafından tanımlanan bir fonksiyondur ~/.emacsdosyası:

(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)))))

Şimdi sadece update_emacs_envEmacs ortam değişkenlerini güncellemek için shell komut satırından yazabilirsiniz .


Ve "printenv" i fonksiyonun içinden de çalıştırabilirsiniz ...
Mankoff

@mankoff Aslında, yapamayacağınızı düşünüyorum .. :) (O zaman eski değerleri
basar

Giriş bayrağı olan bir kabuk oluşturamaz mısınız? Veya source.bashrc, .bash_profile, vs.?
mankoff

Evet .. ancak kabuğu kullanarak komut satırından doğrudan dışa aktarırsam özel durum için yardımcı olmazexport VAR=value
Håkon Hægland

Evet, bu davayı düşünmedim. Müşteri ile zarif çözüm!
mankoff

3

Bunu kullanıyordum:

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
}

Adlandırılmış bir değişkeni EG olarak dışa aktarmanıza olanak tanır:

export EDITOR=vim
export-emacs EDITOR
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.