首页 > 其他分享 >vim和gcc

vim和gcc

时间:2024-09-22 14:24:50浏览次数:3  
标签:文件 gcc 模式 生成 vim main 光标

一.vim

1.删除和跳转

跳转到指定行

88G (命令模式)
:88 (末行模式)

跳转文件首

gg (命令模式)

跳转文件尾

G (命令模式)

自动格式化程序

gg=G (命令模式)

大括号对应

% (命令模式)

光标移至行首

0 (命令模式)
执行结束,工作模式不变

光标移至行尾

$ (命令模式) 
执行结束,工作模式不变

删除单个字符

x (命令模式) 
执行结束,工作模式不变

删除一个单词

dw (命令模式) 
光标至于首字母进行操作

删除光标至行尾

D (命令模式)
d$(命令模式)

删除光标至行首

d0 (命令模式)

删除指定N行

在光标所在行
dd (命令模式) 删除1行
Ndd (命令模式) 删除N行 光标所在行往后

替换单个字符

将代替换的字母用光标选中
r (命令模式)
再将欲替换的字符

删除指定区域:

按V (命令模式)
切换为“可视模式”
  hjkl
  挪移光标来选中待删除区域
  d   删除该区域数据
删除实际上是剪切,放进了缓冲区了

2.复制和粘贴

复制一行:

yy (命令模式)
光标所在行

粘贴一行

小p (命令模式)
  光标后一行粘贴
大P  (命令模式)
   光标前一行粘贴

3.查找和替换

查找:

命令模式下
  按“/”输入欲搜索关键字,回车 
  使用n检索下一个,用N检索上一个

  光标放在单词的任意一个字符下
  按“ * ” / “ # ”检索下一个/上一个

单个替换:

将光标置于待替换行上,按“:”进入末行模式
输入 s /原数据/新数据

行首个替换:

将光标置于待替换行上,按“:”进入末行模式
输入 %s /原数据/新数据
注:每次只会替换每一行的首个

全部替换:

将光标置于待替换行上,按“:”进入末行模式
输入 %s /原数据/新数据/g

区域替换:

按“:”进入末行模式
输入 行首,行尾s  /原数据/新数据/g

4.其它操作

撤销、反撤销

 u、crtl+r (命令模式)

分屏操作

“:”进入末行模式
启动分屏:
    sp 
        上下分屏,后可跟文件名
    ctrl+w 
        切换光标在哪个屏中
    vsp 文件
        左右分屏,后可跟文件名

跳转至man手册

将光标置于待查看函数单词上,使用K(命令模式)跳转
指定卷,nK

查看宏定义

将光标置于待查看宏定义单词上,使用
    [d
查看定义语句

编译.c文件

:    进入末行模式
!gcc hello.c -o hello1    编译
enter
:    进入末行模式
!./hello1                 运行
Ctrl+p:生成tags
Ctrl+]:跳转到函数定义
Ctrl+t:从函数定义返回
Ctrl+o:在左侧打开文件列表
F4:在右侧打开函数列表
Ctrl+n:补齐函数,向下翻

二.gcc

1.gcc编译四步骤

预处理、编译、汇编、链接

编译阶段消耗时间、系统资源最多

2.编译常用参数

-v

/-v/-version 查看gcc版本号

-l(L的小写)

指定动态库苦命

-L

指定动态库路径

-On

n=0~3 编译优化,n越大优化的越多

-Wall

提示更多警告信息

-E

生成预处理文件

-I

当.c文件引用了自己创建的头文件,且该头文件不在.c文件

的目录下,这时候可以通过加上 -I./.h文件的文件夹名,来

指明头文件的位置

gcc -I./inc hello.c -o hello100

./hello100

-c

只进行预处理、编译、汇编,得到的是二进制文件

-g

编译时添加调试语句,不加的话是无法对文件进行调试的

用gdb工具进行调试,后面会进行说明

-D

gcc hello.c -D HELLO
//向程序中“动态”注册宏义,比如用于
//#ifdef HELLO
//#difine HI 20
//#endif  使main方法中能不打印HI出来
也可以用宏来做一个开关

-M

只是将依赖输出到终端,要想输出到文件,需要用-MF去指定

生成文件的依赖关系,同时也把一些标准库的头文件包含了进来

注意:该选项默认打开了 -E 选项, -E 参数的用处是使得编译器在预处理结束时就停止编译

gcc -M main.c 
》》》》
 main.o: main.c defs.h \
 /usr/include/stdio.h \
 /usr/include/features.h \                                          
 /usr/include/sys/cdefs.h /usr/include/gnu/stubs.h \         
 /usr/lib/gcc-lib/i486-suse-linux/2.95.3/include/stddef.h \  
 /usr/include/bits/types.h \
 /usr/include/bits/pthreadtypes.h \ 
 /usr/include/_G_config.h /usr/include/wchar.h \ 
 /usr/include/bits/wchar.h /usr/include/gconv.h \ 
 /usr/lib/gcc-lib/i486-suse-linux/2.95.3/include/stdarg.h \ 
 /usr/include/bits/stdio_lim.h

-MM

生成文件的依赖关系,和 -M 类似,但不包含标准库的头文件


[....]# gcc -MM main.c
main.o: main.c defs.h

-MG

要求把缺失的头文件按存在对待,并且假定他们和源文件在同一目录下,必须和 ‘-M’ 选项一起用。

-MF File

当使用了 “-M” 或者 “-MM” 选项时,则把依赖关系写入名为 “File” 的文件中。若同时也使用了 “-MD” 或 “-MMD”,“-MF” 将覆写输出的依赖文件的名称 。

gcc -M -MF main.d main.c
# main.c的依赖写进了main.d文件中
# 本目录下只生成了main.d,不会生成main.out,main.i
# 因为-M,到预处理后就停止了,而预处理是需要-o指定main.i他才会生成
# -E是需要-o指定生成的目标他才会生成,没有-o,gcc -E是不会生成.i文件

-MD

等同于 -M -MF File但是默认关闭了 -E 选项。其输出的文件名是基于 -o 选项

若给定了 -o 选项,则输出的依赖文件名是 -o 指定的文件名,并添加 .d 后缀

若没有给定-o,则输出的依赖文件名是要编译的文件的名,并添加 .d 后缀

同时继续指定的编译工作。(依赖关系写进文件后继续执行编译)

注意:-MD 不会像 -M 那样阻止正常的编译任务,因为它默认关闭了 -E 选项,比如命令中仅使用了 -c 选项而没有指定 -o 选项时,若同时使用了 -M 选项,则不会生成 .o 文件,若使用的是 -MD 选项,则会生成 .o 文件

gcc -E -MD main.c

# 本目录下生成了文件:main.d 
# 终端上也输出了 main.c 文件的预处理结果(main.c文件没被更改到)
# 没有-o给定main预处理后输出的文件名称,用输出的mian.c的main作为输出名称

gcc -E main.c //不使用 '-o',则把预处理后的结果输出在终端上,并不会生成main.i文件去存放
gcc -S main.c //不使用 '-o',则自动生成main.s,存放的是main.c预处理、编译后的结果
gcc -c main.c //不使用 '-o',则自动生成main.o,存放的是预处理、编译、汇编后的结果
gcc main.c/i/o    //不使用 '-o',则把结果默认输出到 a.out 可执行文件中

-MMD

类似于“-MD”,但是输出的依赖文件中,不包含标准头文件

-MP

生成的依赖文件里面,依赖规则中的所有 h 依赖项都会在该文件中生成一个伪目标,其不依赖任何其他依赖项。该伪规则将避免删除了对应的头文件而没有更新"Makefile”去匹配新的依赖关系而导致 make 出错的情况出现。

-MT Target

在生成的依赖文件中,指定依赖规则中的目标

示例

*************例1*****************
gcc -E -o tmp.i -MD main.c

本目录下生成了以下文件:
  tmp.d tmp.i

**************例2****************
gcc -c -MD main.c

# 没有-o指定,将要编译的文件名作为依赖文件的名,加上.d后缀
本目录下生成了以下文件:
  main.d main.o
  
***************例3***************
gcc -c -o tmp.o -MD main.c

# 根据-o指定的tmp.o的文件名tmp作为依赖关系存入的文件名
本目录下生成了以下文件:
  tmp.d tmp.o

 **************例4****************
 gcc -c -o main.o -MD main.c -MF main.d

本目录下生成了以下文件:
    main.o main.d
 # MD默认是关闭-E的,因此-c可以正常生成main.o文件
 # 只不过生成前会讲main.c文件的依赖关系写进指定的main.d 

****************例5**************
gcc -MD main.c

本目录下生成了以下文件:
  a.out main.d 
  
****************例6**************
gcc -M -MD main.c

本目录下生成了以下文件:
   main.d  

不会生成 a.out 可执行文件, '-M' 默认打开了 '-E' 选项,使得编译器在预处理结束后就停止编译

*****************例7**************
gcc -c -M -MF main.d  main.c

本目录下生成了以下文件:
   main.d 

不会生成 main.o 文件,因为 '-M' 默认打开了 '-E' 选项,使得编译器在预处理结束后就停止编译

***********例8********************
gcc -c -o m.o -M -MF main.d  main.c

本目录下生成了以下文件:
   main.d m.o

***********例9********************
gcc -c -MM -MD main.c

生成的main.d文件内容如下:
  main.o:main.c defs.h

***********例10********************
gcc -c -MM -MD main.c -MP

生成的 main.d 文件内容如下:
  main.o:main.c defs.h
  defs.h:
该选项会生成“defs.h:”伪目标,其没有任何依赖项,若不是用'-MP'选项,则不会生成该文件

***********例11********************
gcc -MF main.d-MG-MM-Mp -M main.d -MT main.o main.c

  cat main.d
  #查看生成的依赖文件的内容main.d main.o: main.c
注:依赖规则中 main.d和main.0 目标都是通过“-MT”选项指定的

为啥例8 跟 例7 不一样,生成了 m.o 文件,而不受 -M 的影响而终止编译呢?

GCC 编译器在处理命令行选项时有一个特定的顺序。如果没有指定-o选项,编译器会默认将目标文件命名为"a.out"。但是当使用 -M 选项时,GCC 将输出依赖关系文件而不是目标文件。因此如果你不指定-o选项,编译器会将生成的目标文件命名为“a.out”,并且将输出重走向到依赖关系文件"main.d”,这样就导致了预期之外的行为。

通过增加 -o选项并指定目标文件的名称为“main.o”,你告诉编译器将生成的目标文件命名为"main.o”,而不是默认的“a.out"。这样编译器就不会将输出重定向到依赖关系文件"main.d”,从而避免了预处理后终止的问题。

标签:文件,gcc,模式,生成,vim,main,光标
From: https://blog.csdn.net/caiji0169/article/details/142427059

相关文章

  • llm.nvim 支持在neovim中使用kimi
    llm.nvim(https://github.com/Kurama622/llm.nvim)是一个为大型语言模型(LLM)设计的通用插件,旨在使用户能够在neovim中与LLM进行交互。您可以自定义您希望使用的任何LLM(比如智谱清言、kimi、通义千问等)。最后,也是最重要的,您可以使用各种免费模型(无论是由Cloudflare还是其......
  • 【Linux 】开发利器:深度探索 Vim 编辑器的无限可能
    ......
  • nvim 配置,neovim配置
    背景:因为vim配置的非常的复杂,所以了解到了一个新的vim,neovim。通过lazyvim这个功能来自动化的配置neovim。已达到在终端中就可以编程。原文仓库:https://github.com/folke/lazy.nvim.git原文文档仓库:https://lazyvim.github.io本人fork仓库:https://github.com/xin2233/LazyV......
  • vim matchit 自定义配对关键字之间的跳转
    vim因其强大的扩展性一直深受linux程序员的喜爱,最近在用vim写verilog的时候,由于一个逻辑块中的beginend较多,常常会多写或者漏掉匹配关键字,很是苦恼,于是寻找匹配关键字间跳转的方法,发现matchit可以用%在关键字之间实现跳转,还可以自定义更多的关键字,相当方便。以下正片:1、安装ma......
  • vim8 自带插件管理系统
    vim8自带插件管理系统,使用了指定目录的方式来安装插件。在linux下的目录为:~/.vim/pack/自定义目录名/{start,opt}举例说明,比如我安装一个python代码格式化的插件,地址是:https://github.com/Vimjas/vim-python-pep8-indent转到.vim目录后,首先创建pack目录:mkdirpack转......
  • update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-13 60 详细解释这个命
    update-alternatives是一个在Linux系统(尤其是Debian系列,包括Ubuntu)上用于管理多个相同功能的软件版本的命令。它让你可以在系统中安装多个版本的同一个程序(例如多个版本的GCC),并通过优先级和符号链接来控制默认使用哪个版本。让我们详细解释一下以下命令的作用:sudoup......
  • 在ubuntu中安装较新版本的gcc和gdb
    要在Ubuntu中安装较新版本的GCC和GDB,可以通过以下几种方法实现。Ubuntu的默认包管理器apt提供的软件包通常不是最新的,因此需要使用PPA或手动编译以获取较新版本。方法1:使用ppa:ubuntu-toolchain-r/test安装最新版本的GCC和GDBUbuntuToolchainPPA提供了更新的......
  • C语言中的GCC的优化和数组的存放方式、Cache机制、访问局部性
    “我们仍需共生命的慷慨与繁华相爱,即使岁月以刻薄和荒芜相欺”文章目录前言文章有误敬请斧正不胜感恩!第一题:***什么是gcc:***C语言中,“gcc-O2”是使用GCC编译器时的一个编译选项。第一部分:为什么程序一输出0,而程序二输出1?第二题:第二部分:为什么两个循环版本的性能......
  • GCC安全编译选项
    以CMake为例,给出安全编译选项的定义。关闭RPATH特性。set(CMAKE_SKIP_RPATHTRUE)开启栈保护。set(CMAKE_CXX_FLAGS"${CMAKE_CXX_FLAGS}-fstack-protector-strong")或者set(CMAKE_CXX_FLAGS"${CMAKE_CXX_FLAGS}-fstack-protector-all")开启GOT表保护。set(CM......
  • vi/vim命令详解
     原文:Linux—vi/vim命令详解(3000字) 目录vi/vim概念vi/vim的三种模式vi/vim常用命令命令行模式的命令进入插入模式从插入模式切换为命令行模式移动光标操作文本其他功能底行输入模式保存文件操作文本搜索和替换注释vi/vim概念        vi用来进......