Чи можу я видати інтерактивну оболонку у вікні Vim?


17

Я знаю, що можу :!або :r!виконувати зовнішню команду і необов'язково вставляти її вихід у текст. Я навіть можу виконати, :!shі я породжу оболонку, яка буде жити, поки я не вийду з неї, але поки оболонка активна, Вім 'спить' і недоступний. Я мушу покинути оболонку та створити нову, якщо хочу на мить повернутися до Vim - не дуже корисно.

Я можу отримати доступ до оболонки на протилежному кінці, призупинивши Vim ^Zі керуючи роботою Vim через bg, fgі jobs. Це має більше сенсу, але дуже громіздке в перспективі. Я можу використовувати, Screenякщо він доступний (часто це не так), або відкрити кілька вікон мого вікна-менеджера (і ssh націлити хост з кожного з них послідовно, щоб мати і vim, і оболонку на віддаленому хості, знову громіздкий.)

Це було б найменше, якби Vim дозволив мені відкрити сеанс оболонки і тримати його, скажімо, в одному з його (внутрішніх) вікон, або дозволити мені переключитися на нього і назад. Чи можливо щось подібне?


1
Отже, ви хочете відкрити оболонку в :split, зберігаючи файл в іншому вікні? ... Це для мене звучить як робота для tmux чи екрана ...
Мартін Турной

1
@Carpetsmoker: Я часто не маю контролю над тим, що встановлено у віддаленій системі, і частіше за все жодне з двох немає, в той час як Vim завжди є.
СФ.

Подумайте про перехід на Neovim. Тепер у нього є вбудований емулятор терміналу, який працює досить добре і може бути відкритий у буфері vim.
Зак

Відповіді:


16

Є кілька плагінів vim, які дозволяють це зробити. Я використовую Conque ( Github ).

Після того, як ви помістите його у свою довідку плагінів, все, що вам потрібно зробити:

:ConqueTermSplit bash

І у вас буде інтерактивна оболонка bash у vim. Потім ви можете використовувати свої звичайні жести vim, щоб зробити все інше, що ви можете зробити у вікні.

Також інший плагін є vimshell .


1
Немає способів зробити щось подібне без плагіна?
СФ.

3
@SF Див :help shell-window. (Коротка відповідь: ні)
муру

3

З VIM я вважаю, що плагіни, які є для цього, не дуже великі, хоча IMO вимшел підходить найближчим. Однак вам потрібно зрозуміти, що це проблема в двох частинах.

  1. VIM не був розроблений таким чином, щоб робити такі речі, особливо громіздкий вміє виконувати будь-яке тривале завдання і розмовляти з ним асинхронно, не блокуючи VIM. У цьому випадку це не тільки сама оболонка, але й інші завдання, які ви можете виконати в процесі оболонки.
  2. Модальна філософія VIM не так добре поєднується з тим, як ми взаємодіємо з оболонкою. У оболонці можна редагувати лише поточний рядок, хоча ви можете прокручувати та бачити старіший текст своєї історії разом із оболонкою, ви не можете її редагувати. Це взагалі не вписується у філософію VIM, якщо ви натиснули ESC та повернулися до звичайного режиму, стає дуже важко заборонити користувачеві повертатися назад та редагувати частини історії вище.

На мою думку, є два підходи, які працюють набагато краще в цьому плані.

  1. Використовуючи TMUX / Screen і мультиплексні термінальні вікна, щоб мати як vim, так і оболонку. Таким чином, вони акуратно розділені, і все ж ви можете переглядати обидва з дуже невеликими зусиллями, і обидва можуть працювати якнайкраще свого потенціалу, не конфліктуючи один з одним.
  2. Використовуючи плагіни, такі як tpope / vim-dispatch та подібні, ви можете легко запустити одну команду оболонки оболонки та змусити їх асинхронно виконуватись на задньому плані у фактичній термінальній оболонці та повертати результати у vim, як тільки вона буде завершена. Це також забезпечує вам однаковий рівень ізоляції між двома, а значить, вони можуть знову працювати якнайкраще своїх можливостей, не наступаючи на пальці ніг.

Слід додати, що існує велика ймовірність того, що NeoVIM може призвести до зміни цього аспекту, оскільки однією з його основних цілей є можливість виконувати завдання асинхронно. Але до цього це найкраще, що ми можемо отримати на мою думку.


3

В :help shell-windowми можемо прочитати про виконання команд оболонки у вікні:

Були питання щодо можливості виконання оболонки у вікні всередині Vim.

Відповідь: ви не можете!

Включення цього додало б багато коду до Vim, що є вагомою причиною цього не робити. Зрештою, Вім є редактором , він не повинен виконувати завдання без редагування. Однак, щоб отримати щось подібне, ви можете спробувати розділити екран вашого термінала або вікно відображення за допомогою програми " splitvt ".

Альтернативою є команда " вікно ", знайдена в системах BSD Unix, яка підтримує кілька перекритих вікон. Або програма " екран ".

Однак є кілька рішень, якими ви можете скористатися:

  • використання, screenяке спеціально призначене для таких речей, наприклад:

    • Ctrl+ a, Sщоб розділити поточне вікно по горизонталі
    • Ctrl+ a, Tabдля перемикання між вікнами
    • Ctrl+ a, Xщоб видалити поточну область
    • Ctrl+ a, Qщоб видалити всі регіони, окрім однієї

    Дивіться більше за посібником з виживання на екрані GNU на в stackoverflow SE

    Або: Розщеплення екрана GNU , швидка довідка на екрані для отримання детальної інформації.

  • VIM-Shell - сторонній патч

    Оболонка VIM - це розширення для VIM, яке має розділені вікна, і цей патч дозволяє запускати оболонки в цих вікнах. Він доступний лише для POSIX систем

  • vterm - термінальний емулятор всередині vim.

    Мета vterm - створити клон unix-терміналу всередині vim, який працює прямо з вікна без будь-яких залежностей.

  • Vimux - легко взаємодіє з tmux від vim.

    Натхненний tslime.vim , плагін, який дозволяє надсилати вхід до tmux, vimux - це робити взаємодію з tmux від vim без особливих зусиль.

  • інші вже згадувані: Завоювання

Пов'язане: Як запустити термінал всередині vim? при stackoverflow


Як позбутися розколу ?? : - /
0xc0de

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.