source

Vim [컴파일 및] 실행 바로 가기

factcode 2023. 10. 1. 22:02
반응형

Vim [컴파일 및] 실행 바로 가기

기본적으로 제가 원하는 것은 vim에서 현재 편집 중인 C, C++ 또는 Python 프로그램을 [컴파일하고] 실행할 수 있는 키보드 단축키입니다.입력 코드:

when a shortcut key is pressed:
    if current_extension == 'c' then
        shell: gcc this_filename.c -o this_filename_without_extension
        if retcode == 0 then shell: ./this_filename_without_extension
    else if current_extension == 'cpp' then
        shell: g++ this_filename.cpp -o this_filename_without_extension
    if retcode == 0 then shell: ./this_filename_without_extension
    else if current_extension == 'py' then
        shell: python this_filename.py
    end if
end key

나는 내가 약간 많은 것을 요구할 수도 있다는 것을 깨달았지만 이것이 가능하다면 좋을 것입니다!

이런 것이 효과가 있을 겁니다.식 autocmd다를 파일 하면 됩니다.<F4>저장하고 컴파일하고 프로그램을 실행할 수 있습니다.exec을 사용하여 문자열을 작성하고 셸스케이프를 사용하여 파일 이름을 탈출합니다.

autocmd filetype python nnoremap <F4> :w <bar> exec '!python '.shellescape('%')<CR>
autocmd filetype c nnoremap <F4> :w <bar> exec '!gcc '.shellescape('%').' -o '.shellescape('%:r').' && ./'.shellescape('%:r')<CR>
autocmd filetype cpp nnoremap <F4> :w <bar> exec '!g++ '.shellescape('%').' -o '.shellescape('%:r').' && ./'.shellescape('%:r')<CR>

%는 현재 버퍼 파일 이름입니다.%:r입니다가 이름입니다.

http://singlecompile.topbug.net 은 당신이 원하는 것 이상의 것을 하는 것 같습니다.더 간단한 해결책을 위해 당신은 당신의 vimrc에 다음을 추가할 수 있습니다.

au BufEnter *.cpp set makeprg=g++\ -g\ %\ -o\ %< 
au BufEnter *.c set makeprg=gcc\ -g\ %\ -o\ %< 
au BufEnter *.py set makeprg=python\ % 
au BufEnter *.[rR] set makeprg=Rscript\ %
map <F5> :call CompileGcc()<CR>
func! CompileGcc()
    exec "w" 
    silent make
endfunc

HTH

2018년입니다. vim 8은 출시된 지 2년이 되었고 모든 mean stream Linux 배포판과 Mac OS X와 함께 출시되었습니다. 하지만 많은 vim 튜토리얼은 여전히 10년 전에 사람들에게 무언가를 가르치고 있습니다.

Vim 8 또는 NeoVim 전용 플러그인을 사용하여 Subravilt Text 또는 NotePad++만큼 편리하게 Vim에서 C++/Java 프로그램을 컴파일할 수 있습니다.

예를 들어, 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"를 입력하면 다음과 같습니다.

여기 캡처 보기

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

하나의 파일을 컴파일하여

SyncRun으로 하나의 파일을 컴파일하는 것은 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)파일의 디렉터리에 있는 파일을 실행하는 것을 의미합니다.e$(VIM_FILEDIR)/$(VIM_FILENOEXT)됩니다../현재 디렉터리에서 실행 파일을 실행하는 것에 대한 접두사이지만 윈도우는 그렇지 않습니다. 이진 파일의 절대 경로 이름을 사용하면 교차 플랫폼 문제를 처리할 수 있습니다.

-raw출력이 vim의 오류 형식과 일치하지 않고 그대로 퀵픽스로 표시됨을 의미합니다.이제 F9로 파일을 컴파일하고 퀵픽스 창에서 컴파일 오류를 확인한 후 F5를 눌러 바이너리를 실행할 수 있습니다.

C/C++ 프로젝트 구축

어떤 빌드 도구를 사용하든, 만들든, 만들든 상관없이 프로젝트 빌드는 파일 그룹에 따라 작업을 수행하는 것을 의미합니다.프로젝트 루트 디렉터리를 찾아야 합니다.AsyncRun은 루트 마커라는 간단한 방법을 사용하여 프로젝트 루트를 식별합니다.Project Root는 다음 디렉토리 또는 파일 중 하나를 포함하는 현재 파일의 가장 가까운 상위 디렉토리로 식별됩니다.

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를 사용하는 경우, Make 파일을 업데이트하기 위해 F4를 지도화할 수 있습니다.

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

환경인 경우 까지 모든 cruntime 의이 non-tty instdout .그래서, 분명 뭔가가 있을 겁니다.fflush(stdout)r후에printfstdout 처음부터 buffer를 stdout buffer에 아니면하거나 stdout buffer를 stdout 버퍼를 처음에 닫을 수 있습니다실시간 출력을 보려면하여 닫을 수 .

setbuf(stdout, NULL);

한편 C++ 코드를 작성하는 경우 std::endl을 std::cout 끝에 추가할 수 있습니다.stdout 버퍼를 강제로 플러시할 수 있습니다.창에서 개발하는 경우 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=4창에서 Visual Studio에서 명령줄 프로그램을 실행하는 것처럼 명령을 실행하는 새 프롬프트 창이 열립니다.마지막으로 다음과 같은 키 매핑이 있습니다.

  • F4: make로 Makefile 업데이트.
  • F5: 단일 파일 실행
  • F6: 프로젝트 테스트 실행
  • F7: 빌드 프로젝트
  • F8: 프로젝트 실행
  • F9: 단일 파일을 컴파일합니다.
  • F10: 빠른 수정 창 전환

이것은 노트패드++와 GEdit의 빌드 시스템에 더 가깝습니다. cmake다에 셸 할 수 ~/.vim/script/build.shF4 와 F7 을 함께 결합하기 위해: MakeList 이면 Makefile 을 업데이트합니다.txt가 변경된 다음 make를 실행합니다.

고급사용법

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은 소스 간 기호 정의 및 참조를 검색하는 가장 저렴한 방법입니다.이제 커서 아래에 키워드를 검색할 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그리고..hfiles. 이제 커서 주변을 이동하고 F2를 누르면 현재 프로젝트의 기호 참조가 빠른 수정 창에 즉시 표시됩니다.

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

그것이 Vim 8이나 NeoVim에서 C/C++ 프로젝트를 구축/실행하는 실용적인 방법입니다.써브라임 텍스트의 빌드 시스템과 노트패드++의 NppExec처럼 말입니다.

더 이상 구식 vim 튜토리얼은 그만하고, 새로운 것을 시도해보세요.

저는 7년 후에 이곳에 온 것을 알고 있습니다.다른 답변의 코드를 시도했지만 결과가 만족스럽지 않아 다음과 같이 시도했습니다.

autocmd filetype cpp nnoremap <F9> :w<bar>term ++shell g++ %:p -o %:p:r && %:p:r<CR>

F9를 누르면 (위의 모든 답변과 마찬가지로) 현재 파일을 컴파일하고 실행합니다.출력은 :terminal 섹션 분할 화면에 표시됩니다.g++ 명령어를 변경하여 다른 언어 코드를 실행할 수 있습니다.

enter image description here

출력을 표시하는 다른 매핑과 함께 분할된 섹션에 저장되지만 새 파일에 저장되므로 출력을 저장할 수 있습니다.

누군가에게 도움이 되기를 바랍니다.

이것은 내 지도입니다. 정말 작동합니다. 어떤 언어로도 업데이트 할 수 있습니다.

" <!----------------------------" gcc compile C files----------------------------------------!>
autocmd filetype c nnoremap <Leader>c :w <CR>:!gcc % -o %:r && ./%:r<CR>

" <!----------------------------" java compile files----------------------------------------!>
autocmd filetype java nnoremap <Leader>c :w <CR>:!javac % :r&& java %:r<CR>
" <!----------------------------" php compile files----------------------------------------!>
autocmd filetype php nnoremap <Leader>c :w <CR>:!clear && php  %<CR>

vim에 있는 파일 중 하나에 있으면 일반 모드로 하면 됩니다.

<leader>c

저도 지름길을 찾고 싶었습니다.하지만 나는 사용하고 싶지 않았습니다.autocmd웬일인지 그래.저는 bash script를 사용했습니다.나는 이미 내 C/C++ 코드를 컴파일하고 실행하기 위해 bash 스크립트를 사용하고 있었습니다.그래서 C와 C++의 경우 bash 스크립트를 사용해서 fltplugin 파일에 사용하면 어떨까 생각했습니다.나는 두개의 bash 스크립트를 따로 만들었습니다.하나는 C, 하나는 C++.C의 경우)의 기 C의다(C++우)로. 컴파일러를 다음으로 변경하는 것도 비슷합니다.clang++/g++,std=c2x.std=c++20그리고.$filename.c.$filename.cpp),

filename=$1
compiler=clang-10
if [ $2 ]; then
    if [ $2 == "-v" ]; then
        FLAGS="-g -Wall -Wextra -pedantic -std=c2x"
    fi
else
    FLAGS="-Wall -Wextra -pedantic -std=c2x"
fi

$compiler $FLAGS $filename.c -o $filename -lm

return_value=$?

if [ $return_value -eq 0]; then
    if [ $2 ]; then
        if [ $2 == "-v" ]; then
            valgrind ./$filename
            rm $filename
        fi
    else
        ./$filename
        echo
        echo "[process exited $return_value]"
        rm $filename
    fi
fi

다음으로 저장했습니다.run할 수 있도록 모든 사용자가 실행할 수 있도록 만들었지만,

$ chmod 777 run

.bin디렉토리 입니다.

$ mv run ~/bin

bin전화번호부 불러요홈 디렉토리로 이동하여 다음 이름의 디렉토리를 만듭니다.bin.

$ cd ~
$ mkdir bin

.run(또는 스크립트에 지정한 이름이 무엇이든 간에) 파일을 bin 디렉토리에 저장합니다.

$ mv run ~/bin

다른 사람 만나자.는을 .c.vim줄을 지어 들어오다~/.vim/after/ftplugin디렉토리 입니다.그리고 두 개의 새로운 키 재맵을 추가합니다.c.vim일.

nnoremap <F9> :vertical bo term run %:r<CR>

# This will run my code with valgrind
nnoremap <F2> :vertical bo term run %:r -v<CR> 

여기 스크린샷이 있는데요.

F9를 클릭하면 vim 버퍼의 출력 화면이 나타납니다.

F2를 클릭하면 vim 버퍼에서 valgrind를 사용한 출력이 표시됩니다.

에서도 마찬가지로 은 C++ 를 수 .cpp.vim줄을 지어 들어오다~/.vim/after/ftplugin디렉토리 입니다.그리고 또 다른 것을 만듭니다.run:은일))run_cpp), 합니다합니다.bin(~/bin 지정 키몇 개 . .

언급URL : https://stackoverflow.com/questions/18296192/vim-compile-and-run-shortcut

반응형