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 왜 :!bashCtrl+z좋은가? (그냥 궁금해)
Sebastián Grignoli

2
Ctrl+Z예를 들어 @ SebastiánGrignoli를 사용 하면 예를 들어 다른 폴더로 이동 한 ls다음 git statusCtrl+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.