Як запустити термінал всередині Vim?


303

Я звик до Emacs, але я намагаюся Vim, щоб побачити, який мені подобається краще.

Одне, що мені подобається в Emacs, - це можливість запустити термінал всередині Emacs. Чи можливо це всередині Vim? Я знаю, що ви можете виконувати команди з Vim, але я хотів би мати можливість запустити термінал всередині вкладки.



42
Є чи :! <command>то , що ви шукаєте?
приймає

48
Оскільки Vim 8.0, є :termкоманда, яка відкриває новий термінал у новому розділеному вікні. Якщо це не працює для вас, перевірте, vim --version | grep -o .terminalчи доступна ця функція ( +terminal) чи недоступна ( -terminal).
Сусам Пал

Відповіді:


123

Я б точно рекомендував screenщось подібне. Vim - це текстовий редактор, а не оболонка.

Я б використовував Ctrl+ASдля розділення поточного вікна по горизонталі, або в екрані Ubuntu та інших виправлених версіях ви можете використовувати Ctrl+A|(pipe) для розділення вертикально. Потім використовуйте Ctrl+ATab(або рівнозначно в деяких системах,Ctrl+ACtrl+I які можуть бути простішими) для перемикання між вікнами. Існують і інші команди для зміни розміру та розташування вікон.

Або менш розвинене використання - screenце просто відкривати кілька вікон на весь екран і перемикатися між ними. Це те, що я зазвичай роблю, функцію розділеного екрана використовую лише зрідка.

Питання Посібника з виживання на екрані GNU має ряд корисних порад, якщо ви не знайомі з його використанням.


7
+1 Я нещодавно отримав євангелію на екрані. Цікаво, як я жив без цього.
гармати

118
Я вважаю за краще вибрати tmux замість екрана.
tomaszkubacki

81
Так, звичайно, можна запустити екран, або tmux, або термінатор, або відкрити інше вікно та вкладку alt, або навіть скористатися перемикачем KVM, активованим ножкою. Але це не сенс - усі ці рішення приносять жертву інтеграції між терміналом і VIM, саме тому можна було б турбуватися шукати рішення в цьому просторі. Я не розумію, наскільки ця відповідь є навіть відповіддю, не кажучи вже про верхню чи прийняту відповідь. Думаю, я піду спробувати Conque.
Stabledog

33
як це верхня відповідь ??? вам потрібно скасувати його та проголосувати наступну відповідь вниз, яка фактично відповідає на ваше запитання. Використання екрана не запускає оболонку в рамках vim. Це як сказати комусь запустити іншу оболонку. А для тих, хто продовжує викидати ":!" він НАЗАГАЛЬНО сказав, що він знає, як виконувати команди, а це НЕ, про що він просив ... шееш. Тут зарозумілість настільки густа, що її можна вирізати ножем.
osirisgothra

6
Цю відповідь слід оновити завдяки новому вікну терміналу
Alan Garrido

232

Застаріло з серпня 2011 року

Перевірте Conque Shell (також на GitHub ). Дозволяє запускати будь-яку інтерактивну програму всередині vim, а не лише оболонку.


21
:ConqueTerm bash <CR>, vim <CR>, :ConqueTerm bash.... рекурсивний жах !!
кефлавич

1
Психоделія, здається, має рацію. Я щойно компілював vim з --enable-pythoninterp (cygwin не поширює vim з + python), і після встановлення ConqueTerm я отримую помилку від #set_buffer_settings. Я не зміг відстежити, де ця функція живе, і не розумію, що означає помилка. Повідомлення включає заяву про недійсний аргумент "edit ++ enc = utf-8 bash \ - \ 2". Арг.
Нейт Кеннеді

47
Для того, щоб зрозуміти рекурсію, потрібно спочатку зрозуміти рекурсію.
Stabledog

19
@ Łukasz Niemier VIMCEPTION
Себастьян Гріньолі

1
Здавалося б, це більше не підтримується, у когось є заступник?
дайкг

203

Я не впевнений, чого саме ви намагаєтесь досягти (я ніколи не використовував Emacs), але ви можете запускати команди у Vim, ввівши:

:! somecommand [ENTER]

І якщо ви хочете набрати кілька команд або пограти в оболонці деякий час, ви завжди можете використовувати:

:! bash (or your favourite shell) [ENTER]

Після того, як команда або оболонка завершиться, ви отримаєте можливість натиснути, Enterщоб повернутися до вікна редактора

Vim навмисно легкий і не має можливості робити речі без редагування, так само як запускати повнорозмірну оболонку всередині панелі / вкладки Vim, але, як було сказано вище, є сторонні додатки, такі як vim-shell робити таку річ.

Як правило, якщо я хочу переключитися між Vim та моєю оболонкою (Bash), я просто натискаю CTRL+, Zщоб призупинити процес Vim, пограти в моїй оболонці, а потім набрати 'fg', коли я хочу повернутися до Vim - зберігаючи мого редактора та мого оболонка приємна і окрема.


17
І якщо ви хочете скопіювати вихід команди в поточний буфер:: r! dir
Кібер Олівейра

6
Я використовую і Emacs, і Vim (і маю набагато більше досвіду роботи з Vim). Але я виявив, що часто приємніше і простіше працювати одночасно з двома переглядами (один бачити, що ви редагуєте, а інший працювати в інтерактивній оболонці - наприклад, перевірити ефект зміни конфігурації, який у вас є щойно відредаговано). Це також допомагає в моєму пізнанні, утриманні та розумових робочих процесах, коли важливі речі, які мені можуть знадобитися уважно стежити, не зникають з екрану (як, наприклад, те, що відбувається при використанні Ctrl-Z або: shell у Vim).
mvanle

Це чудова відповідь, яка зекономить багато мого часу.
jerry_sjtu

Гарна відповідь! Щоб ще більше компліменту, я також додав би :r! command [ENTER]згадуване в коментарях.
Jeach

151

Шукаю це:

  • пауза Vim з Ctrl+ Z,
  • грати в терміналі,
  • потім поверніться туди, куди ви пішли з Vim, просто набравши команду fg.

14
:!bashє приємнішим способом зробити це
0атман

Я думаю, що він хоче такий тип мрійника, як функціональність
Адам Міллер

10
@Oatman Чому :!bashприємніше Ctrl+z? (Просто цікаво)
Себастьян Гріньолі

2
@ SebastiánGrignoli, оскільки Ctrl+Z, наприклад, ви можете перейти в іншу папку, тоді lsі git statusт. Д. Ctrl+ZЦе "пауза", ви можете "відновити" fg. Але з:! Bash, як я знаю до цих пір, ви можете запустити одну команду одночасно, або навіть якщо ви можете запустити більше, ніж команду одночасно, це все ще не зручно. Таким чином, "Ctrl + Z" значно кращий
Лев

+1, оскільки це працює в майже будь-якому середовищі. Працюючи над іноземною системою, яку я не можу налаштувати, і завдяки дешевій оболонці PuTTY це чудово працює.
t3sture

121

Якщо у вашій версії Vim увімкнено термінал, можна запустити :termкоманду.

Підтримка вікон терміналів була додана до Vim 8. Це додаткова функція, яку можна ввімкнути під час компіляції Vim із функцією + термінал. Якщо у вашій версії Vim є підтримка терміналу, :echo has('terminal')буде виведено "1".

Якщо ввійти :term, ви переведете вас в режим термінальної роботи , де ви можете використовувати термінал, як очікувалося.

У режимі Terminal-Job натисканням Ctrl-W Nабо Ctrl-\ Ctrl-Nперемиканням режиму на Terminal-Normal , що дозволяє переміщувати курсор і виконувати команди аналогічно нормальному режиму Vim . Щоб повернутися до режиму роботи терміналу , натисніть i.

В інших відповідях згадується аналогічна функціональність у Neovim.


5
+1 про те, як повернутись у термінальний CMD-режим iпісля переходу з режиму перегляду ctrl-wN. Це вбивча функція навіть над tmux та працює і в Windows.
радке

1
Чи можливе вертикальне розщеплення за допомогою :term?
Віталій Зданевич

1
супер! Чудово, що термінал вбудований, тому у нас немає безладу з більшою кількістю плагінів. Модернізований до vim 8 via brew install vim --override-system-viта :termпрацює чудово. Дякую, що поділились!
LeOn - Хан Лі

18
@VitalyZdanevich, :vertical :termвертикально розділиться з терміналом у лівому вікні. :vertical :botright :termвертикально розділиться з терміналом у правому вікні. Крім того, ви можете вручну :term ++curwinрозмістити вікна, а потім використовувати для відкриття терміналу в активному вікні.
Даніель С.

esc ctrl-w w дозволяє перемикатися між вікнами
user1869582

87

:shпотім ctrl+dповернутися в (удар)

Оновлення :

Ви можете зіставити карту ctrl+dvim для запуску :sh, що дозволяє швидко перемикатися між bash і vim.

noremap <C-d> :sh<cr>


1
Я думаю ctrl+zі fgтрохи швидше, враховуючи, що вам не доведеться вводити :shв цьому випадку.
Олексій

@Alex ні, вам не доведеться вводити, :shякщо ви робите карту. Після цього noremapви можете просто Ctrl+Dперейти від vim до sh, а оскільки ^Dце EOF, який припиняє sh, то ви повернетесь до vim. Одна клавіша може перемикатися між shі vim.
no1xsyzy

42

Основна нова особливість Vim 8.1 - підтримка запуску терміналу у вікні Vim.

:term відкриє термінал в іншому вікні всередині Vim.


2
це прекрасно працює, дякую! Ваша відповідь набагато більше в дусі оригінального запитання
subelsky

Привіт, ти знаєш, як вийти з цього режиму?
користувач3289737

2
як у звичайному терміналі, exitвийде з терміналу, а потім використовувати, :qщоб закрити вікно
Yossarian42

2
@ user3289737 Крім того, ви можете натиснути Ctrl + W двічі поспіль для перемикання між вікнами. Це не характерно для термінальних вікон, але працює так само добре.
flarn2006

39

Зрештою, :terminalдо vim у 2017 році була додана нативна команда.

Ось уривок з : readme терміналу :

Ця функція призначена для запуску емулятора терміналу у вікні Vim. Завдання можна запустити, підключившись до емулятора терміналу. Наприклад, для запуску оболонки:

 :term bash

Або запустити команду build:

 :term make myprogram

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


Термінал працює в буфері на тій же вкладці. тому якщо ви звикли використовувати декілька файлів vim, ви можете зіткнутися з деякими труднощами. комутаційні буфери зрештою прийдуть до терміналу, звідки це точка неповернення, вам доведеться вбити термінал. поки ви це знаєте, це повинно бути добре. сподіваємось, що розробники придумають вирішення цього питання.
ArunMKumar

1
@ArunMKumar Використовуйте [Ctrl + W] для "втечі" з терміналу, а потім зробіть :bnяк завжди. Не потрібно вбивати термінал, і це не сенс повернення :)
fjardon

Дякую, друже, повністю пропустив це. Я створив ключ : bn до ключа, і він перестав працювати, він знову працює. Це було моє погано.
ArunMKumar

2017? Ви маєте на увазі 2018 рік?
flarn2006

1
@ flarn2006, щодо 2017 року проти 2018 року, Vim 8.1 було оголошено на vim.org 18 травня 2018 року, "підтримка запуску терміналу у вікні Vim" вказана як його "основна нова функція". Ця функція вперше була доступна раніше, 7 липня 2017 року, у патчі 8.0.0693. github.com/vim/vim/commit/…
Даніель С.

32

Це питання досить старе, але для тих, хто його знаходить, є нове можливе рішення: Neovim містить повноцінний, першокласний емулятор терміналу, який робить саме те, що намагався ConqueTerm. Просто бігайте :term <your command here>.

<C-\><C-n>повернеться в режим звичайного режиму до звичайного. Якщо ви схожі на мене і віддаєте перевагу виходу з режиму терміну виходу, можете додати це до свого nvimrc:

tnoremap <ESC><ESC> <C-\><C-N>

Після цього, натиснувши ESC двічі , вийде з термінального режиму назад у звичайний режим, так що ви можете маніпулювати буфером, до якого записується ще запущена команда.

Хоча майте на увазі, оскільки nvim перебуває під значним розвитком у той час, коли я публікую цю відповідь, може бути доданий інший спосіб виходу з термінального режиму. Оскільки я Ctrl+\Ctrl+nпереходить у звичайний режим майже з будь-якого режиму, я не очікую, що ця відповідь стане неправильною, але майте на увазі, що якщо вона не працює, ця відповідь може бути застарілою.

https://github.com/neovim/neovim


29

:term

Ця функція була нещодавно додана у Vim 8.1, однак після цього повідомлення було нещодавно випущено, тому для її використання вам може знадобитися оновити.


Його додавали до vim 8.1. Це лише головна велика особливість, якої vim 8.0.001 не мав. Ось чому його рекламують як новинку vim 8.1. Див відповіді Данила від октави 2017 року, і один fjardon в арг 2018. -> github.com/vim/vim/blob/master/runtime/doc/version8.txt#L18814
Люк Hermitte

17

Я знаю, що прямо не відповідаю на питання, але думаю, що це вдалий підхід. Ніхто не згадав tmux (або, принаймні, не як окрему відповідь). Tmux - це термінальний мультиплексор, як екран. Більшість матеріалів можна виготовити в обох мультиплексорах, але afaik tmux простіше налаштувати. Також зараз tmux активніше розробляється, ніж екран, і навколо нього досить велика екосистема, як інструменти, що допомагають конфігурації, ecc.

Також для vim є ще один плагін: ViMUX , який дуже допомагає у взаємодії обох інструментів. Ви можете викликати команди за допомогою:

:call VimuxRunCommand("ls")

Ця команда створює невеликий горизонтальний розкол під поточним vim панелі.

Він також може дозволити вам запустити з підказки, якщо ви не хочете запустити всю команду:

<Leader>vp :VimuxPromptCommand<CR>

Як не було зрозуміло, є принаймні 6 "платформних плагінів":

  • vim-vroom : бігун для rspec, огірка та тест / блок; підтримка vimux черезg:vroom_use_vimux
  • vimux-ruby-test : набір команд для легкого виконання тестів на рубіні
  • vimux-огірок : запустіть функції огірка через Vimux
  • vim-turbux : Тестування Turbo Ruby з tmux
  • vimux-pyutils : набір функцій для vimux, які дозволяють запускати кодові блоки в ipython
  • vimux-test-nose : запустити тести носа у vimux

Ось приємний "випадок використання": Тести на вимогу за допомогою Vimux та Turbux за допомогою Spork та Guard


Хочете пояснити, чому це було знято? (окрім того, що я відповів 6 років тому)
Пабло Олмос де Агілера C.

13

Хтось уже запропонував https://github.com/Shougo/vimshell.vim , але вони не згадали, чому. Отже, коли я відійшов від цього питання, я витратив багато іншого, намагаючись інші (набагато вищі) позиції.

Shougo / vimshell - це відповідь. Ось чому:

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

Жоден з інших згаданих параметрів, включаючи команду: terminal у NeoVim, не робить цього. Neovim's: термінал наближається, але забуває, щонайменше, наступними способами станом на 18.02.2017:

  • Переміщує курсор до кінця буфера, а не в останню чергу, зберігаючи його в тому самому місці, що і VimShell. Величезна трата часу.

  • Не підтримує modifiable = 1см дискусію з цього питання на Github , не може бути використана , так як корисні плагіни ВІМ-EasyMotion.

  • Не підтримує відображення номерів рядків, як це робить Vimshell.

Не витрачайте час на інші варіанти, включаючи Neovim: термінал. Ідіть з VimShell.


1
NeoVim дозволяє вам переміщуватися та копіювати з термінального виходу у звичайному / візуальному режимі. Я роблю це постійно. Використання NVIM 0.1.6-dev
Еліс Хітон

Дякую, я спробую VimShell. Однак я взяв на себе сміливість видалити неправильну заяву з відповіді. Як зазначав @Alice, NeoVim's:terminal може зробити те саме.
Конрад Рудольф

:terminal не може робити те саме, що :VimShell стосується навігації та редагування, а також принципово. Дивіться пояснення редагування вище.
користувач3751385


8

2
НЕ ВИКОРИСТУЙТЕ РОЗВИТКУ splitvt- це керує кодами управління кольором і робить його vimабсолютно непридатним.
new123456

12
"Ні" - це погана відповідь. Краща відповідь - "За замовчуванням - ні". Технічно це можна зробити, і, можливо, вам потрібно буде написати новий вихідний код і скласти його самостійно, або написати плагін. Це легко? Можливо, ні, але це можна зробити. Простіше сказати «Ні» - це більше, як сказати «ні, я цього не зроблю».
trusktr

2
@AnishRamaswamy Досі неможливо запустити оболонку в буфер vim, використовуючи stock vim (на відміну від emacs). Саме це було питанням ОП.
Бурштин,

1
@ Amber, Так, це було б добре, за винятком того, що ОП не згадувала про використання vim.
Аніш Рамасвамі

3
Хтось повинен просто відредагувати цю відповідь, щоб сказати, що ви не можете це зробити з stock vim.
still_dreaming_1

4

Єдиний спосіб, про який я знаю, - це використовувати vim-shell , сторонній патч.


Щоб бути педантичним, vim-shell - це патч, а не надбудова (що, принаймні, означає, що це сценарій). Я не пробував це особисто, але сторінка vim-shell на вікі Vim, на жаль, говорить про те, що він не буде компілюватися з Vim 7.1+.
Yewge

Змінився, щоб заспокоїти педанта. :) (Доводилося набирати щось довше 15 символів. "Виправлено" було недостатньо довго)
romandas

Shougo / vimshell ( github.com/Shougo/vimshell.vim ), здається, працює досить добре. Для цього потрібна побудова динамічної бібліотеки, але вона досить проста (cd <vim> / vimproc; make)
Wayne Walker


2

Спробуйте vterm , який є майже повною функцією оболонки всередині vim. Він злегка баггі зі своєю історією та чіткими функціями, та ще в розвитку, але все-таки досить непоганий


2

Припускаючи, що ваша версія vim підтримує +termкоманду спочатку, встановіть оболонку для vim для використання в одній команді (наприклад set=/usr/bin/zsh), а потім запустіть команду +term(тобто bo 15vs +term). можливо, вам доведеться зробити кілька додаткових маневрів ваших вікон (тобто видалити одне і обертати), але у вас буде свій термінал.


0

Я визнаю, що я не відповідаю суворо на ваше запитання, але те, що для мене краще працювало при використанні Vim та Terminals у тому самому вікні, є Tmux (це на зразок "запуску у фоновому програмному забезпеченні", як, наприклад, на екрані, хоча це краще працювати з розщепленнями та вкладками).

Ця публікація допоможе вам зрозуміти, як вони працюють разом: "Tmux і Vim - ще краще разом" .

Таким чином ми можемо перетворити Vim у потужний IDE


0

Розділіть екран і запустіть команду term ++curwinдля запуску терміналу всередині Vim буфера. Наступна команда виконує і те, і працює для мене:

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