পরিবেশের ভেরিয়েবলগুলি পুনরায় লোড করুন


10

এই প্রশ্নটি সুপারইজার --ওয়ে-ওয়ে-টু-রি-লোড-এনভায়রনমেন্ট-ভেরিয়েবল-ইন-ইম্যাক্সে জিজ্ঞাসা করা হয়েছে , তবে কোনও ভাল সমাধান দেওয়া হয়নি।

আমি প্রায় 30 টিরও বেশি বাফার খোলা রেখে EmacsClient ব্যবহার করছি, যদি আমি শেলটিতে পরিবেশের পরিবর্তনশীল পরিবর্তন করি তবে আমাকে EmacsClient (এবং সমস্ত বাফার পুনরায় খোলা) প্রস্থান করতে হবে বা আমাকে নিজেই পরিবেশগত পরিবর্তনশীলটি ইম্যাক্সে সেট করতে হবে। আমি বিরক্তিকর বলে মনে করি যে আমি Emacs এ সহজেই পরিবেশের পরিবর্তনগুলি আপডেট করতে পারি না। কোন পরামর্শ?


এটি করার সহজবোধ্য কোনও উপায় নেই, কারণ পিতামাতার প্রক্রিয়ায় পরিবেশের পরিবর্তনশীল পরিবর্তন করা কোনও সন্তানের কাছে রফতানির সাথে এর মান আপডেট করে না।
এরিক হেটজনার

উত্তর:


7

এক্সেক-পাথ-থেকে-শেলexec-path-from-shell-copy-env কমান্ডটি সরবরাহ করে , যা আপনাকে পরিবেশের ভেরিয়েবলের মান ইম্যাক সেশনগুলিতে অনুলিপি করতে দেয়। উদাহরণস্বরূপ, Emacs এর M-x exec-path-from-shell-copy-env RET FOOমানও সেট করে $FOO

নোট করুন যে পরিবেশের ভেরিয়েবলের মান বের করতে exec-path-from-shell-copy-envএকটি নতুন শেল তৈরি হয়েছে। সুতরাং এটি কেবলমাত্র আপনার শেল কনফিগারেশন ফাইলগুলিতে (যেমন .bashrc) সেট করে এমন ভেরিয়েবলগুলির জন্য কাজ করবে তবে কেবল চলমান শেল সেশনে সেট করা চলকগুলির জন্য নয় export/proc/চলমান প্রক্রিয়াগুলির জন্য পরিদর্শন করা বা অনুরূপ এপিআই সংযুক্ত হ্যাকগুলি ব্যতীত এই ভেরিয়েবলগুলি বের করা সাধারণত অসম্ভব ।


পরবর্তী / ক্ষণস্থায়ী মানগুলির বিষয়ে, যদি ইমাসস একটি সার্ভার হিসাবে চলমান থাকে তবে সেই শেলটি থেকে সরাসরি ইমেলক্লিয়েন্টে আপডেট হওয়া মানগুলি পাস করা যথেষ্ট সহজ।
ফিল্মগুলি

@ ফিলস ধন্যবাদ, আমার আপডেট হওয়া উত্তরটি দেখুন ..
হ্যাকন হাগল্যান্ড

5

কার্যকারণ হিসাবে নিম্নলিখিতটি ব্যবহার করা যেতে পারে (লিনাক্স, ব্যাশ):

  • printenv -0 > env.txtবাশ টার্মিনাল উইন্ডো থেকে প্রথমে রান করুন ,
  • তারপরে ইমাক্সের মধ্যে থেকে চালান
(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)))))

হালনাগাদ

আমি দেখাচ্ছি যে কমান্ডের --evalবিকল্পটি ব্যবহার করে এটি আরও মার্জিতভাবে করা যেতে পারে emacsclient: বাশ স্ক্রিপ্ট সংজ্ঞায়িত করুন update_emacs_env:

#! /bin/bash

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

server_nameআপনার ইমাক্স সার্ভারের নাম কোথায় এবং my-update-envএটি আপনার ~/.emacsফাইল দ্বারা সংজ্ঞায়িত একটি ফাংশন :

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

update_emacs_envইমাস এনভায়রনমেন্ট ভেরিয়েবল আপডেট করার জন্য আপনি এখন শেল কমান্ড লাইন থেকে টাইপ করতে পারেন ..


এবং আপনি ফাংশনটির ভিতরে থেকে "
প্রিন্টেভ

@ ম্যানকফ আসলে, আমার মনে হয় আপনি পারবেন না .. :) (এটি তখন পুরানো মানগুলি মুদ্রণ করবে)
হ্যাকন হাগল্যান্ড

আপনি লগইন পতাকা সহ একটি শেল স্প্যান করতে পারবেন না? বা source.bashrc, .Bash_profile, ইত্যাদি?
mankoff

হ্যাঁ .. তবে আমি যদি কমান্ড লাইন থেকে সরাসরি শেলটি রফতানি করি তবে বিশেষ export VAR=value
কেসটির পক্ষে কোনও লাভ হবে না

হ্যাঁ আমি এই মামলাটি ভাবিনি। ক্লায়েন্টের সাথে মার্জিত সমাধান!
mankoff

3

আমি এটি ব্যবহার করতাম:

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
}

আপনাকে একটি নামযুক্ত ভেরিয়েবল, ইজি রফতানি দেয়:

export EDITOR=vim
export-emacs EDITOR
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.