নিয়মিত ইমাকের পাশাপাশি স্পেসম্যাক চালাচ্ছি: কীভাবে আলাদা .emacs.d রাখতে হবে


32

আমি স্পেসম্যাক চেষ্টা করতে চাই। তবে আমি এখনও আমার নিয়মিত ইমাস কনফিগারেশন থেকে স্যুইচ করতে চাই না, তাই আমি চাই যে বর্তমানে আমার মধ্যে থাকা কনফিগারেশনটি .emacs.dএকটি ডিরেক্টরিতে থাকতে পারে এবং স্পেসম্যাকসের জন্য সমান কনফিগারেশন অন্য ডিরেক্টরিতে থাকতে পারে। ডিরেক্টরিতে কোনটির নাম আছে তাতে আমার আপত্তি নেই।

এটি কি সম্ভব, ক্রুটের সংক্ষিপ্ত / এলডিপ্রেলএড / এই জাতীয় কৌশলগুলি? আমি এটা কিভাবে করবো?


2
ইমা্যাকস শুরু হওয়ার সাথে সাথে বিকল্পগুলির সাথে টাইমার স্থাপনের বিষয়ে আমার যেমন অনুরূপ প্রশ্নের ড্যানের জবাবটি দেখুন: emacs.stackexchange.com/questions/3588/… আমি তখন থেকেই উত্তরটির সামান্য প্রকরণ ব্যবহার করে আসছি।
আইনজীবি

1
"অন্যান্য কৌশল" বিভাগে, সম্ভবত, আপনি spacemacsইমাসকে এক্সিকিউটেবলের দিকে নির্দেশ করে একটি সিমলিংক তৈরি করতে পারেন এবং (car command-line-args)কোন init ফাইলটি চালাতে হবে তা নির্ধারণের জন্য মানটি ব্যবহার করতে পারেন। এটি অবশ্যই ধরে নেওয়া হচ্ছে যে আপনি ওএস এক্স ব্যতীত অন্য একটি ইউনিক্স সিস্টেমে চলছে ((ওএস এক্সে অ্যাপ্লিকেশন বান্ডিলগুলি যেভাবে কাজ করে তা এই কৌশলটিকে চালিত করা শক্ত করে তোলে))
হ্যারাল্ড হানচে-ওলসেন

1
এখানে অন্য পদ্ধতির দেখুন: emacs.stackexchange.com/q/4253/780
গ্লুকাস

2
আমি মাত্র ফিরে আসতে বলেছিলাম, প্রায় 18 মাস পরে, এটি এখনও স্পেসম্যাকস শিখেনি কারণ। আমি স্বীকৃত উত্তরটি নিয়ে কিছুটা কড়কড়ি করেছিলাম, আবার চেষ্টা করেছি, এখনও সত্য। Org স্তর যুক্ত করার পরে ঠিক এখনই "প্রতীকটির ফাংশন সংজ্ঞাটি বাতিল: লুপ" রয়েছে। আমি জানি না এটি কারণটির একটি অংশ, তবে এটিই ঠিক সমস্যা: একটি পালিশযুক্ত "ব্যাটারি অন্তর্ভুক্ত" প্রকল্পের জন্য, কেবল এটি শুরু করার জন্য কিছু একসাথে আবদ্ধ করা অস্বাভাবিক মনে হয়, তবে আমার কনফিগারেশনটি সমর্থন করে কিনা তা অবাক করে তোলেন? সম্ভবত অন্যায্য তবে এটি আমার বিশ্বাস হারাতে বাধ্য করে। হতে পারে আরও 18 মাসের মধ্যে এটি ঠিক হয়ে যাবে ...
ক্রড ল্যাংশন

উত্তর:


20

একটি বিকল্প হ'ল আপনি কোন ~/.emacsফাইলটিতে কোন কনফিগারেশনটি লোড করতে চান তা নির্দিষ্ট করে । যখন ইমাস শুরু হবে এটি সন্ধানের আগে এই জাতীয় ফাইলটি সন্ধান করবে ~/.emacs.d/। আরও তথ্যের জন্য আপনি ইমাস ম্যানুয়ালটিতে ইন ফাইল ফাইলটি পড়তে পারেন ।

সুতরাং উদাহরণস্বরূপ আপনি একটি তৈরি করতে ~/.spacemacs.dএবং আপনার বিদ্যমানটিকে ~/.emacs.dযেমন আছে তেমন রাখতে পারেন। তারপরে ~/.emacsআপনি যে কোনও মুডে ব্যবহারের মুডে থাকছেন তা লোড করার জন্য একটি তৈরি করুন :

(setq use-spacemacs t)   ; or nil 

(when use-spacemacs
  (setq user-emacs-directory "~/.spacemacs.d/"))   ; defaults to ~/.emacs.d/

(load (expand-file-name "init.el" user-emacs-directory))

আপনি যদি চান তবে আপনি .emacs ফাইলটি পরিবর্তন না করে কনফিগার স্যুইচ করার উপায় নিয়ে আসতে পারেন। উদাহরণস্বরূপ, আপনার .emacs এমন কিছু পরিবেশের পরিবর্তনশীল যা আপনি আপনার শেল বা স্পেসম্যাক শুরু করতে ব্যবহার করেন এমন স্ক্রিপ্টে পরীক্ষা করুন:

(setq use-spacemacs (getenv "USE_SPACEMACS"))

1
অবশ্যই, এলিস্পের ভিতর থেকে অবশ্যই একটি উপায় থাকতে হবে যা আপনি স্পেসম্যাক চালাচ্ছেন কিনা? উদাহরণস্বরূপ, fboundpস্পেসম্যাকসের সাথে অনন্য যে কোনও ক্রিয়া বা কমান্ডের জন্য (সাথে ) পরীক্ষা করে ?
হ্যারাল্ড হানচে-ওলসেন

2
অবশ্যই, তবে আমি এটি বুঝতে পারার পরে প্রশ্নটি ছিল না। স্পেসম্যাকস কেবল একটি ইম্যাক্স কনফিগারেশন এবং ওপি একাধিক স্বতন্ত্র ইম্যাকস কনফিগারেশন ডিয়ার কীভাবে বজায় রাখতে হয় তা জানতে চায়।
গ্লুকাস

1
@ হ্যারাল্ডহানচ-ওলসেন আমাকে ডাউনলোড করার সময়ও আমাকে অবাক করে দিয়েছিল, কিন্তু আমি যখন এটির বিষয়ে চিন্তাভাবনা করেছি তখন এটি পুরোপুরি অর্থপূর্ণ হয়েছিল। আমি মনে করি যে কারণটি আমরা প্রত্যাশা করি তা হ'ল বেশিরভাগ সিস্টেমে স্পেসম্যাকের মতো একটি পালিশ করা 'পণ্য' তৈরি করার জন্য কিছু নিম্ন-স্তরের সিস্টেমের ভাষা ট্র্যান্ডেল করা প্রয়োজন - তবে ইমাসে খুব বেশি এক্সটেনসিবিলিটি রয়েছে (ধন্যবাদ এলিস্প) এটি প্রয়োজনীয় নয়
করড ল্যাংশন

1
আমি এটি গ্রহণ করেছি, কিন্তু বাস্তবে এটি চেষ্টা করে দেখিনি। আমার এখন এটি যেমনটি তেমন কাজ করে না: ফাইল ত্রুটি: লোড ফাইলটি খুলতে পারে না, /home/me/.emacs.d/core/core-load-paths.el - (setq user-emacs-directory "~/.spacemacs.d/")এটির জন্য আমার দরকার ছিল কাজ ( prognআপনার শর্তাধীন স্পেসম্যাক্স শাখায়) আপনার উত্তরটিতে আপনি এটি যুক্ত করতে পারেন যাতে আমি এটি আবার গ্রহণ করতে পারি?
ক্রড ল্যাংশন

2
@glucas আমি win10 এ চলেছি, কোনও কারণে হোমকে সি: / ব্যবহারকারী / নেটে নিয়োগ দেওয়া হয়েছিল। পরিবেশগত পরিবর্তনশীল সরানো হয়েছে এবং সবকিছু ঠিকঠাক কাজ করেছে।
নাথানিয়েল

12

যেহেতু আরম্ভের জন্য কেবল একটি ফাইল লোড করা এবং অন্যদিকে আমার রানটাইমের পরিবেশ .emacs.dপরিবর্তনের HOMEপরিবর্তে সিলেকিং করা বা পরিবর্তন করা হয়েছে , তাই আমি @ গ্লুকাস প্রস্তাবিত কি তার বৈকল্পিকের জন্য বেছে নিয়েছি। আমি কোডটি ব্যবহার করেছি startup.elএবং # 15539 থেকে প্যাচটি যুক্ত করেছি বিভিন্ন ডিআইআর এর মধ্যে স্যুইচিংয়ের জন্য পরিবেশ পরিবর্তনশীল ব্যবহার করতে। যদি কিছু না দেওয়া হয় তবে ডিফল্ট ব্যবহার করা হয়।

স্পেসম্যাকস নিয়ে একটি সমস্যা ছিল: asyncপরিবর্তিত init ডিরেক্টরি সম্পর্কে জানে না এবং তাই কিছু প্রয়োজনীয় ফাইল খুঁজে পাওয়া যায় না। তবে এটি সম্প্রতি স্পেসম্যাক্সে সমাধান করা হয়েছে: .emacs.d ব্যতীত কোনও কনফিগারেশন ডিরেক্টরি ব্যবহার করার সময় ত্রুটি · সমস্যা # 3390

সুতরাং এখানে আমার ~/.emacsমূল টি-কোড কোডটির মতো আচরণ করা উচিত তবে কনফিগারযোগ্য ডিআর ডিরেক্টরি সহ:

;;; .emacs --- let the user choose the emacs environment to use

;;; Commentary:
;;; This code mimics the behaviour of `startup.el' to let the
;;; usage of the custom init directory behave just like the
;;; one and only "~/.emacs.d".
;;;
;;; By setting the environment variable `EMACS_USER_DIRECTORY'
;;; the user-emacs-directory can be chosen and if there is an
;;; `init.el' the configuration from that directory will be used.
;;; If the environment variable is not set or there is no `init.el'
;;; the default configuration directory `~/.emacs.d/' will be used.
;;;
;;; The variable `server-name' will be set to the name of the directory
;;; chosen as start path.  So if the server will be started, it can be
;;; reached with 'emacsclient -s servername'.
;;;
;;; This now works with a current version of spacemacs but does not
;;; work with `async-start' in general, if the code executed with `async'
;;; uses `user-init-dir' or makes other assumptions about the emacs
;;; start-directory.

;;; Code:
(let* ((user-init-dir-default
    (file-name-as-directory (concat "~" init-file-user "/.emacs.d")))
       (user-init-dir
    (file-name-as-directory (or (getenv "EMACS_USER_DIRECTORY")
                    user-init-dir-default)))
       (user-init-file-1
    (expand-file-name "init" user-init-dir)))
  (setq user-emacs-directory user-init-dir)
  (with-eval-after-load "server"
    (setq server-name
      (let ((server--name (file-name-nondirectory
                   (directory-file-name user-emacs-directory))))
        (if (equal server--name ".emacs.d")
        "server"
          server--name))))
  (setq user-init-file t)
  (load user-init-file-1 t t)
  (when (eq user-init-file t)
    (setq user-emacs-directory user-init-dir-default)
    (load (expand-file-name "init" user-init-dir-default) t t)))

(provide '.emacs)
;;; .emacs ends here

একটি দুর্দান্ত সংযোজন রয়েছে যা এটি অতিরিক্ত প্রচেষ্টা ছাড়াই ডেমন হিসাবে কাজ করে: সার্ভার-নামটি ডিরেক্টরি ডিরেক্টরিটির নামে সেট করা হবে। সুতরাং এখন আপনি একটি ভ্যানিলা স্পেসম্যাকস দিয়ে দ্বিতীয় ইমাস ডেমন শুরু করতে পারেন

EMACS_USER_DIRECTORY=~/.emacsenv.d/spacemacs emacs --daemon

এবং এখনও emacsclient ব্যবহার করুন

emacsclient -s spacemacs -c -e '(message "Hello spacemacs")'

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

যেহেতু আমি কেবলমাত্র সমস্যাটি asyncজানি এবং এটি পরিবর্তিত ডিআইডি ডির সম্পর্কে জানিনা, তাই আমি কিছু কনফিগারেশন যুক্ত করতে চাই asyncযে এর মধ্যে ভেরিয়েবল রয়েছে যা ডিফল্টরূপে ইনজেকশন করা উচিত, যাতে সমস্ত প্যাচ করার প্রয়োজন হয় না এর আমন্ত্রণ async-startঠিক যেমন spacemacs সম্পন্ন করেছে।


এটি সত্যই সুন্দর এবং সুন্দরভাবে কাজ করেছে ... যতক্ষণ না আমার ব্যবহারের প্রয়োজন হয় async। :-( যেহেতু আপনি পোস্ট করেছেন কয়েক মাস হয়ে গেছে, আপনার কি কোনও কাজের সুযোগ নেই?
ট্রে

দুর্ভাগ্যক্রমে নয় - তবে স্পেসম্যাক্সের জন্য এটি স্থির হয়েছে এবং সাধারণ অ্যাসিঙ্কের জন্য আমি সত্যই নিশ্চিত নই যে অন্য কোনও পরিবর্তন অবশ্যই হওয়া উচিত, কারণ async-startকিছু ছাড়াই ইম্যাক শুরু হয় এবং আপনি যদি কিছু পরিবর্তনশীল ব্যবহার করতে চান তবে আপনাকে এটি পাস করতে হবে তবে নিশ্চিত, এটি হবে সুন্দর এবং সুবিধাজনক হোন, যদি অ্যাসিঙ্কটি ভেরিয়েবলের একটি তালিকা দিয়ে কনফিগার করা যায়, যা প্রতিটি অনুরোধে ব্যবহৃত হবে async-start
উয়ে কোলোস্কা

1
এই পদ্ধতির সাথে, অন্যান্য ভেরিয়েবলগুলি থাকতে পারে যা আপনার .emacs লোড হওয়ার আগে ডিফল্ট ব্যবহারকারী-ইমাস্যাক্স-ডিরেক্টরি থেকে শুরু হয়ে যায়। উদাহরণস্বরূপ আমাকে (setq custom-theme-directory user-emacs-directory)এখানে যুক্ত করা দরকার ।
গ্লুকাস

1
এই চলকটি কোথায় সেট করা আছে তা আমি জানি না, কারণ আমি যখন এটি কোনও ন্যূনতম টেস্টেনভের ভিতরে পরীক্ষা করি তখন আমি পাই: এর মান "~ / .emacs.d /"। মূল মান ছিল "~ / .emacsenv.d / init-test /" সুতরাং এর সঠিক মান আছে তবে এটি ওভাররাইট করা হয়েছিল।
উয়ে কোলোস্কা

1
আমি প্রশ্নটি জিজ্ঞাসা করার অনেক পরে, আমি আসলে এই উত্তরটি ব্যবহার করে শেষ করেছি। আমি গ্রহণযোগ্য উত্তরটি পরিবর্তন করি নি কারণ এটি এত দীর্ঘ এবং কারণ বাস্তবায়নে আমি আসলে খুব বেশি মনোযোগ দিইনি! যদিও এই উত্তরটি আমার পক্ষে খুব কার্যকর হয়েছে।
করড ল্যাংশন

5

এটি এখানে ব্যাখ্যা করা হয়েছে , এবং এটি ডকুমেন্টেশনে যুক্ত করার জন্য একটি চলমান জনসংযোগ রয়েছে :

mkdir ~/spacemacs
git clone git@github.com:syl20bnr/spacemacs.git ~/spacemacs/.emacs.d
HOME=~/spacemacs emacs```

6
হ্যাঁ, আমি কখনও কখনও বিকল্প কনফিগার চেষ্টা করে দেখতে হোমকে পরিবর্তন করি। নেতিবাচকতাটি হ'ম এমন অন্যান্য জিনিসের জন্য ব্যবহৃত হয় যা আপনি পছন্দ করতে পছন্দ করেন না।
গ্লুকাস

3

এটি ইতিমধ্যে উত্তর দেওয়া হয়েছে এবং স্বীকৃত হয়েছে, তবে আপনি যদি বিপরীত উপায়গুলি করার নতুন পদ্ধতি চেষ্টা করার মতো মনে করেন (ইমাস কনফিগারেশনের বাইরে) আমি আপনাকে জিএনইউ স্টোর সাথে পরিচিত করার জন্য আধ ঘন্টা ব্যয় করার পরামর্শ দিচ্ছি। এটি ln -sস্টেরয়েডগুলিতে ধরণের , এবং এটি ব্যবহারের জন্য বেশ কয়েকটি পদ্ধতি থাকতে পারে। আপনার একটি উপ-ডিরেক্টরিতে (অফলাইনপ্যাপ কনফিগারস, ইম্যাকস কনফিগারেশন ইত্যাদি সহ) সম্পূর্ণ সেটআপ থাকতে পারে - যা পরিবেশ ভিত্তিক দৃষ্টিভঙ্গি হতে পারে - বা আপনার প্রতিটি অ্যাপ্লিকেশনের জন্য একটি পৃথক সাব-ডাইরেক্টরি থাকতে পারে। মিষ্টি সিজোফ্রেনিয়া।

আমার ~ / স্টো থেকে ইমাস-সম্পর্কিত তালিকা:

-> % ls ~/Stow | grep emacs
emacs 
emacs_from_scratch
spacemacs
hoodoo@T450s 2:46 [~]

আমি ব্যবহারযোগ্য হয়ে উঠতে সক্ষম হয়েছি এমন একটি প্রাথমিক কনফিগারেশন রয়েছে, একটি 'আমি খেলাপি ডিফল্টের সাথে আটকে থাকি' কনফিগারেশন এবং একটি 'আমি নিজের রোল দেব'। আমি কেবল এগুলির প্রতিটি চালু এবং বন্ধ করতে পারি এবং সর্বদা সেগুলি উপলব্ধ থাকি। প্রতিটি সাবডিরের আমার to / এর সাথে সম্পর্কিত একটি সম্পূর্ণ গাছ থাকতে পারে এবং এটি মিশ্রিত করা এবং মেলাতে বেশ কার্যকর।


আমি স্টো ব্যবহার করি ইতিমধ্যে এটি হিসাবে। তবে আপনি কীভাবে এটি এর জন্য ব্যবহার করবেন? স্টো ব্যবহার করে আপনি যেটি ব্যবহার করতে চান তার মধ্যে / আউটপুটে সিএমলিং করে আপনি নিজের .emacs.d কে কেবল 'গতিশীলভাবে স্কোপিং' করছেন? আপনি কি কখনও একই সাথে উভয় চালান? যদি তা হয় তবে আমার অনুমান হয় যে উভয়ই ইম্যাকগুলি তাদের "নিজস্ব" .emacs.d আছে। আমি অবাক হয়েছি যে যদি সেখানকার পরিস্থিতিগুলির সাথে কিছু প্রতিকুলতা দেখা দেয়, যেমন আমি সাম্প্রতিক বলতে গেলে, সেফহিস্ট, অটোস্যাভ ইত্যাদি জানি না, বিশেষত যখন ইমাকের দুটি অনুলি একেবারে আলাদা কনফিগারেশনের সাথে চলছে?
করড ল্যাংশন

না, আমি প্রয়োজন অনুসারে কনফিগারেশনগুলি স্যুইচ করেছি।
রোমান গ্রাজদান

2

@ ইউ কোলোস্কা যে প্যাচটি ব্যবহার করেছিলেন তা আমি পরীক্ষা করেছিলাম। এটি মূল শাখায় অন্তর্ভুক্ত ছিল না। আমি কিছুটা হলেও একমত, আমি মনে করি যে শাঁসটি ব্যবহার করে এবং ইমাকগুলি ছেড়ে যাওয়া সম্পর্কে এটিকে কিছুই জানা না হয়ে সমস্যার সমাধান করা উচিত।

ব্যবহারকারীর দৃষ্টিকোণ থেকে এই বৈশিষ্ট্যটি আরও যুক্তিযুক্ত হতে পারে, কিছু ব্যবহারকারীর জন্য একটি পতাকা ব্যবহার করা কম সংশ্লেষিত হবে।

আমার ব্যবহারের ক্ষেত্রে আমি আমার Emacs ইনস্টলেশন এবং স্পেসম্যাকস রাখতে চাই যাতে উপরের দুটি সমাধানের ক্ষেত্রে আমার প্রকরণটি এটির মতো কাজ করে।

শেল স্ক্রিপ্ট

স্পেসম্যাকগুলি চালু করার জন্য সমস্ত স্ক্রিপ্টের প্রথমটি:

#!/bin/sh

export EMACS_USER_DIR=~/spacemacs/emacs.d

exec emacs "$@"

এই স্ক্রিপ্টটি বলা হয় spacemacsএবং /usr/local/binফোল্ডারে ইনস্টল করা হয় ।

.emacs ফাইল

তারপরে .emacsআমার বাড়ির ফোল্ডারে আমার এমন একটি ফাইল দরকার যা পরিবেশের পরিবর্তনশীলকে যথাযথভাবে আচরণ করবে EMACS_USER_DIR

(defvar user-custom-dir (getenv "EMACS_USER_DIR"))

(when (/= (length user-custom-dir) 0)
  (setq user-emacs-directory (file-name-as-directory user-custom-dir)))

(load (expand-file-name "init.el" user-emacs-directory))

আমি এলিস্পের সাথে মোটেও অভিজ্ঞ নই তাই আমি এগুলি নিয়ে এসেছি, আরও অভিজ্ঞ ব্যক্তি সম্ভবত আরও ভাল কিছু নিয়ে আসতে পারেন। কিন্তু ওহে, এটা কাজ করে।

আই-মিছরি

তাহলে কেন একটি আইকন যুক্ত করবেন না:

আইকন

[Desktop Entry]
Name=Spacemacs
GenericName=Text Editor
Comment=Edit text
MimeType=text/english;text/plain;text/x-makefile;text/x-c++hdr;text/x-c++src;text/x-chdr;text/x-csrc;text/x-java;text/x-moc;text/x-pascal;text/x-tcl;text/x-tex;application/x-shellscript;text/x-c;text/x-c++;
Exec=spacemacs %F
Icon=/home/marcs/.icons/spacemacs.svg
Type=Application
Terminal=false
Categories=Development;TextEditor;
StartupWMClass=Emacs
Keywords=Text;Editor;

3
আপনার শেল স্ক্রিপ্ট ব্যবহার করা উচিত exec emacs "$@"
উয়ে কোলোস্কা

হ্যাঁ, টিপটির জন্য ধন্যবাদ, ঠিক ঠিক করা হয়েছে।
মার্কস

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