ควร "เลิกทำการพิมพ์" อย่างไร


12

ฉันกำลังใช้งานแอป Java ที่มี Undo / Redo stack ฉันสังเกตเห็นว่าแอพบางตัว (เช่น TextEdit บน Mac OS X) ให้คุณเลือก "เลิกทำการพิมพ์" จากเมนูแก้ไขหลังจากพิมพ์ข้อความ ฉันต้องการนำสิ่งเหล่านั้นไปใช้ในแอพของฉันด้วย แต่ฉันมีแนวทางในการค้นหาเวลาที่ยากลำบากจริงๆเกี่ยวกับวิธีการทำงานของมัน

ด้วยการทดลองและข้อผิดพลาดการคาดเดาที่ดีที่สุดของฉันเกี่ยวกับวิธีการเลิกทำการพิมพ์ดีดของ TextEdit คือ:

  • เมื่อผู้ใช้พิมพ์อักขระใหม่ (หรือพิมพ์คีย์ลบ) ให้รวมเข้าไปในรายการ Undo Typing ก่อนหน้าหากมีอักขระอยู่ที่ด้านบนสุดของ Undo stack ยกเว้นว่ามีเหตุการณ์ใดเหตุการณ์หนึ่งต่อไปนี้เกิดขึ้น
  • สร้างรายการเลิกทำการพิมพ์ใหม่หลังจากผู้ใช้พิมพ์ต่อไปหลังจากไม่มีกิจกรรมใด ๆ เป็นเวลาอย่างน้อย 15 วินาที
  • สร้างรายการ Undo Typing ใหม่ทุกครั้งหลังจากที่ผู้ใช้พิมพ์เป็นระยะเวลานานและเป็นไปตามเงื่อนไขบางประการ (ไม่ทราบว่าเป็นไปตามเวลาหรือตามจำนวนตัวอักษร)
  • สร้างรายการเลิกทำพิมพ์ดีดใหม่เสมอเมื่อเลือกข้อความใด ๆ แล้วลบหรือเขียนทับ (เลือกข้อความไม่ทำการเปลี่ยนแปลงจากนั้นกลับไปที่จุดแทรกดั้งเดิมและพิมพ์ต่อเนื่องไม่ทำให้เกิดสิ่งนี้)

ในทางปฏิบัติกลยุทธ์ของ Apple ดูเหมือนจะใช้งานได้ (อย่างน้อยมันก็ใช้ได้กับฉันเมื่อฉันพิมพ์) แต่ตามที่ระบุไว้ในจุดสุดท้ายฉันไม่สามารถเข้าใจกฎได้อย่างแท้จริง ดูเหมือนว่าโปรแกรมอื่น ๆ จะปฏิบัติตามกฎที่แตกต่างกันเช่น Microsoft Word Google ยังไม่ได้เปิดรายการของกฎที่กำหนดไว้สำหรับการติดตั้ง Undo Typing และฉันไม่ได้พบวิธีปฏิบัติที่ดีที่สุดสำหรับวิธีการทำงานของมัน ดังนั้นมันควรทำอย่างไร? หรือมันขึ้นอยู่กับการแปรเปลี่ยนของโปรแกรมเมอร์?

แก้ไข: เพื่อชี้แจงฉันไม่สนใจรายละเอียดการใช้งานในตอนนี้ ฉันอยากรู้เป็นพิเศษว่าเอกสารอ้างอิงที่เชื่อถือได้ (เช่นแนวปฏิบัติที่ดีที่สุดหรือเอกสารส่วนต่อประสานผู้ใช้) มีอยู่เพื่ออธิบายหรืออธิบายถึงวิธีการนำไปใช้ในผลิตภัณฑ์ต่างๆ


คำแนะนำของฉัน: บีบอัดการแก้ไขไปยังจุดที่มันยังคงเป็นไปได้ที่จะสร้างลำดับที่แน่นอนของปุ่มกดจากข้อมูลเลิกทำและไม่มาก ตัวอย่างเช่นนี่หมายความว่าหากผู้ใช้พิมพ์บางอย่างและใช้ backspace ทันทีเพื่อลบมันควรจะมีจุดเลิกทำระหว่างนั้น
Ambroz Bizjak

บางทีคุณอาจเพิ่ม "เลิกทำรายการการพิมพ์" ใหม่ทุกครั้งที่ผู้ใช้สร้างบรรทัดใหม่และอาจจะทุกครั้งที่มีการใช้แถบพื้นที่ทันทีหลังจากป้อนอักขระ IMO 15 วินาทีของเวลารอก่อนที่ "เลิกทำการพิมพ์รายการใหม่" อาจยาวไปหน่อย แต่นั่นเป็นเพียงฉัน (ฉันจะไปประมาณ 5 วินาที)
user82529

หรืออาจจะ "ลำดับที่แน่นอนของปุ่มกด" ควรผ่อนคลายไปที่ "สถานะของข้อความหลังจากการแก้ไขแต่ละครั้ง" แนวคิดคือการป้องกันไม่ให้ข้อความใด ๆ หายไปเนื่องจากการบีบอัด
Ambroz Bizjak

ดูเหมือนว่าฉันชอบ TextEdit จะรวมช่องว่างและลบด้วยรายการ Undo Typing สุดท้ายหากไม่ตรงตามเงื่อนไขอื่น ๆ ดังนั้น124<delete>3แล้วการยกเลิกและ redoing 123ผลใน ฉันเดาว่าข้อดีของสิ่งนี้คือมันส่งผลให้สถานะสุดท้ายของข้อความค่อนข้างคล้ายกับข้อเสนอแนะด้านบน
Thunderforge

คุณลองค้นหาสิทธิบัตรแล้วหรือยัง (กฎมักจะถูกเข้ารหัสในเลเยอร์ไลบรารีโดยไม่เปิดเผยรหัสผู้ใช้)
Donal Fellows

คำตอบ:


5

หากคุณกำลังมองหาแหล่งข้อมูลที่เชื่อถือได้ฉันคิดว่าเนื้อหาที่เกี่ยวข้องกับ Mac ที่ดีที่สุดจะพบได้ในเอกสารเลิกทำสถาปัตยกรรมจาก Apple

ฉันไม่คิดว่าคุณจะพบรายการของกฎเกี่ยวกับเมื่อคุณควรหรือไม่ควรรวมกันยกเลิกกิจกรรมแม้ว่า ความรู้สึกที่เหมาะสมสำหรับแอปพลิเคชันหนึ่งอาจไม่เหมาะสมสำหรับแอปพลิเคชันอื่น ตัวอย่างเช่นการกดแป้นพิมพ์ร่วมกันทำให้รู้สึกในโปรแกรมแก้ไขข้อความเพราะผู้ใช้อาจจะเห็นการพิมพ์ย่อหน้าเป็นการกระทำเดียวและไม่เป็น 539 การกระทำที่แยกจากกันและเพราะคุณไม่ต้องการให้ผู้ใช้ต้องยกเลิก 539 ครั้งเพื่อให้ได้ จนถึงจุดที่พวกเขาอยู่ก่อนที่จะพิมพ์ย่อหน้านั้น แต่สิ่งที่เกี่ยวกับการดำเนินการย้ายในรูปร่างในโปรแกรมวาดภาพ? หรือการปรับตามลำดับของสีเติม คุณสามารถสร้างกรณีที่ดีสำหรับการรวมตัวกันหรือไม่ขึ้นอยู่กับลักษณะของโปรแกรมของคุณ

สร้างรายการ Undo Typing ใหม่ทุกครั้งหลังจากที่ผู้ใช้พิมพ์เป็นระยะเวลานานและเป็นไปตามเงื่อนไขบางประการ (ไม่ทราบว่าเป็นไปตามเวลาหรือตามจำนวนตัวอักษร)

มันขึ้นอยู่กับการบันทึกอัตโนมัติ โชคดีสำหรับคุณรหัสที่มา TextEdit สามารถใช้ได้และแสดงความคิดเห็นได้ดี ฉันคิดว่าถ้าคุณดูมันคุณจะได้รับความคิดที่ดีขึ้นว่าเกิดอะไรขึ้นและทำไม ตัวอย่างเช่น:

- (void)saveToURL:(NSURL *)absoluteURL ofType:(NSString *)typeName forSaveOperation:(NSSaveOperationType)saveOperation completionHandler:(void (^)(NSError *error))handler {
    // Note that we do the breakUndoCoalescing call even during autosave, which 
    // means the user's undo of long typing will take them back to the last spot an 
    // autosave occured. This might seem confusing, and a more elaborate solution may 
    // be possible (cause an autosave without having to breakUndoCoalescing), but since 
    // this change is coming late in Leopard, we decided to go with the lower risk fix.
    [[self windowControllers] makeObjectsPerformSelector:@selector(breakUndoCoalescing)];
 ...

ฉันรู้ว่าคุณบอกว่าคุณไม่สนใจรายละเอียดการใช้งาน แต่ดูที่วิธีการที่แอปเปิ้ลใช้ TextEdit สามารถแจ้งการตัดสินใจของคุณสำหรับแอปพลิเคชันของคุณเอง


1
ฉันคิดว่าฉันจะประกาศคำตอบที่ดีที่สุดนี้ ฉันขอขอบคุณที่ให้ลิงก์ไปยังการนำไปปฏิบัติของ Apple รวมถึงรหัสบางอย่างสำหรับตัวอย่างเฉพาะที่ฉันให้ไว้ ฉันคิดว่าคุณพูดถูก แต่โดยทั่วไปจะขึ้นอยู่กับความต้องการของแอปพลิเคชันและไม่มีใครพยายามทำให้เป็นมาตรฐานว่าความต้องการเหล่านั้นคืออะไรและทำอย่างไรจึงจะจัดการกับมันได้
Thunderforge

1

ที่ keydown -> ตัวจับเวลาที่แสดงถึงการไม่ใช้งานของคุณจะเริ่มขึ้น

ในการกดแป้น / ตัวจับเวลา - - รีเซ็ตตัวจับเวลา

เมื่อ keydown / ไม่มีการจับเวลา -> ปรับเซลล์บล็อกใหม่เพื่อเตรียมพร้อมสำหรับสถานะที่สงวนไว้ใหม่เมื่อมีการเปลี่ยนแปลงตำแหน่ง

รอบเดินเบาไม่ทำงาน -> สร้างสถานะเลิกทำใหม่

ฉันจะไม่ติดตามตัวตนของปุ่มกด ฉันแบ่งออกเป็นบล็อกข้อความ (ตามจำนวนตัวอักษร) ที่อนุญาตให้คุณติดตามตำแหน่งโดยการหักล้างจากตำแหน่งเริ่มต้นของเซลล์ที่ใกล้ที่สุดดังนั้นคุณไม่ต้องบันทึกสถานะทั้งหมดของนวนิยายเรื่องตลกทุกครั้งที่ตัวจับเวลาว่างทำงาน . การปรับการชดเชยเหล่านั้นเมื่อเซลล์ก่อนที่เซลล์อื่นจะถูกแก้ไขเป็นส่วนที่ยุ่งยาก

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