Tại sao tôi không thể đánh dấu văn bản trong trình giả lập thiết bị đầu cuối linux bằng phím shift + mũi tên?


19

Đây là các phím tắt chỉnh sửa văn bản tiêu chuẩn mà tôi sử dụng liên tục bất cứ khi nào chỉnh sửa văn bản, theo nghĩa đen, bất kỳ ứng dụng linux nào ngoài trình giả lập thiết bị đầu cuối:

  • mũi tên trái + phải để di chuyển sang trái + phải
  • ctrl + mũi tên để di chuyển toàn bộ từ
  • nhà / kết thúc để di chuyển đến đầu / cuối dòng
  • ctrl + c / ctrl + v để sao chép / dán [một số thiết bị đầu cuối có thể sử dụng shift-ctrl-C / shift-ctrl-V; đây là một sự thay thế tốt
  • shift + mũi tên để tô sáng văn bản
  • shift + ctrl + mũi tên để tô sáng toàn bộ từ

Tôi chưa bao giờ tìm thấy sự kết hợp của trình giả lập shell cộng với thiết bị đầu cuối cho phép hai mục cuối trong danh sách này và nó khiến tôi phát điên. Rõ ràng các trình giả lập thiết bị đầu cuối hỗ trợ làm nổi bật (chuột có thể làm được) và chúng hỗ trợ việc sử dụng các phím ctrl và shift làm công cụ sửa đổi (chúng có thể được sử dụng để di chuyển con trỏ toàn bộ từ và viết hoa chữ cái tương ứng; [sửa:] chúng thậm chí có thể được sử dụng cùng nhau để sao chép / dán với shift-ctrl-C và shift-ctrl-V), vậy vấn đề ngăn chặn chức năng này là gì? Tôi có một số câu hỏi:

  • Đây có phải là sự cố với trình giả lập thiết bị đầu cuối của tôi hoặc với trình bao của tôi (bash, mặc dù tôi sẵn sàng thay đổi)?
  • Tại sao trình giả lập thiết bị đầu cuối / vỏ không phù hợp với tiêu chuẩn phổ quát này?
  • Nếu có một lý do thực tế, nó có cổ xưa và lỗi thời không, hay nó vẫn còn liên quan đến một số lượng đáng kể người dùng linux máy tính để bàn ?
  • Có cách giải quyết nào không?
  • Có một số chương trình tối nghĩa tôi có thể sử dụng hỗ trợ này?
  • Có khả thi để sửa đổi nguồn của gnome-terminal để hỗ trợ điều này không?

Tôi biết văn bản có thể được sao chép / dán bằng chuột, đó không phải là điều tôi đang hỏi. Tôi đang hỏi tại sao tôi không thể làm những điều này với bàn phím trong trình giả lập thiết bị đầu cuối.


Lưu ý rằng việc chọn văn bản bằng chuột không thay đổi vị trí con trỏ. Nếu bạn kết hợp lựa chọn văn bản với việc nhập các lệnh thông thường trên bàn phím, điều đó thực sự gây nhầm lẫn vượt ra ngoài ranh giới của lệnh bạn vừa nhập và chưa được thực thi. Bạn có thể chọn văn bản vượt ra ngoài ranh giới của hộp văn bản trên trang web bằng bàn phím không? Cũng xin lưu ý rằng có những chương trình như màn hình cho phép nhập một chế độ khác có lựa chọn văn bản cho toàn bộ thiết bị đầu cuối, nhưng tất nhiên không còn cho phép nhập lệnh.
Daniel Beck

1
Daniel: ví dụ, bảng điều khiển Matlab là CLI cho phép tô sáng văn bản bằng bàn phím. Nó hoạt động hoàn hảo theo kinh nghiệm của tôi; nó cho phép lựa chọn ngoài lệnh chưa được thực thi hiện tại nếu muốn, cá nhân tôi ít sử dụng cho điều đó.
monguin


Câu trả lời:


5

Tôi nghĩ rằng nó sẽ hữu ích nhất nếu tôi lấy cái này một lúc. Vấn đề chung là: ai là người nhấn phím dành cho ai? Thiết bị đầu cuối, hoặc chương trình chạy bên trong thiết bị đầu cuối?

Ví dụ, "màn hình", là một thiết bị đầu cuối, sử dụng Ctrl+ Alàm tiền tố cho các lệnh của nó, để phân biệt chúng với những thứ đi đến chính chương trình đang chạy. (Và cung cấp một cách để gửi Ctrl+ A.)

gnome-terminal có một số chìa khóa mà nó nắm bắt để làm nhiều việc khác nhau, bao gồm một số khóa bạn yêu cầu.

Ngoài ra, hãy nhớ rằng "tô sáng" của thiết bị đầu cuối tách biệt với vị trí con trỏ của thiết bị đầu cuối . Một số thiết bị đầu cuối không có khả năng làm nổi bật cả.

Bây giờ, lấy tổ hợp phím này cùng một lúc:

mũi tên trái + phải để di chuyển sang trái + ctrl phải + mũi tên để di chuyển toàn bộ từ nhà / kết thúc để di chuyển đến đầu / cuối dòng

Di chuyển những gì trái và phải? Bash có thể được cấu hình để làm điều này, và thường là theo mặc định. Thông thường, chúng di chuyển vị trí con trỏ.

ctrl + c / ctrl + v để sao chép / dán

Đầu tiên: sao chép / dán thậm chí có ý nghĩa? Nếu bạn đang ở VT, bạn thực sự không có bảng tạm, đặc biệt nếu X không chạy.

Một số thiết bị đầu cuối có thể sao chép văn bản trong đầu ra và một số thiết bị cũng sẽ "dán" bằng cách mô phỏng bạn nhập nội dung của bảng tạm. Ctrl+ Shift+ V, ví dụ, được dán vào gnome-terminal, có thể giúp ích. (Và Ctrl+ Shift+ Clà bản sao.) Như đã thảo luận trước đó, vấn đề lớn với Ctrl+ CCtrl+ Vlà chúng trùng lặp với các lệnh thiết bị đầu cuối / chương trình chung. ( Ctrl+ Clà gửi ngắt (SIGINT) và Ctrl+ Vlà nguyên văn.)

Một số thiết bị đầu cuối cũng hỗ trợ hai chế độ sao chép dữ liệu: "sao chép" bình thường hơn và được gọi là "chặn chọn" hoặc "sao chép khối". (Giữ Ctrl, và sau đó kéo trong khi gnome-terminalví dụ.)

Ngoài ra, xsel -bcó thể được sử dụng để nội dung clipboard đường ống xung quanh. Phụ thuộc vào vị trí chính xác cho dù xselphiên bản dán của thiết bị đầu cuối có hữu ích hơn không. Xem man xsel.

shift + mũi tên để tô sáng shift văn bản + ctrl + mũi tên để tô sáng toàn bộ từ

Điểm nổi bật của thiết bị đầu cuối của bạn (nếu nó có khả năng này) tách biệt với vị trí con trỏ. Một lần nữa, thiếu các combo chính có sẵn là một yếu tố. Hãy ghi nhớ một điểm nổi bật có hai vị trí: bắt đầu và kết thúc, hoặc góc trên bên trái và góc dưới bên phải. Làm thế nào để bạn quản lý cả hai?

Cuối cùng, lưu ý rằng nhiều thiết bị đầu cuối GUI, nhấp đúp vào một từ sẽ làm nổi bật nó. (Và trong X, sao chép vào lựa chọn chính.)

screen, như một ví dụ, có các phím để chuyển sang chế độ để di chuyển xung quanh bộ đệm (đầu ra trước đó) và sao chép / dán.

Tôi nghĩ rằng nếu bạn sử dụng đầy đủ xselvà lựa chọn chính, bạn sẽ thấy các hoạt động của clipboard vừa đủ hiếm vừa đủ phức tạp để sử dụng chuột.


5
Tôi đánh giá cao thời gian bạn dành để viết ra câu trả lời của mình, nhưng bằng cách nào đó tôi không cảm thấy mình hiểu rõ hơn về lý do tại sao đây không phải là một tính năng có sẵn trong trình giả lập thiết bị đầu cuối. Bạn đã chỉ ra một ý tưởng mới cho tôi - rằng trình giả lập thiết bị đầu cuối là duy nhất ở chỗ nó có thể chạy các chương trình khác - nhưng tôi không hiểu tại sao chỉ có một tập hợp con của các tổ hợp phím không thể cung cấp cho người dùng.
monguin

2
Trình giả lập thiết bị đầu cuốiphỏng thiết bị đầu cuối vật lý . Chúng không được tạo từ đầu để cung cấp giao diện dòng lệnh. Những thứ như Control-C đã hình thành ý nghĩa từ lâu trước khi Microsoft quyết định chọn chúng làm phím tắt và trình giả lập thiết bị đầu cuối phải tuân thủ chúng.
chepner

2
Tôi nghĩ rằng ma quỷ là trong các chi tiết ở đây. Không phải là không thể: màn hình có một chế độ để làm những gì bạn muốn, tôi nghĩ vậy. Nhưng để thực hiện nó, bạn phải chuyển sang chế độ "Tôi muốn chọn đồ". gnome-terminalsẽ có những vấn đề tương tự: có lẽ họ đã không thực hiện nó bởi vì đó không chính xác là điều bạn đang làm. Hãy nhớ rằng shell không phải là chương trình duy nhất đang chạy: bất kỳ chương trình nào cũng có thể chạy và nó có thể muốn sử dụng bất kỳ chuỗi khóa nào bạn có thể sử dụng để sao chép / dán cho mục đích riêng của mình. màn hình có các cách để gửi các phím mà nó ghi đè và thiết bị đầu cuối gnome cố gắng không bước lên ngón chân.
Thanatos

1
Chọn khối là một phương tiện để chọn một hình chữ nhật: Giữ điều khiển và kéo trong gnome-terminal, và bạn sẽ thấy ngay nó khác nhau như thế nào. Hầu hết các trình giả lập thiết bị đầu cuối GUI đều có khả năng này và hầu hết các trình soạn thảo văn bản tiên tiến cũng vậy. (Xem ví dụ về khối Visual trong vim.)
Thanatos

1
À, sau đó tôi quen thuộc với khối chọn, nhưng không biết tên. Tôi cũng không biết về một phím tắt GUI cho hành động đó, vì vậy dường như không cần thiết phải phát minh ra một phím tắt để trả lời câu hỏi của tôi. Tôi đánh giá cao ý kiến ​​của mọi người ở đây, nhưng vì tôi vẫn chưa hài lòng, tôi cho rằng tất cả những gì tôi có thể làm bây giờ là tự đào sâu vào nguồn ...
monguin

1

Tôi không phải là chuyên gia về trình giả lập thiết bị đầu cuối nhưng ...

các ứng dụng như bash (readline) chạy vào trình giả lập thiết bị đầu cuối không biết gì về hệ thống cửa sổ X đang chạy và cửa sổ X đang ở trong đó, chúng biết stdin và stdout trên thiết bị đầu cuối (ttyS / ttyUSB / tty / pts trên linux).

Vấn đề không hiển thị một số văn bản được tô sáng nhưng làm thế nào để biết ứng dụng cửa sổ X (trình giả lập thiết bị đầu cuối) mà văn bản đã được chọn, thông qua các thiết bị đầu cuối này.

Tôi đoán X ứng dụng thiết bị đầu cuối một mở của các thiết bị trong đầu vào và đầu ra và sau đó dịch các sự kiện X chìa khóa để đúng đầu ra (từ X bên) đầu vào (từ phía bash). Thay đổi luồng đầu ra bash đến đầu cuối X làm đầu vào , ở đây đầu cuối X xử lý đầu vào này để di chuyển con trỏ, tô màu nền sau bằng một số màu, theo đầu ra của ứng dụng bash.

Đối với kiến ​​thức của tôi, mã thoát có thể được sử dụng để kiểm soát các hành vi đặc biệt, như xóa, điền vào nền, di chuyển con trỏ và có thể thêm một số mã thoát tùy chỉnh để biết thiết bị đầu cuối X có văn bản từ hàng, col sang hàng, col đã được chọn, chỉ là một ví dụ, có thể thay vào đó văn bản đã chọn chỉ có thể được trả về (một chi tiết triển khai).

Tôi đoán không phải là một định nghĩa chuẩn, bạn sẽ phải vá mọi ứng dụng mà bạn muốn hỗ trợ để biết về tổ hợp phím đã nhấn và xuất mã thoát thích hợp, đường dẫn đọc nếu bạn muốn nó trong bash, trình giả lập thiết bị đầu cuối X trên phía bên kia để xử lý đúng mã thoát (và cuối cùng gửi thông tin vào bảng tạm). Có lẽ việc thực hiện điều này như một khả năng của thiết bị đầu cuối sẽ giúp bạn tiết kiệm từ mỗi bản vá ứng dụng. Tôi hy vọng (và đoán) các trình điều khiển thiết bị đầu cuối trong kernel muốn biết ít nhất có thể về mã thoát, vì vậy nếu bạn may mắn sẽ không có bản vá nào được yêu cầu.

Thiết bị đầu cuối X vẽ đầu ra, để dễ dàng biết, khi bạn sử dụng chuột, bạn sẽ chọn văn bản / ký tự nào.

Một widget văn bản đồ họa biết mọi thứ về cửa sổ X của nó rằng tại sao nó lại dễ thực hiện chọn & sao chép.

BIÊN TẬP

Ở đây bản vá hiển thị hình ảnh urxvt-9.16 này có thể là điểm khởi đầu tốt để hiểu những gì cần thiết để hỗ trợ mã thoát mới. http://lists.schmorp.de/pipermail/rxvt-unicode/2013q1/001736.html


1

Các câu trả lời được đưa ra là những lời giải thích tốt về lý do tại sao làm điều này là khó khăn. Dưới đây là một số thứ bạn có thể làm trong gnome-terminal để thiết lập ctrl-cctrl-vsao chép và dán, trong khi chỉnh lại các phím khác trong kỷ luật đầu cuối sttyđể gửi SIGINTvà chèn một nguyên văn ký tự. Đây không phải là một giải pháp hoàn chỉnh vì một số chương trình vô hiệu hóa kỷ luật đầu cuối và bạn sẽ không thể gửi cho họ '^ C' và '^ V'. Thêm thông tin ở đây .

Trong khi khởi động shell script của bạn (ví dụ ~/.bashrc, ~/.zshrc, ~/.rcrc), làm

stty intr '^Q' 2>/dev/null  # To send SIGINT I will use ctrl-q
stty lnext '^A' 2>/dev/null # To insert a character verbatim I will use ctrl-a

Sau đó, trong gnome-terminal Chỉnh sửa> Tùy chọn> Phím tắt, bạn có thể liên kết Sao chép và Dán vào ctrl-c và ctrl-v. Lưu ý rằng thiết bị đầu cuối sẽ nhận được các sự kiện quan trọng trước khi mọi thứ được gửi đến thiết bị đầu cuối, vì vậy từ đó trở đi, bạn sẽ không thể gửi '^ C' và '^ V' cho bất kỳ quy trình nào đang chạy trên thiết bị đầu cuối.

Tôi chỉ làm điều này và tôi sẽ thấy nó diễn ra như thế nào, và nó gây ra vấn đề gì. Tôi đã làm điều đó một cách có điều kiện để chỉ áp dụng chúng khi tôi đang chạy X.


1
Cảm ơn vì sự trả lời. Trong thời gian đó, tôi đã quen với các ràng buộc của OSX và Emacs, và cũng từ bỏ giấc mơ về ctrl + shift + mũi tên trong một thiết bị đầu cuối ...
monguin

1

Như Thanatos đã đề cập, có một sự khác biệt được tạo ra giữa trình giả lập thiết bị đầu cuối (chạy trên X Windows hoặc Wayland) và các chương trình chạy trong thiết bị đầu cuối (hãy gọi đó là "shell", mặc dù có thể không phải vậy); hai điều này được cách ly với nhau (xem chi tiết kỹ thuật ).

Các mục đầu tiên trong danh sách của bạn (phím mũi tên, Trang chủ / Kết thúc, v.v.) được xử lý trực tiếp bởi chương trình bên trong thiết bị đầu cuối và do đó, vị trí con trỏ được điều khiển bởi chương trình bên trong thiết bị đầu cuối.

Mặt khác, các phím tắt sao chép và dán (Ctrl + Shift + C và Ctrl + Shift + V) được xử lý bởi trình giả lập thiết bị đầu cuối, hiểu chuột (vì vậy bạn có thể chọn văn bản bằng chuột), nó biết đó là gì trên màn hình (để nó có thể sao chép) và có thể gửi các phím bấm cho chương trình bên trong (để nó có thể dán).

Để hỗ trợ Shift + Left và Shift + Right, trình giả lập thiết bị đầu cuối hoặc trình bao sẽ phải xử lý tổ hợp phím. Dù bằng cách nào, chúng tôi có một vấn đề:

  1. Shell không thể dễ dàng xử lý các khóa này vì cuối cùng bạn sẽ muốn sao chép văn bản đã chọn vào bảng tạm và bảng tạm là khái niệm X Windows mà shell không nhất thiết phải có quyền truy cập (nhưng xem xclip). Và theo như tôi biết, nếu shell hỗ trợ lựa chọn văn bản, Linux không định nghĩa bất kỳ cơ chế nào để thông báo cho trình giả lập thiết bị đầu cuối về những gì được chọn.
  2. Trong khi đó, trình giả lập thiết bị đầu cuối không phụ trách vị trí của con trỏ. Ngay cả khi trình giả lập thiết bị đầu cuối có thể thay đổi vị trí của con trỏ, nó có thể không biết dòng văn bản hiện tại bắt đầu và kết thúc ở đâu. Ví dụ: thiết bị đầu cuối có thể chứa văn bản như ~ $ ls -lvà trình giả lập thiết bị đầu cuối không biết rằng chỉ có ls -lphần thuộc về người dùng.

Không khó để tưởng tượng một trình giả lập thiết bị đầu cuối hỗ trợ lựa chọn với Shift + Mũi tên, nhưng tôi đoán nó sẽ phải ẩn con trỏ của vỏ và giới thiệu "con trỏ giả" của chính nó tồn tại tạm thời để giúp bạn chọn thứ gì đó, và sau đó bạn có thể nhấn Ctrl + C / Ctrl + Shift + C / Ctrl + Ins để sao chép (hoặc Esc để hủy) và hiển thị con trỏ thực một lần nữa. Tất nhiên, điều này sẽ không có tất cả các khả năng của một lựa chọn thông thường - đáng chú ý là cắt và xóa sẽ không tồn tại.


Cảm ơn, tôi sẽ đọc bài báo TTY đó, nhưng chưa có. Điều đó có thể giải thích khoảng cách trong sự hiểu biết của tôi về sự khác biệt giữa "trình giả lập thiết bị đầu cuối" và "ứng dụng máy tính để bàn xử lý các chương trình văn bản". Ví dụ trước đây của tôi, bảng điều khiển Matlab, hoạt động chính xác như tôi muốn. Tôi không hiểu tại sao không thể có một ứng dụng máy tính để bàn với hành vi đó, trong đó chương trình văn bản chạy trong đó là một cái gì đó ngoài Matlab. Nói rằng tôi muốn chỉ sử dụng các lệnh shell cơ bản nhất - ls, cd, cp, mv - sau đó tôi không thấy bất kỳ xung đột nào. Các chương trình như màn hình hoặc tmux, tôi hiểu có thể làm mọi thứ trở nên phức tạp hơn.
monguin

1

Đây là các ràng buộc bàn phím CUA mà bạn mô tả, một tiêu chuẩn của IBM vào giữa những năm 80:

https://en.wikipedia.org/wiki/IBM_Common_User_Access

Chúng thường được thực hiện trong tất cả các môi trường máy tính để bàn được tạo từ đó. Các công cụ DOS, Windows, Motif, thậm chí Netware đều hội tụ theo tiêu chuẩn này. Một ngoại lệ là Mac, sử dụng một bộ khá giống nhau nhưng khác nhau (Cmd thay vì Ctrl) trong cùng khoảng thời gian.

Thiết bị đầu cuối Unix vượt xa tiêu chuẩn này tuy nhiên và chủ yếu bỏ qua nó. Ngoài ra, nếu họ đã thực hiện các ràng buộc chính này, nó có thể can thiệp vào các chương trình TUI đã sử dụng chúng cho các chức năng khác. Vì vậy, trong khi kỹ thuật có thể làm được, có vấn đề quá.

Ứng dụng:

Trình microsoạn thảo văn bản là trình soạn thảo văn bản GUI tốt nhất mà tôi từng thấy khi mô phỏng trình soạn thảo văn bản GUI, tương tự như DOS  editnhưng với các tính năng hiện đại hơn là Văn bản tuyệt vời. nelà một bản cũ hơn trong repos Debian và thậm chí nanocó thể được cấu hình bằng các phím bấm lành mạnh. Nhưng thiết bị đầu cuối trần / vỏ, không.

Với libvtenó có thể dễ dàng để xây dựng một thiết bị đầu cuối ảo thô sơ tự xử lý các tổ hợp phím này. Tuy nhiên, rất nhiều công việc cho một lợi ích nhỏ bé.


0

Tôi chỉ giúp một người bạn thông qua một vấn đề tương tự như vậy và phát hiện ra rằng clipit của trình quản lý clipboard là thủ phạm.

sudo apt-get loại bỏ clipit

đã có thể lấy lại mọi thứ và chạy tốt cho anh ta. Hy vọng rằng có thể giúp đỡ người khác ngoài đó.


Bạn đã trả lời sai câu hỏi? Đây là một câu hỏi chung về khả năng của tất cả các trình giả lập thiết bị đầu cuối. Rõ ràng là không có "giải pháp". Bây giờ tôi không có, tôi cũng chưa từng cài đặt clipit trên bất kỳ máy nào.
monguin
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.