2011-01-11 47 views
13

Tôi đang kết nối với máy tính để bàn chạy Cygwin qua SSH từ ứng dụng đầu cuối trong Mac OS X. Tôi đã bắt đầu màn hình ở phía Cygwin và có thể kết nối với nó qua phiên SSH. Hơn nữa, tôi có sau trong file Screenrc:Làm thế nào để có được các phím F1-F12 để chuyển đổi màn hình trong màn hình gnu trong Cygwin khi kết nối thông qua SSH?

bindkey -k k1 select 1 # F1 = screen 1 
bindkey -k k2 select 2 # F2 = screen 2 
bindkey -k k3 select 3 # F3 = screen 3 
bindkey -k k4 select 4 # F4 = screen 4 
bindkey -k k5 select 5 # F5 = screen 5 
bindkey -k k6 select 6 # F6 = screen 6 
bindkey -k k7 select 7 # F7 = screen 7 
bindkey -k k8 select 8 # F8 = screen 8 
bindkey -k k9 select 9 # F9 = screen 9 
bindkey -k F1 prev  # F11 = prev 
bindkey -k F2 next  # F12 = next 

Tuy nhiên, khi tôi bắt đầu nhiều cửa sổ trên màn hình và cố gắng để chuyển đổi giữa chúng thông qua các phím chức năng, tất cả tôi nhận được là một tiếng bíp.

Tôi đã thử các cài đặt khác nhau cho $ TERM (ví dụ: ansi, cygwin, xterm-color, vt100) và chúng dường như không ảnh hưởng đến bất kỳ thứ gì.

Tôi đã xác minh rằng ứng dụng đầu cuối đang thực sự gửi chuỗi thoát cho phím chức năng mà tôi đang mong đợi và vỏ bash của tôi (chạy bên trong màn hình) đang nhận nó. Ví dụ, đối với F1, nó sẽ gửi sau (hexdump là một kịch bản perl Tôi đã viết rằng mất STDIN trong binmode và đầu ra nó như là một hệ thập lục phân/ascii dump):

% hexdump 
[press F1 and then hit ^D to terminate input] 
00000000: 1b4f50        .OP 

Nếu mọi thứ đang làm việc một cách chính xác, tôi don' t nghĩ rằng bash sẽ nhận được chuỗi thoát vì màn hình nên đã bắt được nó và biến nó thành một lệnh.

Làm cách nào để các phím chức năng hoạt động?

+1

Không lập trình. – leppie

+5

Câu hỏi thường gặp cho biết: "các công cụ phần mềm thường được các lập trình viên sử dụng". Các công cụ tôi mô tả có vẻ liên quan đến tôi. – Mikey

Trả lời

4

Với rất nhiều thử nghiệm, tôi đã có thể để làm cho nó hoạt động bằng cách thêm các dòng sau vào screenrc của tôi:

terminfo * k1=\EOP 
terminfo * k2=\EOQ 
terminfo * k3=\EOR 
terminfo * k4=\EOS 
terminfo * k5=\E[15~ 
terminfo * k6=\E[17~ 
terminfo * k7=\E[18~ 
terminfo * k8=\E[19~ 
terminfo * k9=\E[20~ 
terminfo * F1=\E[23~ 
terminfo * F2=\E[24~ 
+0

Nó sẽ là tốt đẹp nếu bạn cho thấy phương pháp bạn sử dụng để đi đến giải pháp này. Nó không hiệu quả với tôi. – PonyEars

+1

Tôi không nhớ nó rõ ràng như nó đã được một vài năm trước đây. Một phần của nó phải làm với biết tên thiết bị đầu cuối cho các phím (ví dụ k1, k2, vv) và một phần của nó phải làm gì khi biết thiết bị đầu cuối của bạn truyền khi bạn nhấn F1, F2, v.v. Tôi đã có thể để tìm ra thứ hai bằng cách chạy "đọc" trong bash shell và sau đó nhấn F1, F2, v.v. Ví dụ, khi tôi chạy đọc và nhấn F1, đây là những gì tôi thấy: '% đọc ^ [OP ' – Mikey

+0

Trong bash, nếu bạn nhấn Ctrl-V theo sau là phím chức năng quan tâm, sau đó bạn sẽ thấy trực quan các mã trên được in trên dòng lệnh. Đây là cách bạn tìm thấy các mã. Có lẽ đó là một tính năng 'readline'? –

16

Nếu bạn có một thiết lập kỳ lạ hơn (ví dụ như Windows -> PuTTY - > Linux) mà dung dịch chuẩn bindkey -k không hoàn toàn làm việc đúng, bạn có thể sử dụng lệnh showkey:

showkey -a 

để tìm ra ánh xạ từ tổ hợp phím để mã chủ chốt. Trong trường hợp cụ thể của tôi, hãy đặt chúng trong ~/.screenrc đã thực hiện thủ thuật:

bindkey "^[[11~" select 1 
bindkey "^[[12~" select 2 
bindkey "^[[13~" select 3 
bindkey "^[[14~" select 4 
bindkey "^[[15~" select 5 
bindkey "^[[17~" select 6 
bindkey "^[[18~" select 7 
bindkey "^[[19~" select 8 
bindkey "^[[20~" select 9 
bindkey "^[[21~" select 10 
bindkey "^[[23~" select 11 
bindkey "^[[24~" select 12 
+0

Tôi có một thiết lập "lạ" tương tự bằng cách sử dụng mobaxterm. Đầu tiên tôi vô hiệu hóa các phím tắt mobaxterm cho f11 và sau đó tôi vẫn có F10 không làm việc với bindkey -k Fx (F1 là F11, F2 là F12 nhưng F0 không hoạt động, có lẽ nó là hệ thập lục phân). Dù sao tôi đã sử dụng giải pháp của bạn để có được giá trị bindkey chính xác cho F10. Cảm ơn. – th3penguinwhisperer

0

Tôi đang sử dụng iTerm trên macos. Điều này phù hợp với tôi:

terminfo * F1=^[OP 
terminfo * F2=^[OQ 

bindkey -k F1 prev 
bindkey -k F2 next 

Đặt 4 dòng này vào .screenrc của bạn.

Câu trả lời lấy cảm hứng từ câu trả lời của Mikey.

Các vấn đề liên quan