Ubah bentuk kursor (atau warna) untuk menunjukkan mode vi dalam bash

30

Untuk memperjelas: Saya tidak bertanya bagaimana cara mengubah kursor saat menggunakan vim di dalam terminal . Saya ingin kursor berubah ketika beralih antara input dan mode perintah dalam mode-Bash:

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

Saya menemukan skrip yang membuat perubahan warna kursor pada mode perubahan mungkin dilakukan di zsh , tapi saya tidak ingin mengganti shell hanya untuk fitur yang satu ini.

Apakah ada cara untuk membuat kursor berubah bentuk, seperti di gvim, (atau bahkan hanya warna) saat beralih antara perintah dan memasukkan mode pada baris perintah Bash?

joecan
sumber
Pertanyaan yang sama di SO untuk Putty, tidak ada jawaban tho :( - stackoverflow.com/questions/2393383/…
studgeek

Jawaban:

5

tambahkan dua baris ini ke ~ / .inputrc :

set vi-ins-mode-string \1\e[5 q\2
set vi-cmd-mode-string \1\e[2 q\2
holytrousers
sumber
4
Jawaban ini akan jauh lebih berguna jika Anda menjelaskan apa yang mereka lakukan dan memberikan beberapa konteks, misalnya, apakah pengaturan mengharuskan pengguna untuk memiliki versi Readline tertentu.
Anthony G - keadilan untuk Monica
:) di sini adalah entri manual: gnu.org/software/bash/manual/html_node/…
holytrousers
1
Ini hanya akan bekerja pada terminal dan emulator terminal yang memahami DECSCUSR.
JdeBP
Saya harus menambahkan set show-mode-in-prompt ondi ~/.inputrcjuga untuk membuat karya ini.
ronakg
4

Disalin dari sini - Gaya vim pengeditan baris perintah

Harus tersedia di bash4.3 - lihat changelog -

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 saat ini sedang dalam rctahap, Anda harus bisa mendapatkan paket untuk sebagian besar distro tanpa kompilasi dari sumber, meskipun tidak di repositori utama. Misalnya. Ubuntu (amd64) di sini dan Debian (repo eksperimental) di sini .

Graeme
sumber
Perhatikan bahwa: prompt tidak akan diperbarui jika Anda menggunakan PS1 khusus yang berisi karakter baris baru. ditemukan di sini
pgerics
@pgericson Tampaknya berfungsi dengan PS1 khusus berisi baris baru untuk saya di bash 4.4.12.
DuBistKomisch
2

Saya belum menemukan solusi nyata, tetapi mungkin ini dapat membantu Anda (atau orang lain) untuk menemukan solusi yang lebih baik.

Anda harus membuat skrip (misalnya 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

dan setelah menambahkannya ke PS1 Anda, sesuatu seperti:

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

tetapi seperti yang saya katakan, itu bukan apa yang Anda inginkan, karena itu mengubah warna kursor hanya setelah cr. Semoga berhasil

gb

gogolb
sumber
Apakah ini benar-benar bekerja untuk Anda? Itu tidak berhasil untuk saya; itu hanya membuat kursor merah. Saya tidak berpikir kmtest.sh dijalankan setiap kali saya beralih antara mode insert dan command. Sepertinya itu hanya akan berjalan pada penciptaan prompt.
joecan
1

Sepertinya mungkin ada cara untuk melakukannya melalui peretasan readline. Mungkin kita bisa mendorongnya untuk diarusutamakan?

Ini jawaban saya di SO https://stackoverflow.com/a/12201092/255961 yang akan saya perbarui jika saya mendapatkan info lebih lanjut.

Studgeek
sumber
1

Meskipun bukan apa yang Anda inginkan (mengubah kursor secara dinamis), bash 4.4 / readline 7.0 akan menambahkan dukungan untuk mengubah prompt secara dinamis . Anda akan dapat menentukan indikator mode khusus untuk mode sisipan / perintah (Ini berbeda dari show-mode-in-promptopsi saat ini yang di-hardcod untuk digunakan +dan :).

Sayangnya, versi ini saat ini masih dalam versi beta dan sepertinya belum semua bug diperbaiki. Mereka juga kehilangan kemampuan untuk menentukan di mana dalam prompt Anda ingin indikator mode muncul.

Untuk sementara saya telah menerbitkan versi patch bash 4.3 / readline 6.3 pada github dengan fungsi ini.

Dylan Cali
sumber
0

Saya menanyakan pertanyaan yang sama beberapa waktu lalu di AskUbuntu ketika saya beralih dari Gvim ke Console Vim.

Saya menerima satu jawaban tetapi itu melibatkan pengaturan terminal gnome, dan pengaturan ini berlaku di terminal. Dengan demikian, dimungkinkan untuk kursor terminal gnome terjebak dalam kondisi yang salah.

Saya masih tertarik pada apakah Anda mendapatkan solusi yang memuaskan, tetapi seiring waktu saya telah menyesuaikan dengan kurangnya informasi status mode dalam kursor. Mungkin saya lebih sering menekan escape (mis., escUntuk memastikan saya dalam mode perintah; esc iuntuk memastikan saya dalam mode insert); mungkin saya melihat keadaan yang ditampilkan di bagian bawah layar; mungkin saya baru saja menginternalisasi mode.

Jeromy Anglim
sumber
3
Hanya untuk memperjelas, pertanyaan Anda tidak sama dengan pertanyaan saya. Anda bertanya bagaimana cara mengubah kursor di dalam Vim di konsol. Ini didokumentasikan dengan baik di Vim wiki . Saya ingin tahu bagaimana melakukan ini dalam mode-Bash .
joecan