Berbagai perintah pada baris yang sama

188

Saya telah mencoba untuk menemukan sesuatu yang akan memungkinkan saya menjalankan beberapa perintah pada baris yang sama di Vim, mirip dengan menggunakan titik koma untuk memisahkan perintah di sistem * nix atau &di Windows. Apakah ada cara untuk melakukan ini?

Bub Bradlee
sumber
2
Wow saya mencoba belajar tentang vim dari pertanyaan Anda (yang saya lakukan) dan ternyata saya bisa menggunakan ;alih-alih &&memisahkan perintah shell Unix juga!
8
@ebyrob Saya merasa penting untuk mencatat bahwa &&'boolean dan' dalam perintah shell jadi jika sudah command1 && command2, command2hanya akan dijalankan jika command1dieksekusi dengan sukses. dengan ;Anda hanya secara manual menentukan akhir dari baris itu dan memulai yang baru. Itu sama dengan menulis setiap perintah pada baris berbeda di skrip shell.
Will
... dan command1 || command2, command2 hanya akan mengeksekusi jika command1 gagal. Itu karena dalam logika komputer | | dan && bitwise, dan meskipun "&&" menyiratkan bahwa kedua perintah1 DAN perintah2 harus dievaluasi, perintah2 TIDAK perlu dievaluasi jika perintah1 gagal karena apa pun yang dikembalikan cmd2, selalu gagal sejak yang pertama kembali palsu ( 0), dan 0 && 1 akan tetap nol. Demikian pula, jika command1 = true, tidak ada alasan untuk perintah 2 dalam evaluasi ATAU karena pada saat itu sudah benar (1), karena 1 || 0 adalah 1, dan hanya jika itu adalah 0, akan membutuhkan 0 || 1 (yang masih 1)
osirisgothra
@osirisgothra yang dikenal sebagai evaluasi hubung singkat / hubung singkat.
Berbicara

Jawaban:

241

Bilah |akan memungkinkan Anda melakukan ini. Dari:help :bar

'|'dapat digunakan untuk memisahkan perintah, sehingga Anda dapat memberikan banyak perintah dalam satu baris. Jika Anda ingin menggunakan '|'argumen, awali dengan argumen '\'.

Contoh:

:echo "hello" | echo "goodbye"

Keluaran:

hello
goodbye

NB: Anda mungkin menemukan bahwa Anda ~/.vimrctidak mendukung pemetaan |, atau \|. Dalam kasus ini, coba gunakan <bar>sebagai gantinya.

michaelmichael
sumber
8
Berhati-hatilah dengan beberapa perintah yang tidak berfungsi |!
terlalu banyak php
31
Ketika Anda menemukan diri Anda ingin menggunakan banyak perintah dalam sebuah mappernyataan (dan percayalah, Anda akan), periksa :help map_bar.
Bill Odom
9
Itu benar. Saya menanyakan pertanyaan itu pada superuser beberapa bulan yang lalu. Saya .vimrctidak mendukung bilah lolos ( \|) untuk pemetaan. Saya belajar saya harus benar-benar mengetik <bar>.
michaelmichael
Terima kasih atas solusinya! :help barmenunjukkan motion.txt dan tidak tentang banyak perintah.
geekQ
1
@geekQ seharusnya:help <bar>
Sri Kadimisetty
92

Masukkan <CR>(Pengembalian / Masukkan Kereta) di antara dan setelah perintah. Sebagai contoh:

map <F5> :w<CR>:!make && ./run<CR>

Jangan gunakan |karena:

  • Beberapa perintah memiliki masalah jika Anda menggunakannya |setelahnya

  • | tidak bekerja secara konsisten dalam file konfigurasi, lihat :help map_bar

Babken Vardanyan
sumber
42

Anda bisa mendefinisikan fungsi yang mengeksekusi perintah Anda.

function Func()
     :command
     :command2 
endfunction

Dan letakkan ini di, misalnya, vimrc Anda. Jalankan fungsinya dengan

exec Func()
Jonatan
sumber
1
Solusi bersih. Pasti akan berguna untuk lebih dari dua atau hanya perintah yang panjang.
elimirks
1
Sangat berguna juga untuk kemampuan menangani kesalahan dengan try / catch.
Immanuel Weihnachten
2
Ini lebih konvensional untuk digunakan :call Func()karena :execute Func()berarti sesuatu yang lebih. Ini berarti melakukan nilai pengembalian fungsi sebagai perintah. Fungsi yang dijelaskan di sini biasanya tidak memiliki perintah yang dimulai :return, sehingga nilai kembalinya akan menjadi angka nol. Melakukan itu sebagai perintah akan memindahkan kursor ke baris pertama dari buffer saat ini, yang tidak selalu seperti yang Anda pikirkan.
minopret
26

Pemisah perintah dalam vim adalah |.

Daenyth
sumber
16

Saya selalu terbiasa ^Jmemisahkan beberapa perintah dengan menekan Ctrl+ v, Ctrl+ j.

eruciform
sumber
Ini tampaknya menjadi satu-satunya solusi yang benar-benar berfungsi. Siapa yang harus saya tentukan jika saya ingin menggunakannya dalam sebuah string?
DerWeh
Anda tidak dapat menggunakan ^Jsebagai pemisah perintah dalam sebuah string karena itu memasukkan karakter NULL yang mengakhiri string. namun Anda dapat menggunakan <CR> = "\ n".
Tinmarino
exe "echo 'foo' \n echo 'bar'"
Tinmarino
exe "echo 'foo'" . nr2char(0x0a) . "echo 'bar'"
Tinmarino
map aa :echo 'foo' <C-V><C-J> echo 'bar'<CR>
Tinmarino
12

Berpikir ini mungkin membantu seseorang yang mencoba melakukan pergantian rantai dan satu gagal

dari komentar

% s/word/newword/ge | % s/word2/newword2/ge

Anda dapat menggunakan ebendera untuk mengabaikan kesalahan saat string tidak ditemukan.

Jerinaw
sumber
2

Anda dapat membuat file baru, dan menulis perintah Anda di atasnya. Kemudian :so %, yang berarti sumber file saat ini.

Lagu
sumber