Pregunta

Quiero algunos Emacs lisp para manipular mismo archivo en diferentes Emacs procesos.Así que escribí la siguiente secuencia de comandos para comprobar cómo lock-buffer obras.Sin embargo, se detiene al intentar bloquear el archivo por el segundo proceso de Emacs (find-and-lock-file $es2 /tmp/dummy).Tengo que ir a la otra terminal y enviar emacsclient --socket-name server-2 --eval '(kill-emacs)' para detener el proceso de Emacs.Emacs pregunte qué hacer con el archivo si puedo abrir una interfaz de usuario emacsclient -t --socket-name server-2, pero quiero hacer todo esto en el fondo y evitar el uso de Emacs mensaje para continuar con el proceso.¿Cómo puedo hacer esto?Es posible hacer que Emacs plantear algunas de error cuando se produce un error de bloqueo de un archivo?

EDITAR:@event_jr propuso una respuesta usando file-locked-p.Creo que funciona la mayoría del tiempo.Sin embargo, pienso que otros Emacs proceso puede bloquear el archivo entre la ejecución de file-locked-p y lock-buffer. Así que, voy a mantener esta pregunta abierta. Solucionado.Gracias, @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
¿Fue útil?

Solución

No parece ser una forma de hacer emacsclient --eval devolver el código de error.Pero Usted puede hacer es imprimir lo que usted necesita saber:

#!/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

EDITAR:He excavado alrededor de la fuente un poco y encontré una referencia a ask-user-about-lock, que resuelve muy bien.

Otros consejos

He encontrado otra respuesta usando run-with-timer, para omitir el emacsclient --eval error, por lo que puedo comprobar que (signal 'file-locked ...) trabaja en "normal" la situación.

#!/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
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top