कस्टम उपयोगकर्ता-इमैक-निर्देशिका के साथ emacs कैसे शुरू करें


58

मैं एक कस्टम और छोटे Emacs कॉन्फ़िगरेशन पर काम कर रहा हूं, जिसे मैं कुछ दोस्तों के साथ एक git रिपॉजिटरी के रूप में साझा करना चाहता हूं ताकि वे अपने भविष्य के कॉन्फ़िगरेशन के लिए आधार रेखा के रूप में उपयोग कर सकें।

इसके लिए मुझे अपने विन्यास का परीक्षण करने के लिए किसी तरह की आवश्यकता है और सबसे सरल समाधान जिसके साथ मैं आ सकता हूं वह कुछ इस प्रकार है:

$ emacs --eval "(setq user-emacs-directory \"~/Code/my_custom_emacs.d/\")"

लेकिन मैं इसे काम करने के लिए प्रतीत नहीं कर सकता।

किसी भी मदद की बहुत सराहना की।


3
मैं Emacs मंगलाचरण के लिए परिशिष्ट C कमांड लाइन तर्क पर पढ़ा, लेकिन मैं एक साधारण .emacs.dनिर्देशिका के साथ Emacs शुरू करने के लिए एक साधारण आदेश-पंक्ति विकल्प नहीं मिला , जब तक कि आप गृह नहीं बदलते, जो मुझे समस्याग्रस्त लगता है। लोगों ने नीचे दिए गए वर्कअराउंड प्रदान किए हैं, लेकिन, मेरे लिए, यह Emacs के लिए एक बहुत ही उचित सुविधा अनुरोध की तरह लगता है।
डेविड जे।


5
@DavidJames तुम सही हो: Emacs बग ट्रैकर में इस बारे में वास्तव में एक विशलिस्ट आइटम है
ffevotte

2
अद्यतन: ऐसा लगता है कि यह सुविधा Emacs डेवलपर्स को इतना रुचि नहीं देती है: अनुरोध को चिह्नित किया गया है wontfixऔर बग ट्रैकर में बंद कर दिया गया है।
ffevotte

@Francesco: मैं एक गतिशील दृष्टिकोण की कोशिश करता हूं जो उपयोगकर्ता Emacs निर्देशिका को "~" के बाहर रखने की अनुमति देता है। हो सकता है आप एक कोशिश दे।
एंटोनियो

जवाबों:


39

इसके लिए मैं जिस मूल दृष्टिकोण का उपयोग करता हूं $HOME, उसे चलाकर संशोधित करना है :

env HOME=/path/to/dir emacs

आप तब उपयोग करें /path/to/dir/.emacs.d

आप इस नकली होम में महत्व की किसी भी फाइल या निर्देशिका को वास्तविक लोगों के लिए सीरलिंक करना चाहते हैं, ताकि Emacs उन्हें देख सके।


2
यह सही काम करता है!
मटियास बेंग्टसन

8
Emac मैनुअल के अनुसार - Emacs मंगलाचरण के लिए परिशिष्ट C कमांड लाइन तर्क - पर्यावरण चर - सामान्य चर , गृह सेट "निर्देशिका ट्री में आपकी फ़ाइलों का स्थान; एक tilde (~) के साथ शुरू होने वाले फ़ाइल नामों के विस्तार के लिए उपयोग किया जाता है।" गृह बदलना परेशानी के लिए एक नुस्खा की तरह लगता है बाद में जब आप जल्दी से नेविगेट करना चाहते हैं या अपने असली घर फ़ोल्डर से फाइलें ढूंढना चाहते हैं ।
डेविड जे।

2
डेविड जेम्स: हां, इस दृष्टिकोण से एक छोटी सी झुंझलाहट है। जैसा कि उल्लेख किया गया है, आप उन चीज़ों को कॉपी या सिम्लिंक करना चाहते हैं, जिन्हें आपको घर के नीचे देखने के लिए Emacs की आवश्यकता है, और यदि आप अपनी वास्तविक होम डायरेक्टरी पर जाना चाहते हैं, तो आपको निरपेक्ष पथ का उपयोग करने की आवश्यकता है (या आप उसी के साथ एक सिम्लिंक जोड़ सकते हैं) )।
phils

3
आप आरंभिक के दौरान एमएसीएस के भीतर मूल होम को पुनर्स्थापित करने के साथ भी प्रयोग कर सकते हैं। मैंने कोशिश नहीं की है, लेकिन यह देखने लायक है।
phils

1
@ एफिल: मैंने कोशिश की कि आप क्या सुझाव देते हैं।
एंटोनियो

39

जिस तरह से मैं .emacs.dसमानांतर में कई निर्देशिकाओं को बनाए रखने के लिए उपयोग करता हूं वह निम्नलिखित है।

  1. emacs इस तरह से शुरू किया गया है:

    alias emacs='emacs -q --load "/path/to/init.el"'
    
  2. प्रत्येक init.elफ़ाइल इस तरह शुरू होती है, सही ढंग से user-init-fileऔर user-emacs-directoryचर सेट करने के लिए :

    (setq user-init-file (or load-file-name (buffer-file-name)))
    (setq user-emacs-directory (file-name-directory user-init-file))
    

मैंने पिछले महीनों में बहुत मज़बूती से काम करने के लिए इसे पाया है। यहाँ कुछ टिप्पणी दी गई है:

  • यह टूट जाता है emacs-init-time, जो केवल डिफ़ॉल्ट सिस्टम कॉन्फ़िगरेशन को लोड करने के लिए आवश्यक समय की रिपोर्ट करता है, लेकिन आपकी खुद की init फ़ाइल नहीं। यदि आप अपने init समय बेंचमार्किंग में रुचि रखते हैं, तो आपको इसे अन्य तरीके से करना होगा (उदाहरण के लिए देखें कि मैं elisp code का प्रदर्शन कैसे मापूं? )।

  • यह एक सामान्य स्टार्टअप के बराबर नहीं है और आपको कुछ विशिष्ट बिंदुओं का ध्यान रखना होगा। विशेष रूप से:

    • after-init-hookinit फ़ाइल लोड होने से पहले चलाया जाता है।
    • *scratch*बफर बनाई गई है इससे पहले कि init फ़ाइल भरी हुई है। आपको इसका मोड स्पष्ट रूप से (उपयोग करने के बजाय initial-major-mode) बदलना होगा ।
    • आपको स्पष्ट रूप से कॉल करने की आवश्यकता होगी package-initialize; यह स्वचालित रूप से नहीं किया जाएगा
  • पथ के लिए init.elमनमाने ढंग से चुना जा सकता है; विशेष रूप से, जिस निर्देशिका में init.elरहता है उसका नाम नहीं होना चाहिए .emacs.d। मैं इसका उपयोग उदाहरणों के .emacs.d.23साथ-साथ .emacs.d.24emacs के विभिन्न संस्करणों के बीच स्विच करने में सक्षम होने के लिए करता हूं (जिस सिस्टम पर मैं काम कर रहा हूं वह निष्क्रिय रूप से पुराना है, और मैं उन सभी मशीनों पर 24 emacs स्थापित नहीं कर सकता हूं जो मैं उपयोग करता हूं)।

  • इस वर्कफ़्लो को पर्यावरण (और विशेष रूप से HOMEएनवार) को संशोधित करने की आवश्यकता नहीं है , जो वांछनीय हो सकता है यदि आप ईमैक्स के भीतर से प्रोग्राम चलाते हैं, जो संशोधित वातावरण से प्रभावित हो सकता है)।


1
यह (प्रभाव में) सामान्य निष्पादन क्रम को बदल देता है, यदि आप --loadएड फ़ाइल को इनिट फ़ाइल मान रहे हैं । शुरुआत के लिए, यह मुझे ऐसा लगता है जैसे सामान्य (डिफ़ॉल्ट) पैकेज आरंभीकरण नहीं होगा, और (नकली) इनिट फ़ाइल का मूल्यांकन होने से पहलेafter-init-hook चलेगा । ये ऐसी चीजें हैं जिनके बारे में आप निश्चित रूप से काम कर सकते हैं, लेकिन इस बात का ध्यान रखें कि यह इनटेक फ़ाइल के रूप में निर्दिष्ट पथ का उपयोग करते हुए Emacs के समान नहीं है।
फिल्स

2
@ हाँ, आप सही कह रहे हैं। यह वास्तव में सामान्य निष्पादन आदेश को बदलता है, और एक नियमित इनिट फ़ाइल का उपयोग करने के बराबर नहीं है। मैंने आपकी बात को प्रतिबिंबित करने के लिए अपना उत्तर संपादित किया after-init-hook। लेकिन मेरा कहना है कि हालाँकि मैं हर समय इस तकनीक का उपयोग करता हूं, लेकिन मुझे कभी भी किसी समस्या का सामना नहीं करना पड़ा after-init-hook(लेकिन मैं इसका स्पष्ट रूप से उपयोग नहीं करता हूं, और शायद मैं सिर्फ भाग्यशाली हूं कि मेरे द्वारा उपयोग किए जाने वाले पैकेज इस पर भरोसा नहीं करते हैं) । "सामान्य (डिफ़ॉल्ट) पैकेज आरंभीकरण से क्या मतलब होगा" नहीं होगा?
ffevotte 19

1
मेरा मतलब है कि उस स्थिति में command-lineफोन नहीं होगा package-initialize। आपको इसे नकली इनिट फ़ाइल में मैन्युअल रूप से कॉल करना होगा।
फिल्स

1
@ धन्यवाद मैंने इसे उत्तर के साथ जोड़ा, एक उल्लेख के साथ कि प्रारंभिक प्रमुख मोड को भी विशेष रूप से ध्यान रखा जाना चाहिए।
ffevotte

यह पूरी तरह से काम किया .. धन्यवाद !!!
स्ट्राइकर

15

आप सहानुभूति रख सकते हैं ~/.emacs.d, यही मैं करता हूं

  1. मेरे emacs कॉन्फ़िगरेशन को ~/.emacs.dउन्मुख रखने का प्रयास करें अर्थात सभी emacs संबंधित कॉन्फ़िगरेशन फ़ाइलों को उस फ़ोल्डर में रहना चाहिए

  2. फिर मेरे पास एक ~/.emacs_configsफोल्डर है जहाँ सभी कॉन्फिग फोल्डर (मूल रूप से एक init.elकॉन्फिगरेशन और बाकी कॉन्फिगरेशन वाला एक फोल्डर ) रहता है, इसलिए मेरा पर्सनल कॉन्फिग फोल्डर होगा ~/emacs_configs/iqbal, एक प्राउल डिस्ट्रीब्यूशन होगा~/emacs_configs/prelude

  3. अपने व्यक्तिगत ईमॅक्स कॉन्फिगर में बहुत जल्दी मैंने user-emacs-directoryनिम्न का उपयोग करके अपने कॉन्फिग को पूर्ण पथ पर सेट कर दिया

    (setq user-emacs-directory (file-truename "~/.emacs.d/"))
    
  4. फिर अंत में मैं ~/.emacs.dउस कॉन्फ़िगरेशन से सहानुभूति रखता हूं जिसे मैं वास्तव में उपयोग करना चाहता हूं, जैसे। अपने विन्यास का उपयोग करने के लिए मैं करूँगा ln -s ~/emacs_configs/iqbal .emacs.d। यदि आप कुछ कॉन्फ़िगरेशन आज़माना चाहते हैं, तो कॉन्फ़िगरेशन फ़ोल्डर की प्रतिलिपि बनाएँ ~/emacs_configs/whatever_nameऔर सिमलिंक को बदलें

तीसरे चरण का लाभ यह है कि मेरे व्यक्तिगत कॉन्फ़िगरेशन के साथ शुरू किए गए emacs अप्रभावित चल सकते हैं, भले ही मैं .emacs.demacs को चालू करते समय सिम्कलिन को बदल देता हूं ।

एक अन्य लाभ यह है कि HOMEबाहरी कार्यक्रमों को बदलने के लिए नहीं है emacs के साथ बातचीत करने की आवश्यकता हो सकती है अप्रभावित हैं


1
क्या इसका मतलब है कि हम सभी अलग-अलग emacs को कॉन्फ़िगर (setq user-emacs-directory (file-truename "~/.emacs.d/"))कर सकते हैं ताकि वे सभी एक साथ अप्रभावित चल सकें?
user1011471

1
सिद्धांत रूप में हां, लेकिन व्यवहार में कुछ पुस्तकालय हो सकते हैं जो उपयोग करने के ~/.emacs.dबजाय पथ को कठिन-कोड करते हैं user-emacs-directory। मैं इस तरह की एक लाइब्रेरी में कम से कम आया हूं, लेकिन दुर्भाग्य से नाम याद नहीं है।
इकबाल अंसारी

7

एक कॉन्फ़िगरेशन जो HOMEसिमलिंक के साथ नहीं बदलता है या काम करता है, वह मेरे उत्तर https://emacs.stackexchange.com/a/20508/934 में पाया जा सकता है । इस कॉन्फ़िगरेशन के साथ आप user-emacs-directoryपरिवेश चर सेट करके बदल सकते हैं :

EMACS_USER_DIRECTORY=~/.emacsenv.d/spacemacs emacs

और यह भी डेमॉन के साथ काम करता है।


5

मैं EmacsWiki से यह साफ समाधान मिला :

emacs -q -l ~/my-init-file.el

(बिल्कुल नहीं एक कस्टम निर्देशिका का उपयोग करते हुए, लेकिन अच्छी तरह से काम करता है क्योंकि आपके पास वैसे भी एक ही प्रविष्टि फ़ाइल है)


FYI करें, यह 2 साल पहले @Francesco की टिप्पणी के साथ बेमानी है।
ब्रायस


3

अपनी init फ़ाइल लोड करने से पहले अपना संस्करण सेट करें :

emacs -q --eval '(setq alt-conf t)' --load ~/.emacs

फिर, आपकी init-file में (इस मामले में ~/.emacs):

(defvar alt-conf nil)

(if alt-conf
    (let ((default-directory "~/src/elisp-test/"))
      (normal-top-level-add-subdirs-to-load-path)
      (various-alt-config-stuff)
      (message "Alternate conf"))
  (message "Regular conf"))

बहुत ही सुंदर, मेरा पसंदीदा सिस्टम, क्योंकि एमएसीएस डोमेन में सब कुछ रहता है, जैसा कि यह होना चाहिए। धन्यवाद।
जीएसएल

1

@ एफिल्स के उत्तर पर विस्तार करते हुए मैंने testrun.shअपने नए एमएसीएस कॉन्फिग को टेस्ट करने के लिए इस छोटे शेल स्क्रिप्ट (बुलाया ) को बनाया । यह अन्य मामलों में भी करने के लिए समझ में आता है (उदाहरण के लिए जब परीक्षण आपके init.el में परिवर्तन का परीक्षण करता है जो emacs को तोड़ सकता है)।

#!/bin/bash

cd $(dirname "${BASH_SOURCE[0]}")
[ -d .testrun ] || mkdir .testrun
cd .testrun
[ -h .emacs.d ] || ln -s .. .emacs.d

env HOME=`pwd` emacs

rm .emacs.d
cd ..
rm -rf .testrun

1

यहाँ @ फिल के उत्तर और HOMEपर्यावरण चर को बदलने के बारे में टिप्पणी के आधार पर एक छोटी सी स्क्रिप्ट है , और फिर इसे Emacs के भीतर पुनर्स्थापित किया जा रहा है।

#!/bin/bash

# Use it like this:
#   /path/to/this/script  EMACS_USER_DIRECTORY  [OTHER EMACS ARGS]

# You can never be too careful
set -e

# First arg = emacs user directory
#   (get a canonical, absolute path)
EMACS_USER_DIRECTORY=$(readlink -f "$1")
shift
if [ ! -d "${EMACS_USER_DIRECTORY}" ]; then
    echo "Non-existent directory: '${EMACS_USER_DIRECTORY}'"
    exit 1
fi

# Bootstrap directory
BOOTSTRAP=$(mktemp --directory --tmpdir .emacs-bootstrap.XXXXXX)
mkdir "${BOOTSTRAP}/.emacs.d"

# Bootstrap init file
cat >"${BOOTSTRAP}/.emacs.d/init.el" <<EOF
  ;; # Correctly set-up emacs-user-directory
  (setq user-emacs-directory "${EMACS_USER_DIRECTORY}/")
  (setq user-init-file (concat user-emacs-directory "init.el"))

  ;; # Reset the HOME environment variable
  (setenv "HOME" "${HOME}")

  ;; # Load the real init file and clean-up afterwards
  (unwind-protect (load user-init-file)
    (delete-directory "${BOOTSTRAP}" :recursive))
EOF

# Forward remaining arguments to emacs
exec env HOME="${BOOTSTRAP}" emacs "$@"

1

यदि उपयोग का मामला एक लिनक्स मशीन के सभी उपयोगकर्ताओं में एकल इमैक कॉन्फ़िगरेशन ".emacs.d" निर्देशिका साझा कर रहा है, तो यह समाधान https://emacs.stackexchange.com/a/4258/5488 ज्यादातर मामलों में काम करेगा, लेकिन कुछ में मामलों emacs उपयोगकर्ता- emacs- निर्देशिका (जैसे .ido.last फ़ाइल) के लिए अस्थायी फ़ाइलों को लिखने की कोशिश करता है। ऐसे मामलों में अगर साझा की गई निर्देशिका निर्देशिका ने सभी उपयोगकर्ताओं को अनुमति दी है तो यह काम करेगा, लेकिन वांछित समाधान नहीं हो सकता है क्योंकि प्रत्येक सिस्टम उपयोगकर्ता अस्थायी फ़ाइलों को संग्रहीत करने के लिए समान निर्देशिका साझा नहीं करना चाहता हो सकता है। ऐसे मामले में निम्नलिखित समाधान बेहतर विकल्प होगा।

सामान्य साझा कॉन्फ़िग फ़ाइल .emacs.d / init.el से शुरू होनी चाहिए

;; should come before calling package-initialize as it will populate
;; everything under common config "~/.emacs.d/elpa"
(setq user-init-file (or load-file-name (buffer-file-name)))
(setq package-user-dir (concat (file-name-directory user-init-file) "elpa"))

(package-initialize)

साझा किए गए कॉन्‍फ़िगर करें .emacs.d ने सभी उपयोगकर्ताओं को अनुमति दी है (लिखने की अनुमति नहीं है)

another_user $ emacs -q --load /path/to/shared/config/.emacs.d/init.el

प्रत्येक उपयोगकर्ता का अपना "~ / .emacs.d /" निर्देशिका होगा, लेकिन इसका उपयोग केवल अस्थायी फ़ाइलों को बचाने के लिए किया जाता है, लेकिन संकुल और अन्य विन्यास साझा विन्यास निर्देशिका से लोड किए जाते हैं।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.