Как мне запустить терминал внутри Vim?


306

Я привык к Emacs, но я пробую Vim, чтобы увидеть, какой из них мне нравится больше.

Одна вещь, которая мне нравится в Emacs - это возможность запуска терминала внутри Emacs. Это возможно внутри Vim? Я знаю, что вы можете выполнять команды из Vim, но я хотел бы иметь возможность запускать терминал внутри вкладки.



42
Является ли :! <command>то , что вы ищете?
принимает

48
Начиная с Vim 8.0, есть :termкоманда, которая открывает новый терминал в новом разделенном окне. Если он не работает для вас, проверьте, vim --version | grep -o .terminalдоступна ли эта функция ( +terminal) или недоступна ( -terminal).
Susam Pal

Ответы:


123

Я определенно рекомендую screenчто-то подобное. Vim - это текстовый редактор, а не оболочка.

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

Или менее сложное использование screen- просто открывать несколько полноэкранных окон и переключаться между ними. Это то, что я обычно делаю, я использую функцию разделения экрана только изредка.

В вопросе « Руководство по выживанию экрана GNU» есть несколько полезных советов, если вы не знакомы с его использованием.


7
+1 Я только недавно получил экран Евангелия. Интересно, как я жил без этого.
оружие

118
Я бы предпочел выбрать Tmux вместо экрана.
Томашкубацкий

81
Да, конечно, можно запустить screen, или tmux, или terminator, или открыть другое окно и alt-tab, или даже использовать KVM-переключатель, активированный с помощью footpedal. Но не в этом суть - все эти решения приносят в жертву интеграцию между терминалом и VIM, поэтому нужно искать решения в этом пространстве. Я не понимаю, как этот ответ даже является ответом, не говоря уже о вершине или принятом ответе. Думаю, я пойду попробую Конка.
Stabledog

33
как это топ ответ ??? Вам нужно отменить голосование и проголосовать за следующий ответ, который фактически отвечает на ваш вопрос. Использование экрана не запускает оболочку в vim. Это все равно что сказать кому-то запустить другую оболочку. А для тех кто постоянно выкидывает ":!" он УЖЕ СКАЗАЛ, что знает, как выполнять команды, а это НЕ то, о чем он просил ... блин. Высокомерие здесь настолько густо, что его можно порезать ножом.
Osirisgothra

6
Этот ответ должен быть обновлен в связи с новой функцией vim 8.1 Terminal Window
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". Argh.
Нейт Кеннеди

47
Чтобы понять рекурсию, вы должны сначала понять рекурсию.
Конюшня

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

1
Казалось бы, это больше не поддерживается, у кого-нибудь есть альтернатива?
dykeag

204

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

:! somecommand [ENTER]

И если вы хотите ввести несколько команд или поиграть в оболочке некоторое время, вы всегда можете использовать:

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

Как только команда или оболочка завершится, вам будет предложено нажать, Enterчтобы вернуться в окно редактора.

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

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


17
И если вы хотите скопировать вывод команды в текущий буфер:: r! реж
Cyber Oliveira

6
Я использую как Emacs, так и Vim (и у меня гораздо больше опыта с Vim). Но я обнаружил, что часто удобнее и проще работать с двумя представлениями одновременно (одно для просмотра того, что вы редактируете, а другое для работы в интерактивной оболочке - например, для проверки эффекта изменения конфигурации, которое у вас есть). только что отредактировал). Это также помогает с моими познаниями, удержанием и умственными рабочими процессами, когда важные вещи, которые мне, возможно, нужно внимательно отслеживать, не исчезают с экрана (например, что происходит, когда вы используете Ctrl-Z или: shell в Vim).
Мванле

Это отличный ответ, который сэкономит мне много времени.
jerry_sjtu

Хороший ответ! Чтобы дополнить это еще больше, я бы также добавил :r! command [ENTER]упомянутое в комментариях.
19

152

Способ, которым я обхожу это:

  • приостановить Vim с помощью Ctrl+ Z,
  • играть в терминале,
  • затем вернитесь точно туда, где вы оставили Vim, просто набрав команду fg.

14
:!bashэто лучший способ сделать это
0atman

Я думаю, что он хочет что-то вроде dreampie, как функциональность
Адам Миллер

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 . Чтобы вернуться к Terminal-Job режим , нажмите i.

Другие ответы упоминают схожую функциональность в Neovim


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

1
Можно ли использовать вертикальное разделение :term?
Виталий Зданевич

1
супер! Здорово, что терминал встроен, поэтому у нас нет путаницы с большим количеством плагинов. Обновлен до vim 8 via brew install vim --override-system-viи :termработает отлично. Спасибо, что поделился!
Леон - Хан Ли

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в этом случае.
Алекс

@ Алекс нет, вам не нужно печатать, :shесли вы делаете карту. После noremap, вы можете просто Ctrl+Dперейти от vim к sh, и так как ^Dесть EOF, который завершает sh, так что вы вернетесь обратно к vim. Одна клавиша может переключаться между shи vim.
no1xsyzy

42

Главной новой функцией Vim 8.1 является поддержка запуска терминала в окне Vim.

:term откроет терминал в другом окне внутри Vim.


2
это работает отлично, спасибо! Ваш ответ гораздо больше в духе оригинального вопроса
Субельский

Привет, ты знаешь, как выйти из этого режима?
user3289737

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

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

39

В конце концов родная :terminalкоманда была добавлена ​​в vim в 2017 году.

Вот выдержка из : терминала readme:

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

 :term bash

Или запустить команду сборки:

 :term make myprogram

Задание выполняется асинхронно из Vim, окно будет обновлено, чтобы показать выходные данные задания, также при редактировании в другом окне.


Терминал работает в буфере на той же вкладке. так что если вы привыкли использовать несколько файлов в vim, вы можете столкнуться с некоторыми трудностями. переключающие буферы в конечном итоге придут к терминалу, откуда это точка невозврата, вы должны убить терминал. пока вы знаете об этом, все должно быть в порядке. надеюсь, что разработчики придут с обходным путем для этого.
АрунМКумар

1
@ArunMKumar Используйте [Ctrl + W], чтобы «сбежать» из терминала, а затем сделайте :bnкак обычно. Не нужно убивать терминал, и это не точка невозврата :)
fjardon

Спасибо, приятель, полностью пропустил это. Я сопоставил : bn ключу, и он перестал работать, он снова работает. Это было мое плохо.
АрунМКумар

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>выйдет из режима term обратно в обычный режим. Если вы похожи на меня и предпочитаете выход из режима выхода, вы можете добавить это в свой 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 года и ответ Фьярдона за апрель 2018. -> github.com/vim/vim/blob/master/runtime/doc/version8.txt#L18814
Люк Эрмит

17

Я знаю, что прямо не отвечаю на вопрос, но думаю, что это хороший подход. Никто не упомянул tmux (или, по крайней мере, не как отдельный ответ). Tmux - терминальный мультиплексор, похожий на экран. Большинство вещей можно сделать в обоих мультиплексорах, но на самом деле это проще в настройке. Также tmux сейчас развивается более активно, чем screen, и вокруг него довольно большая экосистема, такая как инструменты, помогающие в настройке, ecc.

Также для vim есть еще один плагин: ViMUX , который очень помогает во взаимодействии между обоими инструментами. Вы можете вызывать команды с:

:call VimuxRunCommand("ls")

Эта команда создает небольшое горизонтальное разделение ниже текущей области, в которой находится vim.

Он также может позволить вам запускаться из командной строки, если вы не хотите выполнять всю команду:

<Leader>vp :VimuxPromptCommand<CR>

Поскольку этого не было достаточно, существует как минимум 6 «плагинов для конкретной платформы»:

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

Вот хороший пример использования: тестирование по требованию с использованием Vimux и Turbux с Spork и Guard


Не хочешь объяснить, почему за него проголосовали? (помимо того, что был ответом от 6 лет назад)
Пабло Олмос де Агилера С.

13

Кто-то уже предложил https://github.com/Shougo/vimshell.vim , но они не упомянули почему. Следовательно, когда я отошел от этого вопроса, я потратил много времени, пытаясь найти другие (гораздо более высокие оценки) варианты.

Shougo / Vimshell является ответом. Вот почему:

Помимо того, что он является эмулятором терминала, VimShell позволяет вам перемещаться по выводу терминала в обычном и визуальном режимах. Таким образом, если команда, которую вы запускаете, приводит к выводу, который вы хотите скопировать и вставить только с помощью клавиатуры ... VimShell покрывает это.

Ни одна из других упомянутых опций, включая команду: Terminal в NeoVim, не делает этого. Неовим: терминал подходит близко, но терпит неудачу, по крайней мере, следующими способами по состоянию на 18.02.2017:

  • Перемещает курсор в конец буфера, вместо того, чтобы в последний раз держать его в том же месте, что и VimShell. Огромная трата времени.

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

  • Не поддерживает отображение номеров строк, как Vimshell.

Не тратьте время на другие варианты, в том числе Neovim: терминал. Перейти с VimShell.


1
NeoVim позволяет вам перемещаться и копировать данные с терминала в обычном / визуальном режиме. Я все время это делаю. Использование NVIM 0.1.6-dev
Алиса Хитон

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

:terminalне может сделать то же самое, что и :VimShellс точки зрения навигации и редактирования, и фундаментальными способами. См. Объяснение редактирования выше.
user3751385


8

2
НЕ splitvtПРИНИМАЙТЕ СОВЕТА - он искажает коды управления цветом и делает его vimсовершенно непригодным для использования.
new123456

12
«Нет» - плохой ответ. Лучший ответ: «По умолчанию нет». Технически это можно сделать, и, возможно, вам нужно написать новый исходный код и скомпилировать его самостоятельно или написать плагин. Это легко? Может и нет, но это можно сделать. Просто сказать «Нет» больше похоже на «нет, я не буду этого делать».
trusktr

2
@AnishRamaswamy По-прежнему невозможно запустить оболочку в буфере vim с использованием stock vim (в отличие от emacs). Таков был вопрос ОП.
Янтарная

1
@Amber, Да, это было бы хорошо, за исключением того, что OP не упомянул об использовании фондового vim.
Аниш Рамасвами

3
Кто-то должен просто отредактировать этот ответ, чтобы сказать, что вы не можете сделать это с помощью Stock Vim.
still_dreaming_1

4

Единственный способ, которым я знаю, это использование vim-shell , стороннего патча.


Чтобы быть педантичным, vim-shell - это патч, а не «дополнение» (что для меня, по крайней мере, подразумевает, что это скрипт). Я не пробовал это лично, но страница vim-shell на вики Vim, к сожалению, предполагает, что она не будет компилироваться с Vim 7.1+.
Тиве

Изменено, чтобы успокоить педанта. :) (Пришлось набрать что-то длиннее 15 символов. «Исправлено» было недостаточно)
romandas

Shougo / vimshell ( github.com/Shougo/vimshell.vim ), кажется, работает довольно хорошо. Это требует создания динамической библиотеки, но это довольно просто (cd <vim> / vimproc; make)
Уэйн Уокер,


2

Попробуйте vterm , который представляет собой полнофункциональную оболочку внутри vim. Это немного глючит с его историей и понятными функциями, и все еще находится в разработке, но все еще довольно хорошо


2

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


0

Я признаю, что не совсем отвечаю на ваш вопрос, но для меня лучше всего работать с Vim и терминалами в одном окне - Tmux (что-то вроде «запуска в фоновом режиме», аналогично экрану, хотя это лучше работает с разделителями и вкладками).

Этот пост поможет вам понять, как они работают вместе: «Tmux и Vim - еще лучше вместе» .

Таким образом, мы можем преобразовать Vim в мощную IDE


0

Разделите экран и выполните команду, term ++curwinчтобы запустить терминал в буфере Vim. Следующая команда делает оба и работает для меня:

:bo 10sp | term ++curwin
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.