Lệnh Bash bên trong vi


33

Có thể gõ một lệnh bash bên trong vi và nhận được thiết bị xuất chuẩn không?

Tôi thấy thường tẻ nhạt khi đóng và mở lại vi chỉ vì tôi muốn tìm kiếm thứ gì đó trong vỏ.

Câu trả lời:


45

Có, ví dụ nếu bạn muốn làm ls, hãy thử:

:!ls

Để sinh ra một vỏ, sử dụng

:shell


tuyệt vời, làm thế nào tôi có thể sống mà không có điều này?
đàn hạc

3
Trong thực tế một cái gì đó tôi thường làm là quên chạy vi như root khi chỉnh sửa một cái gì đó. Lệnh này đã cứu tôi khỏi việc viết lại nhiều lần hơn tôi có thể nhớ. :w !sudo tee %
Đánh dấu

1
tôi ước có một số cách để làm điều này trong gnunano
ixtmixilix

1
và sau đó làm thế nào để bạn quay lại trình chỉnh sửa sau khi sử dụng: shell?
VaTo

@VaTo: Để quay lại, bạn có thể gõ: exit
Raman Kathpalia

12

Tôi có xu hướng sử dụng ctrl+zđể ngủ vi, chạy những gì tôi cần trong vỏ, sau đó fgtiếp tục vi. Không chính xác là một câu trả lời cho câu hỏi của bạn, nhưng tôi thấy đó là một cách rất nhanh để làm việc.

Nếu bạn quên rằng bạn có vi mở trong nền (điều này có thể xảy ra khi bạn bận), khi bạn cố gắng đăng xuất khỏi shell bằng cách sử dụng, ctrl+dbạn sẽ được cảnh báo rằng bạn có các công việc nền đang chạy và bạn có thể đóng chúng, hoặc nhấn ctrl + d lần nữa để đăng xuất. Ngoài ra, nếu bạn cố gắng mở lại cùng một tệp hai lần, bạn sẽ nhận được cảnh báo khôi phục, do đó bạn có thể nhấn ađể hủy bỏ và chạy fg để quay lại vi.


1
Điều này có thể bị dính nếu bạn bị cuốn vào những gì bạn đang làm trên dòng lệnh và quên rằng bạn đã làm nền vim.
Bóng Eliot

1
Vâng, có thể, tôi đã tự làm điều đó. Đối với tôi nó là giá trị nó có vỏ không đổi. Tôi sẽ cập nhật câu trả lời của mình để đưa nhận xét của bạn vào tài khoản
Rqomey

1
Tôi nghĩ rằng bạn sẽ tốt hơn khi sử dụng màn hình gnu.
dùng606723

1
Tôi sử dụng tmux cho mình ... nhưng vì tốc độ và nếu đăng nhập vào máy chủ không có tmux hoặc màn hình, nó rất tiện dụng
Rqomey

11

Vì bạn đã đề cập "nhận thiết bị xuất chuẩn", lưu ý rằng bạn có thể làm

:r! command

và đầu ra của lệnh sẽ được thêm vào tệp, hoặc

:<range>!command

để có nội dung của phạm vi được lọc thông qua lệnh [ví dụ :1,$!wc]


:%!commandcó vẻ khá hữu ích
Eliot Ball

Tôi sử dụng điều này thường xuyên để sắp xếp các dòng [ví dụ :.,+20 !sort]
Walter A

5

Thành ngữ ưa thích của tôi là

!!command

đó là tốc ký cho

:.!command

mà đường ống hiện tại thông qua lệnh và chèn đầu ra vào tập tin. Trường hợp phổ biến nhất đối với tôi là chỉnh sửa lệnh bằng vi và chạy:

!!sh

Hoặc là

!<motion>command

chẳng hạn như (ví dụ)

!apsh

để chạy toàn bộ đoạn hiện tại thông qua shell.


2
Lưu ý cho !}bạn phải được định vị ở đầu đoạn, hãy thử !ap. (Tôi không biết điều này có trong mỗi vi hay chỉ vim)
Random832

4

Bằng cách sử dụng dấu hai chấm và dấu chấm than, bạn có thể chạy bất kỳ lệnh nào trong đường dẫn shell và tập lệnh shell, hãy nhớ rằng lệnh chạy dưới người dùng đang chạy chương trình vi / vim và sử dụng môi trường của nó.

:!<command>

Vì vi sử dụng môi trường có hiệu lực khi nó được chạy, nên nó sử dụng cùng một đường dẫn trong lệnh cha. Hãy nhớ rằng một số shell giữ bộ đệm của các chương trình trong đường dẫn và vi có thể không hoạt động với bộ đệm này (phụ thuộc vào shell mà nó sử dụng và phiên bản của nó), vì vậy bạn có thể sẽ chạy sai nhị phân trong trường hợp bạn có nhiều hơn hơn một nhị phân có cùng tên.


4

Bạn có thể thấy đầu ra của một lệnh bằng cách gõ, ví dụ, :!ls -lhtrong chế độ lệnh.

Nếu bạn muốn chèn đầu ra của lệnh vào tệp bạn đang chỉnh sửa, chỉ cần thêm một r. Ví dụ , :r!which perl.


1

Sử dụng !rõ ràng là câu trả lời chính xác, nhưng nếu bạn thường xuyên chuyển đổi qua lại, một cái gì đó như màn hình hoặc tmux cũng có thể hữu ích.


0

Tôi có cái này trong .vimrc của tôi. Tìm thấy trên Stack Overflow một lúc trước:

" Executes the current line in a bash shell; syntactically similar to slimv's ,d feature
:nmap ,,d Y:!<C-R>"<C-H><CR>

0

Tôi sẽ, và làm, làm tròn điều này một cách dễ dàng trong Linux bằng cách mở hai cửa sổ dòng lệnh đầu cuối, chạy vi trong một và cái kia có sẵn cho công việc khác cùng một lúc.

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.