Org বাবেলে অ্যাসিঙ্ক কার্যকর করা


14

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

আমি কেবল ওব-মাতলাবকে কাস্টমাইজ করতে চাই না। এটি কারণ আমি মনে করি এটি একটি প্রয়োগের পরিবর্তে কাঠামোর স্তরে করা উচিত। অন্য কথায়, একই ভাষা পরিবর্তনের জন্য অন্যান্য ভাষার এক্সটেনশানগুলির জন্য অ্যাসিঙ্ক বৈশিষ্ট্যটি সক্ষম করা উচিত যেমন আর ভাষা।

কারও কি ভাল সমাধান হতে পারে? এখনও অবধি আমি চেষ্টা করেছি async.elপাশাপাশি deferred.elপরিবর্তন করার জন্য org-babel-execute-safely-maybeযা ob-core.elএই মুহুর্তে পাওয়া যেতে পারে ।


অন্য একটি ইঙ্গিতটি হ'ল বাবেল ব্লকটি স্ক্রিন বা টিএমউক্সে পাস করতে পারে।
stardiviner

আমি কখনই এটি বাস্তবায়ন করি নি, তবে এটি সম্ভব বলে মনে হচ্ছে। ধন্যবাদ।
ডায়াডোচোস

আমি অনুমান করি যে আমি আমার নিজের উত্তরটি গ্রহণ করছি কারণ গত এক মাস ধরে আর কোনও সমাধান পোস্ট করা হয়নি।
ডায়াডোচোস

উত্তর:


6

আমি এ পর্যন্ত আবিষ্কার করেছি যে একটি নতুন ইমাস প্রক্রিয়া তৈরি করা একটি সমাধান।

আমি যা করেছি তা এখানে।

1. একটি বহিরাগত ইম্যাকস প্রক্রিয়া শুরু করতে একটি ফাংশন যুক্ত করুন।

init.el

(defvar my/async-emacs-repl-org-babel-init-file "~/.emacs.d/org-babel-async-init" "File to load on executing async babel evaluation.")

(defun my/async-emacs-repl--start (process-name init-file)
  "Start a new Emacs process as a REPL server."
  (async-shell-command (concat
                        "TERM=vt200 emacs --batch -nw"
                        " --eval '(load \"" init-file "\")'"
                        " --eval '(while t (print (eval (read))))'"
                        )
                       process-name))

(defun my/async-emacs-repl--org-babel--start-server ()
  "Starts an Emacs process for async org-babel execution."
  (my/async-emacs-repl--start "*org-babel-async*" my/async-emacs-repl-org-babel-init-file))

(defun my/async-emacs-repl--org-babel--start-if-not-exists ()
  "Starts an Emacs process if the process does not exist."
  (if (not (get-buffer-process "*org-babel-async*")) (my/async-emacs-repl--org-babel--start-server)))

(defun my/async-emacs-repl--org-babel--execute--build-command (file-name line-number)
  "Build the command for executing `org-babel-execute-src-block'."
  (concat
   "(progn"
   " (find-file \"" file-name "\")"
   " (revert-buffer t t)"
   " (goto-line " (number-to-string line-number) ")"
   " (org-babel-execute-src-block t)"
   " (save-buffer)"
   ")"
   "\n"))

(defun my/async-emacs-repl--org-babel--execute (process-name file-name line-number)
  "Sends the command to the server to run the code-block the cursor is at."
  (process-send-string
   process-name
   (my/async-emacs-repl--org-babel--execute--build-command file-name line-number)))

(defun my/async-emacs-repl-org-babel-do-execute ()
  "Run org babel execution at point."
  (my/async-emacs-repl--org-babel--execute "*org-babel-async*" (buffer-file-name) (line-number-at-pos)))

(defun my/async-emacs-repl-org-babel-execute ()
  "Run by the user. Executes command. Starts buffer if not exists."
  (interactive)
  (save-buffer)
  (my/async-emacs-repl--org-babel--start-if-not-exists)
  (my/async-emacs-repl-org-babel-do-execute))

2. নতুন ইম্যাকস প্রক্রিয়াটিতে লোড করার জন্য একটি কনফিগার ফাইল যুক্ত করুন।

উপরের ফাংশনটি --batchমোডে ইমাস শুরু হয় । সুতরাং স্বাভাবিক init.el লোড হবে না।

পরিবর্তে, আমরা একটি সংক্ষিপ্ত কনফিগারেশন ফাইল তৈরি করতে চাই (পাথ লোড করতে এবং আরও কিছু)।

আমাদের নতুন কনফিগার ফাইলের পাথ async-emacs-repl-org-babel-init-fileউপরের স্নিপেটে সঞ্চিত ।

সংস্থা-Babel-ASYNC-init.el

;; 1
(package-initialize)

;; 2
(setq org-confirm-babel-evaluate nil)

;; 3
(let ((my/org-babel-evaluated-languages
       '(emacs-lisp
         ditaa
         python
         ruby
         C
         matlab
         clojure
         sh
         dot
         plantuml)))
  (org-babel-do-load-languages
   'org-babel-load-languages
   (mapcar (lambda (lang)
             (cons lang t))
           my/org-babel-evaluated-languages)))

এখানে আমরা ...

  1. প্যাকেজ পাথ যোগ করুন।
  2. Org- মোডকে কোড ব্লক কার্যকর করতে হবে কিনা তা জিজ্ঞাসা করতে বলুন।
  3. Org-babel কে বলুন কোনটি ভাষা প্রয়োজনীয়।

পাদটীকা 1: এই সেটিং ব্যতীত মূল্যায়ন ব্যর্থ হবে "No org-babel-execute function for $lang!"

পাদটীকা 2: অবশ্যই আপনি চাইলে একটি নতুন কনফিগার ফাইল তৈরির পরিবর্তে সাধারণ init.el লোড করতে পারেন। (setq org-babel-async-init-file "~/.emacs.d/init")আপনার যোগ করে এটি করুন init.el। তবে আমি মনে করি এই কাজের জন্য একটি কনফিগারেশন ফাইল তৈরি করা আরও সহজ।

3. অতিরিক্ত ...

যোগ init.el

;; This will stop the new process buffer from getting focus.
(setq display-buffer-alist (append display-buffer-alist '(("*org-babel-async*" display-buffer-no-window))))

;; This will automatically show the result section.
(global-auto-revert-mode 1)

যোগ সংস্থা-Babel-ASYNC-init.el

;; This will skip the "Save anyway?" confirmation of automatically saving the file when you also edited the buffer from Emacs while an asynchronous process is running.
(defun advice:verify-visited-file-modtime (orig-func &rest args) t)
(advice-add 'verify-visited-file-modtime :around 'advice:verify-visited-file-modtime)

;; This will skip the "Select coding system" prompt that appears when the result is inserted. This may vary among environments.
(setq coding-system-for-write 'utf-8)

;; This will skip the "changed on disk; really edit the buffer?" checking.
(defun ask-user-about-supersession-threat (fn) "blatantly ignore files that changed on disk")

যোগ সংস্থা-Babel-ASYNC-init.el (এইসব প্রয়োজন নাও হতে পারে। এই ম্যাটল্যাব জন্য হয়)

;; This will set MATLAB cli path.
(setq-default matlab-shell-command "/Applications/MATLAB_R2016a.app/bin/matlab")
;; The MATLAB cli path can be obtained by running `fullfile(matlabroot, 'bin')` in your MATLAB.

;; This will stop MATLAB from showing the splash (the MATLAB logo) at the beginning.
(setq-default matlab-shell-command-switches '("-nodesktop" "-nosplash"))

যোগ সংস্থা-Babel-ASYNC-init.el (এইসব প্রয়োজন নাও হতে পারে। এই জুলিয়া, আর এবং যে ব্যবহার কানা অনুলিপি করুন অন্যান্য ভাষার জন্য আছে।)

;; This will enable :session header in Julia and other languages that use ESS (Emacs speaks statistics).
(load "/path/to/ess-site")
;; This will suppress ESS from prompting for session directory.
(setq ess-ask-for-ess-directory nil)

4. ব্যবহার

(উপরের সেটআপের পরে।)

  1. আপনি সম্পাদন করতে চান কোড স্নিপেটে কার্সার সরান।
  2. চালান M-x my/async-emacs-repl-org-babel-execute(না করে পরিবর্তে C-c C-c)। এটি প্রয়োজনে একটি REPL সার্ভার হিসাবে একটি বাহ্যিক ইমাস্যাকস প্রক্রিয়া শুরু করবে এবং তারপরে আপনি যে সোর্স ব্লকে রয়েছেন তা সম্পাদন করবে।

প্রাপ্তি স্বীকার

আমি এই পোস্টটি থেকে org-babel মূল্যায়নের জন্য একটি ইমাস প্রক্রিয়া শুরু করার ধারণাটি শিখেছি । আমি লেখককে ধন্যবাদ জানাতে চাই

কাস্টমাইজেশন জন্য মন্তব্য

এখানে ধারণাটি সহজ। একটি নতুন Emacs Elisp জন্য REPL যেমন প্রক্রিয়া করবো, কি করতে শুরু find-file, একই .org ফাইল আমরা সম্পাদনা করছেন করার goto-lineএকই কার্সার পয়েন্ট, চালানোর জন্য org-babel-execute-src-block, save-buffer। ব্যবহারকারী প্রক্রিয়া বন্ধ না করা পর্যন্ত প্রস্থান করা বন্ধ করুন (অন্যথায়, গ্রাফগুলি প্রদর্শিত হওয়ার সাথে সাথেই অদৃশ্য হয়ে যাবে)। এটিকে প্রসারিত করার বিষয়ে কেউ স্বাভাবিকভাবে ভাবতে পারেন:

  • Org- মোড ব্যবহার C-c C-cকরে হাতের মাধ্যমে ফাংশনগুলি চালনার পরিবর্তে / একটি নতুন কী-বাইন্ড সেট করে (যা পরামর্শের মাধ্যমে অর্জন করা যেতে পারে)।
  • শর্তাধীন প্রক্রিয়া নাম অনুসারে পরিবর্তন: সেশন ভেরিয়েবল এবং ভাষা
  • শর্তসাপেক্ষে ভাষার উপর ভিত্তি করে init ফাইলগুলি পরিবর্তন করা।

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

ইতিহাস সম্পাদনা করুন

রিফ্যাক্টর কোড (2016-04-02)। সমাধান এখন একটি ইমাস প্রক্রিয়া পুনরায় ব্যবহার করে (2016-04-02)। সমাধানটি এখন সরল করা হয়েছে এবং এটি interactiveচালানোর জন্য কেবল একটি কমান্ড রয়েছে (2016-04-02 Added যুক্ত কনফিগারেশন (2016-04-12)।


আপনি কি দেখেছেন async.el?
পাইথননট

হ্যাঁ আমার আছে. এটি মূলত ইমাক্সের একটি নতুন প্রক্রিয়া শুরু করে এবং এতে lambdaপ্রদত্ত ফাংশনটি চালায় । আমি এই সমাধানের জন্য এটি ব্যবহার করিনি কারণ আমি নতুন প্রক্রিয়াতে ডেটা প্রেরণের কোনও উপায় খুঁজে পাইনি। Org-babel এর সেশন বৈশিষ্ট্যটি ব্যবহার করতে চাইলে প্রক্রিয়াটি যোগাযোগ করা প্রয়োজন।
diadochos

এই সমাধানে কাজ করার জন্য ধন্যবাদ। আমি চেষ্টা করেছিলাম কিন্তু এই ত্রুটি বার্তাটি পেয়েছি: TERM=vt200 emacs --batch -nw --eval '(load "~/.emacs.d/org-babel-async-init")' --eval '(while t (print (eval (read))))': exited abnormally with code 255.দুঃখিত, এটি একটি মন্তব্য হওয়া উচিত এবং উত্তর নয়, তবে আমার পর্যাপ্ত পয়েন্ট নেই।
মার্চম

এটি কার্যকর করার পরে, আপনি কি " org-babel-async " নামক একটি বাফারটি দেখতে পাচ্ছেন ? যদি আপনি এটির সন্ধান করতে পারেন তবে সেই বাফারটিতে সম্ভবত ত্রুটি সম্পর্কে আরও তথ্য রয়েছে। "কোড 255 সহ অস্বাভাবিকভাবে প্রস্থানিত হয়" সাধারণত তখন ঘটে যখন আপনি প্রচ্ছন্ন ইম্যাকস প্রক্রিয়াটি চালাতে চান এমন প্রোগ্রাম ব্যর্থ হয়। সম্ভাব্য উপায়গুলি: 1) আপনার আমার / async-emacs-repl-org-babel-init-file ফাইলটি নির্দিষ্ট করা আছে কিনা তা পরীক্ষা করুন। যদি আপনি না করেন তবে উপরে বর্ণিত হিসাবে একটি তৈরি করুন। 2) আপনি যে ভাষাটি ব্যবহার করতে চান তা তালিকাভুক্ত করেছেন কিনা তা পরীক্ষা করে দেখুন org-babel-do-load-languages। 3) আপনি যে #+SRC_BEGINব্লকটি চালাচ্ছেন তাতে একটি বাগ রয়েছে।
diadochos

ঠিক আছে, তাই বিষয়টি ছিল যে আমি চালানোর আগে আমার সংস্থা ফাইলটি সংরক্ষণ করতে হবে M-x my/async-emacs-repl-org-babel-execute, অন্যথায় "সংস্থা-Babel-ASYNC" বাফার অভিযোগ হবে: ...t/Dropbox/org/work.org locked by maarhart@htkl... (pid 68694): (s, q, p, ?)? Please type q, s, or p; or ? for help। সুতরাং এটির যদি সমাধান করা যায় তবে এটি দুর্দান্ত। এই জন্য যাইহোক ধন্যবাদ, এটি আশ্চর্যজনক! যাইহোক, এটির সাথে বাঁধাই সম্ভব C-c C-cকি org- মোডের সাথে এটি বিরোধ করবে?
মুহূর্তে

4

ভবিষ্যতের রেফারেন্স এবং বাইরের বাইরে লাইব্রেরিগুলির জন্য। আমি উত্তরটির জন্য এটি গ্রহণ করব কারণ এগুলি আরও সাম্প্রতিক।

ob-ASYNC

এখানে async.el https://github.com/linktohack/ob-async ব্যবহার করে একটি লাইব্রেরি রয়েছে

সংস্থা-Babel-Eval-ইন-repl

আমার অন্যান্য সমাধান (মেলপাতে উপলব্ধ): https://github.com/diadochos/org-babel-eval-in-repl

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