मैं अपने स्थानीय Emacs क्लाइंट को TRAMP पर पहुँच जाने वाली दूरस्थ मशीनों के लिए $ EDITOR के रूप में कैसे उपयोग कर सकता हूँ?


44

मैं अक्सर कई दूरस्थ सर्वरों का प्रबंधन करने के लिए, फ़ाइलों को संपादित करने और दूरस्थ गोले चलाने के लिए दोनों का उपयोग करता हूं shell-mode। हालाँकि, यह तब काम नहीं करता है जब कोई कमांड EDITORकिसी फ़ाइल को संपादित करने के लिए चर का उपयोग करता है , जैसे कि crontab -eविशेष रूप से क्योंकि shell-mode"डंब" टर्मिनल है जो इसके अंदर किसी अन्य संपादक को चलाने का समर्थन नहीं करता है।

स्थानीय रूप से, मैं एक उपयुक्त कॉल के साथ ऐसा करता हूं emacsclientजिससे एक नया बफर खुल जाता है और जीवन को बहुत आसान बना देता है। दुर्भाग्य से, यह रिमोट मशीन से काम नहीं करता है।

मुझे लगता है कि मैं इस्तेमाल कर सकता हूं ed। (हा!)

मैं एक रिमोट कैसे सेट कर सकता हूं EDITORजो मुझे अपने स्थानीय एमएसीएस उदाहरण के साथ फाइल संपादित करने देगा?

जवाबों:


23

[नोट] इस जवाब को with-editorघटनाक्रम के अपडेट का पालन करने के लिए भारी रूप से संपादित किया गया था । अधिकांश टिप्पणियों की संभावना अब बहुत समझ में नहीं आएगी। कुछ नई टिप्पणी जो कर रहे हैं करना मेकअप भावना।


मैगिट में https://github.com/magit/with-editor नाम की एक लाइब्रेरी with-editorउपलब्ध है जो आपको TRAMP पर दूरस्थ मशीनों पर $ EDITOR के रूप में अपने स्थानीय Emacs का उपयोग करने की अनुमति देती है।

एक अन्य विकल्प https://github.com/habnabit/remote-emacsclient है , लेकिन यह अधिक जटिल और कम सामान्य लगता है।

with-editorMELPA के माध्यम से स्थापित करने का सबसे सरल तरीका है :

M-x package-install with-editor

अन्यथा, बस https://github.com/magit/with-editor/blob/master/with-editor.el को अपने लोड पथ पर कहीं ले जाएं और requireयह (यह भी डैश पर निर्भर करता है)।

फिर, बस शुरू shell, eshellया ansi-termनिम्नलिखित करें:

M-x with-editor-export-editor

यह आपसे पूछेगा कि आप किस $ EDITOR में रुचि रखते हैं, बस डिफ़ॉल्ट EDITORचर के लिए एंटर दबाएं । फिर शेल के अंदर आप crontab -eअपने कॉट्रैब को emacs में टाइप और एडिट कर सकते हैं । C-c C-cCrontab को बचाने के लिए या C-c C-kसंपादन रद्द करने के लिए दबाएँ ।

यदि आप अधिक स्थायी सेटअप चाहते हैं:

(add-hook 'shell-mode-hook  'with-editor-export-editor)
(add-hook 'term-mode-hook   'with-editor-export-editor)
(add-hook 'eshell-mode-hook 'with-editor-export-editor)

वैकल्पिक रूप से, आप M-x with-editor-async-shell-command crontab -e RETत्वरित कमांड के लिए उपयोग कर सकते हैं ।


क्या आप इस बारे में विस्तार से बता सकते हैं कि यह with-editorपुस्तकालय प्रश्न से कैसे संबंधित है? उपयोगी लगता है
मालाबार

@ साइलेक्स: क्या मुझे $EDITORकाम करने के लिए रिमोट मशीन पर चर को सेट करने की आवश्यकता होगी ? क्या यह सिर्फ हुक में है emacsclient?
तिकोन जेल्विस

लेकिन हाँ, यह वैसा ही दिखता है जैसा मैं चाहता हूं। मुझे इसे किसी भी तरह से देना होगा - मुझे लगता है कि यह बाकी शाखा के बिना, अपने आप से स्थापित किया जा सकता है?
तिकोन जेल्विस

1
@TikhonJelvi: यह निश्चित रूप से अपने आप ही स्थापित हो जाएगा, लेकिन अभी के लिए यह सिर्फ एक हिस्सा है git-modes। मैं इस दायित्व का बारीकी से पालन कर रहा हूं और यह सिर्फ इतना है कि इसका लेखक (@tarsius) मैगिट जारी करने में व्यस्त है, लेकिन आखिरकार यह खुद का एक पैकेज होगा। $ EDITOR के बारे में, आपको इसे स्वयं कुछ भी सेट करने की आवश्यकता नहीं है, यह तब होता है जब जरूरत होती है जब आप जो कुछ भी कमांड का उपयोग करते हैं उसे चलाते हैं। Magit $ GIT_EDITOR के साथ इस परिवाद का उपयोग करता है।
सिल्क्स

1
ध्यान दें कि यह किसी मौजूदा shell-mode/ term-modeबफर के भीतर से रिमोट पर sshing के बाद काम करना बंद कर देगा । इसे कुछ अतिरिक्त कॉन्फ़िगरेशन के साथ संबोधित किया जा सकता है, emacs.stackexchange.com/questions/5589/… देखें । यदि आपको यह काम करने के लिए मिलता है, तो कृपया अपने निष्कर्षों को github.com/magit/magit/issues/1638 पर रिपोर्ट करें ।
तारसियस

1

डिस्क्लेमर: मैंने यह कोशिश नहीं की है।

TRAMP का उपयोग करके फ़ाइल खोलने के लिए कमांड के लिए एक फंक्शन वॉच कमांड आउटपुट होने से आप रास्ते का हिस्सा प्राप्त कर सकते हैं। सुरक्षा छेद? हाँ। कार्यात्मक? शायद।

एक का प्रयोग करें shell-modeकरने के लिए एक हुक जोड़ने के लिए हुक after-change-hookमें shell-mode। यह हुक एक विशिष्ट अनुक्रम के लिए देखता है। उदाहरण:

;; RemoteTRAMP token: <authentication token maybe?>
;; RemoteTRAMP edit: /path/to/my/file

यह तब tramp-find-fileफ़ाइल को खोलने के लिए उपयोग करता है। यह अपेक्षाकृत सुरक्षित है, क्योंकि केवल रिमोट जो कर सकता है वह ट्रिगर है tramp-find-file। पहले एक पुष्टिकरण अच्छा लेकिन वैकल्पिक होगा।

जब संपादन समाप्त हो जाता है, तो एक और हुक डमी प्रोग्राम से बाहर निकल सकता है (जैसे भेजकर C-c)।

सबसे खराब स्थिति (सुरक्षा के लिए) यह है कि वे मनमाना कोड चलाने का एक तरीका ढूंढते हैं। यदि आपके पास बफर-चर हमेशा मूल्यांकन करने के लिए सेट है, तो एक दुर्भावनापूर्ण हमलावर आपकी जानकारी के बिना महत्वपूर्ण सेटिंग्स को अधिलेखित कर सकता है। वे कई बफ़र्स खोलने के कारण सेवा हमले से इनकार कर सकते हैं। पुष्टि उपरोक्त सभी को रोक सकती है।

रिमोट पर कार्यक्रम को C (या किसी अन्य भाषा) में तुच्छ रूप से लागू किया जा सकता है।


1

https://stackoverflow.com/questions/2231902/originate-edit-of-remote-file-use-emacs-tramp-from-ssh-session के पास काफी सरल स्वीकृत उत्तर है, जिसमें कितनी मात्रा है

(setq server-use-tcp t)
(setq server-host "name_of_local_machine")
(server-start)
;; Maybe also muck with `server-auth-dir`

और फिर उपयोग करें

emacsclient -f ~/.emacs.d/server/server /`hostname`:/path/to/local/file

वहाँ भी है https://stackoverflow.com/questions/12546722/using-emacs-server-and-emacsclient-on-other-machines-as-other-users जो और अधिक जटिल है, लेकिन जहां जवाब भी (लगभग) स्पर्श समान ठिकानों।


1

मेरे पास दूरस्थ होस्ट पर अपने पथ पर एक छोटी सी स्क्रिप्ट है ~/bin/ec, जो कि शालीनता के लिए शॉर्टहैंड है।

#!/bin/bash

params=()
for p in "$@"; do
  if [ "$p" == "-n" ]; then
    params+=( "$p" )
  elif [ "${p:0:1}" == "+" ]; then
    params+=( "$p" )
  else
    params+=( "/ssh:z:"$(readlink -f $p) )
  fi
done
emacsclient --server-file=$HOME/.emacs.d/server/server "${params[@]}"

यह स्क्रिप्ट गुजरती है -nऔर +खाली करने के लिए अपरिवर्तित होती है, अन्यथा आपके स्थानीय Emacs को खोलने के लिए args को फ़ाइलों के रूप में माना जाता है। प्रत्येक फ़ाइल को TRAMP प्रोटोकॉल के साथ उपसर्ग किया जाता है और इसलिए Emacs इसे खोलना जानता है। ssh:यदि आप चाहें तो आप एक अलग TRAMP प्रोटोकॉल में बदल सकते हैं।

आपको zअपने दूरस्थ मशीन के होस्टनाम से बदलना होगा । इसका उपयोग स्थानीय Emacs द्वारा TRAMP के माध्यम से जुड़ने के लिए किया जाता है। (आप hostnameसामान्यता के लिए यहाँ उपयोग करने में सक्षम हो सकते हैं । मैं zअपने स्थानीय में छोटे प्रविष्टियों का उपयोग करना पसंद करता हूँ ssh_config, और रिमोट का कोई मतलब नहीं है कि मैं यह कर रहा हूँ। यह कोशिश करो!)

उपयोग:

  • ec file दूरदराज के खोल में स्थानीय Emacs और इंतजार में फ़ाइल खोलता है
  • ec -n file दूरदराज के खोल में स्थानीय Emacs और रिटर्न में फ़ाइल खोलता है
  • export EDITOR=~/bin/ecरिमोट .bashrcमें जादू होता है

यह सुनिश्चित करने के लिए कि मेरी serverफ़ाइल अच्छी है, मेरे पास अपने स्थानीय में है .emacs, फिर से छोटे होस्टनाम का उपयोग करके z:

(setq server-use-tcp t
      server-port    9999)
(defun server-start-and-copy ()
  "Start server and copy server file to remote box."
  (interactive)
  (server-start)
  (copy-file "~/.emacs.d/server/server" "/z:.emacs.d/server/server" t)
  (chmod "/z:.emacs.d/server/server" (string-to-number "644" 8))
  )
(add-hook 'emacs-startup-hook 'server-start-and-copy)

पोर्ट 9999 एक रिमोटफॉरवर्ड है। मैंने इसे अपने स्थानीय ~/.ssh/ssh_configमें अग्रेषण को स्वचालित करने के लिए रखा , साथ ही स्पीड के लिए कंट्रोलमास्टर सामान।

Host z
HostName dev.example.com
User dev
ControlMaster auto
ControlPath ~/.ssh/z.sock
RemoteForward 9999 localhost:9999

अंत में, सुनिश्चित करें कि ssh_configयदि आप इसका उपयोग करते हैं तो ट्रम्प आपके बारे में जानते हैं :

(require 'tramp)
(tramp-set-completion-function "ssh"
  '((tramp-parse-sconfig "~/.ssh/config")))

0

थोड़ा ट्विकिंग की आवश्यकता हो सकती है, लेकिन यहाँ विचार है:

EDITOR="ssh artagnon@luneth \"emacsclient -n /`hostname`:$1\""

1
क्या आप मतलब है कि एमएसीएस चल रहा है जहां क्लाइंट के लिए दूरस्थ सर्वर से वापस ssh'ing? यह अक्सर संभव नहीं है।
गिल्स एसओ- बुराई को रोकें '

ठीक है, अगर आप उस क्लाइंट तक नहीं पहुँच सकते जहाँ Emacs चल रहा है, तो कुछ भी करना असंभव है।
आर्टगन

2
आप ssh से पूछ सकते हैं, इसके माध्यम से ~ /। Ssh / config को स्थानीय ssh श्रोता को दूरस्थ मशीन पर पोर्ट में हमेशा आगे करने के लिए। आप शायद अपने ssh-Agent को भी अग्रेषित करना चाहते हैं, हालांकि राय भिन्न है कि यह कितना सुरक्षित है। यह आपको EDITOR = "ssh $ user @ localhost: 1234 ..." करके वापस मिल सकता है
बेन हाइड

एक अन्य विकल्प शायद एडिट-
सर्वर

0

हेरोल्ड एब्नबिट इस दृष्टिकोण के साथ आया : 1

http://blog.habnab.it/blog/2013/06/25/emacsclient-and-tramp/

1 रयान बैरेट द्वारा पहले के लेख पर आधारित (जिससे वह लिंक करता है)।

FWIW में https://stackoverflow.com/q/5154224/324105 भी है , जिसमें पेट्री लेहटिनन https://gist.github.com/akheron/850795 के साथ आई है । मुझे लगता है कि अधिक जटिल समाधान बेहतर हैं, लेकिन एक बहुत ही सरल दृष्टिकोण अभी भी रुचि का हो सकता है।


0

वास्तव में आश्चर्यचकित कोई भी sshfsअभी तक उल्लेख नहीं किया है। यह वही है जो मैं आमतौर पर करता हूं जब मैं दूरस्थ जाता हूं:

1) multi-term; sshfs user@host:/dir/i/want/ /mnt/point/on/my/machine
2) open whatever I want to edit in my local emacs
3) get-term; ssh user@host to launch executables etc

हालांकि multi-term, रिमोट डायर के साथ स्थानीय कामकाजी डायर को सिंक नहीं किया जाता है, यह उन सभी अन्य समाधानों को धड़कता है जो मैंने एक लंबे शॉट द्वारा कोशिश की है। हालांकि डीआईआर ट्रैकिंग सुनिश्चित करने के लिए एक स्वागत योग्य सुविधा होगी।

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