Chia sẻ đam mê công nghệ
Giải thích

Vì sao Linux dán bằng chuột giữa khác với Ctrl+V?

PRIMARY giữ vùng văn bản được chọn, còn CLIPBOARD phục vụ lệnh sao chép chủ động. Hiểu hai cơ chế này giúp tránh dán nhầm và phân biệt thay đổi của GNOME với khả năng hỗ trợ của Wayland.

Laptop Linux hiển thị lịch sử clipboard trong Vicinae
Trình quản lý clipboard hiển thị lịch sử nội dung, khác với việc chỉ dựa vào vùng chọn hiện tại của ứng dụng. Ảnh: XDA Developers.

Tóm tắt nhanh

  • Trên ứng dụng hỗ trợ, bôi đen văn bản cập nhật PRIMARY, còn lệnh Copy/Cut cập nhật CLIPBOARD; chuột giữa và Ctrl+V vì thế có thể dán hai nội dung khác nhau.
  • Trong X11, ứng dụng nguồn thường cung cấp dữ liệu lúc dán, nên đóng ứng dụng có thể làm mất nội dung nếu không có cơ chế giữ lại.
  • Wayland có giao thức bổ sung cho PRIMARY, nhưng khả năng sử dụng còn phụ thuộc compositor và ứng dụng.
  • GNOME 50 tắt dán PRIMARY bằng chuột giữa theo mặc định ở các ứng dụng GTK chịu thiết lập này, chứ không xoá PRIMARY; người dùng vẫn có thể bật lại.

Linux có thể giữ nguyên đường dẫn bạn vừa Copy trong khi một đoạn văn mới bôi đen lại được dán ra bằng chuột giữa. Đây là hai đường truyền dữ liệu khác nhau, không phải Ctrl+V bị lỗi hay thao tác sao chép tự nhiên mất hiệu lực. Với người quen Windows hoặc macOS, điểm khó chịu nằm ở chỗ cùng một ô nhập liệu có thể nhận nội dung khác nhau chỉ vì đổi cách dán.

Cách gọi “hai clipboard” dễ nhớ, nhưng chưa mô tả hết cơ chế bên dưới: PRIMARY là vùng chọn phục vụ thao tác nhanh, còn CLIPBOARD gắn với quyết định sao chép chủ động. Phân biệt chúng hữu ích hơn việc cố tìm một tuỳ chọn sửa clipboard chung cho cả desktop, bởi hành vi còn thay đổi theo ứng dụng.

Bôi đen không thay thế nội dung đã Copy

Ưu điểm thực tế của việc tách hai cơ chế là bạn có thể chọn một đoạn cần thay mà không làm mất đoạn đã sao chép để chèn vào. Quy ước của freedesktop.org yêu cầu thao tác chọn văn bản đơn thuần chỉ cập nhật PRIMARY, không ghi đè CLIPBOARD; lệnh Paste thông thường lấy CLIPBOARD, còn nhấn chuột giữa lấy PRIMARY.

Để kiểm tra trên một ứng dụng hỗ trợ PRIMARY và đang bật dán chuột giữa, hãy Copy một đoạn văn, sau đó bôi đen một đoạn khác mà không bấm Copy. Dán vào vùng soạn thảo bằng Ctrl+V sẽ lấy đoạn đã Copy, còn chuột giữa sẽ lấy đoạn được chọn sau đó. Nên dùng văn bản thường trong ô soạn thảo trống để quan sát, thay vì thử với câu lệnh trong terminal.

Hai kênh này không có nghĩa là một kênh chỉ dành cho bàn phím, kênh còn lại chỉ dành cho chuột. Lệnh Copy trong menu cũng cập nhật CLIPBOARD; theo quy ước, Copy/Cut chủ động còn nên cập nhật cả PRIMARY. Sự khác biệt quan trọng là hành động chọn sau đó không được phá nội dung CLIPBOARD vừa lưu.

Cũng không nên coi Shift+Insert là cách gọi khác luôn đúng của Ctrl+V. Phím tắt này có thể lấy PRIMARY ở một số terminal, trong khi Konsole và ô nhập GTK lại có thể dùng CLIPBOARD. Khi cùng một tổ hợp phím cho kết quả khác giữa hai cửa sổ, cần kiểm tra quy ước phím của từng ứng dụng trước khi kết luận desktop làm thất lạc dữ liệu.

Thiết kế này có giá trị khi thường xuyên chuyển các mẩu văn bản giữa cửa sổ: vùng chọn là kênh tạm thời, còn lệnh Copy tạo một điểm lưu có chủ ý. Nhưng nó đòi hỏi người dùng biết mình đang dán từ đâu. Một tính năng không có dấu hiệu báo trước rất dễ bị hiểu thành lỗi khi người mới vô tình ấn nút cuộn xuống, thay vì chỉ xoay bánh xe.

Đóng cửa sổ nguồn có thể làm mất dữ liệu trên X11

Trong X11, “đã Copy” không nhất thiết có nghĩa là toàn bộ nội dung đã được chuyển vào một kho chứa độc lập của hệ thống. Ứng dụng nắm quyền sở hữu selection và chịu trách nhiệm cung cấp dữ liệu khi ứng dụng khác yêu cầu dán; X server làm trung gian cho trao đổi đó.

Ở thời điểm dán, ứng dụng đích gửi yêu cầu, rồi dữ liệu mới được lấy từ bên đang sở hữu selection. Cơ chế này cho phép bên nhận hỏi các định dạng sẵn có và chọn loại phù hợp: terminal có thể nhận văn bản thuần, còn trình soạn thảo có thể nhận nội dung có định dạng. Selection vì vậy giống một đầu mối trao đổi hơn là hộp chứa đã chép sẵn mọi phiên bản dữ liệu.

Đổi lại, nếu ứng dụng nguồn đóng trước khi dữ liệu được giữ ở nơi khác, đầu mối cung cấp cũng biến mất. Tài liệu clipboard của freedesktop.org nêu rõ hạn chế này và đề xuất một clipboard daemon nhận dữ liệu khi ứng dụng thoát, hoặc chương trình như xclipboard liên tục thu nhận các selection.

Đó là lý do trình quản lý clipboard không chỉ có ích vì danh sách những lần Copy trước. Nó còn có thể đảm nhiệm việc giữ nội dung để dữ liệu không phụ thuộc hoàn toàn vào vòng đời cửa sổ nguồn. Khả năng cụ thể vẫn tuỳ cách triển khai; không nên suy từ mô tả giao thức rằng mọi desktop Linux hiện nay đều mất clipboard mỗi lần đóng ứng dụng.

Khi gặp lỗi, nên tách hai phép kiểm tra: dán trước khi đóng cửa sổ nguồn, rồi dán lại sau khi đóng. Nếu chỉ lần sau thất bại, việc kiểm tra cơ chế lưu giữ clipboard có ích hơn đổi phím tắt. Ngược lại, nếu chuột giữa và Ctrl+V khác nhau ngay khi cả hai cửa sổ còn mở, vấn đề đầu tiên cần nghĩ đến vẫn là PRIMARY khác CLIPBOARD.

Di sản được giữ lại là cách chọn văn bản, không phải một nút chuột bất biến

Trang tài liệu Cedar mô tả primary selection và insertion point
Tài liệu Cedar tách vùng chọn chính và phụ, cho thấy khái niệm selection có trước quy ước dán bằng chuột giữa quen thuộc. Ảnh: XDA Developers.

Lịch sử của PRIMARY giải thích vì sao nó tồn tại, nhưng không chứng minh mọi thao tác chuột ngày nay đã có nguyên dạng từ thời Xerox. Các hệ thống cũ từng tách vùng chọn chính với vùng chọn phụ, trong khi nút dùng để chọn hay chèn văn bản thay đổi theo từng giao diện.

Tài liệu SunOS minh hoạ chèn văn bản giữa hai cửa sổ
Lệnh Stuff trong tài liệu SunOS minh hoạ nhu cầu chuyển vùng chọn giữa cửa sổ từ trước thời Linux. Ảnh: XDA Developers.

Theo các tài liệu lịch sử được XDA dẫn lại, Cedar tại Xerox PARC đã mô tả primary và secondary selection năm 1983. SunOS 1.1 năm 1984 có cơ chế selection để trao đổi văn bản giữa công cụ, với mục Stuff dùng để chèn phần được chọn. Nút giữa ở những hệ thống này có thể dùng để mở rộng vùng chọn, chứ không mặc nhiên là nút Paste như nhiều người dùng Linux quen thuộc.

SunView tiếp tục tách Primary, Secondary và Shelf, trong đó Shelf gần với clipboard chủ động hơn. Điểm đáng chú ý là nhu cầu giữ một vùng chọn mà không phá vùng khác đã xuất hiện trước Linux: người dùng cần chuyển văn bản giữa công cụ, nhưng không muốn mọi thao tác sửa nội dung đều làm mất trạng thái đang dùng.

Theo đối chiếu lịch sử của XDA, X11R1 năm 1987 đã định sẵn PRIMARY là atom 1 và SECONDARY là atom 2, trong khi CLIPBOARD không nằm trong bảng atom cố định đó. Atom là tên định danh trong giao thức; việc được gán một số không tự buộc mọi ứng dụng phải sử dụng selection theo cùng cách. Giao thức cung cấp khả năng trao đổi, còn quy ước hành vi phải được xây dựng riêng.

Sự chuyển đổi cũng diễn ra từng bước. xterm thời X10 từng dùng nút phải để chèn dữ liệu từ cut buffer; đến X11R1, nút giữa đảm nhiệm thao tác dán nhưng vẫn còn dựa vào cut buffer. X11R3 mới có mô tả việc thả nút sau khi chọn văn bản sẽ tạo PRIMARY và ưu tiên dán từ selection này. Vì thế, gộp tất cả thành “Linux có hai clipboard từ năm 1987” sẽ bỏ mất khác biệt giữa cơ chế cũ và quy ước sử dụng về sau.

ICCCM tiếp tục định nghĩa cách các ứng dụng X trao đổi với nhau, nhưng vẫn để lại khoảng diễn giải khiến những bộ công cụ chọn cách xử lý khác nhau. Clipboard Spec phiên bản 1.0 do Havoc Pennington công bố ngày 1/12/2000 chốt cách tách vùng bôi đen khỏi thao tác Copy/Paste chủ động. Lý do rất thực dụng: nếu chỉ chọn văn bản đã ghi đè clipboard, người dùng không thể chọn một đoạn rồi dán nội dung đã Copy lên đó một cách dễ đoán.

Wayland giữ PRIMARY nhưng không bảo đảm mọi ứng dụng xử lý giống nhau

Màn hình desktop GNOME với thanh ứng dụng và LightCraft
Ở desktop GNOME, hành vi dán còn phụ thuộc thiết lập và bộ công cụ của ứng dụng, không chỉ giao diện bên ngoài. Ảnh: XDA Developers.

Đổi từ X11 sang Wayland không đồng nghĩa bỏ được mọi thói quen cũ, bởi thao tác chọn rồi dán nhanh vẫn có người cần sử dụng. Giao thức lõi của Wayland không định nghĩa một PRIMARY tương đương X11, nhưng một giao thức bổ sung đã được xây dựng để cung cấp chức năng đó.

Điều này tạo ra khác biệt giữa “Wayland hỗ trợ” và “máy đang dùng có hành vi ấy”. Compositor, thành phần điều phối hiển thị và tương tác, phải hỗ trợ giao thức; phía ứng dụng và bộ công cụ cũng cần phối hợp. Mutter của GNOME và KWin của KDE nằm trong các triển khai hỗ trợ được bài phân tích lịch sử liệt kê, nhưng không thể từ đó suy rộng sang mọi compositor.

Cách phân tầng ấy giúp lý giải một hiện tượng dễ gây bối rối: cùng phiên làm việc Wayland, ứng dụng này dán bằng chuột giữa còn ứng dụng khác không. Chúng có thể tuân theo thiết lập hoặc cơ chế xử lý riêng. Chuyển phiên đăng nhập chỉ để tìm lại một thao tác Paste vì vậy là biện pháp quá rộng nếu chưa kiểm tra ứng dụng và thiết lập liên quan.

Giữ PRIMARY dưới dạng giao thức bổ sung cũng là một lựa chọn tương thích có chủ đích, thay vì mặc nhiên mang nguyên toàn bộ X11 sang Wayland. Người dùng có thể tiếp tục luồng thao tác quen thuộc khi các thành phần hỗ trợ, trong khi desktop vẫn có quyền thay đổi cách tính năng được trình bày hoặc kích hoạt mặc định.

GNOME tắt dán mặc định, không xoá PRIMARY

Thay đổi của GNOME 50 nằm ở thao tác kích hoạt, không phải xoá một kênh trao đổi dữ liệu khỏi Linux. Bản desktop này đặt mặc định gtk-enable-primary-paste thành false, khiến các ứng dụng GTK tuân theo thiết lập đó không tự dán PRIMARY khi nhấn chuột giữa.

Cần phân biệt mặc định của môi trường desktop với mặc định nội tại của thư viện. Tài liệu thuộc tính Gtk.Settings vẫn ghi giá trị mặc định TRUE và mô tả đúng chức năng: nhấn chuột giữa để dán nội dung PRIMARY tại con trỏ. Hai thông tin không tự mâu thuẫn, bởi GNOME có thể áp thiết lập khác với giá trị sẵn có của GTK.

Việc tắt mặc định hợp lý với người chưa từng biết PRIMARY: một cú ấn nút chuột ngoài ý muốn không nên âm thầm chèn đoạn văn đã bôi đen ở cửa sổ khác. Nhưng với người đã dùng luồng chọn rồi dán hằng ngày, thay đổi ấy làm mất một thao tác hữu ích. Giữ cơ chế bên dưới và cho phép bật lại là cách giảm xáo trộn tốt hơn xoá hẳn hỗ trợ.

Trên GNOME có khoá thiết lập tương ứng, người muốn khôi phục dán chuột giữa có thể dùng lệnh:

gsettings set org.gnome.desktop.interface gtk-enable-primary-paste true

Lệnh này điều chỉnh thiết lập giao diện GNOME liên quan đến PRIMARY; nó không gộp PRIMARY với CLIPBOARD và cũng không phải công tắc chung buộc tất cả ứng dụng Linux đổi cách Paste. Firefox có thể xử lý dán chuột giữa riêng, nên không nên lấy hành vi của trình duyệt làm bằng chứng rằng thiết lập GTK không có tác dụng.

Muốn tránh dán nhầm, hãy thống nhất thao tác trước khi đổi desktop

Với người mới chuyển hệ điều hành, lựa chọn dễ kiểm soát nhất là dùng lệnh Copy/Paste rõ ràng trong ứng dụng trước, rồi chỉ bật dán chuột giữa khi thực sự cần. Cách này giữ nguyên lợi ích của CLIPBOARD mà không bắt người dùng học ngay mọi quy ước selection cũ.

Khi soạn tiếng Việt hay chuyển nội dung giữa trình duyệt và trình soạn thảo, bôi đen thường chỉ để đọc kỹ hoặc chuẩn bị thay đoạn chữ. Nếu PRIMARY đang hoạt động, chính thao tác đó có thể cập nhật nội dung sẽ được dán bằng chuột giữa dù bạn chưa hề Copy. Cần tránh đồng nhất lỗi chọn nhầm nguồn dán với lỗi bộ gõ hoặc mã hoá văn bản: đây là những vấn đề khác nhau.

Trong terminal, nên kiểm tra lại văn bản và phím dán được cấu hình, thay vì mặc định Shift+Insert hay chuột giữa luôn tương đương Paste trong menu. Còn nếu mục tiêu là giữ nội dung sau khi đóng ứng dụng, hãy kiểm tra trình quản lý clipboard và khả năng lưu giữ của môi trường đang dùng; bật PRIMARY không giải quyết thay cho chức năng ấy.

Không cần bỏ PRIMARY chỉ vì nó cũ, nhưng cũng không nên bật cho mọi người chỉ vì đã tồn tại lâu năm. Tiêu chí đáng giữ là một thao tác có giúp chuyển văn bản nhanh mà vẫn dễ đoán hay không. Với người không dùng đến, để chuột giữa không tự chèn văn bản là mặc định ít gây bất ngờ hơn.

Nguồn tham khảo: freedesktop.org — Clipboard Spec; GTK — thuộc tính gtk-enable-primary-paste; XDA Developers — lịch sử PRIMARY, CLIPBOARD và thay đổi trên GNOME.

Bài này thế nào?

Hoá đơn của bài này

Tek viết bài này bằng cà phê. Mời Tek một ly nha?

Theo dõi TekCafe: Facebook · YouTube

Bài viết mới nhất