搜索
首页后端开发C++如何编写 vimript 或如何从 Vim 编译和运行 C 代码

使用简单的vim脚本,我们可以轻松编译和运行任何C代码,而无需离开Vim!我们将为此使用 vim9script。

编译并运行函数

vim9script 中的函数是用 def 关键字定义的。由于 Vim 使用类似 algol 的语法,enddef 将表示该函数的结束。

我们将使用 var 关键字定义多个变量,因为 vim9script 不使用 let。

vim9script

def CompileAndRun()
    var current_file = expand('%')
    var file_name = fnamemodify(current_file, ':t:r')

与每个 vim9script 一样,我们首先告诉 vim 这实际上是 vim9script!
然后我们使用 Expand() 获取当前文件的名称,然后使用 fnamemodifty() 和 :t:t 我们将去掉路径和扩展名,只保留基本名称。

  • :t:仅采用文件路径的“尾部”(或基本名称),删除目录。
  • :r:从文件名中删除扩展名。

如果您直接使用 vim filename.extension 打开文件,但如果文件是从相对路径打开的,例如 vim ~/some/path,则 Expand('%') 通常会返回 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() 的另一个好处是它已经为我们捕获了 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

您可能已经注意到,这次我们也在确定分割的大小。

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 命令,您应该将它们添加到您的武器库中。本文只是尝试教一些 vim9 脚本以及一些你可以用它轻松实现的事情。

我希望您喜欢这篇文章,如果您喜欢,请发表评论或做出反应。

以上是如何编写 vimript 或如何从 Vim 编译和运行 C 代码的详细内容。更多信息请关注PHP中文网其他相关文章!

声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
C#vs. C:编程语言的比较分析C#vs. C:编程语言的比较分析May 04, 2025 am 12:03 AM

C#和C 的主要区别在于语法、内存管理和性能:1)C#语法现代,支持lambda和LINQ,C 保留C特性并支持模板。2)C#自动内存管理,C 需要手动管理。3)C 性能优于C#,但C#性能也在优化中。

用C构建XML应用程序:实例用C构建XML应用程序:实例May 03, 2025 am 12:16 AM

在C 中处理XML数据可以使用TinyXML、Pugixml或libxml2库。1)解析XML文件:使用DOM或SAX方法,DOM适合小文件,SAX适合大文件。2)生成XML文件:将数据结构转换为XML格式并写入文件。通过这些步骤,可以有效地管理和操作XML数据。

C中的XML:处理复杂的数据结构C中的XML:处理复杂的数据结构May 02, 2025 am 12:04 AM

在C 中处理XML数据结构可以使用TinyXML或pugixml库。1)使用pugixml库解析和生成XML文件。2)处理复杂的嵌套XML元素,如书籍信息。3)优化XML处理代码,建议使用高效库和流式解析。通过这些步骤,可以高效处理XML数据。

C和性能:它仍然主导C和性能:它仍然主导May 01, 2025 am 12:14 AM

C 在性能优化方面仍然占据主导地位,因为其低级内存管理和高效执行能力使其在游戏开发、金融交易系统和嵌入式系统中不可或缺。具体表现为:1)在游戏开发中,C 的低级内存管理和高效执行能力使得它成为游戏引擎开发的首选语言;2)在金融交易系统中,C 的性能优势确保了极低的延迟和高吞吐量;3)在嵌入式系统中,C 的低级内存管理和高效执行能力使得它在资源有限的环境中非常受欢迎。

C XML框架:为您选择合适的一个C XML框架:为您选择合适的一个Apr 30, 2025 am 12:01 AM

C XML框架的选择应基于项目需求。1)TinyXML适合资源受限环境,2)pugixml适用于高性能需求,3)Xerces-C 支持复杂的XMLSchema验证,选择时需考虑性能、易用性和许可证。

C#vs. C:为您的项目选择正确的语言C#vs. C:为您的项目选择正确的语言Apr 29, 2025 am 12:51 AM

C#适合需要开发效率和类型安全的项目,而C 适合需要高性能和硬件控制的项目。 1)C#提供垃圾回收和LINQ,适用于企业应用和Windows开发。 2)C 以高性能和底层控制着称,广泛用于游戏和系统编程。

c  怎么进行代码优化c 怎么进行代码优化Apr 28, 2025 pm 10:27 PM

C 代码优化可以通过以下策略实现:1.手动管理内存以优化使用;2.编写符合编译器优化规则的代码;3.选择合适的算法和数据结构;4.使用内联函数减少调用开销;5.应用模板元编程在编译时优化;6.避免不必要的拷贝,使用移动语义和引用参数;7.正确使用const帮助编译器优化;8.选择合适的数据结构,如std::vector。

如何理解C  中的volatile关键字?如何理解C 中的volatile关键字?Apr 28, 2025 pm 10:24 PM

C 中的volatile关键字用于告知编译器变量值可能在代码控制之外被改变,因此不能对其进行优化。1)它常用于读取可能被硬件或中断服务程序修改的变量,如传感器状态。2)volatile不能保证多线程安全,应使用互斥锁或原子操作。3)使用volatile可能导致性能slight下降,但确保程序正确性。

See all articles

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

Video Face Swap

Video Face Swap

使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

热工具

Dreamweaver Mac版

Dreamweaver Mac版

视觉化网页开发工具

安全考试浏览器

安全考试浏览器

Safe Exam Browser是一个安全的浏览器环境,用于安全地进行在线考试。该软件将任何计算机变成一个安全的工作站。它控制对任何实用工具的访问,并防止学生使用未经授权的资源。

SublimeText3 Linux新版

SublimeText3 Linux新版

SublimeText3 Linux最新版

适用于 Eclipse 的 SAP NetWeaver 服务器适配器

适用于 Eclipse 的 SAP NetWeaver 服务器适配器

将Eclipse与SAP NetWeaver应用服务器集成。

WebStorm Mac版

WebStorm Mac版

好用的JavaScript开发工具