วิธีกำหนดค่า PuTTY เพื่อให้ Home / End / PgUp / PgDn ทำงานอย่างถูกต้องในการทุบตี?


123

ปุ่ม Home, End, PageUp, PageDown ทั้งหมดพิมพ์ a ~ในเซสชัน bash ของฉันแทนการเลื่อนเคอร์เซอร์ / มุมมองไปรอบ ๆ ทำไมสิ่งนี้จึงเกิดขึ้นและฉันต้องเปลี่ยนการตั้งค่าแบบใด

GNU bash, version 4.0.28(1)-release (x86_64--netbsd)
PuTTY v0.60

คำถามอ่านเดิม:

ใน PuTTY เหตุใดการกดปุ่ม "Home" บนเชลล์ (ทุบตี) ให้พิมพ์ "~" หรือฉันจะทำให้เคอร์เซอร์เลื่อนไปยังจุดเริ่มต้นของคำสั่งที่ฉันพิมพ์ได้อย่างไร

(ฉันคิดว่าเหตุผลคือ ~ เป็นไดเรกทอรีบ้านแต่คำตอบบอกว่ามันไม่เป็นเช่นนั้น)

คำตอบ:


150

เปลี่ยนสตริงประเภทเทอร์มินัลภายใต้แท็บการเชื่อมต่อ> ข้อมูลจาก "xterm" เริ่มต้นเป็น "linux" มันใช้งานได้สำหรับฉัน

ป้อนคำอธิบายรูปภาพที่นี่


2
ขอบคุณ! ฉันมีปัญหานี้หลังจากที่ฉันฝึกฝนเพื่อให้ Ctrl ซ้าย / ขวาทำงานโดยใช้วิธีนี้ ( superuser.com/a/103097/45410 )
Edwin Yip

4
เน้น: ไม่Terminal -> Keyboard"ปุ่มฟังก์ชั่นและปุ่มกด"
Elazar

2
ใช้งานได้ แต่สร้างปัญหาอื่น ๆ เช่นปิดใช้งานการสนับสนุนเมาส์ ดังนั้นจึงไม่ใช่ทางออกที่ยอมรับได้สำหรับฉัน
Anton

วิธีการแก้ปัญหานี้ยังช่วยให้ umlauts ภายในสีโป๊วเมื่อเชื่อมต่อกับ OS X!
ลิง lorem

42

สิ่งนี้เกิดขึ้นเนื่องจากคุณไม่ได้ตั้งค่าประเภทเทอร์มินัลของ PuTTY อย่างถูกต้องหรือเนื่องจากเซิร์ฟเวอร์ของคุณไม่ได้ติดตั้งคำจำกัดความ terminfo ที่ถูกต้อง

บนระบบที่ใช้ Debian แพ็กเกจncurses-term (เวอร์ชัน 5.7 + 20081213-1) มีไฟล์นิยาม terminfo สำหรับชนิดของputty , putty-256colorและputty-vt100ชนิดเทอร์มินัล หากคุณติดตั้งแพ็คเกจนี้คุณสามารถตั้งค่า "สตริงประเภทเทอร์มินัล" เป็น "putty" แทนค่าเริ่มต้น "xterm" ในการกำหนดค่าเซสชันของ Putty (การเชื่อมต่อ -> ข้อมูล)

สตีเฟ่นเหล็กยังกล่าวถึง "ลินุกซ์" อีกประเภทหนึ่งที่ทำงาน; ฉันเชื่อว่าสิ่งนี้ถูกต้องจากประสบการณ์ก่อนหน้านี้ แต่ไม่ได้ทำการทดสอบเมื่อเร็ว ๆ นี้

ในระบบของฉันสิ่งนี้ทำให้ Home และ End ทำงานได้อย่างถูกต้องแม้ว่า PageUp / PageDown จะไม่เลื่อนหน้าต่างคอนโซล (ทำงานได้อย่างถูกต้องในแอปพลิเคชัน ncurses เช่นความถนัดและ Shift-PgUp / Shift-PgDn เลื่อนหน้าต่างคอนโซล)


ใช่การใช้TERM=puttyหรือTERM=putty-256colorฉลาดที่สุด แต่น่าเสียดายที่ในตอนนี้ดูเหมือนว่าจะใช้งานไม่ได้กับสี 8-15 (ซึ่งควรจะเป็นรุ่นที่สว่าง 0-7) "วิธีแก้ปัญหา" อื่น ๆ มีแนวโน้มที่จะสะบัดออกบางครั้งก็ทำกับพวกเขาที่เห็นได้ชัดโดยไม่คำนึงถึงความแตกต่างระหว่างขั้วที่เกี่ยวข้อง
SamB

yum install ncurses-termจัดเรียงสำหรับฉันใน CentOS 7 พร้อมผงสำหรับอุดรูในการเข้าสู่ระบบครั้งต่อไปขอบคุณ
Wandering Zombie

1
การตั้งค่าประเภทเทอร์มินัลให้ใช้puttyงานได้ แต่หยุดพักการสนับสนุนเมาส์เหมือน xterm (เช่นสำหรับ Midnight Commander)
Anton

การติดตั้งคำว่า 'ncurses-term' เหมาะสำหรับฉันในการทดสอบเดเบียน
hochl

ไม่มีงานเหล่านี้สำหรับฉันฉันกำลังเชื่อมต่อกับโป๊วและไม่สามารถเรียกใช้ yum install ncurses-term ได้เพราะฉันไม่ได้รูท
Herman Toothrot

20

หากคุณต้องการตรวจสอบว่ารหัสใดถูกส่งโดย PuTTY ไปยังเทอร์มินัลของคุณเมื่อคุณกดปุ่มหรือการรวมกันของคีย์คุณเพียงแค่ต้องออกCtrl+Vและกดปุ่มที่ต้องการ

ตัวอย่างเช่นในกล่องของฉันการกดปุ่มโฮมจะสร้างสตริงต่อไปนี้บนเทอร์มินัลของฉัน:

^[[1~

นั่นหมายความว่าฉาบส่งตัวหนี^ [ตามด้วยสตริง[1 ~

คุณสามารถสร้าง~/.inputrcไฟล์ใน$HOMEโฟลเดอร์ของคุณหรืออีกวิธีหนึ่ง/etc/inputrcขึ้นอยู่กับระบบของคุณ จากนั้นเติมไฟล์นี้ด้วยรหัส PuTTY และการดำเนินการ Bash ที่ตรงกันที่คุณต้องการให้ถูกเรียกใช้โดย Bash

หมายเหตุ: แทนที่ทุก ๆ^ [ตัวละครด้วยสตริงเทียบเท่า\ e

ในตัวอย่างของฉันฉันจะเพิ่มบรรทัดด้วยรหัสบ้านและการกระทำเริ่มต้นของบรรทัด (ซึ่งโดยค่าเริ่มต้นถูกผูกไว้Ctrl+Aในใน Bash):

"\e[1~": beginning-of-line

FYI, ไฟล์อินพุตของฉันมีเนื้อหาดังต่อไปนี้:

set meta-flag on
set input-meta on
set convert-meta off
set output-meta on
"\e[1~": beginning-of-line     # Home key
"\e[4~": end-of-line           # End key
"\e[5~": beginning-of-history  # PageUp key
"\e[6~": end-of-history        # PageDown key
"\e[3~": delete-char           # Delete key
"\e[2~": quoted-insert         # Insert key
"\eOD": backward-word          # Ctrl + Left Arrow key
"\eOC": forward-word           # Ctrl + Right Arrow key

จาก @Cimbali: คำสั่งเพิ่มเติม bindable (เช่นก่อนหน้าประวัติศาสตร์: ย้าย `ขึ้นผ่านรายการประวัติ) ที่มีอยู่ในหน้าเอกสารอ้างอิงนี้


ใช่! ในที่สุด! สตริงประเภทเทอร์มินัลของ Putty ไม่ได้ทำอะไรเลยสำหรับคำย้อนหลังและไปข้างหน้าคำ มันเยี่ยมมาก!
Cimbali

1
นี่เป็นวิธีการแก้ปัญหาที่ยอมรับได้เพียงเพราะTERM=linuxหรือTERM=puttyทำลายการสนับสนุนเมาส์เหมือน xterm ขอบคุณ!
Anton

14

Crtl + A จะนำคุณไปสู่จุดเริ่มต้นของบรรทัด

นี่คือรายการแป้นพิมพ์ลัดของ Bash


13
นั้นยอดเยี่ยมและทั้งหมด แต่ Home / End นั้นมีสายแบบแข็งในสมองของฉันและเนื่องจากฉันจัดการเซิร์ฟเวอร์เพียงครั้งเดียวในดวงจันทร์สีน้ำเงินโอกาสที่จะไม่ได้รับการเดินสายแบบยากมีความบาง
RomanSt

9

สิ่งที่มันส่งจริง ๆ คือ^[[1~ลำดับการหลบหนีของเทอร์มินัลประกอบด้วย:

  • ^ [- หลบหนี
  • [- วงเล็บเหลี่ยมซ้าย
  • 1 - หนึ่ง
  • ~ - ตัวหนอน

คุณจะเห็นว่าโดยการกดCtrl+ แล้วVHome

คุณอาจสามารถแก้ไขปัญหาของคุณได้โดยเปลี่ยนการตั้งค่าแป้นพิมพ์ PuTTY สำหรับปุ่ม Home และ End เป็น rxvt (ซึ่งทำให้ลำดับ escape ^[[Hหรือโดยเปลี่ยน $ TERM ที่คุณกำลังใช้ (หรือแก้ไข~/.inputrc)

โดยไม่มีความสัมพันธ์ระหว่างตัวหนอนที่คุณได้รับเมื่อคุณกดHomeและตัวหนอนที่แสดงถึงไดเรกทอรีบ้าน ตัวอย่างเช่นในการตั้งค่าของฉันPage-Downผลิต^[[6~ซึ่งจะพิมพ์ตัวหนอนถ้ามันไม่ได้ถูกตีความอย่างถูกต้อง


ขอบคุณ! rxvt แก้ไขปุ่ม Home; ตอนนี้ปุ่มวางสายสร้าง ding PgUp / Down พิมพ์ได้แน่นอน~และไม่มีการตั้งค่าคีย์บอร์ด PuTTY ให้ทำงานได้ ทุบตีของฉันเกิดความสับสนหรือเป็น "ปกติ" หรือไม่?
RomanSt

คุณได้อะไรเมื่อคุณพิมพ์echo $TERM?
เดนนิสวิลเลียมสัน

xterm(ขีด จำกัด อักขระ 15 ตัว)
RomanSt

3
คุณสามารถลองเพิ่ม"\eOw": end-of-line(นั่นคืออักษรตัวใหญ่ O) ลงใน~/.inputrcไฟล์ของคุณ
Dennis Williamson

แก้ไขรหัสสิ้นสุด ฉันได้รับความคิด ต้องการแฮ็กอย่างนี้ไม่จำเป็นเลย ...
RomanSt

2

ไม่ใช่ตัวเลือกเหล่านี้ทำงานสำหรับฉัน ฉันกำลังรันระบบ AIX เก่า ฉันต้องเพิ่มชื่อแทนต่อไปนี้ลงใน. profile ของฉัน

alias __A=$(print '\0020') # ^P = up = previous command
alias __B=$(print '\0016') # ^N = down = next command
alias __C=$(print '\0006') # ^F = right = forward a character
alias __D=$(print '\0002') # ^B = left = back a character

ไม่ทำงานสำหรับฉันคนเกียจคร้าน
Herman Toothrot

1

ฉันไม่สามารถทำงานกับวิธีอื่นได้ ฉันได้สร้างสคริปต์ AutoHotkey นี้ขึ้นมา แต่ตราบใดที่เปลือกของคุณเป็น Bash:

#IfWinActive ahk_class PuTTY
PgUp::Send +{PgUp}
PgDn::Send +{PgDn}
Home::Send ^a   ; beginning of line
End::Send ^e    ; end of line
+^Del::Send ^k  ; delete whole line after cursor
+End::Send ^k   ; delete whole line after cursor
+Home::Send ^u  ; delete whole line before cursor
^Del::Send !d   ; delete word after cursor
^BS::Send ^w    ; delete word before cursor
^Left::Send !b  ; jump word left
^Right::Send !f ; jump word right
#IfWinActive

ใช้ด้วยความระมัดระวังแม้ว่าเนื่องจากคีย์ลัดของ bash เหล่านี้ไม่ทำงานในโปรแกรมอื่น


สิ่งนี้จะยุ่งกับเหตุผลหลักที่ฉันดูนี้: screenซึ่งด้วยการตั้งค่าเริ่มต้นแบ่ง Ctrl-A เพราะมันใช้มันเป็นตัวละครที่หลบหนี ....
Gert van den Berg
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.