programing

VIM에서 C 프로그램을 실행하려면 어떻게 해야 하나요?

javaba 2022. 8. 8. 18:26
반응형

VIM에서 C 프로그램을 실행하려면 어떻게 해야 하나요?

파일명을 입력하지 않고 VIM에서 C 프로그램을 컴파일하여 실행할 수 있는 방법이 있습니까?

:!gcc -o somename % && ./somename
사용시:!, % 는 현재 열려 있는 파일의 이름으로 대체됩니다.

프로젝트 규모가 커지면 makefile을 작성하여 현재 프로젝트를 컴파일할 수도 있습니다.:make오류가 발생하면 vim이 자동으로 해당 오류로 이동합니다.

c 프로그래밍 파일을 컴파일 및 실행하려면 .vimrc 파일의 다음 매핑코드를 사용합니다.

 map <F8> : !gcc % && ./a.out <CR>

F8 키는 매핑을 실행하기 위한 키입니다."%"는 현재 파일 이름을 가져옵니다.

또는 컴파일하기 전에 현재 파일을 저장하려면

map <F8> :w <CR> :!gcc % && ./a.out <CR>

또는 기본 'a.out'이 아닌 파일 기본 이름을 실행 파일 이름으로 사용하려면 다음을 사용하십시오.

map <F8> :w <CR> :!gcc % -o %< && ./%< <CR>

위의 명령어에서는 "%" 뒤에 "<"가 있으면 확장자와 닷(foo.c => foo)이 삭제되므로 "%<"가 파일 베이스명이 됩니다.

cmdline에서 이와 유사한 정보를 찾을 수 있습니다.txt. vim 명령어:help: cmdline.txtvim에서 를 사용하여 "%" 사용에 대한 자세한 내용을 확인할 수도 있습니다.

지금은 2018년입니다. vim 8은 2년 동안 출시되었으며 모든 Linux 디스트리뷰션과 Mac OS X와 함께 출하되었습니다. 하지만 많은 vim 튜토리얼은 10년 전에 여전히 사람들에게 무언가를 가르쳐 주고 있습니다.

C++/Java 프로그램은 Vim 8 또는 NeoVim 전용 플러그인으로 Sublime Text 또는 NotePad+처럼 편리하게 컴파일할 수 있습니다.

예를 들어 AsyncRun 플러그인을 사용하면 셸 명령을 백그라운드에서 실행하고 퀵픽스 창에서 출력을 실시간으로 읽을 수 있습니다.화면 캡처를 참조해 주세요.

IDE에서 프로그램을 컴파일하는 것과 마찬가지로 컴파일 오류는 에러 포맷과 일치하여 강조 표시되어 선택 가능하게 됩니다.빠른 수정 창에서 오류를 탐색하거나 컴파일하는 동안 편집을 계속할 수 있습니다.

퀵 셋업

다음 행을 복사하여 vimrc에 붙여넣습니다.

Plug 'skywind3000/asyncrun.vim'

" open quickfix window automatically when AsyncRun is executed
" set the quickfix window 6 lines height.
let g:asyncrun_open = 6

" ring the bell to notify you job finished
let g:asyncrun_bell = 1

" F10 to toggle quickfix window
nnoremap <F10> :call asyncrun#quickfix_toggle(6)<cr>

명령줄에 ":AsyncRun echo hello"를 입력하면 다음과 같이 됩니다.

여기서 캡처 보기

열려 있는 퀵픽스창에 실시간명령어 출력이 표시됩니다.

단일 파일 컴파일 및 실행

AsyncRun을 사용하여 단일 파일을 컴파일하는 것은 Sublime Text의 빌드 시스템보다 훨씬 간단합니다.F9은 다음과 같이 설정할 수 있습니다.

noremap <silent> <F9> :AsyncRun gcc -Wall -O2 "$(VIM_FILEPATH)" -o "$(VIM_FILEDIR)/$(VIM_FILENOEXT)" <cr>

의 매크로$(..)폼이 실제 파일명 또는 디렉토리로 전개되어 F5가 실행 파일을 실행합니다.

noremap <silent> <F5> :AsyncRun -raw -cwd=$(VIM_FILEDIR) "$(VIM_FILEDIR)/$(VIM_FILENOEXT)" <cr>

큰따옴표는 공백이 포함된 경로 이름을 처리하는 데 사용됩니다.옵션-cwd=$(VIM_FILEDIR)파일 디렉토리에서 파일을 실행하는 것을 의미합니다.절대 경로 이름$(VIM_FILEDIR)/$(VIM_FILENOEXT)Linux가 필요로 하기 때문에 사용됩니다../현재 디렉터리에서 실행 중인 실행 파일의 접두사를 붙입니다. 그러나 Windows에서는 그렇지 않습니다. 바이너리 파일의 절대 경로 이름을 사용하면 이 교차 플랫폼 문제를 처리할 수 있습니다.

다른 옵션-raw출력은 vim의 오류 형식과 일치하지 않고 그대로 퀵픽스로 표시됩니다.이제 F9을 사용하여 파일을 컴파일하고 퀵픽스창에서 컴파일 오류를 체크한 후 F5 키를 눌러 바이너리를 실행할 수 있습니다.

C/C++ 프로젝트 구축

사용하고 있는 빌드 툴, 제조 툴, 제작 툴에 관계없이 프로젝트 구축은 파일 그룹에 대한 처리를 의미합니다.프로젝트 루트 디렉터리를 찾아야 합니다.AsyncRun은 루트 마커라는 간단한 방법을 사용하여 프로젝트 루트를 식별합니다.프로젝트 루트는 다음 디렉토리 또는 파일 중 하나를 포함하는 현재 파일의 가장 가까운 상위 디렉토리로 식별됩니다.

let g:asyncrun_rootmarks = ['.svn', '.git', '.root', '_darcs'] 

상위 디렉터리에 이러한 루트 마커가 없는 경우 현재 파일의 디렉터리가 프로젝트 루트로 사용됩니다.이를 통해 다음 중 하나를 사용할 수 있습니다.<root>또는$(VIM_ROOT)프로젝트 루트를 나타내기 위해 및 F7을 설정하여 현재 프로젝트를 구축할 수 있습니다.

noremap <silent> <F7> :AsyncRun -cwd=<root> make <cr>

현재 프로젝트가 git 또는 subversion 저장소에 없다면 어떻게 하시겠습니까?프로젝트 루트가 어디에 있는지 어떻게 알 수 있습니까?솔루션은 매우 간단합니다.프로젝트 루트에 빈 .root 파일을 넣으면 쉽게 찾을 수 있습니다.

다음으로 현재 프로젝트를 실행하도록 F8을 설정합니다.

noremap <silent> <F8> :AsyncRun -cwd=<root> -raw make run <cr>

프로젝트는 루트 디렉토리에서 실행됩니다.물론 사용자 자신의 makefile에 실행 규칙을 정의해야 합니다.그런 다음 F6을 다시 매핑하여 테스트합니다.

noremap <silent> <F6> :AsyncRun -cwd=<root> -raw make test <cr>

cmake를 사용하는 경우 F4를 맵하여 Make 파일을 업데이트할 수 있습니다.

nnoremap <silent> <F4> :AsyncRun -cwd=<root> cmake . <cr>

c runtime 구현으로 인해 프로세스가 실행 중인 환경이 tty가 아닌 경우 stdout 내의 모든 데이터는 프로세스가 종료될 때까지 버퍼링됩니다.그래서, 반드시fflush(stdout)다음에printf실시간 출력을 표시하는 경우 스테이트먼트는, 리얼 타임의 출력을 표시합니다.또는 처음에 stdout 버퍼를 닫을 수 있습니다.

setbuf(stdout, NULL);

한편, C++ 코드를 쓰고 있는 경우는, std::cout 의 마지막에 std::endl 를 추가할 수 있습니다.stdout 버퍼를 강제로 플러시할 수 있습니다.Windows에서 개발 중인 경우 AsyncRun은 하위 프로세스에 대한 새 cmd 창을 열 수 있습니다.

nnoremap <silent> <F5> :AsyncRun -cwd=$(VIM_FILEDIR) -mode=4 "$(VIM_FILEDIR)/$(VIM_FILENOEXT)" <cr>
nnoremap <silent> <F8> :AsyncRun -cwd=<root> -mode=4 make run <cr>

옵션 사용-mode=4Visual Studio에서 명령줄 프로그램을 실행하는 것과 마찬가지로 명령을 실행하는 새 프롬프트 창이 열립니다.마지막으로 다음과 같은 주요 매핑이 있습니다.

  • F4: Make 파일을 cmake로 업데이트합니다.
  • F5: 단일 파일 실행
  • F6: 프로젝트 테스트 실행
  • F7: 프로젝트 구축
  • F8: 프로젝트 실행
  • F9: 단일 파일 컴파일
  • F10: 퀵픽스 창 전환

NotePad++와 GEdit의 빌드 시스템에 가깝습니다.cmake 를 많이 사용하는 경우는, 다음의 장소에 있는 심플한 셸 스크립트를 작성할 수 있습니다.~/.vim/script/build.shF4와 F7을 조합하는 경우: CMakeList의 경우 Makefile이 갱신됩니다.txt가 변경되어 제조가 종료되었습니다.

고도의 사용법

dotfiles 저장소에서 셸 스크립트를 정의하고 F3을 사용하여 스크립트를 실행할 수도 있습니다.

nnoremap <F3> :AsyncRun -cwd=<root> sh /path/to/your/dotfiles/script/build_advanced.sh <cr>

다음 셸 환경변수는 AsyncRun에 의해 정의됩니다.

$VIM_FILEPATH  - File name of current buffer with full path
$VIM_FILENAME  - File name of current buffer without path
$VIM_FILEDIR   - Full path of current buffer without the file name
$VIM_FILEEXT   - File extension of current buffer
$VIM_FILENOEXT - File name of current buffer without path and extension
$VIM_CWD       - Current directory
$VIM_RELDIR    - File path relativize to current directory
$VIM_RELNAME   - File name relativize to current directory 
$VIM_ROOT      - Project root directory
$VIM_CWORD     - Current word under cursor
$VIM_CFILE     - Current filename under cursor
$VIM_GUI       - Is running under gui ?
$VIM_VERSION   - Value of v:version
$VIM_COLUMNS   - How many columns in vim's screen
$VIM_LINES     - How many lines in vim's screen
$VIM_SVRNAME   - Value of v:servername for +clientserver usage

위의 환경변수는 모두 다음 환경에서 사용할 수 있습니다.build_advanced.sh외부 셸 스크립트 파일을 사용하면 단일 명령어보다 더 복잡한 작업을 수행할 수 있습니다.

GREP 기호

리모트 Linux 박스에 적절한 셋업 환경이 없는 경우 소스 간에 심볼 정의와 참조를 검색하는 가장 저렴한 방법이 grep일 수 있습니다.이제 커서 아래에 F2가 키워드를 검색하도록 하겠습니다.

if has('win32') || has('win64')
    noremap <F2> :AsyncRun! -cwd=<root> grep -n -s -R <C-R><C-W> --include='*.h' --include='*.c*' '<root>' <cr>
else
    noremap <F2> :AsyncRun! -cwd=<root> findstr /n /s /C:"<C-R><C-W>" "\%CD\%\*.h" "\%CD\%\*.c*" <cr>
endif

위의 스크립트는 프로젝트 루트 디렉토리에서 grep 또는 findstr을 실행하고 기호만 검색합니다..c,.cpp그리고..h이제 커서 주위를 이동하고 F2 키를 누르면 현재 프로젝트의 기호 참조가 즉시 빠른 수정 창에 표시됩니다.

대부분의 경우 이 간단한 키맵으로 충분합니다.또한 vimrc에서 더 많은 파일 형식 또는 기타 GREP 도구를 지원하도록 이 스크립트를 개선할 수 있습니다.

이것이 Vim 8 또는 NeoVim에서 C/C++ 프로젝트를 구축/실행하는 실용적인 방법입니다.Sublime Text의 빌드 시스템과 NotePad++의 NppExec과 같습니다.

더 이상 오래된 vim 튜토리얼을 사용하지 말고 새로운 방법을 시도해 보십시오.

TL;DR Makefile이 필요 없습니다. 조정 중&makeprg전혀 쓸모없고, 아직까지는.:make %<Vim에서 컴파일하기에 충분합니다.

장황한 답변:

나는 폐쇄적인 "중복 질문"으로 답한 것을 복제한다.

vi가 아닌 vim을 사용하는 것을 고려하면:make가는 길이에요.

Linux와 같은 경우(sygwin에도 적용되지만 윈도에서는 혼합되지 않음) mingw의 경우 다른 답변을 참조하십시오.&makeprggnumake 가 설치되어 있는 시스템, 프로젝트에 Make 파일이 없는 경우, 그리고 프로젝트가 1개의 파일만으로 구성되어 있는 경우, 입력해 주세요.:make %<이 정도면 충분합니다(로 플레이 할 수 있습니다).$CXXFLAGS,$CFLAGS,$LDFLAGS(용)-Llib/path옵션) 및$LDLIBS(용)-llibname옵션)을 사용하여 컴파일 옵션을 조정합니다.그런 다음 프로그램을 실행하려면:!./%<또는 이전 버전의 vim을 사용하여:terminal ./%<.

프로젝트가 여러 파일로 구성되어 있는 경우 Makefile을 사용하여:make.

CMake를 사용하여 프로젝트를 관리하고 소스 트리 외부에 있는 디렉토리(또는 여러 -> debug, release 등)에서 프로젝트를 컴파일할 경우 통합에 플러그인이 필요합니다.AFAIK, 이런 플러그인을 제안할 사람은 저뿐입니다.BuildToolsWrapper는 CMake의 관리 기능을 통합합니다(빌드 디렉토리, 디버깅 또는 릴리스 또는 빌드 디렉토리 중 선택 가능).local_vimrc 플러그인 중 하나와 결합해야 합니다.

어떤 경우든 VIM 내부(또는 외부)에서 컴파일러에 직접 콜하는 것은:!g++ -o %< %15년 전에 vi에서 했던 일이 뭐든간에 말이야Vim은 컴파일러를 (IDE와 같이) 통합할 수 있는 뛰어난 기능을 갖추고 있습니다.:h quickfix에러 사이를 에디터에서 직접 이동하는 것은 에러 행 하나를 눈으로 추출하고, 행 번호를 에디터에 입력하고, 셸로 돌아가 무엇이 거부되었는지 확인하는 것보다 훨씬 쉽습니다.C에서는 충분하지만 C++에서는 "존재하지 않는 오버로드를 호출하려고 할 때" 이러한 방식으로(에디터와 셸을 왔다 갔다 하는) 작업을 할 수 없습니다.

마지막으로, 이러한 모노 파일프로젝트를 1개의 키 스트로크로 컴파일 하는 경우는, .vimrc 에 추가할 수 있습니다.

nnoremap <silent> <f7> :make %<<cr>

프로젝트 모노파일 펫 프로젝트나 실제 멀티파일 프로젝트 종류에 따라 컴파일 명령어를 자동으로 조정하려면 더 많은 배선이 필요합니다. 이것이 BTW가 하는 일입니다.그것은 다양한 옵션을 읽어내고 무엇을 해야 할지 알 수 있습니다.

마지막 메모:&makeprg적어도 g++/gcc/clang/clang++/gfortran/...으로 설정하지 않는 것이 좋습니다.왜냐하면 언어를 변경할 때마다 언어를 변경해야 하기 때문입니다(사용하지 않는 한).:setlocal권장되는 솔루션에서는 g++가 아닌 clang++를 사용하는 경우 다음 설정만 하면 됩니다.:let $CXX='clang++'(또는$CCC)를 호출합니다.:make %<제가 정의해드릴 수 있는 건:let $CXXFLAGS='-std=c++11'C++11에서 컴파일하기 - 동일한 변수가 경고 설정, 검사기 사용 등에 사용됩니다.

이러한 솔루션을 모두 조사해 보니, 다른 디렉토리의 파일을 편집하는 경우는, (내가 알기론) 동작하지 않는 것을 알 수 있었습니다.이 작업을 서투른 방법으로 실행하는 vimscript를 몇개 작성했습니다만, 누군가가 이 방법을 유용하게 사용할 수 있으면 좋겠습니다.

let mycommand = ':!gcc % -o %< && echo "%<" && [ $(pwd) == "." ] && %< || ./%< '
nnoremap <silent> <F8> :execute mycommand <CR>

또, 복수의 디렉토리에서 상기의 커맨드가 기능하고 있는 경우는, 무시해도 괜찮습니다.

(바로 이 페이지를 포함하여) 몇 가지 조사를 한 후, 다음과 같은 숏컷을 추가하기로 결정했습니다.

map <F9> :w<CR> :!gcc % -o %<.x -Wall -Wextra 2>errors.err; cat errors.err<CR>

또한 다음 항목을 포함할 수 있습니다.-ansi -pedantic-errors네가 그럴 거라면.

errors.errvi 퀵픽스에 도움이 됩니다.

이 행을 에 추가합니다.vimrc파일

nnoremap <silent> <F8> :!clear;gcc % -o % && ./%<CR>

이제 c 프로그램을 컴파일하고 실행하려면 f8 키만 누르면 됩니다.

c&cpp 코드를 실행하는 명령어를 작성했습니다.

:command  Runcpp !clear;g++ % -o %:r && ./%:r<CR> 
:command  Runc   !clear;gcc % -o %:r && ./%:r<CR>

위의 코드를 .vimrc 파일에 입력하고 Runcpp & Runc 명령을 사용하여 코드를 실행합니다.

이 답변에 이 내용을 추가하려고 합니다.전술한 바와 같이:make명령어를 vim으로 지정합니다.아직 언급되지 않은 것은, 이다.:make다른 프로그램을 호출할 수 있습니다.make.

:set makeprg=gcc\ %

원인이 되다:make실행하다gcc와 함께%기호를 현재 파일 이름으로 바꿉니다.

그러면 멋있어져서 할 수 있어요.

:set makeprg=gcc\ %\ &&\ ./a.out

타이핑만 하면 됩니다.:make프로그램이 컴파일되어 실행됩니다.물론 다른 언어에서도 가능합니다.

:set makeprg=cabal\ repl
:set makeprg=python\ %

vim에서 프로그램을 쉽게 컴파일하고 실행할 수 있습니다.그냥 일반 모드로 가서 입력하세요.

:!gcc yourProgramName.c

그리고 프로그램을 실행하기 위해 다음과 같이 적습니다.

:!gcc % | ./a.out

이 플러그인은 C 및 기타 언어용으로 제공되는 기능을 저자가 설명한 바와 같이 추가하는 것이 좋습니다.

Single Compile은 Vim을 떠나지 않고 단일 소스 파일을 보다 편리하게 컴파일 또는 실행할 수 있도록 하는 것을 목적으로 하는 VIM 플러그인입니다.작은 테스트를 위해 작은 C 소스 파일을 작성했을 뿐인데 컴파일하려면 Make 파일을 작성하거나 컴파일하려면 Vim을 종료하거나 퀵픽스 기능을 사용하지 않고!gcc를 사용하여 컴파일해야 합니다.Vim의 make 명령어는 make 명령어만 사용하기 때문입니다.이 플러그인은 도움이 됩니다.

및 에 권장되는 매핑:

nmap <F9> :SCCompile<cr>
nmap <F10> :SCCompileRun<cr>

대부분의 경우 Makefile을 사용하기 때문에 주어진 답변 외에 결과를 "지운" 화면으로 보고 싶습니다.

map <F10> :w<CR> :!clear; make<CR> :!./%<<CR>

  • :w<CR>파일을 저장합니다.

  • :!clear; make<CR>화면을 클리어하고 실행하다make

  • :!./%<<CR>프로그램을 실행합니다(%확장자 없음( )<)

이 세 줄을 에 추가합니다..vimrc파일

au FileType c set makeprg=gcc\ % 

au FileType cpp set makeprg=g++\ %

map <F7>:make && ./a.out<CR>

버튼을 눌러 프로그램을 컴파일하고 실행할 수 있습니다.

내 vimrc에는 다음이 있습니다.

autocmd filetype c nnoremap <F9> :w<CR> :!clear<CR> :!gcc % -o %< && %<<CR>

이를 통해 C를 컴파일/실행할 수 있습니다.<F9>콘솔 클리어

다음 작업도 수행할 수 있습니다.

autocmd filetype c nnoremap <F8> :w<CR> :!clear<CR> :!make && ./%<<CR>

그러면 Makefile을 사용하여 C를 컴파일/실행할 수 있습니다.<F8>콘솔 클리어

언급URL : https://stackoverflow.com/questions/2627886/how-do-i-run-a-c-program-from-vim

반응형