간단한 vimscript를 사용하면 Vim을 떠나지 않고도 C 코드를 쉽게 컴파일하고 실행할 수 있습니다! 이를 위해 vim9script를 사용하겠습니다.
vim9script의 기능은 def 키워드로 정의됩니다. Vim은 algol과 유사한 구문을 사용하므로 enddef는 해당 함수의 끝을 나타냅니다.
vim9script는 let을 사용하지 않으므로 var 키워드를 사용하여 여러 변수를 정의합니다.
vim9script def CompileAndRun() var current_file = expand('%') var file_name = fnamemodify(current_file, ':t:r')
모든 vim9script와 마찬가지로 vim에게 이것이 실제로 vim9script라고 말하는 것부터 시작합니다!.
그런 다음 Expand()를 사용하여 현재 파일의 이름을 얻은 다음 fnamemodifty() 및 :t:t를 사용하여 경로와 확장자를 제거하고 기본 이름만 유지합니다.
vim filename.extension을 사용하여 파일을 직접 열었지만 vim ~/some/path와 같은 상대 경로에서 파일을 연 경우 일반적으로 확장('%')은 filename.extension을 반환합니다. /filename.extension 경로도 반환하므로 경로를 정리해야 합니다.
컴파일 명령을 저장하려면 또 다른 변수가 필요합니다. 우선 간단한 gcc 컴파일 명령으로 수행해야 합니다.
var compile_cmd = 'gcc ' .. current_file .. ' -o ' .. file_name
..은 PHP 및 기타 언어와 유사하게 문자열을 연결하는 방법입니다. 출력 바이너리에 추출된 파일 이름을 사용하고 있다는 사실도 눈치채셨을 것입니다.
이후에는 출력 바이너리를 간단히 컴파일하고 실행할 수 있습니다.
var compile_result = systemlist(compile_cmd) execute 'terminal ./' .. file_name
그래서 함께:
def CompileAndRun() var current_file = expand('%') var file_name = fnamemodify(current_file, ':t:r') var compile_cmd = 'gcc ' .. current_file .. ' -o ' .. file_name var compile_result = systemlist(compile_cmd) execute 'terminal ./' .. file_name enddef defcompile
결국 defcompile 명령은 함수를 컴파일하는 것과 정확히 같은 작업을 수행합니다.
vim9script 함수는 기존 vimscript와 범위가 다르기 때문에 해당 함수에 액세스하려면 명령을 정의해야 합니다.
command! CompileAndRun call CompileAndRun()
이제 :CompileAndRun을 실행할 수 있습니다.
괜찮습니다. 하지만 오류는 어떻게 되나요? 경고? 우리에겐 그게 필요해요! 그러니 더 좋게 만들어 봅시다.
v:shell_error를 확인하는 조건을 추가해 보겠습니다. :h v:shell_error를 참조하세요.
if v:shell_error != 0 || !empty(compile_result) botright new +setlocal\ buftype=nofile\ noswapfile\ bufhidden=wipe call setline(1, compile_result) return endif
다음은 요약입니다. botright new는 수평 분할을 생성하고, setlocal 옵션은 스크래치 버퍼인지 확인하고, systemlist()는 줄 바꿈을 적절하게 처리하면서 바이너리를 실행하고, setline()은 분할 버퍼의 첫 번째 줄에 결과를 넣습니다. .
컴파일 명령에 -Wall을 추가하고 간단한 테스트 C 코드에서 사용되지 않는 변수를 생성해 보겠습니다.
var compile_cmd = 'gcc -Wall ' .. current_file .. ' -o ' .. file_name
나쁘지 않나요? 아직은 더 나아질 수 있습니다!
systemlist() 사용의 또 다른 장점은 2>&1(일명 stdout 및 stderr)을 이미 캡처했기 때문에 리디렉션을 수행할 필요가 없다는 것입니다.
경고 및 오류에 구문 강조를 추가할 수 있나요? 예! setline()을 호출하기 전에 set filetype=c를 추가하면 됩니다.
이 분할을 자동으로 종료할 수 있나요? 예! 하지만 좀 더 많은 코드가 필요합니다.
분할 버퍼에 이름을 지정한 다음 augroup 자동을 사용하여 휴가 시 버퍼를 닫습니다.
vim9script def CompileAndRun() var current_file = expand('%') var file_name = fnamemodify(current_file, ':t:r')
이렇게 하면 CompileErrors라는 이름의 버퍼에서 포커스를 변경할 때 해당 버퍼가 삭제되고 분할이 닫히게 됩니다.
그러나 작업하는 동안 분할을 열어두고 싶은 경우가 있을 수 있으므로 부울을 생성하여 런타임에 1 또는 0으로 설정할 수 있습니다.
var compile_cmd = 'gcc ' .. current_file .. ' -o ' .. file_name
그리고 augroup을 수정하고 형식을 멋지게 지정하겠습니다.
var compile_result = systemlist(compile_cmd) execute 'terminal ./' .. file_name
실행 명령에도 동일한 검사와 세부 사항을 적용할 것입니다. 따라서 단순히 바이너리를 실행하는 대신 다음을 수행할 수 있습니다.
def CompileAndRun() var current_file = expand('%') var file_name = fnamemodify(current_file, ':t:r') var compile_cmd = 'gcc ' .. current_file .. ' -o ' .. file_name var compile_result = systemlist(compile_cmd) execute 'terminal ./' .. file_name enddef defcompile
이번에는 분할 규모도 결정하고 있다는 사실을 눈치채셨을 것입니다.
런타임에 컴파일 플래그를 정의하는 기능인 마지막 터치를 추가해 보겠습니다. 이를 위해서는 g:custom_compile_flag를 확인하는 조건을 추가하고 vim9script가 빈 변수에 까다롭기 때문에 처음에는 이를 비우도록 시작해야 합니다.
command! CompileAndRun call CompileAndRun()
물론 compile_cmd도 수정해야 합니다.
if v:shell_error != 0 || !empty(compile_result) botright new +setlocal\ buftype=nofile\ noswapfile\ bufhidden=wipe call setline(1, compile_result) return endif
이제 런타임 시 컴파일 플래그를 변경할 수 있습니다. 마지막에 공백을 추가하는 것을 잊지 마세요!
테스트해 보겠습니다.
보시다시피 런타임에 아무런 문제 없이 컴파일 플래그를 변경할 수 있습니다!
전체 스크립트는 다음과 같습니다.
var compile_cmd = 'gcc -Wall ' .. current_file .. ' -o ' .. file_name
또한 명령에 더 쉽게 액세스할 수 있도록 F8 키 바인딩을 추가했습니다.
Vim에는 이미 무기고에 추가해야 할 컴파일러와 make 명령이 있습니다. 이 기사에서는 vim9script의 일부와 이를 통해 매우 쉽게 달성할 수 있는 몇 가지 사항만 설명합니다.
이 기사가 도움이 되셨기를 바라며, 도움이 되셨다면 댓글이나 반응을 남겨주세요.
위 내용은 vimript를 작성하는 방법 또는 Vim에서 C 코드를 컴파일하고 실행하는 방법의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!