বিভিন্ন মেশিনের মধ্যে প্যাকেজ সিঙ্ক্রোনাইজ করুন


57

আমি বিভিন্ন জায়গায় ইম্যাক ব্যবহার করি এবং আমি সর্বত্র একই ধরণের সেটআপ এবং প্যাকেজ ইনস্টল করতে চাই। আমার ধারণা আমি সেটআপ ফাইলগুলির জন্য একটি সংস্করণ নিয়ন্ত্রণ সংগ্রহস্থল ব্যবহার করতে পারি। যেহেতু আমি প্রিলেড ব্যবহার করি , তাই হবে ~/.emacs.d/personal/

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


2
আমার জন্য ইনস্টল করা প্যাকেজগুলি আমার ইমাস সংস্করণ নিয়ন্ত্রণের সংগ্রহের একমাত্র অংশ। আমি ইমে্যাক্সের যে পুরানো সংস্করণটি ব্যবহার করতে চাই / ব্যবহার করতে চাই তার সাথে প্যাকেজগুলি বাইট-সংকলন করে এবং .elc ফাইলগুলি সংগ্রহস্থলের মধ্যে রাখি। এটি সর্বাধিক নিয়ন্ত্রণ এবং ধারাবাহিকতা সরবরাহ করে। বাণিজ্য বন্ধটি (তুলনামূলক) বৃহত আকারের সংগ্রহস্থল। আমার 6 বছরের পুরানো গিট সংগ্রহস্থলটির আকার 120MB। আমি যদি প্যাকেজগুলি অন্তর্ভুক্ত না করি তবে আমি সম্ভবত এটির 1/10 নিয়ে পালিয়ে যেতে পারি, এই কয়েক "নষ্ট" মেগাবাইট সত্যিই আমাকে চিন্তিত করবেন না।
পেপ্রিকা 21

1
আমার যোগ করা উচিত যে যখন আজকাল ELPA / MELPA / ... বেশ জনপ্রিয়, তবুও সমস্ত প্যাকেজগুলি সেগুলির মাধ্যমে পাওয়া যায় না। সুতরাং আপনি যদি এমন প্যাকেজ ব্যবহার করেন যার ম্যানুয়াল ইনস্টলেশন দরকার হয় আপনি ব্যবহার করতে পারেন এমন প্রতিটি নতুন মেশিনের প্রচেষ্টা পুনরায় তৈরি করতে না চাইতে পারেন (প্রতিটি প্যাকেজ আপগ্রেডের জন্য প্লাস)। আবার, একটি সহজ সমাধান হ'ল প্যাকেজটি আপনার ইমাস সংস্করণ নিয়ন্ত্রণের সংগ্রহস্থলে যুক্ত করা।
পেপ্রিকা 21

আপনি কি কেবল বাইটটি সাইটে সংকলন করতে পারবেন না এবং গিটের মধ্যে .elc ফাইলগুলি উপেক্ষা করে পালিয়ে যেতে পারবেন না?
বংশী

@ ভামসি: আমি বাইট-সংকলিত ফাইলগুলি সংগ্রহস্থলের মধ্যে রেখেছি কারণ কিছু (নন-ইএলপিএ) প্যাকেজগুলি তাদের নির্ভরতার কারণে সংকলন করতে কিছুটা ফিকির। এগুলির জন্য আমি প্রয়োজনীয় না হলে প্রক্রিয়াটি পুনরাবৃত্তি করতে পছন্দ করি না।
পেপ্রিকা

@ পাপ্রিকা আপনি কীভাবে আপনার সেটআপটি পাবেন তা কিছু বিশদ সরবরাহ করতে পারেন? আপনি কি .emacs.d প্লাস .emacs-এ সমস্ত কিছু সংগ্রহস্থলটিতে যুক্ত করেন এবং এটিই?
শিক্ষানবিস

উত্তর:


50

কাঙ্ক্ষিত প্রভাব অর্জনের জন্য কোনও স্বয়ংক্রিয়ভাবে উত্পন্ন মেনিফেস্ট ফাইল নেই যা আপনি সিঙ্ক্রোনাইজ করতে পারেন।

এটি বলেছিল, আপনি কিছু করতে পারেন তা হ'ল package-installআপনার ইম্যাক্স কনফিগারেশনে কল যুক্ত করা ।

(package-install 'auctex)

ধারণাটি হ'ল package-installআদর্শবান, সুতরাং প্যাকেজটি ইতিমধ্যে উপস্থিত থাকলে আসলে কিছুই হবে না। ধরে নিই যে আপনি যে প্রতিটি প্যাকেজ ব্যবহার করেন (বা নির্ভরতা গ্রাফের অন্ততপক্ষে পাতাগুলি) আপনার কাছে এমন কল রয়েছে, এটি কার্যকরভাবে মেশিনগুলিতে আপনার প্যাকেজগুলিকে সিঙ্ক্রোনাইজ করবে।


একাধিক প্যাকেজগুলির জন্য আপনি নিম্নলিখিতগুলি ব্যবহার করতে পারেন:

(setq my-package-list '(package1 package2 packageN))
(mapc #'package-install my-package-list)

2
আমি অবাক হয়েছি যে এখানে প্রস্তাবিত সমাধানের সাথে এই পদ্ধতির তুলনা কতটা সহজ । কোন পার্থক্য আছে? স্নিপেটও ব্যবহার করে package-install
স্টেনস্কায়ার

1
package.elযে যুক্ত লিঙ্ক উত্তর থেকে পরিবর্তন হয়েছে । এটি সম্ভব যে সেই সময় package-installকেবলমাত্র আনইনস্টল না করে বিদ্যমান প্যাকেজগুলিতে অপারেশন করে।
জোনাথন লেচ-পেপিন

3
দুর্ভাগ্যক্রমে এই কৌশলটি সমস্যাযুক্ত - এমনকি প্যাকেজ-সংরক্ষণাগার সংগ্রহস্থলগুলি মেশিনগুলির মধ্যে অভিন্ন এবং এসসিএম-এ নির্দিষ্ট থাকলেও। এটি নিশ্চিত করে না যে প্যাকেজ সংস্করণগুলি মেশিনগুলির মধ্যে অভিন্ন। সমস্যাটি হ'ল প্যাকেজ সংস্করণগুলি নির্দিষ্ট করা হয়নি; এই পৃথক প্যাকেজগুলি সময়ের সাথে সাথে আলাদা হতে পারে এবং তাদের নির্ভরতাগুলি বেমানান হতে পারে। এটি মেল্পার মতো সক্রিয় প্যাকেজ সংরক্ষণাগারগুলিতে খুব সহজেই ঘটতে পারে।
সিটিপেনরোজ

@ কেপটেনরোজ: এই সমস্যাটি এড়াতে আপনার কোনও পরামর্শ আছে?
শিক্ষার্থী

@ স্টুডেন্ট আমি কমপক্ষে প্রায়শই মেলপা-স্থিতিশীল ব্যবহার করে এবং প্যাকেজ আপডেট করে সমস্যা হ্রাস করেছি।
সিটিপেনরোজ

34

আমি আমার .emacs.d ডিরেক্টরিটি সংস্করণ নিয়ন্ত্রণে রাখি। তারপরে, আমার init.el এবং পরবর্তী ফাইলগুলিতে আমি প্যাকেজ সেটআপটি সংজ্ঞায়িত করতে ব্যবহার-প্যাকেজটি ব্যবহার করি । কেবলমাত্র ব্যবহার-প্যাকেজটি আপনার প্যাকেজগুলিকে অলসভাবে লোড করে না, এটি আপনি সেট আপ করা প্যাকেজ রেপো থেকে উপস্থিত না থাকলে তা তাদের চাহিদা অনুযায়ী ডাউনলোড করবে।

উদাহরণস্বরূপ, আমি গো-মোড ব্যবহার করি তবে প্রতিটি মেশিনে নয়। আমার init.el এ আমার নিম্নলিখিত রয়েছে:

(use-package go-mode
  :ensure t
  :config
  (progn
    (defun my-go-mode-hook ()
      (linum-mode t)
      (setq tab-width 4)
      (add-hook 'before-save-hook 'gofmt-before-save))
    (add-hook 'go-mode-hook 'my-go-mode-hook)))

এটি একটি মোড হুক যুক্ত করে, তবে আরও গুরুত্বপূর্ণ, :ensure tএটি নির্দিষ্ট করে প্যাকেজটি চাহিদা অনুযায়ী ডাউনলোড করবে।

কোনও মেশিন সিঙ্কে রাখার জন্য, আপনি কেবল রেপো থেকে চেকআউট বা টানতে পারেন এবং ইমাকস শুরু করতে পারেন। যে কোনও নতুন প্যাকেজ ডাউনলোড এবং ইনস্টল করা হবে।


এটি এখন আমি ক্যাসকের চেয়ে বরং খুব বেশি ব্যবহার করি, কারণ মূলত (টি। ভেরন উল্লেখ করেছেন) উইন্ডোজে ক্যাস্ক (ভাল) কাজ করে না এবং এটি অন্য একটি নির্ভরতা।
অ্যান্ডি

1
এটিও আমি এইভাবে ব্যবহার করি তবে :ensure go-modeএটি প্যাকেজের নামটি পুনরাবৃত্তি করার পরিবর্তে আপনি কেবল উল্লেখ করতে পারেন:ensure t
পেড্রো লুজ

ভাল যুক্তি! এটি একটি পুরানো উত্তর। আমি এটি আপডেট করব।
এলারসন

আপনি :hookআপনার কোডটি সহজ করার জন্য কীওয়ার্ডটিও ব্যবহার করতে পারেন ।
গিলহার্ম সালোম

17

Emacs-25-এ, ভেরিয়েবল রয়েছে package-selected-packages, সুতরাং আপনি এই পরিবর্তনশীলটিকে কাস্টমাইজ করতে পারেন এবং package-install-selected-packagesসেগুলি ইনস্টল রয়েছে কিনা তা নিশ্চিত করতে ব্যবহার করতে পারেন।


নোট করুন যে আমি এটি দেখতে পেয়েছি, সেই আদেশের নামটি কিছুটা বিভ্রান্তিকর। আমি কি এটি প্যাকেজ-ইনস্টল-নির্বাচিত-প্যাকেজগুলিতে পরিবর্তন করতে পারি?
মালবারবা

ধরে নিচ্ছি আপনার অর্থ "নোট" এর পরিবর্তে "এখন", হ্যাঁ।
স্টিফান

9

আপনি যা ব্যবহার করতে চান তা হ'ল ক্যাস্ক , যা আপনাকে একটি ক্যাস্ক ফাইল তৈরি করতে দেয় যা নির্দিষ্ট করে কোন প্যাকেজ ইনস্টল করতে হবে cask install। এটি কোনও প্যাকেজের নির্ভরতা এবং সহজেই আপনার ইমাস কনফিগারেশনের "নির্ভরতা" পরিচালনা করতে ব্যবহৃত হতে পারে। আপনার ক্যাস্ক ফাইলটি সংস্করণ নিয়ন্ত্রণের অধীনে রাখুন এবং প্রতি-মেশিনের ভিত্তিতে প্যাকেজ ইনস্টল / আপডেট করুন।


4
এটি লক্ষণীয় যে (আজকের হিসাবে) উইন্ডোজ মেশিনগুলির জন্য এই সমাধানটি কাজ করে না।
টি ভেরন

1
আপনার সমাধানের জন্য আমি আর এই সমাধানটি ব্যবহার করি না (এবং এটি ক্যাস্ক অন্য একটি নির্ভরতা)। প্যাকেজ তৈরির জন্য দুর্দান্ত; কনফিগারেশন পরিচালনার জন্য ভয়ঙ্কর।
অ্যান্ডি

6

একটি বিকল্প পদ্ধতির নিম্নলিখিত হবে: যেহেতু আমি চাই না শুধু আমার এ গিয়ে Emacs প্যাকেজ সুসংগত করতে চাই, কিন্তু অন্যান্য ফাইলের (যেমন .emacs, .bashrc, কিন্তু অন্যান্য ডিরেক্টরি) আমার সার্ভার এবং আমার ল্যাপটপ মধ্যে, আমি ব্যবহার শুরু unison, ফাইল সিঙ্ক করার জন্য এবং ডিরেক্টরি। সুতরাং আমার ল্যাপটপে কাজ করার সময় আমি unison laptopঅন্য যে কোনও কিছুর আগে সাধারণ রান করি । ~/.unison/laptop.prfইম্যাক্স সম্পর্কিত ফাইলগুলির জন্য আমার ফাইলে নিম্নলিখিত বিভাগ রয়েছে:

path = .emacs
path = .emacs.d
ignore = Path {.emacs.d/semanticdb}

যেহেতু আমার ইমাস প্যাকেজগুলি (এবং আমার ইমাক্স ব্যাকআপ এবং বুকমার্কগুলিও) এতে সঞ্চিত রয়েছে তা ~/.emacs.dনিশ্চিত করে যে আমার সমস্ত মেশিনে আমি সমস্ত কিছু পেয়েছি।

বিকল্প পদ্ধতির .emacs.dমধ্যে ডিরেক্টরিটি এমন একটি ডিরেক্টরিতে রাখা হবে যা ওয়ানক্লাউড, ড্রপবক্স বা অন্য কোনও ফাইল সিঙ্কিং পরিষেবাদির সাথে সিঙ্ক হয় এবং তারপরে ~/.emacs.dসেই ভাগ করা ডিরেক্টরি থেকে সিমলিংক তৈরি করে ।


5

package.elপ্যাকেজ ইনস্টল করার মানক উপায় হলেও , আপনি চেষ্টা করতেও পারেন el-getযা প্যাকেজগুলি ইনস্টল করার জন্য যা এলপায় (বা হতে পারে না) ইনস্টল করার জন্য খুব কার্যকর। এই উত্তরটি এই জাতীয় প্যাকেজগুলি সিঙ্ক্রোনাইজ করার সাথে সম্পর্কিত।

এল-গেট ব্যবহার করার সময় প্রদত্ত প্যাকেজগুলি ইনস্টল করার বিষয়টি আপনি যেভাবে নিশ্চিত করেছেন তা হ'ল আপনার init ফাইলটিতে নিম্নলিখিতগুলির মতো কিছু যুক্ত করা

(el-get 'sync '(packages))

প্যাকেজগুলি হ'ল প্যাকেজগুলির তালিকা যা আপনি ইনস্টল করতে চান। এই ফাংশনটির অনুরূপ package-installপ্যাকেজগুলি ইনস্টল করে কেবলমাত্র যদি তারা ইতিমধ্যে ইনস্টল না করা হয়, অন্যথায় এটি প্যাকেজগুলি কেবল সূচনা করে।


5

আমি ইমাস্যাক্স-স্টার্টার-কিট থেকে "চুরি" একটি ছোট কৌশল ব্যবহার করি (আমার মনে হয়):

(defun maybe-install-and-require (p)
  (when (not (package-installed-p p))
   (package-install p))
  (require p))

সুতরাং যখন আমার কোনও প্যাকেজ প্রয়োজন, আমি কেবল ব্যবহার করি:

(maybe-install-and-require 'magit)

ইমাক্স স্টার্টআপগুলিতে, আমার কনফিগারেশনটি মূল্যায়ন করে, package.elইনস্টল না করা থাকলে ম্যাগিট ইনস্টল করতে সরবরাহ করবে।

আপনি আমার কনফিগারেশনটি এখানে পেতে পারেন:

https://github.com/mdallastella/emacs-config/


1
একই দর্শনের অনুসরণ, আপনি ব্যবহার করতে পারে 'প্যারাডক্স-প্রয়োজন' থেকে প্যারাডক্স
csantosb

3

আমার কাছে ~ / emacs ডিরেক্টরি রয়েছে যা মার্উরিয়াল-সংস্করণ নিয়ন্ত্রিত এবং আমার ইমাস সেটআপটিতে ম্যানুয়ালি ডাউনলোড করা লাইব্রেরির জন্য (/ emacs / সাইট-লিস্প, এলপা ইনস্টলড লাইব্রেরির জন্য ~ / emacs / elpa, ~ / emacs / ইত্যাদি / রয়েছে বিভক্ত .emacs, ~ / emacs / dot-emacs.el যা আমি ml / .emacs হিসাবে সিমিলিং করি)। এই গাছের অভ্যন্তরে সমস্ত গুরুত্বপূর্ণ ফাইল থাকতে কিছু প্যাকেজটির কিছু টুইটের প্রয়োজন, তবে এটি ভালভাবে কাজ করে। Few কয়েকটি বিট যা মেশিন-নির্দিষ্ট, আমি সিস্টেমের নামে শর্তসাপেক্ষে প্রয়োগ করেছি।

সুতরাং আমি কোনও কিছু ইনস্টল / পুনরায় কনফিগার / পরিবর্তন করার পরে, আমি কেবল আমার ব্যবহৃত সমস্ত মেশিনের মধ্যে সমস্ত পরিবর্তন টান / ধাক্কা দিয়ে প্রতিশ্রুতিবদ্ধ।

অতিরিক্ত সুবিধাটি হ'ল আমার কনফিগারটির সম্পূর্ণ ইতিহাস আছে এবং কিছু ভুল হয়ে গেলে ফিরে যেতে / বিসেক্ট / রিভার্ট করতে পারি।

পিএস মুরউরিয়ালটি বিশেষভাবে উপযুক্ত বলে মনে হচ্ছে কারণ এতে প্রাকৃতিক দ্বি-পক্ষের টান / ধাক্কা রয়েছে তবে গিট বা অন্য কোনও ডিভিসিএসের সাথে অনুরূপ সেটআপটি অর্জন করা শক্ত হওয়া উচিত নয়।


3

আমি এই আছে setup-packages.elআমার Emacs সেটআপ যা থেকে কোডের একটি সংকর হয় প্রস্তাবনা এবং প্যাকেজ ম্যানেজমেন্ট উপর Tomorokoshi এর ব্লগ

setup-packages.el নিম্নলিখিতগুলি করে:

  • elpaপ্যাকেজগুলির জন্য একটি ডিরেক্টরি তৈরি করুন যদি এটি উপস্থিত না থাকে এবং এটি এবং এর উপ ডিরেক্টরি ডিরেক্টরিতে যুক্ত করুন load-path
  • মেলপার package-archivesসাথে আপডেট তালিকা।
  • my-packagesতালিকায় তালিকাভুক্ত সমস্ত প্যাকেজ ইনস্টল করা আছে কিনা তা পরীক্ষা করে দেখুন । যদি কোনও প্যাকেজ ইনস্টল না হয় তবে এটি ইনস্টল করুন।

কীভাবে বাস্তবায়ন করা যায়

  • setup-packages.elনীচে আপনার ~/.emacs.d/ডিরেক্টরিতে সংরক্ষণ করুন ।
  • সেট user-emacs-directory, setup-packages-fileএবং my-packagesআপনার ভেরিয়েবল init.elকি (load setup-packages-file)

আপনি যখন কোনও মেশিনে এই প্যাকেজগুলি ইনস্টল না করে প্রথমবারের জন্য ইমাস শুরু করবেন তখন তালিকাভুক্ত সমস্ত প্যাকগুলি my-packagesস্বয়ংক্রিয়ভাবে ইনস্টল হবে।

সেটআপ-packages.el

;; setup-packages.el - Package management

(require 'cl)
(require 'package)

;; Set the directory where you want to install the packages
(setq package-user-dir (concat user-emacs-directory "elpa/"))

;; Add melpa package source when using package list
(add-to-list 'package-archives '("melpa" . "http://melpa.org/packages/") t)

;; Load emacs packages and activate them
;; This must come before configurations of installed packages.
;; Don't delete this line.
(package-initialize)
;; `package-initialize' call is required before any of the below
;; can happen

;; Auto install the required packages
;; Method to check if all packages are installed
(defun packages-installed-p ()
  (loop for p in my-packages
        when (not (package-installed-p p)) do (return nil)
        finally (return t)))

;; if not all packages are installed, check one by one and install the missing ones.
(unless (packages-installed-p)
  ;; check for new packages (package versions)
  (message "%s" "Emacs is now refreshing its package database...")
  (package-refresh-contents)
  (message "%s" " done.")
  ;; install the missing packages
  (dolist (p my-packages)
    (when (not (package-installed-p p))
      (package-install p))))

(provide 'setup-packages)

init.el

আপনার নিম্নলিখিতগুলির প্রয়োজন হবে init.el:

(setq user-home-directory  (getenv "HOME"))
(setq user-emacs-directory (concat user-home-directory ".emacs.d/"))
(setq setup-packages-file  (expand-file-name "setup-packages.el" user-emacs-directory))

;; A list of packages to ensure are installed at launch
(setq my-packages
      '(
        ;; package1
        ;; package2
       ))

(load setup-packages-file nil :nomessage) ; Load the packages

2

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


2

আরএসওয়াইএনসি : rsyncকোনও হোম নেটওয়ার্কের মাধ্যমে বা sshদূরবর্তী সার্ভারের মাধ্যমে নির্বাচিত ফোল্ডার / ফাইলগুলি সিঙ্ক্রোনাইজ করুন ।

rsyncটার্গেটে থাকা ফাইলগুলি মুছতে সক্ষম এমন একতরফা সিঙ্ক্রোনাইজেশন ইউটিলিটি , সুতরাং দয়া করে সত্য এবং কাজটি করার আগে , উত্স এবং লক্ষ্য উভয় জায়গাতেই আপনার ডেটা ব্যাক-আপ করার বিষয়ে নিশ্চিত হন এবং--dry-run বিকল্পটি ব্যবহার করে ভালভাবে পরীক্ষা করুন ।

.authinfoফাইলটি কীভাবে সঠিকভাবে কনফিগার করতে হয় সে সম্পর্কে পড়তে https://www.gnu.org/software/emacs/manual/auth.html দেখুন .authinfoফাইলের একটি উদাহরণ (যাতে একাধিক পৃথক এন্ট্রি থাকতে পারে) নিম্নরূপ:

machine mymachine login myloginname password mypassword port myport

দূরবর্তী সার্ভারে rsync-remoteসিঙ্ক্রোনাইজ করতে ফাংশনটি কনফিগার করুন এবং ব্যবহার করুন ssh। অথবা, rsync-localএকই কম্পিউটারে বা কোনও বিশ্বস্ত হোম নেটওয়ার্কের মাধ্যমে সিঙ্ক্রোনাইজ করতে ফাংশনটি ব্যবহার করুন ।

(require 'auth-source)

;;; EXAMPLE:
;;;   (get-auth-info "12.34.567.89" "username")
;;;   (get-auth-info "localhost" "root")
(defun get-auth-info (host user &optional port)
  (let ((info (nth 0 (auth-source-search
                      :host host
                      :user user
                      :port port
                      :require '(:user :secret)
                      :create t))))
    (if info
      (let* ((port (plist-get info :port))
             (secret-maybe (plist-get info :secret))
             (secret
               (if (functionp secret-maybe)
                 (funcall secret-maybe)
                 secret-maybe)))
          (list port secret))
    nil)))

(defun rsync-filter (proc string)
  (cond
    ((string-match
       "^\\([a-zA-Z0-9_\\-\\.]+\\)@\\([a-zA-Z0-9_\\-\\.]+\\)'s password: "
       string)
      (let* ((user (substring string (match-beginning 1) (match-end 1)))
             (host (substring string (match-beginning 2) (match-end 2)))
             (password (car (cdr (get-auth-info host user)))))
        (process-send-string proc (concat password "\n"))))
    ((not (or (string-match "files\\.\\.\\.\r" string)
              (string-match "files to consider\n" string)))
      (with-current-buffer (messages-buffer)
        (let ((inhibit-read-only t))
          (goto-char (point-max))
          (when (not (bolp))
            (insert "\n"))
          (insert string)
          (when (not (bolp))
            (insert "\n")))))))

(defun rsync-remote ()
"Use rsync to a remote server via ssh.  Back-up your data first!!!"
(interactive)
  (let* (
      (host "localhost")
      (username "root")
      (port (or (car (get-auth-info host username))
                (number-to-string (read-number "Port:  "))))
      (source
        (let ((dir (expand-file-name (locate-user-emacs-file "elpa/"))))
          (if (file-directory-p dir)
            dir
            (let ((debug-on-quit nil)
                  (msg (format "`%s` is not a valid directory." dir)))
              (signal 'quit `(,msg))))))
      (target "/private/var/mobile/elpa/")
      (ssh "/usr/bin/ssh")
      (rsync "/usr/bin/rsync")
      (rsync-include-file "/path/to/include-file.txt")
      (rsync-exclude-file "/path/to/exclude-file.txt")
      (rsh (concat "--rsh=ssh -p " port " -l " username))
      (host+target (concat host ":" target)))
    (start-process
        "rsync-process"
        nil
        rsync
        "-avr" ;; must specify the `-r` argument when using `--files-from`
        "--delete"
        ;; The paths inside the exclusion file must be relative, NOT absolute.
        ;;; (concat "--files-from=" rsync-include-file)
        ;;; (concat "--exclude-from=" rsync-exclude-file)
        rsh
        source
        host+target)
    (set-process-filter (get-process "rsync-process") 'rsync-filter)
    (set-process-sentinel
      (get-process "rsync-process")
      (lambda (p e) (when (= 0 (process-exit-status p))
        (message "rsync-remote:  synchronizing ... done."))))))

(defun rsync-local ()
"Use rsync locally -- e.g., over a trusted home network.
 Back-up your data first!!!"
  (interactive)
  (let (
      (rsync-program "/usr/bin/rsync")
      (source
        (let ((dir (expand-file-name
                     (file-name-as-directory
                       (read-directory-name "Source Directory: " nil nil nil nil)))))
          (if (file-directory-p dir)
            dir
            (let ((debug-on-quit nil)
                  (msg (format "`%s` is not a valid directory." dir)))
              (signal 'quit `(,msg))))))
      (target (expand-file-name
                (file-name-as-directory
                  (read-directory-name "Target Directory: " nil nil nil nil)))))
    (unless (y-or-n-p (format "SOURCE:  %s | TARGET:  %s" source target))
      (let ((debug-on-quit nil))
        (signal 'quit `("You have exited the function."))))
    (start-process "rsync-process"
      nil
      rsync-program
      "--delete"
      "-arzhv"
      source
      target)
    (set-process-filter (get-process "rsync-process") #'rsync-process-filter)
    (set-process-sentinel
      (get-process "rsync-process")
      (lambda (p e)
        (when (= 0 (process-exit-status p))
        (message "Done!"))))))

0

https://github.com/redguardtoo/elpa-mirror সমস্ত ইনস্টল করা প্যাকেজগুলির স্থানীয় সংগ্রহস্থল তৈরি করে।

ব্যবহার সহজ, কেবল চালান M-x elpamr-create-mirror-for-installed

অন্যান্য মেশিনে, (setq package-archives '(("myelpa" . "~/myelpa/")))আপনার .emacsinোকান এবং ইমাকগুলি পুনরায় চালু করুন।

এখন সমস্ত মেশিনে, আপনি প্যাকেজগুলির ঠিক একই সংস্করণ পাবেন।

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