Tôi có thể phát hành một vỏ tương tác trong cửa sổ Vim không?


16

Tôi biết tôi có thể :!hoặc :r!thực hiện lệnh bên ngoài và tùy ý chèn đầu ra của nó vào văn bản. Tôi thậm chí có thể thực hiện :!shvà tôi sẽ sinh ra một cái vỏ sẽ sống cho đến khi tôi thoát khỏi nó - nhưng trong khi cái vỏ đang hoạt động, Vim đang 'ngủ' và không thể truy cập được. Tôi phải bỏ vỏ, và sinh ra một cái mới nếu tôi muốn quay lại Vim một lát - không hữu ích lắm.

Tôi có thể truy cập shell ở phía đối diện, bằng cách tạm dừng Vim ^Zvà quản lý công việc Vim thông qua bg, fgjobs. Điều này có ý nghĩa hơn nhưng về lâu dài rất cồng kềnh. Tôi có thể sử dụng Screennếu nó khả dụng (thường là không) hoặc mở một số cửa sổ của trình quản lý cửa sổ của tôi (và ssh để nhắm mục tiêu máy chủ từ mỗi trong số chúng theo thứ tự, để có cả vim và shell trên máy chủ từ xa, lại cồng kềnh.)

Sẽ gọn gàng nhất nếu Vim cho phép tôi mở một phiên shell và giữ nó, giả sử, trong một trong các cửa sổ (bên trong) của nó, hoặc cho phép tôi chuyển sang nó và quay lại. Có phải bất cư thứ gì như thế này đều được?


1
Vì vậy, về cơ bản, bạn muốn mở một vỏ trong một :split, trong khi giữ lại các tập tin trong cửa sổ khác? ... Điều này nghe có vẻ như là một công việc cho tmux hoặc màn hình đối với tôi ...
Martin Tournoij

1
@Carpetsmoker: Tôi thường không kiểm soát những gì được cài đặt trên hệ thống từ xa và thường xuyên hơn cả hai không phải là trong khi Vim luôn ở đó.
SF.

Cân nhắc chuyển sang Neovim. Bây giờ nó có một trình giả lập thiết bị đầu cuối tích hợp hoạt động khá tốt và có thể mở trong bộ đệm vim.
Zach

Câu trả lời:


16

Có một vài plugin vim cho phép điều này. Tôi sử dụng Conque ( Github ).

Sau khi đặt nó vào thư mục plugin, tất cả những gì bạn phải làm là:

:ConqueTermSplit bash

Và bạn sẽ có một bash shell tương tác trong vim. Sau đó, bạn có thể sử dụng cử chỉ vim thông thường của mình để làm bất cứ điều gì khác mà bạn có thể muốn làm trong cửa sổ.

Ngoài ra các plugin khác là vimshell .


1
Không có cách nào để làm bất cứ điều gì như thế này mà không có plugin?
SF.

3
@SF Xem :help shell-window. (Câu trả lời ngắn: không.)
muru

3

Với VIM tôi tin rằng các plugin có sẵn để làm điều này không tuyệt vời lắm, mặc dù IMO vimshell là gần nhất. Tuy nhiên, bạn cần hiểu rằng đó là vấn đề gồm 2 phần.

  1. VIM không được thiết kế để có thể làm những việc như thế này, đặc biệt là cồng kềnh là có thể thực hiện bất kỳ tác vụ chạy dài nào và nói chuyện với nó một cách không đồng bộ mà không chặn VIM. Trong trường hợp này, không chỉ bản thân trình bao mà còn các tác vụ khác mà bạn có thể thực hiện trong quy trình trình bao.
  2. Triết lý phương thức của VIM không chơi tốt với cách chúng ta tương tác với vỏ. Trong một vỏ chỉ có dòng có thể chỉnh sửa được, mặc dù bạn có thể cuộn và xem văn bản cũ hơn trong lịch sử của mình bằng vỏ mà bạn không thể chỉnh sửa nó. Điều này hoàn toàn không phù hợp với triết lý của VIM, nếu bạn nhấn ESC và trở lại chế độ bình thường, sẽ không khó để người dùng quay lại và chỉnh sửa các phần của lịch sử ở trên.

Theo tôi có 2 cách tiếp cận hiệu quả hơn về mặt này.

  1. Sử dụng TMUX / Màn hình và cửa sổ đầu cuối ghép kênh để có cả vim và vỏ. Bằng cách đó, hai người được tách biệt gọn gàng và bạn có thể xem cả hai với rất ít nỗ lực và cả hai có thể phát huy hết khả năng của mình mà không xung đột với dòng chảy của nhau.
  2. Sử dụng các plugin như tpope / vim-Clark và những thứ tương tự bạn có thể dễ dàng khởi chạy một lệnh shell và để chúng chạy không đồng bộ trong nền trong vỏ thiết bị đầu cuối thực tế và kéo lại kết quả vào vim sau khi hoàn tất. Điều này cũng cung cấp cho bạn cùng một mức độ cô lập giữa hai người và do đó hai người có thể một lần nữa làm việc hết khả năng của mình mà không phải dẫm lên ngón chân của nhau.

Tôi nên nói thêm rằng có khả năng NeoVIM có thể mang lại sự thay đổi trong khía cạnh này vì một trong những mục tiêu cốt lõi của nó là có thể thực hiện các công việc không đồng bộ. Nhưng cho đến lúc này đây là điều tốt nhất chúng ta có thể nhận được theo ý kiến ​​của tôi.


3

Trong :help shell-windowchúng ta có thể đọc về việc thực thi các lệnh shell trong một cửa sổ:

Đã có những câu hỏi về khả năng thực thi một cái vỏ trong một cửa sổ bên trong Vim.

Câu trả lời: bạn không thể!

Bao gồm điều này sẽ thêm rất nhiều mã vào Vim, đó là một lý do tốt để không làm điều này. Rốt cuộc, Vim là một biên tập viên , nó không được phép thực hiện các tác vụ không chỉnh sửa. Tuy nhiên, để có được cái gì đó như thế này, bạn có thể thử chia màn hình thiết bị đầu cuối hoặc cửa sổ hiển thị với " splitvt chương trình " ".

Một cách khác là lệnh " window ", được tìm thấy trên các hệ thống BSD Unix, hỗ trợ nhiều cửa sổ chồng chéo. Hoặc chương trình " màn hình ".

Tuy nhiên, có một vài giải pháp mà bạn có thể sử dụng:

  • sử dụng screenđược thiết kế đặc biệt cho những thứ đó, ví dụ:

    • Ctrl+ a, Sđể chia cửa sổ hiện tại theo chiều ngang
    • Ctrl+ a, Tabđể chuyển giữa các cửa sổ
    • Ctrl+ a, Xđể xóa vùng hiện tại
    • Ctrl+ a, Qđể xóa tất cả các vùng trừ một

    Xem thêm tại: Hướng dẫn sống còn trên màn hình GNU tại stackoverflow SE

    Hoặc: Chia tách màn hình GNU , màn hình Tham chiếu nhanh để biết thêm chi tiết.

  • VIM-Shell - bản vá của bên thứ ba

    Shell VIM là một phần mở rộng cho VIM có tính năng chia các cửa sổ và bản vá này giúp khởi động các shell trong các cửa sổ đó. Nó chỉ có sẵn cho các hệ thống POSIX

  • vterm - Trình giả lập thiết bị đầu cuối bên trong vim.

    Mục tiêu của vterm là cung cấp một bản sao của thiết bị đầu cuối unix bên trong vim hoạt động ngay lập tức mà không có bất kỳ sự phụ thuộc nào.

  • Vimux - dễ dàng tương tác với tmux từ vim.

    Lấy cảm hứng từ tslime.vim , một plugin cho phép bạn gửi đầu vào cho tmux, vimux là để tương tác với tmux từ vim dễ dàng.

  • khác đã được đề cập: Conque

Liên quan: Làm thế nào để chạy một thiết bị đầu cuối bên trong vim? tại stackoverflow


Làm thế nào để thoát khỏi sự chia rẽ ?? : - /
0xc0de

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.