Menggunakan tombol VI untuk mengedit perintah shell di UNIX

28

Saya dulu punya rekan kerja yang sangat bagus di UNIX.

Dia menunjukkan kepada saya bagaimana menggunakan binding kunci Vi untuk mengedit perintah shell saya.

Dia menempatkan perintah dalam file yang berjalan setiap kali saya masuk.

Sejak itu, saya pindah ke proyek lain.

Sayangnya saya tidak ingat bagaimana mengaturnya.

Apakah ada orang di sini yang tahu cara menggunakan binding kunci Vi untuk mengedit perintah di terminal?

Bagaimana saya bisa menjadikan pengaturan itu permanen?

pengguna919860
sumber

Jawaban:

31

Anda sedang berbicara tentang fitur terhebat yang pernah ada!

Anda dapat menggunakan perintah vi untuk mengedit perintah shell (dan riwayat perintah) dengan menambahkan ini ke .bashrcfile Anda :

set -o vi

Anda juga dapat menjalankan perintah itu dari baris perintah untuk memengaruhi hanya sesi Anda saat ini.

Jika Anda tidak menggunakan bash, gantikan file rc yang sesuai untuk shell Anda.


Ini memungkinkan Anda untuk menggunakan perintah vi untuk mengedit perintah apa pun ...

Anda juga dapat menggunakan jdan kuntuk menelusuri riwayat Anda (setelah menekan ESC).

Anda juga dapat menggunakan /(setelah memukul ESC) untuk mencari perintah lama.

Dengan kata lain, untuk menemukan cpperintah super panjang yang Anda lakukan sepuluh menit yang lalu:

ESC/cpENTER

Kemudian Anda bisa melihat semua perintah yang cocok dalam riwayat Anda dengan ndan N.

Semua ini membuat saya 10 triliun kali lebih produktif di baris perintah!

Jahroy
sumber
4
Yah, itu tidak benar-benar menggunakan vi, itu menggunakan perintah keyboard vi-style untuk mengedit baris.
4
Tentu ... Saya kira istilah yang tepat adalah vi bindings in the shellfitur terbesar yang pernah ditemukan!
Jahroy
Saya akan beralih dari binding emacs ke vi binding jika ada cara untuk menampilkan mode. Apakah Anda tahu cara untuk melakukan itu?
iconoclast
Mereka, apakah ada cara untuk mengikat jjdengan ESCseperti yang biasanya kita lakukan di vim?
steveyang
@yangchenyun - Mungkin pertanyaan ini akan membantu dengan itu: stackoverflow.com/questions/844862/... Saya pribadi tidak mengikat / mengubah salah satu perintah, jadi saya tidak yakin apa yang Anda tanyakan.
Jahroy
12

Jika Anda menggunakan bash, seperti yang dijawab jahroy dan otto jahat, Anda dapat menggunakannya

set -o vi

menyebabkan bash menggunakan perintah pengeditan vi-style.

Setelah selesai, Anda dapat mengetik Esc vuntuk meluncurkan editor vi dengan file sementara yang berisi salinan baris perintah saat ini. Anda dapat mengedit perintah, bahkan menggantinya dengan beberapa baris; ketika Anda menyimpan file ( :wq), shell akan menjalankan perintah yang diedit.

Jika kamu memilih

set -o emacs

Anda dapat menggunakannya Ctl-XCtl-Euntuk melakukan hal yang sama. Ini akan menggunakan editor pilihan Anda $EDITOR, tidak harus emacs.

(Secara pribadi, saya menggunakan vi (sebenarnya vim) untuk sebagian besar pengeditan saya, tetapi saya lebih suka set -o emacsdi shell; beralih masuk dan keluar dari mode insert sangat bagus untuk mengedit file, tetapi canggung untuk perintah interaktif. YMMV.)

Keith Thompson
sumber
apakah Anda tahu cara untuk kembali ke mode edit normal dengan menghindari vi-style? Saya ingat berhasil dengan Bl Num, tetapi sekarang tidak lagi; apa yang saya lewatkan?
piertoni
@piertoni: Tidak set -o emacsmelakukan apa yang Anda inginkan?
Keith Thompson
Ya, itu berhasil, saya melewatkan intinya, terima kasih
piertoni
10

Anda dapat menggunakan set -o viuntuk mengubah perintah pengeditan baris Anda sebagai @jahroy diposting, tetapi Anda mungkin berpikir tentang fcperintah (tersedia dalam bash dan saya pikir ksh, tetapi mungkin tidak tcsh), yang akan menempatkan perintah sebelumnya menjadi editor (FCEDIT atau EDITOR , yang mungkin telah Anda atur ke vi) dan kemudian jalankan perintah saat Anda keluar dari editor. Lihat halaman manual atau help fcuntuk detailnya, atau coba saja.

otto jahat
sumber
5
alias r='fc -e -'adalah alias berharga untuk menjalankan kembali perintah sebelumnya. fcsendiri berasal dari kulit Korn, saya percaya. Anda dapat menentukan perintah berdasarkan nomor ( fc 123 129untuk mengedit nomor perintah 123 hingga 129 dalam riwayat). Anda dapat menentukan angka relatif ( fc -10 -1untuk mengedit 10 perintah terakhir yang dimasukkan). Anda dapat mendaftar perintah sebelumnya dengan fc -l. Anda dapat menentukan perintah dengan awalan dengan ralias ( r makemenjalankan permintaan terakhir make; begitu juga r mjika Anda belum menjalankan mvperintah sejak Anda terakhir berlari make, dll.).
Jonathan Leffler
6

Untuk mengedit perintah yang paling baru digunakan dalam vim dan menjalankan versi yang diedit setelah editor menyimpan dan keluar, gunakan fcshell built-in. Tanpa argumen apa pun akan dilakukan hal berikut:

  1. Membuat file sementara /tmpdan mengisinya dengan perintah yang baru diketik
  2. Setelah editor keluar secara normal (dengan kode keluar 0) ia menjalankan perintah yang ditemukan dalam file sementara itu dan menghapus file ini. Versi yang diedit disimpan dalam histori sebagai perintah biasa (setidaknya dalam zsh). Tidak ada yang dieksekusi jika editor keluar dengan kode selain nol (dalam vim ini dapat dicapai dengan membunuhnya atau menggunakan :cquit).

Perintah berfungsi baik dalam bash dan zsh.

ZyX
sumber
5

Memang, ini sebenarnya fitur terbesar yang pernah ada. Masih ada lagi:

Buat file dengan nama

.editrc

mengandung garis

bind -v

Editline , adalah pustaka versi berlisensi BSD yang menyediakan layanan seperti readline. Itu .editrc akan mengatur keybindings Anda ke mode vi di shell baris perintah MySQL, atau aplikasi apa pun yang tidak menggunakan readline.

Saya telah menjadi agak pelupa dengan berlalunya waktu, jadi .zshrc saya mencari beberapa pembungkus untuk mode vi, untuk menunjukkan kepada saya mode apa yang saya gunakan di baris perintah. Itu bagus.

Saya tahu di zsh Anda bisa mengetik

bindkey -L

dan dapatkan daftar keybindings. Saya yakin bash pasti memiliki sesuatu yang serupa. Tidak semua tombol vi terikat secara default. Ikat mereka sesuai keinginan Anda dan Anda akan pergi ke balapan.

chiggs
sumber
Seandainya saya bisa memperbaiki ini 5 kali untuk binding di MySQL!
Jahroy
1

di terminal Anda, ketik export EDITOR=vi.

Untuk menyimpan pengaturan ini. letakkan baris ini di file ~ / .profile


sumber
5
Itu menetapkan editor default Anda (untuk perintah yang memperhatikan $EDITOR) vi. Itu tidak memungkinkan Anda mengedit perintah shell dengan vi(setidaknya tidak secara langsung).
Keith Thompson
2
@KeithThompson Zsh secara default ke mode edit vi jika $EDITORberisi vi. Saya pikir itu satu-satunya shell yang melakukan ini.
Gilles 'SANGAT berhenti menjadi jahat'