TRAMP를 통해 액세스하는 원격 컴퓨터의 $ EDITOR로 로컬 Emacs 클라이언트를 어떻게 사용합니까?


44

TRAMP를 사용하여 파일을 편집하고에서 원격 셸을 실행하기위한 여러 원격 서버를 관리합니다 shell-mode. 그러나 명령이 EDITOR변수를 사용하여 파일을 편집 할 때는 작동하지 않습니다 . 예를 들어, 내부에서 다른 편집기 실행을 지원하지 않는 "dumb"터미널이 crontab -e있기 때문 shell-mode입니다.

로컬에서는 적절한 emacsclient버퍼를 사용하여 새 버퍼를 열고 인생을 매우 쉽게 만듭니다. 불행히도 원격 시스템에서는 작동하지 않습니다.

사용할 수있을 것 같아요 ed. (하!)

EDITOR로컬 Emacs 인스턴스로 파일을 편집 할 수 있는 리모컨 을 어떻게 설정 합니까?

답변:


23

[참고] 이 답변은 with-editor개발 업데이트에 따라 크게 편집되었습니다 . 대부분의 의견은 더 이상 의미가 없을 것입니다. 새로운 댓글이 있습니다 메이크업 감각.


Magit 에는 https://github.com/magit/with-editorwith-editor 에서 사용 가능한 라이브러리가 포함되어있어 TRAMP 를 통해 원격 컴퓨터에서 로컬 Emacs를 $ 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(대시에도 따라 다름).

그런 다음, 단순히 시작 shell, eshell또는 ansi-term다음을 수행 :

M-x with-editor-export-editor

관심있는 $ EDITOR를 묻는 메시지가 표시되면 기본 EDITOR변수로 Enter 키를 누르십시오 . 그런 다음 쉘 내부 crontab -e에서 emacs 내에서 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라이브러리가 질문과 어떻게 관련 되는지 자세히 설명해 주 시겠습니까? 유용한 것
Malabarba

@Silex : $EDITOR이것이 작동 하려면 변수를 원격 컴퓨터에서 무언가 로 설정해야 합니까? 그냥 연결 emacsclient됩니까?
Tikhon Jelvis

그러나 예, 이것은 내가 원하는 것과 정확히 같습니다. 어떻게 든 시도 해봐야합니다. 나머지 지점없이 자체적으로 설치할 수 있다고 가정합니까?
Tikhon Jelvis

1
@TikhonJelvi : 그것은 확실히 자체로 설치 될 수 있지만 지금은 그것의 한 부분이다 git-modes. 나는이 라이브러리를 밀접하게 따르고 있으며 저자 (@tarsius)가 magit을 발표하는 데 바쁘지만 결국 자체 패키지 일 것입니다. $ EDITOR에 관해서는 직접 설정하지 않아도되며 필요한 명령을 실행할 때 필요할 때 수행됩니다. Magit은이 라이브러리를 $ GIT_EDITOR와 함께 사용합니다.
실 렉스

1
기존 shell-mode/ term-mode버퍼 내에서 원격으로 sshing 한 후 작동이 중지됩니다 . 이는 추가 구성으로 해결할 수 있습니다 ( emacs.stackexchange.com/questions/5589/… 참조) . 그것이 효과가 있다면, github.com/magit/magit/issues/1638 에서 발견 한 것을 보고하십시오 .
tarsius

1

면책 조항 : 나는 이것을 시도하지 않았습니다.

TRAMP를 사용하여 파일을 여는 명령에 대한 기능 watch 명령 출력을 사용하여 방법의 일부를 얻을 수 있습니다. 보안 구멍? 예. 기능의? 아마.

용도 shell-mode에 후크를 추가 할 훅을 after-change-hook에서 shell-mode. 이 후크는 특정 시퀀스를 감시합니다. 예:

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

그런 다음 tramp-find-file파일을 여는 데 사용 합니다. 이것은 리모트가 할 수있는 유일한 것은 트리거 a이기 때문에 비교적 안전합니다 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/ecemacsclient의 약어입니다.

#!/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에 변경 인수는, 그렇지 않으면 인수는 열 지역 이맥스에 대한 파일로 처리됩니다. 각 파일은 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는 RemoteForward입니다. 나는 이것을 로컬 ~/.ssh/ssh_config에 넣어서 포워딩을 자동화하고 ControlMaster를 속도를 높였습니다.

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

마지막으로, TRAMP 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 's를 의미합니까? 종종 불가능합니다.
Gilles 'SO- 악마 그만'

Emacs가 실행중인 클라이언트에 연결할 수 없으면 아무 것도 할 수 없습니다.
artagnon

2
~ / .ssh / config를 통해 ssh에게 항상 로컬 ssh 리스너를 원격 시스템의 포트로 전달하도록 요청할 수 있습니다. 당신은 아마 당신의 ssh-agent를 전달하고 싶을 수도 있지만, 그것이 얼마나 안전한지에 대한 의견은 다양합니다. EDITOR = "ssh $ user @ localhost : 1234 ..."를 수행하면 다시 돌아올 수 있습니다.
Ben Hyde

아마도 콜 편집 - server.el에 작은 래퍼를 작성 될 또 다른 옵션은
stsquad


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원격 디렉토리와 로컬 작업 디렉토리 동기화하지 않습니다, 내가 긴 슛을 시도한 다른 모든 솔루션을 친다. dir 추적은 확실히 환영받는 기능입니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.