Yerel Emacs istemcimi TRAMP üzerinden erişdiğim uzak makineler için $ EDITOR olarak nasıl kullanabilirim?


44

TRAMP'i birkaç uzak sunucuyu yönetmek için kullanıyorum, hem dosyaları düzenlemek hem de uzaktaki kabukları çalıştırmak için shell-mode. Bununla birlikte, bir komut, EDITORbir dosyayı düzenlemek için, crontab -eözellikle de shell-modeiçinde başka bir düzenleyicinin çalışmasını desteklemeyen bir "aptal" bir terminal olduğu için bir dosyayı değiştirmek için değişken kullandığında çalışmaz.

Yerel olarak bunu emacsclientyeni bir arabellek açan ve hayatı çok kolaylaştıran uygun bir çağrı ile yapıyorum . Ne yazık ki, bu uzak makineden çalışmıyor.

Sanırım kullanabilirim ed. (Hah!)

EDITORYerel Emacs örneğimle dosyaları düzenlememe izin verecek bir uzaktan kumandayı nasıl ayarlayabilirim ?

Yanıtlar:


23

[NOT] Bu cevap with-editorgelişmelerin güncellemelerini takip etmek için yoğun bir şekilde düzenlendi . Muhtemelen çoğu yorum artık pek bir anlam ifade etmiyor. Bazı yeni açıklamalar vardır yapmak mantıklı.


Magit adlı kütüphaneler with-editormevcut https://github.com/magit/with-editor Eğer TRAMP üzerinden uzak makinelerde bir $ EDİTÖR olarak yerel Emacs kullanmak için izin verir.

Diğer bir alternatif ise https://github.com/habnabit/remote-emacsclient , ancak daha karmaşık ve daha az genel görünüyor.

with-editorYüklemenin en basit yolu MELPA'dır:

M-x package-install with-editor

Aksi takdirde, yük yolunuzdan bir yere https://github.com/magit/with-editor/blob/master/with-editor.el dosyasını yakalayın ve requirebu, çizgiye bağlıdır.

Ardından hemen başlatmak shell, eshellya da ansi-termve aşağıdakileri yapın:

M-x with-editor-export-editor

Hangi EDITOR ile ilgilendiğinizi soracak, varsayılan EDITORdeğişken için enter tuşuna basmanız yeterli olacaktır . Ardından kabuğun crontab -eiçine emacs içindeki crontab'ınızı yazıp düzenleyebilirsiniz. C-c C-cCrontab'ı kaydetmek veya C-c C-kdüzenlemeyi iptal etmek için basın .

Daha kalıcı bir kurulum istiyorsanız:

(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)

Alternatif olarak M-x with-editor-async-shell-command crontab -e REThızlı komutlar için kullanabilirsiniz .


Bu with-editorkütüphanenin soru ile olan ilişkisini açıklayabilir misiniz ? Yararlı sesler
Malabarba

@Silex: Bunun çalışması için $EDITORdeğişkeni uzaktaki makinedeki bir şeye ayarlamam gerekir mi ? Sadece takılıyor emacsclientmu?
Tikhon Jelvis

Ama evet, bu tam olarak istediğim gibi görünüyor. Bir şekilde denemek zorunda kalacağım - dalın geri kalanı olmadan kendi başına kurulabilir.
Tikhon Jelvis

1
@TikhonJelvi: kesinlikle olacak kendisi tarafından yüklenemeyecek, ama şimdilik o sadece bir parçası git-modes. Bu lib'i yakından takip ediyorum ve sadece yazarı (@tarsius) magit'i bırakmakla meşguldü, ama sonunda kendi paketi olacaktı. $ EDITOR hakkında, kendinize bir şey ayarlamanıza gerek yok, kullandığınız komutları çalıştırdığınızda gerektiğinde yapılır. Magit bu lib'i $ GIT_EDITOR ile kullanıyor.
Silex

1
Bunun, bir uzak shell-mode/ uzak bir sürücüye varolan / term-modearabellekten ssheme işleminden sonra çalışacağını unutmayın . Bu, bazı ek yapılandırmalarla ele alınabilir, bkz. Emacs.stackexchange.com/questions/5589/… . İşe yararsanız , lütfen bulgularınızı github.com/magit/magit/issues/1638 adresinden bildirin .
tarsius

1

Uyarı: Bunu denemedim.

TRAMP kullanarak dosyayı açmak için bir komut için bir işlev izleme komutu çıktısı alarak yolun bir parçası olabilirsiniz. Güvenlik deliği? Evet. Fonksiyonel? Muhtemelen.

Bir kullan shell-modeiçin bir kanca eklemek için kanca after-change-hookiçinde shell-mode. Bu kanca belirli bir diziyi izler. Örnek:

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

Daha sonra tramp-find-filedosyayı açmak için kullanır . Bu nispeten güvenlidir, çünkü uzaktan kumandanın yapabileceği SADECE BİR şey tetiklenir tramp-find-file. Öncelikle bir onay iyi fakat isteğe bağlı olacaktır.

Düzenleme tamamlandığında, başka bir kanca sahte programın çıkışını tetikleyebilir (örn. Göndererek C-c).

En kötü durum (güvenlik için) keyfi kod çalıştırmanın bir yolunu bulmalarıdır. Her zaman değerlendirmek üzere ayarlanmış tampon değişkenleriniz varsa, kötü amaçlı bir saldırgan bilginiz olmadan önemli ayarların üzerine yazabilir. Ayrıca, birçok arabellek açılmasına neden olarak hizmet reddi saldırısı başlatabilirler. Onaylar muhtemelen yukarıdakilerin tümünü engelleyebilir.

Uzaktan kumandadaki program önemsizce C (veya başka bir dilde) olarak uygulanabilir.


1

https://stackoverflow.com/questions/2231902/originate-edit-of-remote-file-using-emacs-tramp-from-ssh-session , oldukça basit ve kabul edilen bir cevaba sahiptir.

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

ve sonra kullan

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

Aynı zamanda https://stackoverflow.com/questions/12546722/using-emacs-server-and-emacsclient-on-other-machines-as-other-users daha karmaşık olan ancak cevapların da (kabaca) aynı olduğu yerler bazlar.


1

Uzaktaki ana bilgisayardaki ~/bin/ecyolumda emacsclient için kısa bir senaryo var.

#!/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[@]}"

Bu komut dosyası , emacsclient'e değişmeden geçer -nve +değişmez, aksi takdirde, argümanlar yerel Emac'larınızın açılması için dosya olarak kabul edilir. Her bir dosyaya TRAMP protokolü ve ana bilgisayar eklenmiştir, böylece Emacs onu nasıl açacağını bilir. İsterseniz ssh:farklı bir TRAMP protokolüne geçebilirsiniz.

zUzak makinenizin ana bilgisayar adı ile değiştirmeniz gerekir . Bu, TRAMP ile bağlanmak için yerel Emacs tarafından kullanılır. (Kullanılacak mümkün olabilir hostnamegenelliği burada. Ben gibi minik girdileri kullanmayı tercih zbenim yerel ssh_configkısalık için ve uzak Bunu yapmamın hiçbir fikri yok. Deneyin!)

Kullanımı:

  • ec file uzaktaki kabukta yerel Emacs'ta dosya açılır ve bekler
  • ec -n file uzaktaki kabukta yerel Emacs'ta dosya açılır ve döner
  • export EDITOR=~/bin/ecuzaktan kumandada .bashrcsihir gerçekleşir

Benim sağlamak için serverdosya benim yerel bu var iyidir .emacsyine minik hostname kullanarak 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)

Bağlantı Noktası 9999, RemoteForward'tır. Bunu ~/.ssh/ssh_configyönlendirmeyi otomatikleştirmek için yerel bölgeme ve hız için ControlMaster malzemelerine koydum .

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

Son olarak, ssh_configeğer kullanırsanız TRAMP'in sizin hakkınızda bildiğinden emin olun :

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

0

Biraz tweaking gerektirebilir, ama işte fikir:

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

1
Uzak sunucudan Emacs'in çalıştığı istemciye geri dönmek mi demek istiyorsun? Bu genellikle mümkün değildir.
Gilles 'SO- kötülük yapmayı bırak'

Emacs'in çalıştığı müşteriye ulaşamıyorsan, bir şey yapmak imkansızdır.
artagnon

2
Yerel ssh dinleyicisini her zaman uzaktaki makinedeki bir bağlantı noktasına iletmesini ~ / .ssh / config aracılığıyla ssh'dan sorabilirsiniz. Muhtemelen ssh-acentanızı da iletmek istersiniz, ancak görüşler bunun ne kadar güvenli olduğuna göre değişebilir. Bu, EDITOR = "ssh $ user @ localhost: 1234 ..." yaparak geri dönmenize izin verir
Ben Hyde

Başka bir seçenek belki de edit-
server.el


0

sshfsHenüz kimsenin bahsetmediği için şaşırdım . Bu, genelde uzaklara gittiğimde yaptığım şey:

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

İken multi-termuzaktan dir ile yerel çalışma dir senkron değil, ben uzun bir atış denedim diğer tüm çözümler yener. Her ne kadar dir izleme kesinlikle hoş bir özellik olacaktır.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.