Bagaimana cara menunjukkan mode Vi saat ini ketika menggunakan keybindings Vi di shell?


15

Saya menggunakan keybindings vi di shell tcsh saya.

Sekarang, saya tidak tahu di mana mode vi saya ( insertmode atau commandmode), yang menyebabkan banyak frustrasi.

Apakah ada yang tahu cara untuk menunjukkan mode vi saat ini di shell? (dengan memasukkan prompt atau sesuatu)

Jawaban:


4

Saya tidak percaya ada cara untuk menentukan secara visual apa mode Anda, tetapi jika Anda sedikit mengubah perilaku Anda, itu tidak masalah.

Jika Anda ingin berada dalam mode perintah, tekan ESC sebelum mengetik perintah.

Jika Anda ingin berada dalam mode penyisipan, tekan ESC dan saya sebelum mengetik konten.

Anda akan sering menekan ESC, tetapi setiap pengguna vi yang pernah saya temui melakukannya.


1
Masalahnya adalah, di shell, ESC tambahan tidak diabaikan - ketika saya memberikan ESC tambahan, kemudian ketik perintah (misalkan h untuk bergerak ke kiri), itu hanya memberi bunyi bip dan tidak melakukan apa-apa.
sundar - Reinstate Monica

2
Dengan "ESC ekstra", maksud saya menekan ESC ketika saya sudah dalam mode perintah - yang saya lakukan banyak karena saya tidak tahu mode apa yang saya masuk
sundar - Reinstate Monica

Anda benar. Saya sudah menggunakannya begitu lama sehingga saya bahkan tidak memperhatikan perilaku itu lagi. Sekali lagi, jawaban paling sederhana. Jika Anda menekan ESC dan h dan tidak ada yang terjadi, tekan h lagi. Saya pikir itu membuka pertanyaan lain. Mengapa menekan ESC saat berada dalam mode 'perintah' pada keybindings vi menyebabkan karakter berikutnya tidak ditafsirkan dengan benar? vi itu sendiri tidak melakukan ini. Saya dapat mengetik ESC 10 kali dan perintah berikutnya masih berfungsi seperti yang diharapkan.
Bob Weber

Tip lain, matikan bel. Ini sangat menjengkelkan hanya karena alasan yang Anda gambarkan - dan karena berbunyi bip saat selesai membaca. Ada berbagai cara untuk melakukan ini tergantung pada lingkungan Anda.
Bob Weber

1
Ok, saya sedang mencoba solusi ini. Memetakan Caps Lock to Escape telah membuat penerapan ini lebih mudah, tapi saya belum terbiasa dengan ESC-i untuk mode penyisipan. Saya harap saya akan segera. > Jika Anda menekan ESC dan h dan tidak ada yang terjadi, tekan h lagi Masalahnya adalah, ini cukup membuat frustasi dan banyak aliran putus. Ini adalah hal tambahan yang harus saya pikirkan selain perintah yang saya bentuk. Saya lebih suka vi keybindings untuk alasan bahwa mereka berada di memori otot saya dan memberikan satu hal yang kurang untuk berpikir tentang - semacam ini istirahat yang tujuan itu sendiri ...
sundar - mengembalikan Monica

3

Saya sudah melihat-lihat dokumentasi, dan saya harus mengatakan saya tidak dapat menemukan cara untuk mendeteksi dan menampilkan mode-vi saat ini. Saya harap Anda memiliki kejutan yang menyenangkan dan seseorang datang dengan solusi, tetapi saya jelas tidak bisa melihat cara untuk melakukan apa yang Anda minta.

Saya pikir ada cara untuk melakukan ini, tetapi itu adalah kerja keras yang sangat besar untuk gangguan kecil, dan saya tidak berpikir itu yang ada dalam pikiran Anda ketika Anda mengajukan pertanyaan ini. Jika ini benar, berhentilah membaca sekarang dan nikmati hidup Anda.

OTOH, jika ini benar-benar hewan peliharaan Anda, dan itu membuat Anda gila, dan Anda benar-benar ingin sekali memecahkan masalah ini, inilah ide saya tentang bagaimana cara mengatasinya:

  1. Dapatkan salinan Pemrograman Tingkat Lanjut di Lingkungan UNIX (R) oleh W. Richard Stevens.
  2. Baca bab tentang Streaming dan Terminal I / O.
  3. Unduh kode sumber ke buku yang disebutkan di atas, yang mencakup contoh aliran yang dapat berlapis ke terminal.
  4. Terapkan penanganan Anda untuk kombinasi tombol Esc (atau kedua mode, tekan tombol ganti), dan tunjukkan melalui bel atau manipulasi latar belakang garis saat ini.

Singkatnya, Unix mengimplementasikan terminal I / O sebagai aliran I / O dupleks penuh antara driver perangkat dan proses pengguna, ke mana modul dapat dimasukkan. Ini diatur sebagai tumpukan, sehingga Anda dapat melapis aliran sebanyak yang Anda inginkan. Jumlah aliran yang disuntikkan menciptakan perilaku I / O terminal Anda.

Ketika sebuah karakter dimasukkan, modul pertama akan memeriksanya dan meneruskannya (jika mau). Ketika respons tiba di arah yang berlawanan, itu sekali lagi mendapat kesempatan untuk memeriksa dan meneruskannya. Ini adalah cara Ctrl-C ditangani pada tingkat yang lebih tinggi ke kunci karakter normal.

Anda dapat membuat biner yang mengimplementasikan modul stream, yang ketika dijalankan dijalankan secara diam-diam di latar depan, memeriksa dan meneruskan semua penekanan tombol, melakukan tindakan yang Anda sukai pada penekanan tombol yang Anda pedulikan. Untuk semua maksud dan tujuan, itu akan tampak seolah-olah Anda sedang mengerjakan shell. Oooh. Anda dapat memanggil biner ini pada baris terakhir (atau pertama, atau apa saja) dari .tcshrc Anda dan Anda bahkan tidak akan tahu itu ada.

Ada primer yang bagus di sini , tetapi saya tidak dapat menemukan banyak tentang topik ini, mungkin karena sudah melewati masa jayanya.


2

Halaman ini memiliki skrip yang cukup terperinci yang mengatur apa yang Anda inginkan (dan lebih banyak lagi) di zsh . Mungkin bisa diadaptasi untuk bekerja dengan tcsh (saya tidak terlalu terbiasa dengan shell itu).


Saya juga tidak terbiasa dengan tcsh, tapi saya pikir halaman yang Anda tampilkan menggunakan widget zsh (with zle). Saya tidak berpikir kerang lain memiliki itu, tetapi jika mereka melakukannya, pasti akan melakukan trik.
BrianH

1

Untuk siapa pun yang memiliki masalah ini (seperti saya): Saya menemukan solusi di stackoverflow . Rupanya ada dukungan asli untuk ini di readline, jadi Anda bisa menambahkan yang berikut ini ke ~/.inputrc:

set show-mode-in-prompt on

Dan untuk menyesuaikan penggunaan karakter yang sebenarnya:

set vi-ins-mode-string "custom-ins"
set vi-cmd-mode-string "custom-cmd"

0

Pengeditan Baris Perintah dengan tcsh

Ada dua mode utama untuk mengedit baris perintah,
berdasarkan pada dua editor teks yang paling umum digunakan, Emacs dan vi.

Dengan binding vi , Anda harus beralih antara mode insert dan command ;
perintah yang berbeda berguna dalam setiap mode.

Mode vi memiliki dua submode,mode insert dan command .

  • Mode default adalah menyisipkan .
  • Anda dapat beralih di antara mode dengan menekanEsc .
  • Atau, dalam mode perintah ,
    mengetik 'a' (append) atau 'i' (insert) akan mengembalikan Anda ke mode insert
    .

Lebih banyak catatan pada halaman tcshpenyesuaian yang sudah ditautkan di atas.


2
Tautan Anda menuju ke buku-buku O'Reilly yang dilindungi hak cipta ...
BrianH

0

Saya memiliki masalah yang persis sama dan secara tidak sengaja menemukan solusinya. Meskipun utas ini sudah tua, saya tidak dapat menemukan situs web lain yang menawarkan solusi, jadi saya menganggap memposting di utas ini tidak apa-apa.

Setel ulang pengaturan program terminal atau shell Anda. Saat ini saya menggunakan Putty, dan saya baru saja menghapus pengaturan saya yang disimpan untuk koneksi saya yang disimpan, dan menciptakan kembali sesi yang disimpan. Bekerja seperti pesona.

Semoga ini membantu!


0

Silakan lihat jawaban saya di SO . Bash 4.4 / Readline 7.0 akan menambahkan dukungan untuk fungsi ini, dan untuk sementara saya telah menerbitkan versi patch dari Bash 4.3 / Readline 6.3 ke github .

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.