簡単な vimscript を使用すると、Vim を離れることなく、あらゆる C コードを簡単にコンパイルして実行できます。これには vim9script を使用します。
vim9script の関数は def キーワードで定義されます。 Vim はアルゴリズムのような構文を使用するため、enddef はその関数の終わりを示します。
vim9script では let を使用しないため、var キーワードを使用していくつかの変数を定義します。
vim9script def CompileAndRun() var current_file = expand('%') var file_name = fnamemodify(current_file, ':t:r')
すべての vim9script と同様に、これが実際には vim9script! であることを vim に伝えることから始めます。
次に、expand() を使用して現在のファイルの名前を取得し、fnamemodifty() と :t:t を使用してパスと拡張子を取り除き、ベース名のみを保持します。
通常、expand('%') は、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() を使用するもう 1 つの利点は、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
同じチェックと機能を run コマンドにも適用します。したがって、単にバイナリを実行する代わりに、次のことができます:
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 中国語 Web サイトの他の関連記事を参照してください。