TRAMP経由でアクセスするリモートマシンの$ EDITORとしてローカルEmacsクライアントを使用するにはどうすればよいですか?


44

私はよく、TRAMPを使用して、ファイルの編集とでのリモートシェルの実行の両方のために、複数のリモートサーバーを管理しshell-modeます。ただし、これは、コマンドがEDITOR変数を使用してファイルを編集する場合は機能しません。crontab -e特にshell-mode、「ダム」端末はその中で別のエディターの実行をサポートしていないためです。

ローカルでは、適切な呼び出しを使用してこれを行います。この呼び出しemacsclientにより、新しいバッファーが開かれ、非常に簡単になります。残念ながら、これはリモートマシンでは機能しません。

私は使用できると思いますed。(はい!)

EDITORローカルのEmacsインスタンスでファイルを編集できるようにリモートを設定するにはどうすればよいですか?

回答:


23

[注]この回答は、with-editor開発の更新に合わせて大幅に編集されました。ほとんどのコメントは、おそらくあまり意味をなさないでしょう。いくつかの新しいコメントがありません意味をなさないが。


Magitには、https://github.com/magit/with-editorwith-editor利用可能な名前のライブラリが含まれていますこれにより、ローカルのEmacsを、TRAMP経由でリモートマシンの$ EDITORとして使用できます。

別の代替手段はhttps://github.com/habnabit/remote-emacsclientですが、より複雑で一般的ではないようです。

インストールする最も簡単な方法with-editorは、MELPA を使用することです。

M-x package-install with-editor

それ以外の場合は、https://github.com/magit/with-editor/blob/master/with-editor.elをロードパスとrequireそのパスのどこかに取り込むだけです(ダッシュにも依存します)。

次に、単に起動shelleshellまたはansi-term、次の操作を行います。

M-x with-editor-export-editor

どの$ EDITORに興味があるかを尋ねられますEDITOR。デフォルト変数の場合はEnterを押してください。次に、シェル内で、crontab -eemacs内でcrontabを入力および編集できます。を押しC-c C-cてcrontabを保存するか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ライブラリが質問にどのように関連しているかについて詳しく教えてください。便利なサウンド
マラバルバ14年

@Silex:$EDITORこれを機能させるには、リモートマシンで変数を何かに設定する必要がありますか?ただフックするだけemacsclientですか?
ティコンジェルビス14年

しかし、ええ、これはまさに私が望むもののように見えます。どうにかして試してみる必要があります。ブランチの残りの部分がなくても、単独でインストールできると思いますか?
ティコンジェルビス14年

1
@TikhonJelvi:それは確か単独でインストール可能ですが、今のところはの一部にすぎませんgit-modes。私はこのライブラリを厳密に追っていますが、その作者(@tarsius)はmagitのリリースに忙しいだけですが、最終的には独自のパッケージになります。$ EDITORについては、自分で何かを設定する必要はありません。それを使用するコマンドを実行するときに必要なときに行われます。Magitはこのライブラリを$ GIT_EDITORとともに使用します。
サイレックス14年

1
これは、既存のshell-mode/ term-modeバッファ内からリモートに送信した後に機能しなくなることに注意してください。これは、いくつかの追加構成で対処できます。emacs.stackexchange.com/ questions / 5589 /…を参照してください。動作するようになったら、github.com / magit / magit / issues / 1638で結果を報告してください。
タルシウス14

1

免責事項:私はこれを試していません。

TRAMPを使用してファイルを開くコマンドの機能監視コマンド出力を使用することで、この方法の一部を取得できます。セキュリティホール?はい。機能的?恐らく。

shell-modeフックを使用して、フックをafter-change-hookin に追加し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-using-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、emacsclientの短縮形の小さなスクリプトがあります。

#!/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+のemacsclientに変わらない引数は、そうでない場合はargsが開くように、あなたの地元のEmacs用のファイルとして扱われます。各ファイルにはTRAMPプロトコルとホストが接頭辞として付けられているため、Emacsはそれを開く方法を認識しています。ssh:必要に応じて、別のTRAMPプロトコルに変更できる場合があります。

zリモートマシンのホスト名に置き換える必要があります。これは、TRAMP経由で接続するためにローカルEmacsによって使用されます。(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はRemoteForwardです。これをローカルに配置して~/.ssh/ssh_config、転送を自動化し、さらにControlMasterを使用して速度を向上させました。

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

最後に、ssh_config使用する場合はTRAMPがあなたについて知っていることを確認してください:

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

0

少し調整する必要があるかもしれませんが、ここにアイデアがあります:

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

1
リモートサーバーからEmacsが実行されているクライアントにsshすることを意味しますか?それはしばしば不可能です。
ジル 'SO-悪であるのをやめる' 14

まあ、Emacsが実行されているクライアントに到達できない場合、何もすることはできません。
artagnon

2
〜/ .ssh / configを使用して、sshに常にローカルsshリスナーをリモートマシンのポートに転送するように依頼できます。おそらくあなたのssh-agentも転送したいと思うでしょうが、それがどれほど安全かについての意見は異なります。これにより、EDITOR = "ssh $ user @ localhost:1234 ..."を実行して元に戻すことができます。
Ben Hyde 14

おそらくコール編集server.elに小さなラッパーを書くことになるもう一つのオプションは、
stsquad

0

ハロルド・アブナビットはこのアプローチ1を思いつきました。

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

1は、Ryan Barrett(リンク先)の以前の記事に基づいています。

FWIWにはhttps://stackoverflow.com/q/5154224/324105もあり、Petri Lehtinenが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、リモートディレクトリとローカルの作業ディレクトリを同期しない、それは私がロングショットで試した他のすべてのソリューションを打ちます。確かに、ディレクトリ追跡は歓迎すべき機能ですが。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.