ホームページ > バックエンド開発 > C++ > vimript の書き方または Vim から C コードをコンパイルして実行する方法

vimript の書き方または Vim から C コードをコンパイルして実行する方法

Susan Sarandon
リリース: 2024-10-30 15:36:25
オリジナル
1092 人が閲覧しました

簡単な 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 を使用してパスと拡張子を取り除き、ベース名のみを保持します。

  • :t: ファイル パスの「末尾」(またはベース名) のみを取得し、ディレクトリを削除します。
  • :r: ファイル名から拡張子を削除します。

通常、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 を実行できるようになりました。

How to write vimript or How to Compile and Run C code from Vim

それは問題ありませんが、エラーはどうなりますか?警告?私たちにはそれが必要なのです!それでは、改善していきましょう。

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
ログイン後にコピー
ログイン後にコピー

How to write vimript or How to Compile and Run C code from Vim

悪くないですか?まだまだ改善できるはずです!

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
ログイン後にコピー
ログイン後にコピー

お気づきかもしれませんが、今回は分割のサイズも決定しています。

How to write vimript or How to Compile and Run C code from Vim

最後の仕上げとして、実行時にコンパイル フラグを定義する機能を追加しましょう。そのためには、 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
ログイン後にコピー
ログイン後にコピー

実行時にコンパイル フラグを変更できるようになりました。最後にスペースを追加することを忘れないでください。

テストしてみましょう:

How to write vimript or How to Compile and Run C code from Vim

ご覧のとおり、実行時にコンパイル フラグを問題なく変更できます!

スクリプト全体は次のとおりです:

var compile_cmd = 'gcc -Wall ' .. current_file .. ' -o ' .. file_name
ログイン後にコピー
ログイン後にコピー

コマンドに簡単にアクセスできるように、F8 キーバインドも追加しました。

注記

Vim にはすでにコンパイラーと make コマンドが備わっており、これらを武器に追加する必要があります。この記事は、vim9script の一部と、それを使用して非常に簡単に達成できることのいくつかについてのみ説明しようとしています。

この記事を楽しんでいただければ幸いです。気に入っていただけた場合は、コメントまたは反応を残してください。

以上がvimript の書き方または Vim から C コードをコンパイルして実行する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:dev.to
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート