【问题标题】:Add debug print code in every function using vim使用 vim 在每个函数中添加调试打印代码
【发布时间】:2013-09-05 12:26:52
【问题描述】:

我有一个巨大的代码文件,想在每个函数中插入打印代码。 我知道调试是一种选择,但我是内核新手,kgdb 不是一个简单直接的选择,因此我想暂时使用 printf。

我使用vim的multiple buffers来更快地完成这项任务,但想知道.vimrc中是否有任何方法可以自动化它 这是最终代码的样子

void foo(int a, int b) {
    printf("Some print");
    // ...
}

int bar() {
    printf("Some print");

    // ...
}

void bleh(int b) {
    printf("Some print");
    // ...
}

【问题讨论】:

  • 您的具体问题是什么:找到要添加语句的行、将更改应用于多个文件,或者只是在这些步骤之外构建自定义映射/命令?!
  • 我只是想将打印语句放在文件的每个函数中。构建自定义映射也是一个好主意,但我并没有优先考虑它

标签: c vim editor


【解决方案1】:

一种快速的方法是在 shell 中:

find -name '*.c' | xargs vim

在vim中,你用qq一个宏开始录制,使用全局命令

:g/\v\s*(void|int) \w+\([^)]*\)/normal A^Mprint("some print");

然后你使用美妙的argdo 命令:

:argdo normal @q

保存您使用的更改:

:argdo normal :w^M

这会将print("someprint") 添加到已定位的 c 源代码文件的每个函数中。如果你想在print 语句中使用函数名或文件名,你可以使用全局命令进行一些复杂的替换,例如(未测试):

:global /\v\s*(void|int) \w+([^)]*)/s/\v(\w+)\([^]]*\)\s* {/\=submatch(0) . '\r\t\tprint(in file.function:'. expand('%') .'.'. submatch(1) . ');'

记住 ^M 和 ^[ 不是文字字符串,它们是用 <C-v><CR><C-v><Esc> 插入的

希望有帮助

【讨论】:

  • 我太天真了,但这就是我用 <C-v><CR> 替换 ^M 所发生的事情,这是我得到的错误 E492: Not an editor command: Normal A^Mprint("some print") ;
  • <C-v> 表示按住 Control 并按 vim 键符号中的 v 和 vim 键符号 <CR> 是键盘上的回车键。要阅读有关 vim 键符号的更多信息,请尝试以下命令::h key-notation
  • 我的错误命令是normal,不是正常的。我更新答案以反映这种情况:global:g 简称在这种情况下应用命令选择,选择是匹配正则表达式\v\s*(void|int) \w+([^)]*) 的行。不要忘记使用命令:h g 查看全局的帮助。在这种情况下,:global 命令将击键序列A^Mprint("some print"); 应用于匹配的行。
  • 要获得更具描述性的打印,您可以使用:global /\v\s*(void|int) \w+([^)]*)/s/\v(\w+)\([^]]*\)\s* \{/\=submatch(0) . "\r\t\tprint(". '"in file->function:'. expand('%') .'->'. submatch(1) . '");'。使用vim内部的帮助了解更多解决方案:h :g:h :s:h submatch()
  • 我在写“:global:g 简称应用命令选择”时打错了字,我真的很想写:global 将命令应用到选择。顺便说一句,我建议您在 vimcasts.org 上查看截屏视频,问候
猜你喜欢
  • 1970-01-01
  • 2017-09-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多