파일을 잠글 수 없을 때 Emacs 잠금 버퍼가 실패하도록 만드는 방법은 무엇입니까?

StackOverflow https://stackoverflow.com//questions/9608715

  •  09-12-2019
  •  | 
  •  

문제

나는 다른 Emacs 프로세스에서 동일한 파일을 조작하기 위해 일부 Emacs lisp를 원합니다.그래서 나는 어떻게되는지 확인하기 위해 다음 스크립트를 작성했습니다. lock-buffer 공장.그러나 두 번째 Emacs 프로세스에서 파일을 잠그려고 하면 중지됩니다(find-and-lock-file $es2 /tmp/dummy).다른 터미널로 가서 보내야 해요 emacsclient --socket-name server-2 --eval '(kill-emacs)' Emacs 프로세스를 중지합니다.Emacs는 다음과 같이 UI를 열면 파일에 대해 무엇을 해야 하는지 묻는 메시지를 표시합니다. emacsclient -t --socket-name server-2, 그러나 모든 작업을 백그라운드에서 수행하고 프로세스를 계속하기 위해 Emacs 프롬프트를 사용하지 않고 싶습니다.어떻게 해야 하나요?파일을 잠그는 데 실패하면 Emacs에서 오류가 발생하도록 할 수 있습니까?

편집하다:@event_jr은 다음을 사용하여 답변을 제안했습니다. file-locked-p.나는 그것이 대부분의 경우에 작동한다고 생각합니다.그러나 다른 Emacs 프로세스는 실행 사이에 파일을 잠글 수 있다고 생각합니다. file-locked-p 그리고 lock-buffer. 그래서 저는 이 질문을 열어두겠습니다. 해결되었습니다.@event_jr님, 감사합니다!

#!/bin/bash
es1="server-1"
es2="server-2"

start-server () {
    emacs -q --daemon --eval "(progn (setq server-name \"$1\") (server-start) (require 'cl))"
}

emacs-eval () {
    echo "@$1 >>> $2"
    emacsclient --socket-name "$1" --eval "$2"
}

kill-emacs () {
    emacs-eval "$1" '(kill-emacs)'
}

find-and-lock-file () {
    emacs-eval "$1" "(progn (find-file \"$2\") (set-buffer-modified-p t) (lock-buffer))"
}

start-server $es1
start-server $es2

find-and-lock-file $es1 /tmp/dummy
find-and-lock-file $es2 /tmp/dummy

kill-emacs $es1
kill-emacs $es2
도움이 되었습니까?

해결책

emacsclient --eval 리턴 오류 코드를 만들 수있는 방법이없는 것 같습니다.그러나 당신이 알아야 할 사항을 인쇄 할 수 있습니다 :

#!/usr/bin/env bash

es1="server-1"
es2="server-2"

emacs=/Applications/Emacs.app/Contents/MacOS/Emacs
[ -e $emacs ] || emacs=emacs

start-server () {
  read -r -d '' script <<EOF
(progn
  (setq server-name "$1")
  (server-start)
  (require 'cl)

  (defun my-set-buffer-modified-p (flag)
    (flet ((ask-user-about-lock
              (&rest args)
;;              (signal 'file-locked args)
              (apply 'error "%s was locked by %s" args)))
      (set-buffer-modified-p flag))))
EOF

  $emacs -q --daemon --eval "$script"
}

emacs-eval () {
    echo "@$1 >>> $2"
  emacsclient --socket-name "$1" --eval "$2"
}

kill-emacs () {
  emacs-eval "$1" '(kill-emacs)'
}

find-and-lock-file () {
  read -r -d '' script <<EOF
(with-current-buffer (find-file-noselect "$2")
  (my-set-buffer-modified-p t))
EOF

  emacs-eval "$1" "$script"

}

start-server $es1
start-server $es2

find-and-lock-file $es1 /tmp/dummy
find-and-lock-file $es2 /tmp/dummy

kill-emacs $es1
kill-emacs $es2
.

편집 : 나는 소스를 조금 주위에 파고 들이고 ask-user-about-lock는 그것을 멋지게 해결합니다.

다른 팁

다음을 사용하여 다른 답변을 찾았습니다. run-with-timer, emacsclient --eval 버그를 우회하여 이를 확인할 수 있습니다. (signal 'file-locked ...) "정상적인" 상황에서 작동합니다.

#!/usr/bin/env bash

es1="server-1"
es2="server-2"

emacs=/Applications/Emacs.app/Contents/MacOS/Emacs
[ -e $emacs ] || emacs=emacs

start-server () {
  read -r -d '' script <<EOF
(progn
  (setq server-name "$1")
  (server-start)
  (require 'cl)
  (defvar my-file-is-locked "undefined")

  (defun my-set-buffer-modified-p (flag)
    (flet ((ask-user-about-lock
              (&rest args)
              (setq my-file-is-locked "no")
              (signal 'file-locked args)))
      (set-buffer-modified-p flag)
      (setq my-file-is-locked "yes"))))
EOF

  $emacs -q --daemon --eval "$script"
}

emacs-eval () {
    echo "@$1 >>> $2"
  emacsclient --socket-name "$1" --eval "$2"
}

kill-emacs () {
  emacs-eval "$1" '(kill-emacs)'
}

find-and-lock-file () {
  read -r -d '' script <<EOF
(run-with-timer 0 nil (lambda ()
  (with-current-buffer (find-file-noselect "$2")
    (my-set-buffer-modified-p t))))
EOF

  emacs-eval "$1" "$script"
}

file-locked-p () {
  emacs-eval "$1" "(message \"my-file-is-locked = %s\" my-file-is-locked)"
}

start-server $es1
start-server $es2

find-and-lock-file $es1 /tmp/dummy
find-and-lock-file $es2 /tmp/dummy

file-locked-p $es1
file-locked-p $es2

kill-emacs $es1
kill-emacs $es2
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top