কাস্টম ব্যবহারকারী-ইমাস-ডিরেক্টরি দিয়ে ইমাকগুলি কীভাবে শুরু করবেন


58

আমি একটি কাস্টম এবং ছোট ইম্যাকস কনফিগারেশন নিয়ে কাজ করছি যা আমি কিছু বন্ধুদের সাথে তাদের ভবিষ্যতের কনফিগারেশনের জন্য বেসলাইন হিসাবে ব্যবহার করার জন্য গিট সংগ্রহস্থল হিসাবে ভাগ করতে চাই।

এর জন্য আমার কনফিগারেশনটি পরীক্ষা করার জন্য আমার কিছু উপায় প্রয়োজন এবং আমি যে সহজ সমাধানটি নিয়ে আসতে পারি তা হ'ল এরকম:

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

কিন্তু আমি এটি কাজ করে বলে মনে হচ্ছে না।

যে কোনও সহায়তা অনেক প্রশংসিত।


3
আমি ইমাস আমন্ত্রণের জন্য পরিশিষ্ট সি কমান্ড লাইন আর্গুমেন্টগুলি পড়েছি .emacs.dতবে আপনি হোম পরিবর্তন না করলে আমি কাস্টম ডিরেক্টরি দিয়ে ইমাস শুরু করার জন্য একটি সহজ কমান্ড-লাইন বিকল্প পাইনি , যা আমার কাছে সমস্যা বলে মনে হচ্ছে। লোকেরা নীচে ওয়ার্কআরউন্ড সরবরাহ করেছে, তবে আমার কাছে এটি ইমাক্সের জন্য খুব যুক্তিসঙ্গত বৈশিষ্ট্যের অনুরোধ বলে মনে হচ্ছে।
ডেভিড জে।


5
@ ডেভিডজেমস আপনি ঠিক বলেছেন: ইমা্যাকসের বাগ ট্র্যাকারে এটি সম্পর্কে একটি ইচ্ছার তালিকার আইটেমটি আসলে রয়েছে ।
ffevotte

2
আপডেট: দেখে মনে হচ্ছে এই বৈশিষ্ট্যটি ইমাস বিকাশকারীদের তেমন আগ্রহী করে না: অনুরোধটি ট্যাগ wontfixট্র্যাকারে ট্যাগ এবং বন্ধ করা হয়েছে ।
ffevotte

@ ফ্রান্সেসকো: আমি একটি গতিশীল পদ্ধতির চেষ্টা করছি যা ব্যবহারকারীর ইমাক্স ডিরেক্টরিটি "~" এর বাইরে রাখতে দেয়। আপনি একটি চেষ্টা দিতে হবে হতে পারে।
অ্যান্টোনিও

উত্তর:


39

এটির জন্য আমি যে প্রাথমিক পদ্ধতির ব্যবহার করি তা হ'ল $HOMEচালাও:

env HOME=/path/to/dir emacs

আপনি তারপর ব্যবহার /path/to/dir/.emacs.d

আপনি এই নকল হোম ডিয়ারের যে কোনও ফাইল বা গুরুত্বের ডিরেক্টরিগুলি সত্যিকারের কাছে ফিরে যেতে ইচ্ছুক হতে পারেন, যাতে ইমাসগুলি সেগুলি দেখতে পাবে।


2
এটি নিখুঁত কাজ করে!
ম্যাটিয়াস বেঙ্গস্টন

8
ইম্যাক ম্যানুয়াল অনুসারে - ইম্যাক্স আহ্বানের জন্য পরিশিষ্ট সি কমান্ড লাইন আর্গুমেন্ট - পরিবেশগত পরিবর্তনসমূহ - জেনারেল ভেরিয়েবলস , হোম সেট করে "ডিরেক্টরি ট্রিতে আপনার ফাইলগুলির অবস্থান; টিলড (() দিয়ে শুরু হওয়া ফাইলের নাম সম্প্রসারণের জন্য ব্যবহৃত হয়।" আপনি যখন আপনার আসল হোম ফোল্ডারটি থেকে দ্রুত নেভিগেট করতে বা ফাইলগুলি সন্ধান করতে চান তখন হোম পরিবর্তন করা সমস্যার জন্য একটি রেসিপি বলে মনে হয় ।
ডেভিড জে।

2
ডেভিড জেমস: হ্যাঁ, এই পদ্ধতির সাথে এটি একটি সামান্য বিরক্তি। উল্লিখিত হিসাবে, আপনি যে জিনিসগুলি আপনাকে হোমের নীচে দেখতে ইম্যাক্স প্রয়োজন সেগুলি অনুলিপি বা সিমলিংক করতে চাইবেন এবং আপনি যদি নিজের আসল হোম ডিরেক্টরিটি দেখতে চান তবে আপনাকে অবশ্যই পরম পথটি ব্যবহার করতে হবে (অথবা আপনি সেই সাথে একটি সিমলিংক যোগ করতে পারেন) )।
ফিল্ডস

3
আপনি আরম্ভের সময় ইমাকের মধ্যে মূল হোমটি পুনরুদ্ধার করার জন্যও পরীক্ষা করতে পারেন। আমি এটি চেষ্টা করি নি, তবে এটি সন্ধান করা উপযুক্ত বলে মনে হচ্ছে।
ফিল্ডস

1
@ ফিলস: আপনার পরামর্শ অনুসারে আমি চেষ্টা করেছি ।
অ্যান্টোনিও

39

.emacs.dসমান্তরালে বেশ কয়েকটি ডিরেক্টরি বজায় রাখার জন্য আমি যেভাবে ব্যবহার করি তা নিম্নলিখিত is

  1. ইমাকগুলি এভাবে শুরু হয়:

    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, যা কেবলমাত্র ডিফল্ট সিস্টেম কনফিগারেশনটি লোড করার জন্য প্রয়োজনীয় সময়টির প্রতিবেদন করে, তবে আপনার নিজের থিম ফাইলটি নয়। আপনি যদি আপনার ডিআইএস সময় বেঞ্চমার্কিং করতে আগ্রহী হন তবে আপনাকে এটি অন্য উপায়ে করতে হবে (উদাহরণস্বরূপ আমি কীভাবে এলিসপ কোডের কার্যকারিতা পরিমাপ করব? )।

  • এটি একটি সাধারণ সূচনার সমতুল্য নয় এবং আপনাকে কয়েকটি নির্দিষ্ট পয়েন্টের যত্ন নেওয়া দরকার। নির্দিষ্টভাবে:

    • after-init-hookinit ফাইলটি লোড হওয়ার আগে চালানো হয়।
    • *scratch*বাফার তৈরি করা হয় আগে Init ফাইলটি লোড করা হয়। আপনাকে এর মোডটি স্পষ্টভাবে পরিবর্তন করতে হবে (ব্যবহারের পরিবর্তে initial-major-mode)।
    • আপনাকে স্পষ্টভাবে কল করতে হবে package-initialize; এটি স্বয়ংক্রিয়ভাবে সম্পন্ন হবে না
  • যাওয়ার পথটি init.elনির্বিচারে বেছে নেওয়া যেতে পারে; বিশেষত, যে ডিরেক্টরিতে init.elথাকে তার নামকরণ করতে হবে না .emacs.d। আমি ইমাক্সের বিভিন্ন সংস্করণগুলির মধ্যে স্যুইচ করতে সক্ষম হওয়ার .emacs.d.23পাশাপাশি .emacs.d.24এটি ব্যবহার করার জন্য ব্যবহার করি (আমি যে সিস্টেমে কাজে লাগছি তা পুরনো হয়ে গেছে এবং আমি যে সমস্ত মেশিন ব্যবহার করি সেগুলিতে আমি ইম্যাক 24 ইনস্টল করতে পারি না)।

  • এই কর্মপ্রবাহের জন্য পরিবেশের (এবং বিশেষত HOMEএনভ্বর) সংশোধন করার প্রয়োজন নেই , যা আপনি ইম্যাক্সের মধ্যে থেকে প্রোগ্রামগুলি চালনা করলে কাঙ্ক্ষিত হতে পারে যা পরিবর্তিত পরিবেশ দ্বারা প্রভাবিত হতে পারে)।


1
আপনি যদি --loadএডি ফাইলটিকে ইআর ফাইল হিসাবে বিবেচনা করছেন তবে এটি কার্যকরভাবে কার্যকর করার আদেশটিকে (কার্যকরভাবে) পরিবর্তিত করে । প্রারম্ভিকদের জন্য, এটি আমার কাছে দেখে মনে হচ্ছে সাধারণ (ডিফল্ট) প্যাকেজ সূচনাটি ঘটবে না এবং (জাল) আরআর ফাইলটি মূল্যায়নের আগেইafter-init-hook চলবে । এগুলি এমন জিনিসগুলি যা আপনি চারপাশে কাজ করতে পারেন, অবশ্যই, তবে সচেতন থাকুন যে এটি ইমা্যাক্সের মতো আর্ট ফাইল হিসাবে নির্দিষ্ট পাথ ব্যবহার করে ঠিক একই জিনিস নয়।
ফিল্ড

2
@ ফিলস হ্যাঁ, আপনি ঠিক বলেছেন। এটি প্রকৃতপক্ষে কার্যকর সম্পাদনের ক্রম পরিবর্তন করে এবং এটি নিয়মিত থিম ফাইল ব্যবহারের সমতুল্য নয়। আপনার উত্তরটি প্রতিফলিত করতে আমি আমার উত্তর সম্পাদনা করেছি after-init-hook। তবে আমার বলতে হবে যে যদিও আমি এই কৌশলটি সর্বদা ব্যবহার করি তবে আমি কখনই কোনও সমস্যার মুখোমুখি হই নি after-init-hook(তবে আমি এটি স্পষ্টভাবে ব্যবহার করি না, এবং সম্ভবত আমি ভাগ্যবান যে আমি যে প্যাকেজগুলি ব্যবহার করি তাতে নির্ভর করে না) । "সাধারণ (ডিফল্ট) প্যাকেজ আরম্ভ হবে না" বলতে কী বোঝ?
ffevotte

1
আমি বলতে চাইছি যে এই পরিস্থিতিতে command-lineকল করবে না package-initialize। আপনাকে এটি নকল ডিডি ফাইলটিতে ম্যানুয়ালি কল করতে হবে।
ফিলস

1
@ ফিলস ধন্যবাদ। আমি এটি উত্তরে যুক্ত করেছিলাম, প্রাথমিক উল্লেখের মোডটিও বিশেষভাবে যত্ন নেওয়া উচিত।
ffevotte

এটি নিখুঁতভাবে কাজ করেছে .. আপনাকে ধন্যবাদ !!!
স্ট্রাইকার

15

আপনি সিমিলিংক করতে পারেন ~/.emacs.d, এটি আমি করি

  1. আমার ইম্যাকস কনফিগারেশনটি ~/.emacs.dওরিয়েন্টেড রাখার চেষ্টা করুন অর্থাৎ সমস্ত ইমাস সম্পর্কিত কনফিগারেশন ফাইলগুলি সেই ফোল্ডারে থাকা উচিত

  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.dযখন ইমেলস চলাকালীন সিমলিংকটি পরিবর্তন করি ।

আর একটি সুবিধা হ'ল যেহেতু HOMEবাহ্যিক প্রোগ্রামগুলি পরিবর্তন করা হয়নি ইম্যাকের সাথে ইন্টারেক্ট করার প্রয়োজন হতে পারে অকার্যকর


1
এর অর্থ কি এই যে আমরা সমস্ত পৃথক ইম্যাকস কনফিগারগুলিতে টুইট করতে পারি (setq user-emacs-directory (file-truename "~/.emacs.d/"))যাতে সেগুলি একই সাথে অকার্যকরভাবে চালাতে পারে?
ব্যবহারকারী 1011471

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

আমি এই ইম্যাকস উইকি থেকে ঝরঝরে সমাধানটি পেয়েছি :

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

(কাস্টম ডিরেক্টরিটি হুবহু ব্যবহার করে না, তবে দুর্দান্তভাবে কাজ করে কারণ সম্ভবত আপনার কোনও একক প্রবেশ ফাইল রয়েছে সম্ভবত)


এফওয়াইআই, এটি 2 বছর পূর্বে @ ফ্রেঞ্চসকো দ্বারা একটি মন্তব্য দিয়ে অপ্রয়োজনীয়।
ব্রাইস


3

আপনার init ফাইলটি লোড করার আগে আপনার ভার সেট করুন:

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

তারপরে, আপনার আর-ফাইলটিতে (এই ক্ষেত্রে ~/.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"))

খুব মার্জিত, আমার প্রিয় সিস্টেম, যেহেতু সবকিছু ইমাসের ডোমেনে থেকে যায়, যেমনটি হওয়া উচিত। ধন্যবাদ.
gsl

1

@ ফিলগুলি থেকে উত্তরটি প্রসারিত করে আমি testrun.shআমার নতুন emacs কনফিগারেশন পরীক্ষা করার জন্য এই ছোট্ট শেল স্ক্রিপ্ট (কল করা ) করেছি। এটি অন্যান্য ক্ষেত্রেও করণীয় বোধগম্য হতে পারে (উদাহরণস্বরূপ যখন আপনার init.el এ পরিবর্তনগুলি পরীক্ষা করা হয় যা ইমাস বিচ্ছেদ করতে পারে)।

#!/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পরিবেশের পরিবর্তনশীল পরিবর্তন সম্পর্কে মন্তব্য এবং তারপরে এটি ইম্যাক্সের মধ্যে পুনঃস্থাপনের উপর ভিত্তি করে একটি ছোট স্ক্রিপ্ট দেওয়া আছে ।

#!/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 /" ডিরেক্টরি থাকবে তবে কেবলমাত্র অস্থায়ী ফাইলগুলি সংরক্ষণ করতে ব্যবহৃত হবে তবে প্যাকেজগুলি এবং অন্যান্য কনফিগারেশন ভাগ করা কনফিগারেশন ডিরেক্টরি থেকে লোড করা হবে।

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