วิธีทำให้ emacsclient รอเมื่อใช้ตัวเลือก --eval


1

ฉันต้องการเรียกใช้ediff-merge-filesฟังก์ชันemacs เพื่อรวมไฟล์เข้ากับ unison file synchronizer เพื่อหลีกเลี่ยงการเริ่มต้นอินสแตนซ์ใหม่ฉันชอบที่จะใช้emacsclient:

emacsclient --eval '(ediff-merge-files "CURRENT1" "CURRENT2" nil "NEW")'

อย่างไรก็ตามemacsclientผลตอบแทนทันที (เช่นเดียวกับที่จะทำเมื่อได้รับไฟล์ธรรมดาและ--no-waitตัวเลือก) แน่นอนพร้อมเพรียงแล้วบ่นว่าไม่มีไฟล์ที่ถูกแก้ไข

มีวิธีให้ emacsclient รอจนกว่าฉันจะรวมเสร็จหรือไม่

คำตอบ:


1

ฉันเห็น 2 วิธีในการทำเช่นนี้

ล้อมรอบการเรียกของคุณไปยัง ediff-merge-files รอบ ๆ ฟังก์ชั่น emacs อื่นที่จะรอให้การโทรจบสามารถเล่นได้โดยใช้การแฮ็กเข้าไปใน hooks การเริ่มต้น แต่มันอาจจะยุ่งมาก

ปิดการเรียกใช้ emacsclient ด้วยสคริปต์ที่รอให้ไฟล์ใหม่ถูกสร้างขึ้นก่อนที่จะส่งคืนหากไฟล์ชั่วคราวถูกสร้างตามความต้องการนี่เป็นวิธีแก้ปัญหาที่ง่ายกว่าหากไฟล์ใหม่อาจมีอยู่แล้วคุณจะต้องใช้ ไฟล์ตัวยึดตำแหน่ง

ตัวอย่างสคริปต์ - ediff-wait มันแฮ็กและมีการตรวจสอบสติขั้นต่ำ

#!/bin/sh

[ -f $3 ] && exit 1  # merge file exists?

emacsclient --eval "( ediff-merge-files \"$1\" \"$2\" nil \"$3\" )"
while /bin/true; do
  [ -f $3 ] && exit 0
  sleep 1
done

1

Emacsclient จะรอถ้าคุณขอให้สร้างเฟรมใหม่ ดังนั้นใช้อย่างใดอย่างหนึ่ง:

emacsclient -c --eval '(ediff-merge-files "CURRENT1" "CURRENT2" nil "NEW")' ถ้าคุณต้องการสร้างเฟรมกราฟิกหรือ

emacsclient -t --eval '(ediff-merge-files "CURRENT1" "CURRENT2" nil "NEW")' ถ้าคุณต้องการกรอบเทอร์มินัล


0

ดูเหมือนว่าปัญหาในการใช้ emacsclient เป็นเครื่องมือ diff คือมันจะคืนค่า 0 เป็นรหัสสถานะทำให้เป็นไปไม่ได้ที่ git จะตัดสินว่าการผสานสำเร็จหรือไม่

มีการนำเสนอวิธีแก้ปัญหาบน Mercurial wiki:

#!/bin/bash

if [ $# -lt 1 ]; then
  echo 1>&2 "Usage: $0 local other base output"
  exit 1
fi

local=$1
other=$2
base=$3
output=$4

OUTPUT=`emacsclient --no-wait --eval "(ediff-merge-with-ancestor \"$local\" \"$other\" \"$base\" nil \"$output\")" 2>&1`
echo $OUTPUT | grep -v "Ediff Control Panel"

if echo "$OUTPUT" | grep -q '^*ERROR*'; then
    exit 1
fi

ใส่สิ่งนี้ในเชลล์สคริปต์ในเส้นทางของคุณและสิ่งที่ควรจะสวยหรู

[หมายเหตุ: ปัญหานี้ได้รับการแก้ไขในลำตัว emacs]

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.