Vim 내부에서 터미널을 어떻게 실행합니까?


303

나는 Emacs에 익숙하지만 Vim에서 내가 더 좋아하는 것을 보려고 노력하고 있습니다.

내가 Emacs에 대해 좋아하는 것은 Emacs 내부에서 터미널을 실행할 수 있다는 것입니다. Vim 내부에서 가능합니까? Vim에서 명령을 실행할 수 있다는 것을 알고 있지만 탭 내부에서 터미널을 실행할 수 있기를 바랍니다.



42
:! <command>당신 은 무엇을 찾고 있습니까?
— takeshin

48
Vim 8.0부터는 :term새로운 분할 창에서 새 터미널을 여는 명령이 있습니다. 그래도 작동하지 않으면 vim --version | grep -o .terminal이 기능을 사용할 수 있는지 ( +terminal) 또는 사용할 수 없는지 ( -terminal) 확인하십시오.
— 수삼 팔

답변:


123

나는 screen이와 같은 것을 확실히 추천 할 것입니다. Vim은 텍스트 편집기이며 쉘이 아닙니다.

내가 사용하는 것이 Ctrl+AS수평 현재 창을 분할하거나 우분투의 화면과 다른 패치 버전에서, 당신이 사용할 수있는 Ctrl+A|수직 분할 (파이프). 그런 다음 창 사이를 전환하기 위해 Ctrl+ATab(또는 Ctrl+ACtrl+I입력하기가 쉬운 일부 시스템에서 동일하게) 사용 하십시오. 창의 크기와 배열을 변경하는 다른 명령이 있습니다.

또는 덜 고급 사용은 screen여러 개의 전체 화면 창을 열고 그 사이를 전환하는 것입니다. 이것은 내가 일반적으로하는 일이며, 때때로 분할 화면 기능 만 사용합니다.

GNU 화면 서바이벌 가이드 당신은 그것의 사용에 익숙하지 않은 경우 문제는 좋은 팁을 가지고 있습니다.


7
+1 최근에야 스크린 복음을 받았습니다. 나는 그것없이 어떻게 살았는지 궁금합니다.
— 총

118
차라리 화면 대신 tmux를 선택하고 싶습니다.
— tomaszkubacki

81
물론 화면, tmux 또는 터미네이터를 실행하거나 다른 창과 Alt-Tab을 열거 나 발판으로 활성화 된 KVM 스위치를 사용할 수도 있습니다. 그러나 이것이 핵심이 아닙니다. 모든 솔루션 은 터미널과 VIM 간의 통합 을 희생 하므로이 공간에서 솔루션을 찾는 것이 좋습니다. 나는이 답변이 어떻게 대답인지 이해하지 못한다. 내가 콘크를 시험해볼 까봐
— Stabledog

33
이것이 어떻게 최고 답입니까? 투표를 취소하고 다음 답변에 투표를해야 실제로 질문에 대한 답변을 얻을 수 있습니다. vim 내에서 screen을 사용하면 쉘이 실행되지 않습니다. 누군가에게 다른 쉘을 시작하라고 말하는 것과 같습니다. 그리고 ":!"를 계속 던지는 사람들을 위해 그는 이미 명령을 실행하는 방법을 알고있었습니다. 오만이 너무 두껍기 때문에 칼로자를 수 있습니다.
— osirisgothra

6
이 답변은 새로운 vim 8.1 기능 터미널 창
— Alan Garrido

232

구식 2011 년 8 월

Conque Shell ( GitHub 에도 있음)을 확인하십시오 . 쉘뿐만 아니라 vim 내에서 대화 형 프로그램을 실행할 수 있습니다.


21
:ConqueTerm bash <CR>, vim <CR>, :ConqueTerm bash... 재귀 공포!
— keflavich

1
psihodelia가 옳은 것 같습니다. 방금 --enable-pythoninterp (cygwin이 + python과 함께 vim을 배포하지 않음)로 vim을 컴파일했으며 ConqueTerm을 설치 한 후 #set_buffer_settings에서 오류가 발생합니다. 해당 기능이 어디에 있는지 추적하거나 오류의 의미를 알 수 없었습니다. 메시지에 유효하지 않은 인수 "edit ++ enc = utf-8 bash \-\ 2"에 대한 설명이 포함되어 있습니다. 아아
— 네이트 케네디

47
재귀를 이해하려면 먼저 재귀를 이해해야합니다.
— Stabledog

19
@의 Łukasz Niemier VIMCEPTION
— 세바스티안 Grignoli

1
이것이 더 이상 지원되지 않는 것 같습니다. 다른 사람이 있습니까?
— dykeag

203

정확히 무엇을 달성하려고하는지 잘 모르겠지만 (Emacs를 사용한 적이 없습니다) Vim에서 다음을 입력하여 명령을 실행할 수 있습니다.

:! somecommand [ENTER]

그리고 여러 명령을 입력하거나 쉘에서 잠시 동안 놀고 싶다면 항상 다음을 사용할 수 있습니다.

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

명령 또는 셸이 종료되면을 눌러 Enter편집기 창으로 돌아갈 수 있는 옵션이 제공됩니다

Vim은 Vim 창 / 탭 내에서 본격적인 쉘을 실행하는 것처럼 의도적으로 가볍고 편집자가 아닌 유형의 작업을 수행 할 수있는 능력이 부족하지만 위에서 언급 한 것처럼 vim-shell과 같은 타사 애드온이 있습니다. 그런 종류의 일을합니다.

일반적으로 Vim과 내 셸 (Bash) 사이를 전환하려면 CTRL+ Z를 눌러 Vim 프로세스를 일시 중지하고 셸에서 재생 한 다음 Vim으로 돌아가고 싶을 때 'fg'를 입력합니다. 쉘은 훌륭하고 분리되어 있습니다.


17
그리고 명령의 출력을 현재 버퍼에 복사하려면 : r! dir
— 사이버 올리베이라

6
저는 Emacs와 Vim을 모두 사용합니다 (Vim에 대한 경험이 더 많습니다). 그러나 나는 종종 두 개의 뷰로 동시에 작업하는 것이 더 좋고 더 쉽다는 것을 알았습니다 (하나는 편집중인 것을보고 다른 하나는 대화 형 쉘 내에서 작동합니다-예를 들어 구성 변경의 영향을 테스트하는 것) 방금 편집). 또한 모니터해야 할 중요한 것들이 화면에서 사라지지 않을 때 (인지 Vim에서 Ctrl-Z 또는 : shell을 사용할 때와 같이)인지, 유지 및 정신적 워크 플로에 도움이됩니다.
— mvanle

내 시간을 많이 절약 할 수있는 훌륭한 대답입니다.
— jerry_sjtu

좋은 대답입니다! 그것을 더 칭찬하기 위해 나는 :r! command [ENTER]언급에 언급을 추가 할 것 입니다.
— Jeach

151

이 문제를 해결하는 방법은 다음과 같습니다.

  • Ctrl+로 Vim을 일시 중지하고 Z,
  • 터미널에서 놀고
  • 그런 다음 명령을 입력하여 Vim으로 떠난 곳으로 정확하게 돌아갑니다 fg.

14
:!bash더 좋은 방법입니다
— 0atman

나는 그가 기능과 같은 일종의 dreampie를 원한다고 생각합니다
— Adam Miller

10
@Oatman 왜 :!bash더 Ctrl+z좋은가? (그냥 궁금해)
— Sebastián Grignoli

2
Ctrl+Z예를 들어 @ SebastiánGrignoli를 사용 하면 예를 들어 다른 폴더로 이동 한 ls다음 git status등 Ctrl+Z이 "일시 정지" 되기 때문에 "재개"할 수 있습니다 fg. 그러나 지금까지 알고 있듯이 :! bash를 사용하면 한 번에 하나의 명령 만 실행할 수 있거나 한 번에 여러 명령을 실행할 수 있어도 여전히 편리하지 않습니다. 전체적으로 'Ctrl + Z'가 훨씬 좋습니다
— Leo

거의 모든 환경에서 작동하기 때문에 +1입니다. 내가 사용자 정의 할 수없는 외국 시스템에서 작업하고 저렴한 PuTTY 쉘을 통해이 기능이 훌륭합니다.
— t3sture

121

사용중인 Vim 버전에서 활성화 된 경우 :term명령 으로 터미널을 시작할 수 있습니다 .

터미널 창 지원은 Vim 8에 추가되었습니다.이 기능은 Vim을 + 터미널 기능으로 컴파일 할 때 활성화 할 수있는 선택적 기능입니다. 만약 당신의 Vim 버전이 터미널을 지원한다면, :echo has('terminal')"1"을 출력 할 것입니다.

입력 :term하면 터미널 작업 모드로 전환되어 예상대로 터미널을 사용할 수 있습니다.

내 터미널 - 작업 모드를 누르면 Ctrl-W N또는 Ctrl-\ Ctrl-N으로 모드 전환 터미널 - 일반 커서가 이동하고 명령 빔의 유사으로 실행 할 수 있으며, 일반 모드. 터미널 작업 모드 로 다시 전환하려면을 누르십시오 i.

다른 답변은 Neovim의 유사한 기능을 언급합니다.


5
ictrl-wN 찾아보기 모드에서 전환 한 후 터미널 cmd 모드로 다시 전환하는 방법에 대해 +1 이것은 tmux 이상의 킬러 기능이며 Windows에서도 작동합니다.
— radke

1
?를 사용하여 수직 분할 할 수 :term있습니까?
— Vitaly Zdanevich의

1
감독자! 터미널이 내장되어 있으므로 더 많은 플러그인이 필요하지 않습니다. 를 통해 정력 8로 업그레이드 brew install vim --override-system-vi하고 :term완벽하게 작동합니다. 공유해 주셔서 감사합니다!
— LeOn-Han Li

18
@VitalyZdanevich :vertical :term는 왼쪽 창에서 터미널과 세로로 분할됩니다. :vertical :botright :term오른쪽 창에서 터미널과 세로로 분할됩니다. 또는 창을 수동으로 레이아웃 한 다음 사용 :term ++curwin하여 활성 창에서 터미널을 열 수 있습니다.
— Daniel S.

esc ctrl-w w를 사용하면 창 사이를 전환 할 수 있습니다
— user1869582

87

:sh그런 다음 ctrl+d다시 들어가십시오 (bash)

업데이트 :

ctrl+dvim에서 run으로 매핑 하여 :shbash와 vim 사이를 빠르게 전환 할 수 있습니다.

noremap <C-d> :sh<cr>


1
나는 생각 ctrl+z하고 fg, 조금 더 빨리 입력 할 필요가 없습니다 주어진 :sh경우에.
— Alex

@Alex 아니오 당신이 :sh지도 를 입력 하면 입력 할 필요가 없습니다 . 이후 noremap에는 Ctrl+Dvim에서로만 갈 수 sh있으며, 이후 ^DEOF가 종료되어을 종료 sh하므로 vim으로 돌아갑니다. 하나의 키 sh는와 vim 사이를 전환 할 수 있습니다 .
— no1xsyzy 2018

42

Vim 8.1의 새로운 주요 기능은 Vim 창에서 터미널 실행을 지원하는 것입니다.

:term Vim 내부의 다른 창에서 터미널을 엽니 다.


2
이것은 완벽하게 작동합니다, 감사합니다! 당신의 대답은 원래 질문의 정신에 훨씬 더
— subelsky

안녕하세요,이 모드를 종료하는 방법을 알고 있습니까?
— user3289737 2016 년

2
일반 터미널 에서처럼 터미널에서 exit종료 된 다음 :q창을 닫는 데 사용
— Yossarian42

2
또는 @ user3289737 또는 Ctrl + W를 연속으로 두 번 눌러 창 사이를 전환 할 수 있습니다. 이것은 터미널 창에만 국한된 것이 아니라 잘 작동합니다.
— flarn2006

39

결국 :terminal2017 년에 기본 명령이 vim에 추가되었습니다.

다음은 : terminal readme 에서 발췌 한 것입니다 .

이 기능은 Vim 창에서 터미널 에뮬레이터를 실행하기위한 것입니다. 터미널 에뮬레이터에 연결된 작업을 시작할 수 있습니다. 예를 들어, 쉘을 실행하려면 다음을 수행하십시오.

 :term bash

또는 빌드 명령을 실행하려면

 :term make myprogram

작업은 Vim에서 비동기식으로 실행되며 다른 창에서 편집하는 동안 작업의 출력을 표시하도록 창이 업데이트됩니다.


터미널은 동일한 탭의 버퍼에서 실행됩니다. 따라서 vim에서 여러 파일을 사용하는 데 익숙하다면 다소 어려움을 겪을 수 있습니다. 스위칭 버퍼는 결국 리턴되지 않는 지점에서 터미널로옵니다. 터미널을 죽여야합니다. 당신이 이것을 알고있는 한, 괜찮을 것입니다. 개발자가 이에 대한 해결 방법을 제공하기를 바랍니다.
— ArunMKumar

1
@ArunMKumar [Ctrl + W]를 사용하여 터미널에서 "탈출"한 다음 :bn평소와 같이하십시오. 터미널을 죽일 필요가 없으며 그것은 돌아올 수 없습니다 :)
— fjardon

고마워 친구 키에 키를 매핑했습니다 : bn 을 키에 넣고 작동을 멈추었습니다. 다시 작동합니다. 내 잘못이야
— ArunMKumar

2017? 2018을 의미합니까?
— flarn2006 2

1
@ flarn2006에서 2017 년과 2018 년 사이에 Vim 8.1은 2018 년 5 월 18 일 vim.org에서 "Vim 창에서 터미널 실행 지원"이 "주요 새로운 기능"으로 표시되었습니다. 이 기능은 2017 년 7 월 7 일 패치 8.0.0693에서 처음 사용되었습니다. github.com/vim/vim/commit/…
— Daniel S.

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 참신으로 광고되는 이유입니다. 4월 2018 OCT로 2017 및 fjardon의 한 다니엘의 답변을 참조하십시오 -> github.com/vim/vim/blob/master/runtime/doc/version8.txt#L18814
— 루크 Hermitte

17

나는 질문에 직접 대답하지는 않지만 좋은 접근 방법이라고 생각합니다. 아무도 tmux에 대해 언급하지 않았습니다 (또는 적어도 독립형 답변으로는 아닙니다). Tmux는 화면과 같은 터미널 멀티플렉서입니다. 대부분의 것은 멀티플렉서 둘 다로 만들 수 있지만, 구성하기가 더 쉽습니다. 또한 tmux는 현재 화면보다 적극적으로 개발되고 있으며 환경을 구성하는 도구와 같은 매우 큰 생태계가 있습니다.

vim에는 ViMUX라는 플러그인도 있습니다.이 플러그인 은 두 도구 간의 상호 작용에 많은 도움이됩니다. 다음을 사용하여 명령을 호출 할 수 있습니다.

:call VimuxRunCommand("ls")

이 명령은 현재 창 vim이있는 작은 수평 분할을 만듭니다.

전체 명령을 실행하지 않으려는 경우 프롬프트에서 실행할 수도 있습니다.

<Leader>vp :VimuxPromptCommand<CR>

충분하지 않아서 최소한 6 개의 '플랫폼 특정 플러그인'이 있습니다.

좋은 "사용 사례"는 다음 과 같습니다. Spork 및 Guard와 함께 Vimux 및 Turbux를 사용하여 주문형 테스트


다운 보트 된 이유를 설명 할까? (6 년 전 답변 외)
— Pablo Olmos de Aguilera C.

13

누군가 이미 https://github.com/Shougo/vimshell.vim을 제안 했지만 그 이유는 언급하지 않았습니다. 결과적 으로이 질문에서 벗어날 때 다른 (훨씬 높은 순위) 옵션을 시도하는 데 많은 시간을 낭비했습니다.

Shougo / vimshell 이 그 해답입니다.이유는 다음과 같습니다.

VimShell은 터미널 에뮬레이터 일뿐 아니라 일반 및 시각적 모드에서 터미널 출력을 탐색 할 수 있습니다. 따라서 명령을 실행하면 키보드 만 사용하여 복사하여 붙여 넣기 원하는 결과가 출력됩니다 ... VimShell 이이를 다룹니다.

NeoVim의 : terminal 명령을 포함하여 언급 된 다른 옵션은이 작업을 수행하지 않습니다. Neovim의 : 터미널은 근접하지만 2017 년 2 월 18 일 현재 최소한 다음과 같은 방식 으로 부족합니다 .

  • VimShell과 같은 지점에 커서를 유지하는 대신 커서를 버퍼의 끝으로 이동합니다. 엄청난 시간 낭비.

  • 지원하지 않습니다 modifiable = 1참조 Github에서에서 이에 대한 토론을 , VIM-easymotion 같은 도움이 플러그인을 사용할 수 없습니다.

  • Vimshell처럼 줄 번호 표시를 지원하지 않습니다.

Neovim 's : terminal을 포함하여 다른 옵션에 시간을 낭비하지 마십시오. VimShell과 함께하십시오.


1
NeoVim은 일반 / 비주얼 모드에서 터미널 출력을 탐색하고 복사 할 수 있습니다. 나는 항상 이것을한다. NVIM 0.1.6-dev 사용
— Alice Heaton

고마워, 나는 VimShell을 시도합니다. 그러나 나는 대답에서 잘못된 진술을 제거 할 자유를 얻었습니다. @Alice가 지적했듯이 NeoVim :terminal은 절대적으로 동일한 작업을 수행 할 수 있습니다.
— Konrad Rudolph

:terminal:VimShell탐색 및 편집, 기본 방식과 동일 할 수 없습니다 . 위의 설명 편집을 참조하십시오.
— user3751385


8

아니 당신은 할 수 없습니다:

http://vimdoc.sourceforge.net/htmldoc/tips.html#shell-window


2
조언을 구하지 마십시오 splitvt-색상 제어 코드가 엉망이되어 vim완전히 사용할 수 없게됩니다.
— new123456

12
"아니오"는 나쁜 대답입니다. 더 나은 대답은 "기본적으로 아니요"입니다. 기술적으로는 가능할 수 있으며 아마도 새 소스 코드를 작성하여 직접 컴파일하거나 플러그인을 작성해야합니다. 쉬운가요? 아닐 수도 있지만 할 수 있습니다. 단순히 아니요라고 말하는 것은 "아니요,하지 않을 것입니다."
— trusktr

2
@AnishRamaswamy emacs와 달리 stock vim을 사용하여 vim 버퍼 내에서 쉘을 실행할 수 없습니다. 이것이 OP의 질문이었습니다.
— Amber

1
@ 앰버, 그래, OP가 주식 vim을 사용하는 것에 대해 언급하지 않은 한 괜찮을 것입니다.
— Anish Ramaswamy

3
누군가 가이 답변을 편집하여 스톡 vim으로 할 수 없다고 말해야합니다.
— still_dreaming_1

4

내가 아는 유일한 방법은 타사 패치 인 vim-shell 을 사용 하는 것입니다.


peantic하기 위해, vim-shell은 '추가 기능'이 아닌 패치입니다 (적어도 나에게 스크립트임을 암시합니다). 개인적으로 시도하지는 않았지만 Vim 위키의 vim-shell 페이지는 Vim 7.1 이상으로 컴파일하지 않을 것을 제안합니다.
— Yewge

pedant를 달래기 위해 변경되었습니다. :) (15 자보다 긴 문자를 입력해야합니다. '고정'길이가 충분하지 않았습니다)
— romandas

Shougo / vimshell ( github.com/Shougo/vimshell.vim )은 다소 잘 작동하는 것 같습니다. 동적 라이브러리를 구축해야하지만 매우 간단합니다 (cd <vim> / vimproc; make)
— Wayne Walker


2

vim 내부의 거의 모든 기능을 갖춘 vterm을 사용해보십시오 . 그것은 역사와 명확한 기능으로 약간 버그가 있으며 여전히 개발 중이지만 여전히 꽤 좋습니다.


2

정력 지원 버전을 가정하면 +term첫 번째 명령, 정력 하나의 명령 (예에서 사용하기위한 일련의 쉘 set=/usr/bin/zsh명령을 실행 한 후), 및 +term(예 bo 15vs +term). 윈도우를 추가로 조작해야 할 수도 있지만 (즉, 하나를 삭제하고 회전하는 경우) 터미널이 있습니다.


0

나는 귀하의 질문에 엄격하게 답변하지는 않지만 같은 창에서 Vim과 터미널을 사용할 때 나에게 더 효과적 인 것은 Tmux입니다. 하나는 분할 및 탭에서 더 잘 작동합니다).

이 포스팅은 그들이 함께 작동하는 방법을 이해하는 데 도움이됩니다 : 'TMUX 및 빔을 - 더 나은 함께' .

이런 식으로 Vim을 강력한 IDE로 변환 할 수 있습니다


0

화면을 분할하고 명령 term ++curwin을 실행하여 Vim 버퍼 내에서 터미널을 실행하십시오. 다음 명령은 둘 다하고 나를 위해 일했습니다.

:bo 10sp | term ++curwin
당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.