将vscode打造成无敌的IDE初步探索vscode,解放生产力

Posted 奇妙之二进制

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了将vscode打造成无敌的IDE初步探索vscode,解放生产力相关的知识,希望对你有一定的参考价值。


上一节给大家介绍了vscode,今天带领大家一步步搭建vscode下的C/C++开发环境。

1、如何安装插件

以安装C/C++插件为例:

打开vscode,按照以下步骤安装

2、C/C++插件–C/C++开发必备

从事Linux C/C++开发,C/C++是必须安装的第一个插件,它提供了代码智能、调试、浏览等功能。vscode的所有插件都会安装在C:\\Users\\用户名\\.vscode\\extensions目录下。

接下来探索下C/C++插件的功能。熟悉二进制君的同学都知道,二进制君的治学态度是,一个课题必定要研究彻底,穷尽到没有内容可以研究为止。所以对于vscode的插件,二进制君坚持的态度就是宁缺勿滥,对于插件的每一个配置,也都尽量彻底了解,以发挥插件的最大功能。

代码智能补全提示:

C语言glibc库,C++ STL库都支持。

代码导航:

  • 跳转定义
  • 跳转声明
  • 跳转类型定义
  • 跳转引用
    跳转定义的快捷键是F12,但是我们更习惯使用ctl+鼠标左键单击。

此外还增加了代码格式化、符号重命名(F2)、头文件和源文件相互切换(alt+O)、文件内符号跳转、全局符号跳转等功能。

左侧还增加了一个大纲视图,自动解析出当前文件的符号:

配置代码格式化

安装了C/C++插件后就支持代码格式化功能了,也不用去安装额外的代码格式化插件。C/C++代码格式都是基于clang-format工具做的,安装C/C++插件后就自动安装了clang-format工具,只不过有一些配置需要我们自己设置(vscode这点做得不好),截图如下:



代码格式化需要指定格式化风格,提供了自定义(配置为file)、Google、LLVM等。
对于C/C+,谷歌风格是一个不错的风格,建议大家采用,关于谷歌风格的说明可以参考:https://zh-google-styleguide.readthedocs.io/en/latest/google-cpp-styleguide/contents/

最后,再开启保存自动格式化功能,还可以设置格式化模式(整个文件格式化、只对改动处格式化):

关于代码格式化工具clang-format,我们会另开一篇介绍。

3、为代码中的括号添上一抹亮色

在代码编写过程中,各种括号 [()] 必不可少。然而,随着代码量的增加,你有没有因为括号的嵌套太多,而导致代码难以阅读?

我们来看看下面的代码:


这还让我们怎么愉快地Code Review或是改代码?

不用怕!vscode支持为代码中各种结对的括号兄弟们提供了颜色高亮等功能。

配置中搜索bracket:

我们再来看看,配置之后的效果。各个结对的括号兄弟都有了不同的颜色。不管是Code Review或是改代码,都便利了许多呢!

默认匹配三层颜色后,颜色又重复循环,但别担心,支持自定义每一层的颜色:

下面定义了6种颜色,大家贴到自己的setting.json文件里即可使用。

"workbench.colorCustomizations": 
  "editorBracketHighlight.foreground1": "#ffd700",
  "editorBracketPairGuide.activeBackground1": "#ffd7007f",
  "editorBracketHighlight.foreground2": "#da70d6",
  "editorBracketPairGuide.activeBackground2": "#da70d67f",
  "editorBracketHighlight.foreground3": "#87cefa",
  "editorBracketPairGuide.activeBackground3": "#87cefa7f",
  "editorBracketHighlight.foreground4": "#3905f7",
  "editorBracketPairGuide.activeBackground4": "#3905f7",
  "editorBracketHighlight.foreground5": "#66031c",
  "editorBracketPairGuide.activeBackground5": "#66031c",
  "editorBracketHighlight.foreground6": "#04f541",
  "editorBracketPairGuide.activeBackground6": "#04f541",
  "editorBracketHighlight.unexpectedBracket.foreground": "#ff0000",
, // 开启原生括号着色
"editor.guides.bracketPairs": "active",// 开启 active 时的代码块边缘导轨线着色
"editor.bracketPairColorization.enabled": true // 开启括号匹配上色功能

4、代码片段一触即发–解放生产力

代码片段英文叫code snippet,就是事先准备好一些常用的代码片段,在敲代码时,只需输入前缀,如果匹配到了就会自动提示你是否采用。vscode无需安装任何插件就可以实现这一功能。

先秀一把效果,写一个类要敲一堆东西,比如构造函数、析构函数,为何不提炼成代码片段呢?

我们来插入自己的代码片段:

点击User Snippets后会弹出一个小框,我们输入想要的语言简称即可为该语言创建代码片段,如c、cpp、py,会为该语言创建一个json文件。代码片段的书写语法这里就不细说了,感兴趣自行百度,这里我根据谷歌风格写了一个C++的代码片段:


	"for": 
		"prefix": "for",
		"body": [
			"for ($size_t $i = $1:0; $i < $2:len; $i++) ",
			"	$3",
			""
		],
		"description": "A Code snippet for 'for' loop"
	,
	"forr": 
		"prefix": "forr",
		"body": [
			"for (int $i = $1:len - 1; $i >= $2:0; $i--) ",
			"	$3",
			""
		],
		"description": "Code snippet for reverse 'for' loop"
	,
	"do": 
		"prefix": "do",
		"body": [
			"do ",
			"	$1",
			" while($2:condition);"
		],
		"description": "Code snippet for do...while loop"
	,
	"while": 
		"prefix": "while",
		"body": [
			"while ($1:condition) ",
			"	$2",
			""
		],
		"description": "Code snippet for while loop"
	,
	"foreach": 
		"prefix": "foreach",
		"body": [
			"for(auto& $var : $1:list) ",
			"	$2",
			""
		],
		"description": "Code snippet for const range-based for loop (c++11) statement"
	,
  "foreachconst": 
		"prefix": "foreachconst",
		"body": [
			"for(const auto& $var : $1:list) ",
			"	$2",
			""
		],
		"description": "Code snippet for const range-based for loop (c++11) statement"
	,
	"if": 
		"prefix": "if",
		"body": [
			"if ($1:condition) ",
			"	$2",
			""
		],
		"description": "Code snippet for if statement"
	,
	"else": 
		"prefix": "else",
		"body": [
			"else ",
			"	$1",
			""
		],
		"description": "Code snippet for else statement"
	,
	"else if": 
		"prefix": "else if",
		"body": [
			"else if ($1:condition) ",
			"	$2",
			""
		],
		"description": "Code snippet for else-if statement"
	,
	"enum": 
		"prefix": "enum",
		"body": [
			"enum $1:MyEnum ",
			"	$2",
			";"
		],
		"description": "Code snippet for enum"
	,
	"enum class": 
		"prefix": "enum class",
		"body": [
			"enum class $1:MyClass  $2 ;"
		],
		"description": "Code snippet for enum class (c++11)"
	,
	"class": 
		"prefix": "class",
		"body": [
			"class $1:MyClass ",
			" public:",
			"	$1();",
			"	$1($1 &&) = default;",
			"	$1(const $1 &) = default;",
			"	$1 &operator=($1 &&) = default;",
			"	$1 &operator=(const $1 &) = default;",
			"	~$1();",
			"",
			" private:",
			"	$2",
			";",
			"",
			"$1::$1() ",
			"",
			"",
			"$1::~$1() ",
			""
		],
		"description": "Code snippet for class"
	,
	"classi": 
		"prefix": "classi",
		"body": [
			"class $1:MyClass ",
			" public:",
			"	$1() = default;",
			"	$1($1 &&) = default;",
			"	$1(const $1 &) = default;",
			"	$1 &operator=($1 &&) = default;",
			"	$1 &operator=(const $1 &) = default;",
			"	~$1() = default;",
			"",
			" private:",
			"	$2",
			";"
		],
		"description": "Code snippet for class with inline constructor/destructor"
	,
	"namespace": 
		"prefix": "namespace",
		"body": [
			"namespace $1:MyNamespace ",
			"	$2",
			" // $1"
		],
		"description": "Code snippet for namespace"
	,
	"#ifdef": 
		"prefix": "#ifdef",
		"body": [
			"#ifdef $DEBUG",
			"$1",
			"#endif // $DEBUG"
		],
		"description": "Code snippet for #ifdef"
	,
	"#ifndef": 
		"prefix": "#ifndef",
		"body": [
			"#ifndef $1:1",
			"$2",
			"#endif // !$1"
		],
		"description": "Code snippet for #ifndef"
	,
	"#if": 
		"prefix": "#ifdef",
		"body": [
			"#ifdef $1:0",
			"$2",
			"#endif // $1"
		],
		"description": "Code snippet for #if"
	,
	"struct": 
		"prefix": "struct",
		"body": [
			"struct $1:MyStruct ",
			"	$2",
			";"
		],
		"description": "Code snippet for struct"
	,
	"switch": 
		"prefix": "switch",
		"body": [
			"switch ($1:switch_on) ",
			"	case $2:A:",
			"		$3",
			"		break;",
			"	default:",
			"		break;",
			""
		],
		"description": "Code snippet for switch statement"
	,
	"try": 
		"prefix": "try",
		"body": [
			"try ",
			"	$1",
			"",
			"catch (const std::exception&) ",
			"	$2",
			""
		],
		"description": "Code snippet for try catch"
	,
	"union": 
		"prefix": "union",
		"body": [
			"union $1:MyUnion ",
			"	$2",
			";"
		],
		"description": "Code snippet for union"
	,
	"cout": 
		"prefix": "cout",
		"body": [
			"std::cout << \\"$1:/* message */\\" << std::endl;"
		],
		"description": "Code snippet for printing to std::cout, provided the header is set"
	,
	"#inc": 
		"prefix": "#inc",
		"body": [
			"#include \\"$1\\""
		],
		"description": "Code snippet for #include \\" \\""
	,
	"#inc<": 
		"prefix": "#inc<",
		"body": [
			"#include <$1>"
		],
		"description": "Code snippet for #include < >"
	,
	"#def": 
		"prefix": "#def",
		"body": [
			"#define $1 ($2)"
			],
		"description": "Code snippet for #define ( )"
	,
	"main": 
		"prefix": "main",
		"body": [
			"int main(int argc, const char** argv) ",
				"	$1"
				"	return 0;",
			""
		],
		"description": "Code snippet for main function"
	
  "join": 
		"prefix": "join",
		"body": [
			"if($1:thread_.joinable()) ",
				"	$1.join();"
				"	LOG(INFO) << "$1 join success";
			""
		],
		"description": "Code snippet for thread join"
	

更多精彩内容,下期见…

以上是关于将vscode打造成无敌的IDE初步探索vscode,解放生产力的主要内容,如果未能解决你的问题,请参考以下文章

将vscode打造成无敌的IDE安装一个自己满意的主题

将vscode打造成无敌的IDE开发神器vscode介绍

将vscode打造成无敌的IDE开发神器vscode介绍

将vscode打造成无敌的IDE打造shell IDE--三大神器

将vscode打造成无敌的IDE(10)配置C/C++标准版本

将vscode打造成无敌的IDE(11) vscode增加文件后缀类型的支持,例如cmake支持识别cmake.in