Apakah mode Ex memiliki penggunaan praktis?

115

Vim memiliki mode Ex yang dapat dimasukkan dengan memasukkan Q, dan mode baris perintah yang dapat dimasukkan dengan q:. Keluhan umum di antara pengguna vim baru adalah bahwa mereka memasuki mode ini secara tidak sengaja ketika mencoba untuk berhenti vim. Karena itu, saya menonaktifkan kunci-kunci ini dalam diri saya ~/.vimrcuntuk menghentikan diri sendiri mengenai hal itu secara tidak sengaja (khususnya q:):

map q: <Nop>
nnoremap Q <nop>

Meskipun saya telah membaca dokumentasi vim pada Ex , saya adalah pengguna Vim yang cukup berpengalaman, dan memahami ide dasar di baliknya, saya masih kesulitan menemukan penggunaannya dalam penggunaan vim harian saya. Secara umum tampaknya kurang bermanfaat daripada hanya memasukkan perintah baris perintah vim standar yang diawali dengan :, karena perubahan tidak langsung digemakan.

Apakah Ex memiliki penggunaan praktis sehari-hari di Vim modern? Apakah ada sesuatu yang lebih mudah dilakukan dalam mode Ex daripada dengan perintah standar? Apa perbedaan antara mode baris perintah dan mode ex?

Andrew Ferrier
sumber
13
Qdan q:sangat berbeda. Anda hanya merujuk ke Qkanan?
jamessan
@ jessam, sebenarnya, ternyata saya tidak yakin ... Anda benar, mereka tampaknya melakukan hal yang berbeda, meskipun saya berasumsi mereka pada dasarnya sama. Jika Anda menjawab pertanyaan ini, mungkin ada baiknya menjelaskan di sana, karena saya jelas bingung.
Andrew Ferrier
Pertanyaan ini sedang dibahas di Meta .
200_sukses
1
@AndrewFerrier Anda bertanya q:secara spesifik, dan menyebutkannya sebagai, di antara dua urutan utama, yang paling banyak Anda hadapi. Dan dua jawaban di sini mungkin bermanfaat bagi orang yang mencarinya dengan istilah yang benar.
Acak 832
4
Ketika Anda mempelajari apa q/dan apa yang q:harus dilakukan, Anda mungkin akan menganggapnya sebagai beberapa perintah paling berguna di Vim. Dan ya, Anda sudah tahu cara menggunakannya, Anda belum tahu apa yang mereka lakukan. Tonton screencast ini untuk mencari tahu.
Sato Katsura

Jawaban:

81

Qadalah, seperti yang Anda temukan, mode ex. Ini tidak sepenuhnya berguna untuk digunakan secara interaktif, tetapi itu ada karena Vim dapat digunakan untuk meniru exbiner lama . Faktanya, banyak sistem menyediakan experintah hanya dengan menghubungkannya vim.

q:, atau :<C-f>, sebaliknya menyediakan cara untuk menelusuri riwayat baris perintah Anda dan mengeditnya seperti buffer normal. Ini membuatnya mudah untuk menemukan perintah sebelumnya yang Anda jalankan, edit dengan perintah Vim normal, dan kemudian jalankan perintah yang dimodifikasi. The q/dan q?perintah ada untuk menyediakan fungsi yang sama untuk riwayat pencarian.

jamessan
sumber
64

Vim dalam mode Ex berguna ketika:

  • Anda perlu mengedit (banyak) file secara non-interaktif (sebagai bagian dari skrip).
  • Koneksi Anda sangat lambat atau layar tidak diperbarui setelah tindakan Anda.
  • Pemetaan dan singkatan dinonaktifkan.
  • Kunci umum seperti Escapeatau Controltidak berfungsi dengan baik.

Pada dasarnya viadalah mode visual karena exitu Mode Vim Ex hanya emulasi ex(mereka masih menjalankan kode yang sama), sehingga dimungkinkan untuk mendapatkan ke mode perintah exdari dalam vi dan sebaliknya. Sebenarnya ada dua mode: Ex mode ( vim -e) dan mode Ex ditingkatkan yang memungkinkan untuk perintah lebih lanjut daripada mode Ex-kompatibel ( vim -E). Lihat: Apa perbedaan antara mode Ex dan mode Ex yang ditingkatkan?

Ex adalah akar dari keluarga editor: edit, exdan vi. Ex adalah super-set ed, dengan ekstensi yang paling terkenal adalah fasilitas pengeditan tampilan. ex (1)

Mengedit file secara non-interaktif adalah penggunaan yang paling umum dan orang-orang menggunakannya dengan cara yang sama seperti seddan awk, namun mereka lebih berorientasi pada aliran - mereka hanya membaca file dari awal sampai akhir (mereka tidak dirancang untuk bekerja dengan banyak baris ) sementara vimberorientasi buffer - Anda dapat bergerak maju dan mundur dalam file sesuka Anda yang membuatnya sangat kuat.

Pada dasarnya:

sedadalah S tream ED itor, bukan file editor.

Namun demikian, orang-orang tampaknya menyalahgunakannya karena mencoba mengedit file dan kenyataannya tidak mengedit file. Kedua pilihannya seperti in-place ( -i) adalah ekstensi FreeBSD non-standar dan mungkin tidak tersedia pada sistem operasi lain. Jadi, jika Anda ingin menghindari kode yang tidak dapat diakses, overhead I / O dan efek samping yang buruk (seperti menghancurkan symlink), Anda harus menggunakan exyang merupakan editor berbasis perintah UNIX standar (bersama dengan ed) BashFAQ .


Hal-hal lain yang saya temukan berguna dalam mode Ex adalah menggunakannya sebagai taman bermain (mirip dengan pythonkonsol) di mana Anda dapat menjalankan banyak perintah berturut-turut, bekerja / men-debug ekspresi reguler, memeriksa konfigurasi vim, menjalankan perintah eksternal atau bekerja dengan register, dll .

Sebagai contoh:

let @d = '<td></td>'
let @r = '<tr>' . repeat(@d, 5) . '</tr>'
echo @r
let @t = '<table>' . repeat(@r, 5) . '</table>'
reg

yang lebih mudah dalam mode Ex daripada dalam mode normal (di mana Anda hanya dapat melihat perintah terakhir Anda).


Penggunaan praktis

Saya memiliki alias berikut di .bash_aliases:

alias trim="ex +'bufdo!%s/\s\+$//e' -scxa"
alias retab="ex +'set ts=2' +'bufdo retab' -scxa"

Catatan: Menggunakan bufdobukan exmetode yang sesuai dengan POSIX (sesuai manual ), jadi Anda dapat mempertimbangkan untuk menggunakannya find. Ini !digunakan untuk memaksa mengganti buffer tanpa menyimpan (jika tidak, peringatan akan dihasilkan).

Yang pertama saya gunakan untuk memangkas spasi tambahan di semua file sumber saya, misalnya:

trim **/*.php

Yang kedua mengubah semua tab menjadi spasi (secara rekursif), misalnya:

retab **/*.php

Bagi saya menggunakan retabsudah cukup, tetapi ada beberapa kelemahan yang dijelaskan di sini . Tambahkan ekstra -Vuntuk meningkatkan output verbositas.

Perhatikan bahwa contoh di atas menggunakan globbing zsh / bash4 ( **), jadi pastikan shell Anda mendukungnya dan diaktifkan.

Untuk contoh yang lebih praktis (seperti parsing file html), periksa:

Pelajari juga lebih lanjut tentang Ex-mode di:

kenorb
sumber
Dapatkah Anda silahkan posting contoh "editing (multiple) file non-interaktif" operasi yang lebih sederhana untuk mencapai dengan exdaripada dengan ed, sedatau awk?
Sato Katsura
1
@SatoKatsura Menambahkan dua penggunaan praktis yang berhubungan dengan banyak file.
kenorb
Saya telah menggali dokumentasi untuk mendapatkan pemahaman yang lebih baik tentang exmode. Saya tidak mengerti mengapa Anda memiliki bang ( !) pada perintah trimalias Anda bufdo. Bukankah itu hanya meninggalkan semua perubahan di semua file kecuali yang terakhir? Jika tidak, mengapa tidak?
Wildcard
@Wildcard Tanpa !dasarnya tidak akan berfungsi, karena setiap kali buffer diaktifkan, exakan mengeluh tentang perubahan yang tidak disimpan (dan kami menyimpan perubahan di bagian paling akhir dengan xa). Peringatan dapat dinonaktifkan, tetapi lebih mudah untuk ditambahkan !.
kenorb
Begitu ... saya kira saya salah membaca dokumentasi, lalu; itu menetapkan bahwa tanpa itu !perintah akan gagal jika buffer tidak bisa ditinggalkan, tetapi tidak secara eksplisit menentukan bahwa !akan menyebabkan buffer untuk tidak dibuang .... Jadi, apakah "ditinggalkan" dalam hal ini berarti "turun , karena tidak mengandung apa pun yang tidak ditulis ke disk "? Atau apa? (Saya sedang melihat :help bufdo)
Wildcard
18

Saya jarang menggunakan ex-mode, tetapi ketika saya membutuhkannya saya bersyukur atas keberadaannya.

Saya kadang-kadang mengakses sistem melalui ssh melalui VPN, dan koneksi ini terkadang lambat. Membuat masalah menjadi lebih buruk, kadang-kadang saya perlu mengedit file di sisi remote yang, selain berada di belakang ssh dan VPN, adalah melalui koneksi serial yang lambat (jadi, 9600 baud ditambah banyak latensi jaringan).

Saat-saat seperti inilah yang memiliki umpan balik visual dan pembaruan layar menjadi lebih banyak penghalang karena apa yang saya lihat tertunda (efeknya seperti berbicara ke dalam mikrofon tetapi dengan speaker yang jauh, seperti di stadion olahraga. Tindakan seseorang menjadi berombak dan kadang-kadang bingung karena umpan balik yang tertunda).

Dalam hal ini, memiliki perubahan yang tidak diulang kembali merupakan keuntungan yang bermanfaat, karena saya bisa menyelesaikan lebih banyak dalam waktu yang lebih singkat ketika saya tidak menunggu layar untuk diperbarui.

Setelah selesai mengedit, saya kembali ke mode visual untuk pembaruan layar satu kali untuk meninjau pekerjaan saya. Lalu saya dapat kembali ke mode ex-atau menyimpan karena saya sudah selesai.

John O'M.
sumber
13

Jendela baris perintah berguna untuk menuliskan perintah rumit yang panjang. Karena riwayat perintah terbuka sebagai jendela, Anda dapat menggunakan navigasi vim atau mengedit perintah / pemetaan.

Katakanlah Anda ingin mengedit perintah substitusi panjang yang Anda jalankan sekali, tetapi telah membuat kesalahan:

:%165,177s:here is a whole bunch of text I wnat to replace:here is the replacement:c

Untuk mengubah string pencarian, Anda tidak dapat menggunakan gerakan vim seperti bpada baris Ex untuk menavigasi (meskipun saya percaya bahwa ada pemetaan kunci untuk navigasi ini). Sebagai gantinya, kebanyakan orang akan menekan tombol panah kiri beberapa kali.

Cara yang lebih baik: tekan q:untuk masuk ke jendela baris perintah, kuntuk naik ke perintah terakhir, dan navigasi dengan gerakan normal ke bagian perintah yang ingin Anda ubah. Ingin mengubah seluruh kata, tidak ada masalah: ciw.

bsmith89
sumber
Ok terima kasih. Apakah Anda yakin q: adalah Ex baris perintah? Bantuan hanya menggunakan frasa "Ex" untuk mode yang ditampilkan Q, tetapi itu tidak mendukung pengeditan vim standar yang Anda maksud - hanya q:melakukannya, yang bantuannya sebut 'mode baris perintah'. Saya tahu saya bingung keduanya pada awalnya, tetapi kita mungkin harus memastikan bahwa kita jelas tentang perbedaan di sini.
Andrew Ferrier
1
Saya mencari :help q:sebelum saya memutuskan untuk menggunakan frasa itu, tetapi saya mungkin bingung tentang terminologinya.
bsmith89
1
Saya bingung tentang istilah ini juga. Saya biasanya berbicara tentang mengetikkan perintah Ex sebagai sesuatu yang mengikuti :, tetapi saya bisa menggunakan itu salah.
bsmith89
3
Isi jawaban Anda semuanya benar, tetapi cara Anda menggunakan terminologi itu (bagi saya) agak membingungkan. Saya pikir Anda menafsirkan dokumentasi sedikit salah. q:tidak membuka baris perintah Ex. Ini membuka jendela histori perintah , di mana perintah Ex saat ini dan sebelumnya dapat diedit. Baris perintah Ex adalah apa yang Anda dapatkan ketika Anda menekan :dalam mode Normal.
Kaya
3
FWIW Saya pikir dokumentasi Vim agak bingung juga, karena di tempat itu mengacu pada semua :perintah sebagai perintah 'Ex'. IMHO sebenarnya hanya perintah yang benar-benar tersedia di Ex yang harus dianggap sebagai perintah Ex.
Kaya
6

Saya diberitahu oleh seseorang dengan penglihatan sebagian yang menjadi buta bahwa ia beralih ke mantan, jadi itu salah satu penggunaannya. Saya sendiri jauh lebih tua dari vi, dan saya beralih dari ed ke ex sejak lama (ya, saya tahu, "ed adalah editor standar"). Satu-satunya hal yang saya lakukan dalam mode vi adalah%-bouncing untuk mencocokkan parens saat menulis kode Lisp.

John Cowan
sumber
Mengingatkan saya pada wawancara ini . Saya tidak ingat apakah exsecara spesifik disebutkan.
Martin Tournoij
Wawasan luar biasa, saya tidak akan pernah memikirkan hal ini. Terima kasih banyak, jawaban yang bagus.
Andrew Ferrier
2

Terlepas dari penggunaan yang telah disebutkan di sini, ex juga merupakan cara untuk mengedit file pada konsol linux jika itu terjadi pada platform S / 390 dan konsol tersebut berorientasi pada garis, bukan berorientasi layar.

Thomas
sumber
0

Apakah mode Ex memiliki penggunaan praktis?

Mungkin tidak. Namun, saat memasuki mode Ex tidak benar-benar berguna, mempelajari perintah Ex masih berguna, terutama karena Anda menggunakan perintah pengeditan ex dengan :g/perintah global untuk beroperasi pada baris yang cocok.

Lie Ryan
sumber
-1

"Ex" asli adalah versi upgrade dari editor teks "ed" di Unix. Dalam 2BSD mode visual ditambahkan, dan editor baru disebut "vi".

Jika seseorang ingin menggunakan baris perintah ex, ia akan beralih ke mode perintah dengan tombol ":". Jadi, dalam pemahaman terbaik saya, mantan sebenarnya tidak ada untuk nostalgia, itu adalah bagian untuk menyediakan mode perintah.

Anda juga dapat memasukkan mode sisipannya dengan

 :i 

lalu tekan "enter dan ketik teks Anda. Keluar dengan ^ c. Atau ketik semuanya pada satu baris perintah, seperti

 :i my multiline text \with a second line.^c
if2
sumber
1
Mengingat bahwa Ex-mode tidak sama dengan mode Command-line-mode , sepertinya ini tidak menjawab pertanyaan. Dan sebagai catatan tambahan: mode perintah adalah sinonim yang tidak menguntungkan untuk mode Normal, bukan mode baris perintah.
8bittree
Titik "Mode Perintah" diambil. Hanya alasan, ketika kami mengubah ke vi penambahan baru kami diperkenalkan sebagai "visual" (bukan mode visual vim sekarang) yang bertentangan dengan "perintah" - sekarang ex. Di sisi lain, command-line tampaknya memanggil do_cmdline () yang sama dengan ex. Bukan berarti itu menyarankan "penggunaan praktis" yang saya akui.
if2