Làm thế nào để hoàn tác gõ gõ hành vi?


12

Tôi đang triển khai một ứng dụng Java bao gồm ngăn xếp Hoàn tác / Làm lại. Tôi đã nhận thấy rằng một số ứng dụng (như TextEdit trên Mac OS X) cho phép bạn chọn "Hoàn tác nhập" từ Menu Chỉnh sửa sau khi nhập một số văn bản. Tôi cũng muốn triển khai loại điều đó vào ứng dụng của mình, nhưng tôi đang rất khó khăn trong việc tìm hướng dẫn về cách ứng xử.

Với một số thử nghiệm và lỗi, tôi đoán tốt nhất về cách hoạt động Hoàn tác Nhập văn bản của TextEdit là:

  • Khi người dùng nhập một ký tự mới (hoặc gõ phím xóa), hãy hợp nhất nó vào mục Hoàn tác nhập trước đó nếu một mục nằm ở đầu ngăn xếp Hoàn tác, trừ khi một trong các tình huống sau xảy ra
  • Luôn tạo một mục Hoàn tác nhập mới sau khi người dùng tiếp tục nhập sau ít nhất 15 giây không hoạt động
  • Luôn tạo một mục Hoàn tác Nhập mới sau khi người dùng nhập trong một khoảng thời gian dài và một số điều kiện được đáp ứng (không thể biết liệu đây là dựa trên thời gian hay dựa trên số ký tự).
  • Luôn tạo một mục Hoàn tác nhập mới khi bất kỳ văn bản nào được chọn và sau đó xóa hoặc ghi đè (chọn văn bản, không thực hiện thay đổi, sau đó quay lại điểm chèn ban đầu và tiếp tục nhập không kích hoạt điều này)

Trong thực tế, chiến lược của Apple dường như hoạt động (ít nhất là nó hoạt động với tôi khi tôi gõ), nhưng như đã lưu ý ở điểm cuối cùng, tôi thực sự không thể tìm ra quy tắc. Ngoài ra, có vẻ như các chương trình khác tuân theo các quy tắc khác nhau, chẳng hạn như Microsoft Word. Google đã không đưa ra một danh sách các quy tắc được xác định cho bất kỳ triển khai Hoàn tác Nhập nào và tôi không bắt gặp bất kỳ thực tiễn tốt nhất nào về cách thức hoạt động của nó. Vậy nó nên cư xử thế nào? Hay chỉ là tùy theo ý thích của lập trình viên?

EDIT: Chỉ cần làm rõ, tôi không quan tâm đến chi tiết thực hiện ngay bây giờ. Tôi đặc biệt tò mò về việc có hay không một tài liệu tham khảo có thẩm quyền (ví dụ: thực tiễn tốt nhất hoặc tài liệu giao diện người dùng) tồn tại mô tả điều này hoặc mô tả về cách triển khai trên nhiều sản phẩm.


Đề nghị của tôi: nén các sửa đổi đến mức vẫn có thể xây dựng lại chuỗi chính xác các phím được nhấn từ thông tin hoàn tác và không còn nữa. Ví dụ, điều này có nghĩa là nếu người dùng gõ một cái gì đó và ngay lập tức sử dụng backspace để xóa nó, thì sẽ có một điểm hoàn tác ở giữa.
Ambroz Bizjak

Có lẽ bạn cũng có thể thêm một "Hoàn tác mục nhập" mới mỗi khi người dùng tạo một dòng mới và có thể mỗi lần thanh không gian được sử dụng ngay sau khi nhập ký tự. IMO 15 giây thời gian chờ đợi trước khi "Hoàn tác mục nhập" mới có thể hơi lâu nhưng đó chỉ là tôi. (Tôi sẽ đi trong khoảng 5 giây)
user82529

Hoặc có thể "trình tự chính xác của các phím được nhấn" nên được chuyển sang "trạng thái của văn bản sau mỗi lần sửa đổi". Ý tưởng là để ngăn chặn bất kỳ văn bản nào bị mất do nén.
Ambroz Bizjak

Theo tôi, TextEdit hợp nhất các khoảng trắng và xóa trong mục Hoàn tác Nhập cuối cùng, miễn là các điều kiện khác không được đáp ứng. Vì vậy 124<delete>3, sau đó hoàn tác và làm lại nó kết quả 123. Tôi đoán lợi thế của việc này là nó dẫn đến trạng thái cuối cùng của văn bản, giống như gợi ý ở trên.
Thunderforge

Bạn đã thử tìm kiếm bằng sáng chế chưa? (Các quy tắc thường được mã hóa trong lớp thư viện, không được hiển thị với mã người dùng.)
Donal Fellows

Câu trả lời:


5

Nếu bạn đang tìm kiếm một nguồn có thẩm quyền, tôi nghĩ rằng tài liệu tốt nhất liên quan đến Mac sẽ được tìm thấy trong tài liệu Kiến trúc hoàn tác từ Apple.

Tuy nhiên, tôi không nghĩ rằng bạn sẽ tìm thấy một danh sách các quy tắc về thời điểm bạn nên hoặc không nên kết hợp lại các sự kiện. Những gì cảm thấy đúng cho một ứng dụng sẽ không nhất thiết có ý nghĩa đối với một ứng dụng khác. Ví dụ, việc kết hợp các tổ hợp phím có ý nghĩa trong trình soạn thảo văn bản vì người dùng có thể sẽ thấy việc nhập một đoạn văn dưới dạng một hành động chứ không phải là 539 hành động riêng biệt và cũng vì bạn không muốn người dùng phải hoàn tác 539 lần chỉ để có được đến mức họ đã ở trước khi họ gõ đoạn đó. Nhưng những gì về hoạt động di chuyển trên một hình dạng trong một chương trình vẽ? Hoặc điều chỉnh tuần tự cho một màu tô? Bạn có thể tạo ra một trường hợp tốt cho những điều này được kết hợp hay không, tùy thuộc vào bản chất của chương trình của bạn.

Luôn tạo một mục Hoàn tác Nhập mới sau khi người dùng nhập trong một khoảng thời gian dài và một số điều kiện được đáp ứng (không thể biết liệu đây là dựa trên thời gian hay dựa trên số ký tự).

Nó dựa trên autosave. May mắn cho bạn, mã nguồn TextEdit có sẵn và được nhận xét tốt. Tôi nghĩ rằng nếu bạn xem nó, bạn sẽ hiểu rõ hơn về những gì đang xảy ra và tại sao. Ví dụ:

- (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)];
 ...

Tôi biết bạn nói rằng bạn chưa quan tâm đến chi tiết triển khai, nhưng nhìn vào cách Apple triển khai TextEdit có thể thông báo cho các quyết định bạn đưa ra cho ứng dụng của riêng mình.


1
Tôi nghĩ rằng tôi sẽ tuyên bố đây là câu trả lời tốt nhất. Tôi đánh giá cao việc bạn cung cấp liên kết đến việc triển khai của Apple cũng như một số mã cho ví dụ cụ thể mà tôi đã cung cấp. Tôi nghĩ rằng bạn đúng, mặc dù nó thường dựa trên nhu cầu của ứng dụng và không ai thực sự nỗ lực để chuẩn hóa những nhu cầu đó là gì và làm thế nào để giải quyết chúng.
Thunderforge

1

khi tắt phím -> bộ đếm thời gian biểu thị bắt đầu không hoạt động của bạn

khi tắt phím / hẹn giờ chạy -> đặt lại bộ hẹn giờ

khi tắt phím / không chạy hẹn giờ -> điều chỉnh các khối ô để chuẩn bị cho trạng thái được bảo toàn mới khi thay đổi vị trí

idle-timer chạy xuống -> Thiết lập trạng thái hoàn tác mới

Tôi sẽ không theo dõi danh tính nhấn phím. Tôi đã chia thành các khối văn bản di động (theo số ký tự) cho phép bạn theo dõi vị trí bằng cách bù đắp từ các vị trí bắt đầu của ô gần nhất để bạn không phải lưu toàn bộ trạng thái của tiểu thuyết tolstoy mỗi khi hết giờ . Điều chỉnh lại các độ lệch khi các ô trước khi các ô khác được chỉnh sửa là phần khó khăn.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.