2011-01-11 11 views
13

Łączę się z komputerem z uruchomionym cygwinem przez SSH z aplikacji terminalowej w Mac OS X. Już uruchomiłem ekran po stronie cygwin i mogę się z nim połączyć podczas sesji SSH. Ponadto, mam następujący w pliku .screenrc:Jak uzyskać klucze F1-F12 do przełączania ekranów na ekranie gnu w cygwin podczas łączenia się przez 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 

Jednak, kiedy zaczynają wiele okien w ekran i próbować przełączać się między nimi za pomocą klawiszy funkcyjnych, wszystkie uzyskać jest sygnał dźwiękowy.

Próbowałem różnych ustawień dla $ TERM (np. Ansi, cygwin, xterm-color, vt100) i tak naprawdę nie wydają się wpływać na nic.

Sprawdziłem, że aplikacja terminalowa wysyła sekwencję specjalną klucza funkcyjnego, którego oczekuję, i że odbiera ją moja powłoka bash (działająca na ekranie). Na przykład, dla F1, wysyła następujące (hexdump to skrypt Perl pisałem, że trwa STDIN w BINMODE i wyjść go jako szesnastkowym/ASCII wysypisko):

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

Jeśli rzeczy działały prawidłowo, I don” t bash powinien otrzymać sekwencję ucieczki, ponieważ ekran powinien ją przechwycić i przekształcić w komendę.

Jak uzyskać dostęp do klawiszy funkcyjnych?

+1

Brak programowania. – leppie

+5

Najczęściej zadawane pytania to: "narzędzia programowe powszechnie używane przez programistów". Narzędzia, które opisałem, wydają mi się odpowiednie. – Mikey

Odpowiedz

4

Z dużą dozą eksperymentów udało mi się zmusić go do pracy, dodając następujące wiersze do mojego .screenrc:

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

Byłoby miło, gdybyś pokazał metodę, której używałeś, by dotrzeć do tego rozwiązania. To nie działa dla mnie. – PonyEars

+1

Nie pamiętam tego wyraźnie, jak było kilka lat temu. Część tego dotyczyła znajomości nazw terminali dla kluczy (np. K1, k2 itd.), A część z nich miała związek z tym, co przekazuje twój terminal po uderzeniu w F1, F2 itd. Udało mi się aby dowiedzieć się tego ostatniego, uruchamiając "odczyt" w powłoce basha, a następnie uderzając F1, F2, itd. Na przykład, gdy biegam czytając i uderzając F1, widziałem to: '% czytaj ^ [OP ' – Mikey

+0

W bash, jeśli naciśniesz Ctrl-V, a następnie klawisz funkcyjny będący przedmiotem zainteresowania, zobaczysz wizualnie powyższe kody wydrukowane w linii poleceń. W ten sposób znajdziesz kody. Może to funkcja 'readline'? –

16

Jeśli masz bardziej dziwaczne konfigurację (np Windows -> PuTTY - > Linux), gdzie średnia bindkey -k rozwiązanie nie dość działa dobrze, można użyć komendy showkey:

showkey -a 

znaleźć mapowanie klawiszy do głównych kodów. W moim konkretnym przypadku, stawiając je w ~/.screenrc wystarczyły:

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

Mam podobne "dziwne" ustawienia przy użyciu mobaxterm. Najpierw wyłączyłem skrót mobaxterm dla f11, a potem nadal miałem F10 nie działający z bindkey -k Fx (F1 to F11, F2 to F12, ale F0 nie działa, być może jest szesnastkowy). W każdym razie użyłem twojego rozwiązania, aby uzyskać poprawną wartość bindkey dla F10. Dzięki. – th3penguinwhisperer

0

używam iTerm na MacOS. Działa to dla mnie:

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

bindkey -k F1 prev 
bindkey -k F2 next 

Umieść te 4 linie w swoim ekranie .screenrc.

Odpowiedź inspirowana odpowiedzią Mikey.

Powiązane problemy