เปลี่ยนรูปร่างเคอร์เซอร์ (หรือสี) เพื่อระบุโหมด vi ใน bash


30

ชี้แจง:ผมไม่ได้ถามถึงวิธีการเปลี่ยนเคอร์เซอร์เมื่อใช้เป็นกลุ่มที่อยู่ในขั้ว ฉันต้องการให้เคอร์เซอร์เปลี่ยนเมื่อสลับระหว่างโหมดอินพุตและคำสั่งภายในโหมด Vi ของ Bash:

set -o vi <CR> type some text <ESC> (the cursor changes shape/color)
i (cursor change back) etc... 

ฉันพบสคริปต์ที่ทำให้การเปลี่ยนสีของเคอร์เซอร์ในโหมดการเปลี่ยนแปลงเป็นไปได้ในzshแต่ฉันไม่ต้องการเปลี่ยนเชลล์สำหรับคุณลักษณะนี้เพียงอย่างเดียว

มีวิธีที่จะให้เคอร์เซอร์เปลี่ยนรูปร่างเช่นใน gvim (หรือเพียงแค่สี) เมื่อสลับระหว่างโหมดคำสั่งและโหมดแทรกในบรรทัดคำสั่ง Bash หรือไม่?


คำถามเดียวกันใน SO สำหรับผงสำหรับอุดรู, ไม่มีคำตอบสรรพสินค้า :( - stackoverflow.com/questions/2393383/ …
studgeek

คำตอบ:


5

เพิ่มสองบรรทัดเหล่านี้ใน~ / .inputrc :

set vi-ins-mode-string \1\e[5 q\2
set vi-cmd-mode-string \1\e[2 q\2

4
คำตอบนี้จะมีประโยชน์มากขึ้นถ้าคุณอธิบายสิ่งที่พวกเขาทำและให้บริบทเช่นการตั้งค่าต้องการให้ผู้ใช้มี Readline รุ่นที่เฉพาะเจาะจง
Anthony G - ความยุติธรรมสำหรับ Monica

:) นี่คือรายการคู่มือ: gnu.org/software/bash/manual/html_node/…
holytrousers

1
สิ่งนี้จะทำงานกับเทอร์มินัลและเทอร์มินัลอีมูเลเตอร์ที่เข้าใจ DECSCUSR
JdeBP

ฉันต้องเพิ่มset show-mode-in-prompt onเข้าไป~/.inputrcด้วยเพื่อให้งานนี้สำเร็จ
ronakg

4

คัดลอกจากที่นี่ - สไตล์ vim การแก้ไขบรรทัดคำสั่ง

ควรมีอยู่ในbash4.3 - ดูการเปลี่ยนแปลง -

j.  New user-settable variable, show-mode-in-prompt, adds a characters to the
    beginning of the prompt indicating the current editing mode.

bash4.3 อยู่ในrcขั้นตอนนี้คุณควรจะได้รับแพ็คเกจสำหรับ distros ส่วนใหญ่โดยไม่ต้องรวบรวมจากแหล่งที่มาแม้ว่าจะไม่ได้อยู่ในแหล่งเก็บข้อมูลหลัก เช่น. อูบุนตู (amd64) ที่นี่และ Debian (จากการทดลอง repo) ที่นี่


โปรดทราบว่า: พรอมต์จะไม่ถูกปรับปรุงหากคุณใช้ PS1 ที่กำหนดเองซึ่งมีอักขระขึ้นบรรทัดใหม่ พบได้ที่นี่
pgericson

@pgericson ดูเหมือนว่าจะทำงานกับ PS1 แบบกำหนดเองที่มีการขึ้นบรรทัดใหม่สำหรับฉันใน bash 4.4.12
DuBistKomisch

2

ฉันไม่พบวิธีแก้ปัญหาที่แท้จริง แต่อาจช่วยคุณได้ (หรือคนอื่น) ในการหาวิธีที่ดีกว่า

คุณต้องสร้างสคริปต์ (เช่น kmtest.sh)

#!/bin/bash
# Script "kmtest.sh"

TEST=`bind -v | awk '/keymap/ {print $NF}'`
if [ "$TEST" = 'vi-insert' ]; then
   echo -ne "\033]12;Green\007"
else
   echo -ne "\033]12;Red\007"
fi

และหลังจากเพิ่มลงใน PS1 ของคุณแล้วสิ่งที่ชอบ:

export PS1="\u@\h \$(kmtest.sh)> "

แต่อย่างที่ฉันบอกไปมันไม่ใช่สิ่งที่คุณต้องการเพราะมันเปลี่ยนสีของเคอร์เซอร์หลังจาก cr โชคดี

GB


มันใช้งานได้จริงสำหรับคุณ? มันไม่ได้ผลสำหรับฉัน มันเพิ่งทำให้เคอร์เซอร์แดง ฉันไม่คิดว่า kmtest.sh ทำงานทุกครั้งที่ฉันสลับระหว่างโหมดแทรกและโหมดคำสั่ง ดูเหมือนว่าจะทำงานเฉพาะเมื่อมีการสร้างพรอมต์
joecan

1

ดูเหมือนว่าอาจมีวิธีที่จะทำผ่านการแฮ็ก readline บางทีเราสามารถผลักดันให้มันกลายเป็นกระแสหลักได้?

นี่คือคำตอบของฉันใน SO https://stackoverflow.com/a/12201092/255961ซึ่งฉันจะอัปเดตหากฉันได้รับข้อมูลเพิ่มเติม


1

ในขณะที่มันไม่ตรงกับสิ่งที่คุณต้องการ (การเปลี่ยนแปลงตลอดเวลาเคอร์เซอร์) ทุบตี 4.4 / 7.0 ReadLine จะเพิ่มการสนับสนุนสำหรับการเปลี่ยนแปลงแบบไดนามิกพร้อมท์ คุณจะสามารถระบุตัวบ่งชี้โหมดที่กำหนดเองสำหรับโหมดแทรก / คำสั่ง (ซึ่งแตกต่างจากshow-mode-in-promptตัวเลือกปัจจุบันซึ่งฮาร์ดโค้ดที่จะใช้+และ:)

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

ในระหว่างที่ฉันได้รับการตีพิมพ์รุ่น patched ของทุบตี 4.3 / 6.3 ReadLine บนGitHubกับการทำงานนี้


0

ฉันถามคำถามเดียวกันในขณะที่AskUbuntuเมื่อฉันเปลี่ยนจาก Gvim เป็น Console Vim

ฉันได้รับคำตอบเดียวแต่เกี่ยวข้องกับการสลับการตั้งค่าเทอร์มินัลของ gnome และการตั้งค่าเหล่านี้จะใช้กับเทอร์มินัล ดังนั้นจึงเป็นไปได้ที่เคอร์เซอร์เทอร์มินัล gnome จะติดอยู่ในสถานะที่ไม่ถูกต้องในบางครั้ง

ฉันยังคงสนใจว่าคุณจะได้รับโซลูชั่นที่น่าพอใจหรือไม่ แต่เมื่อเวลาผ่านไปฉันได้ปรับให้ขาดข้อมูลสถานะโหมดในเคอร์เซอร์ บางทีฉันอาจกดหลบหนีบ่อยขึ้น (เช่นescเพื่อให้แน่ใจว่าฉันอยู่ในโหมดคำสั่ง; esc iเพื่อให้แน่ใจว่าฉันอยู่ในโหมดแทรก); บางทีฉันดูสถานะที่แสดงที่ด้านล่างของหน้าจอ บางทีฉันแค่ทำให้โหมดอยู่ภายใน


3
เพียงชี้แจงให้ชัดเจนว่าคำถามของคุณไม่เหมือนกับของฉัน คุณถามวิธีเปลี่ยนเคอร์เซอร์ภายใน Vim บนคอนโซล นี้เป็นเอกสารที่ดีในวิกิพีเดียเป็นกลุ่ม ฉันต้องการที่จะทราบวิธีการทำเช่นนี้ในvi โหมดทุบตีของ
joecan
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.