Nhiều lệnh trên cùng một dòng


187

Tôi đã cố gắng tìm thứ gì đó cho phép tôi chạy nhiều lệnh trên cùng một dòng trong Vim, giống như sử dụng dấu chấm phẩy để phân tách các lệnh trong hệ thống * nix hoặc &trong Windows. Có cách nào để làm việc này không?


2
Wow tôi đã cố gắng tìm hiểu về vim từ câu hỏi của bạn (mà tôi đã làm) và phát hiện ra tôi có thể sử dụng ;thay vì &&để tách các lệnh shell Unix!

8
@wiserob Tôi cảm thấy điều quan trọng cần lưu ý đó &&là 'boolean và' trong các lệnh shell nên nếu bạn có command1 && command2, command2sẽ chỉ thực hiện nếu được command1thực hiện thành công. với việc ;bạn chỉ định thủ công kết thúc dòng đó và bắt đầu một dòng mới. Nó giống như viết mỗi lệnh trên một dòng khác nhau trong tập lệnh shell.
Sẽ

... và lệnh1 | | lệnh2, lệnh2 sẽ chỉ thực hiện nếu lệnh1 thất bại. Đó là bởi vì trong logic máy tính, | | và && là bitwise, và mặc dù "&&" ngụ ý rằng cả hai lệnh1 AND lệnh2 sẽ được xử lý, lệnh 2 KHÔNG cần phải được đánh giá nếu lệnh1 thất bại vì dù cmd2 trả về, nó sẽ luôn thất bại vì lệnh đầu tiên trả về sai ( 0) và 0 && 1 sẽ vẫn bằng 0. Tương tự, nếu lệnh1 = true, không có lý do nào cho lệnh 2 trong đánh giá OR vì tại thời điểm đó, nó đã đúng (1), vì 1 || 0 là 1 và chỉ khi đó 0, sẽ cần 0 || 1 (vẫn là 1)
osirisgothra

@osirisgothra được gọi là đánh giá ngắn mạch / ngắn mạch.
nói

Câu trả lời:


241

Một thanh |sẽ cho phép bạn làm điều này. Từ:help :bar

'|'có thể được sử dụng để phân tách các lệnh, vì vậy bạn có thể đưa ra nhiều lệnh trong một dòng. Nếu bạn muốn sử dụng '|'trong một đối số, đi trước nó với '\'.

Thí dụ:

:echo "hello" | echo "goodbye"

Đầu ra:

hello
goodbye

NB: Bạn có thể thấy rằng bạn ~/.vimrckhông hỗ trợ ánh xạ |, hoặc \|. Trong những trường hợp này, hãy thử sử dụng <bar>thay thế.


8
Chỉ cần coi chừng một số lệnh không hoạt động |!
quá nhiều php

31
Khi bạn thấy mình muốn sử dụng nhiều lệnh trong một mapcâu lệnh (và tin tôi đi, bạn sẽ làm được), hãy kiểm tra :help map_bar.
Bill Odom

8
Đúng. Tôi đã hỏi câu hỏi đó trên superuser vài tháng trước. Tôi .vimrckhông hỗ trợ thanh thoát ( \|) cho ánh xạ. Tôi đã học được rằng tôi phải thực sự loại ra <bar>.
michaelmichael

Cảm ơn các giải pháp làm việc! :help barhiển thị Motion.txt mặc dù và không có gì về nhiều lệnh.
geekQ

1
@geekQ nên là:help <bar>
Sri Kadimisetty

90

Đặt <CR>(Vận chuyển trở lại / Enter) giữa và sau các lệnh. Ví dụ:

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

Đừng sử dụng |vì:

  • Một số lệnh có vấn đề nếu bạn sử dụng |sau chúng

  • | không hoạt động nhất quán trong các tập tin cấu hình, xem :help map_bar


42

Bạn có thể định nghĩa một hàm thực thi các lệnh của bạn.

function Func()
     :command
     :command2 
endfunction

Và đặt cái này vào, ví dụ, vimrc của bạn. Chạy chức năng với

exec Func()

1
Dung dịch sạch. Chắc chắn sẽ có ích cho nhiều hơn hai hoặc chỉ các lệnh dài.
bỏ

1
Cũng rất hữu ích cho khả năng xử lý lỗi với thử / bắt.
Immanuel Weihnachten

2
Nó thông thường hơn để sử dụng :call Func()bởi vì :execute Func()có nghĩa là một cái gì đó nhiều hơn. Nó có nghĩa là để thực hiện giá trị trả về của hàm như một lệnh. Hàm được mô tả ở đây thường sẽ không có lệnh bắt đầu bằng :return, vì vậy giá trị trả về của nó sẽ là số không. Thực hiện điều đó như một lệnh sẽ di chuyển con trỏ đến dòng đầu tiên của bộ đệm hiện tại, đây không phải là điều bạn luôn nghĩ đến.
minopret


16

Tôi đã luôn sử dụng ^Jđể phân tách nhiều lệnh bằng cách nhấn Ctrl+ v, Ctrl+ j.


Đây dường như là giải pháp duy nhất thực sự hoạt động. Tôi phải chỉ định ai nếu tôi muốn sử dụng nó trong một chuỗi?
DerWeh

Bạn không thể sử dụng ^Jlàm dấu phân cách lệnh trong một chuỗi vì nó đang chèn ký tự NULL kết thúc chuỗi. tuy nhiên, bạn có thể sử dụng <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

11

Nghĩ rằng điều này có thể giúp ai đó cố gắng thay thế trong một chuỗi và một thất bại

từ một bình luận

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

Bạn có thể sử dụng ecờ để bỏ qua lỗi khi không tìm thấy chuỗi.


2

Bạn có thể tạo một tệp mới và viết các lệnh của bạn trên đó. Sau đó :so %, có nghĩa là tập tin nguồn hiện tại.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.