嵌入式C常用语法

 

===== GPIO=====//1

=====typedef结构体=====//2

=====链表实验,约瑟夫环问题=====//. 3

=====嵌入式C语法=====//7

编程细节... 7

枚举... 8

====指针的赋值=====//8

=====SourceInSight=====//9

=====QTProgramming1=====//9

=====QT_Programming2=====//10

===== Linux Command=====//10

环境变量... 11

关于Openwrt的开发... 12

=====vi编辑器的使用=====//13

一、vi的工作模式... 13

二、vi的启动和退出... 13

三、vi长指令和短指令... 14

四、vi的高级应用... 15

5.运行Shell命令... 17

 

 

//===== GPIO=====//

//初始化PA8和PD2为输出口.并使能这两个口的时钟             

//LED IO初始化

void LED_Init(void)

{

       RCC->APB2ENR|=1<<2;    //使能PORTA时钟           

       RCC->APB2ENR|=1<<5;    //使能PORTD时钟    

             

       GPIOA->CRH&=0XFFFFFFF0;

       GPIOA->CRH|=0X00000003;//PA8推挽输出         

   GPIOA->ODR|=1<<8;     //PA8 输出高

                                                                              

       GPIOD->CRL&=0XFFFFF0FF;

       GPIOD->CRL|=0X00000300;//PD.2推挽输出

       GPIOD->ODR|=1<<2;      //PD.2输出高

}

//=====typedef结构体=====//

typedef struct

{

 uint16_t GPIO_Pin;            /*!< Specifies the GPIO pins to be configured.

                                      Thisparameter can be any value of @ref GPIO_pins_define */

 

 GPIOSpeed_TypeDef GPIO_Speed; /*!< Specifies the speed for the selected pins.

                                      Thisparameter can be a value of @ref GPIOSpeed_TypeDef */

 

 GPIOMode_TypeDef GPIO_Mode;   /*!< Specifies the operating mode for the selected pins.

                                      Thisparameter can be a value of @ref GPIOMode_TypeDef */

}GPIO_InitTypeDef;

 

//--------结构体快速赋值方法-------//

typedef struct 

{

       u8apn[20];

       u8useName[20];

       u8password[20];

       u8serverIP[16];

       u8port[6];

       u8useCall[3][15];

}configStruct;

 

configStruct myConf =

{

       "cmnet",

       "\0",

       "\0",

       "201.2.2.2",

       "9002",

       {

              "test123","\0","\0"

       }

};

 

//=====链表实验,约瑟夫环问题=====//

一.实验目的:

要求设计一个程序模拟约瑟夫环问题过程,求出出列编号序列。

二.实验内容:

约瑟夫环问题:设编号为1,2,3,……,n的n(n>0)个人按顺时针方向围坐一圈,每个人持有一个正整数密码。开始时任选一个正整数做为报数上限m,从第一个人开始顺时针方向自1起顺序报数,报到m是停止报数,报m的人出列,将他的密码作为新的m值,从他的下一个人开始重新从1报数。如此下去,直到所有人全部出列为止。令n最大值取30。要求设计一个程序模拟此过程,求出出列编号序列。

三.实验过程:

用一个不带头结点的循环链表来处理Josephu问题:先构成一个有n个结点的单循环链表,然后由k结点起从1开始计数,计到m时,对应结点从链表中删除,把被删除结点的密码作为新的m值,然后再从被删除结点的下一个结点又从1开始计数,直到最后一个结点从链表中删除算法结束。

#include<stdio.h>  

 #include<stdlib.h>   

 #define MAX_NODE_NUM     30 

 #define TRUE             1  

 #define FALSE            0     

 typedef struct NodeType  

   {int number;            

    int password;  

    struct NodeType *next;  

  }NodeType;    

 /*   创建单向循环链表   */  

 static void CreaList(NodeType **, const int);  

 /*   运行"约瑟夫环"问题  */  

 static void StatGame(NodeType **, int);  

 /*   打印循环链表   */  

 static void PrntList(const NodeType *);  

 /*   得到一个结点   */  

 static NodeType *GetNode(const int, const int);  

 /*   测试链表是否为空,   空为TRUE,非空为FALSE   */  

 static unsigned EmptyList(const NodeType *);  

 

  intmain(void)  

   {int n, m;  

     NodeType *pHead=NULL;   //全部为空,包括地址,地址不指向任何东西。

      while(1)  

       {printf("输入总的人数 n(<=%d):",MAX_NODE_NUM);  

          scanf("%d",&n);  

            printf("初始循环的密码为:");  

              scanf("%d",&m);  

                 if(n>MAX_NODE_NUM)  

                  {printf("数字太大,请重新输入!\n");  

                    continue;

                    }  

                 else  

                       break;  

   }  

   CreaList(&pHead,n);  

   printf("\n打印出原始每个结点的序列号和密码\n");  

   PrntList(pHead);  

   printf("\n最终每个结点退出的序列号和密码\n");  

StatGame(&pHead,m);   

Getch();

   return 0;  

 }  

    static void CreaList(NodeType **ppHead, const int n)   

    {  

      int i,iCipher;  

        NodeType *pNew, *pCur;  

    //pCur存储 pNew 采集

         for(i=1;i<=n;i++)  

         {  

           printf("第%d个人的密码为:",i);  

              scanf("%d",&iCipher);  

                pNew=GetNode(i,iCipher);   // 申请空间,创建链表元素(得到一个节点)

                  if(*ppHead==NULL)     //得到节点后,首先pNew->next值为NULL

                  {  

                          *ppHead=pCur=pNew;//将放NULL符号地址传递给pCur两 

                         pCur->next=*ppHead; //写首为尾,或写尾为首,分配下层

                  }  

                  else  

                  {  

                          pNew->next=pCur->next;   //链表插入固定格式,不可更改。

                         pCur->next=pNew;  

                         // pCur=pNew;  

                  }  

         }  

         printf("已完成结点初始化!\n");  

 }    

 static void StatGame(NodeType **ppHead, int iCipher)  

 {  

         int iCounter, iFlag=1,i=1;  

         NodeType *pPrv, *pCur, *pDel;     

         pPrv=pCur=*ppHead;     

         while(pPrv->next!=*ppHead)  

                  pPrv=pPrv->next;  

         while(iFlag)   

         {    

                 for(iCounter=1;iCounter<iCipher;iCounter++)  

                  {  

                          pPrv=pCur;  

                         pCur=pCur->next;  

                  }  

                  if(pPrv==pCur)  

                          iFlag=0;  

                  pDel=pCur;  

                 pPrv->next=pCur->next;  

                  pCur=pCur->next;  

                 iCipher=pDel->password;  

                  printf("第%d个退出的是序列号为%d的人,其密码为:%d\n",  

                                 i,pDel->number,     

                                 pDel->password); 

                  free(pDel);  

                           ++i;       

         }          

         *ppHead=NULL;     

 }    

 static void PrntList(const NodeType *pHead)  

 {  

         const NodeType *pCur=pHead;  

   

         if   (EmptyList(pHead))  

                  return;  

         do  

         {  

                  printf("第%d 个人,密码:%d\n",pCur->number,pCur->password);  

                  pCur=pCur->next;  

         }   while   (pCur!=pHead);  

 }   

 static NodeType *GetNode(const int iId,const int iCipher)  

 {  

         NodeType *pNew;  

       //返回指向被分配内存的指针(此存储区中的初始值不确定),否则返回空指针NULL

         pNew=(NodeType *)malloc(sizeof(NodeType));  

         if(!pNew)  

         {  

                  printf("错误,内存不足!\n");  

                  exit(-1);  

         }  

         pNew->number=iId;  

         pNew->password=iCipher;  

          pNew->next=NULL;    

         return pNew;  

 }  

 static unsigned EmptyList(const NodeType *pHead)  

 {  

         if(!pHead)  

         {  

                  printf("列表为空!\n");  

                  return TRUE;  

         }  

         return FALSE;  

  }

链表使用注意:不要忘了头文件。写next 的时候容易忘写或错写struct的名

链表插入和删除规则:C->next= A->next ;  插入C  单向链表

                                   A->next= C ;

                                   A->next= A->next->next ;  删除

while(p&&j<i-1)   //链表寻址 i为要寻址的链表位置,j为局部变量。p是链表指针

{

       p=p->next;

       ++j;

}

If(!p||j>i-1) return 0 ; // 地址有效,位置正确。

链表插入:          AB 顺序,插入C

                                   A->next->priv= C

                                   C->next= A->next

                                   A->next= C

                                   C->priv= A 

删除规则           ABC 顺序,删除B

                                   A->next->next->priv= A

                                   A->next= C

 

 

//=====嵌入式C语法=====//

编程细节

int const * a ;   //变量不可变,,地址可变。

int *const a ;    // 变量可变,地址不可变。  

int **p; p指针变量的地址*p 指针变量指向的数据的地址 **p 指针变量指向数据的值

NULL指针不指向任何数据。

类型转换 例如 int 转char   int c = 3 ;  char m ; m = (char)c ;

宏定义多句话:#define ShutDoor() {PBout(10) = 0 ; PBout(11) = 0 ;}

Continue使for 加1,break 使跳出for。  

结构体指针函数

typedef struct

{

 uint32_t StdId;  /*!< Specifiesthe standard identifier.

                        This parameter can be avalue between 0 to 0x7FF. */

 

 uint32_t ExtId;  /*!< Specifiesthe extended identifier.

                        This parameter can be avalue between 0 to 0x1FFFFFFF. */

 

 uint8_t IDE;     /*!< Specifiesthe type of identifier for the message that will be transmitted.

                        This parameter can be avalue of @ref CAN_identifier_type */

 

 uint8_t RTR;     /*!< Specifiesthe type of frame for the message that will be transmitted.

                        This parameter can be avalue of @ref CAN_remote_transmission_request */

 

 uint8_t DLC;     /*!< Specifiesthe length of the frame that will be transmitted.

                        This parameter can be avalue between 0 to 8 */

 

 uint8_t Data[8]; /*!< Contains the data to be transmitted. It rangesfrom 0 to 0xFF. */

} CanTxMsg;

 

char PackFrame(unsigned charBufferID[5],unsigned char CMD,CanTxMsg* TxMessage)

{

       charCheckBit = 0 ; char IDLength = 5 ;        char i =0 ;

      

       TxMessage->Data[0]= CMD ; //Data[0] 是命令

       TxMessage->Data[1]= CMD ; //Data[1] 也是命令

       CheckBit^= CMD ;

       for(i=0;i<IDLength;i++)

       {

              TxMessage->Data[i+2]   = BufferID[i] ;

       }

       TxMessage->Data[7]= CheckBit ;

       CheckBit= TxMessage->Data[7] ;   //无意义去warning用

       return1 ;

}

函数引用时:PackFrame(WriteID,res,&TxMessage)

WriteID 是数组不加[2][3] .

枚举

enum { IDLength = 3 ,  IDNum =3 , Tx_Mode = 1 ,Rx_Mode = 0 }    ;

typedef enum {

                       StateCheck = 0x23,\

                       OpenDoor = 0x22, \

                       ShutDoor = 0x12,\

                       DownID = 0x11,\

                       ShutConnect = 0x99, \

                       AskUpLoad = 0x33,\

                       TimeDownLoad = 0x56,\

                       AskBusOccupy = 0x55,\

                       ReleaseBus = 0x07,\

                       LogUpRequest = 0x44,             \

                       InvalidCMD = 0x45,} CMDList;

 

typedef enum {FAILED = 0, PASSED = !FAILED}TestStatus;

volatile TestStatus TestRx;

//====指针的赋值=====//

u32 Address = (u32)Logpoint ; 把指针的值(地址赋给了变量Address)

u32 Address = (u32)*Logpoint ; 把指针对应的变量值赋给了变量Address。

       #defineFLASH_Log  0x08005800    

       #defineFirst_WakeUp  0x08005750

 

       u32*First_WakeUpLocation = (u32*)First_WakeUp ;                             

       u32*Logpoint=(u32 *)FLASH_Log;                   (初始化确定了指针的位置)

       Logpoint=(u32*)FLASH_Log ;   (过程中赋值指针)

数组指针

char* mm[] = {"name"} ;

         TCP_CLIENT_main(3,mm);

         int TCP_CLIENT_main(intargc, char* argv[])

char* argv[100];

         C_main(2,argv) ;

 

//=====SourceInSight=====//

ARCH中保留arm中的对应芯片

删除DocumentationScripts

在初始时提示:选中包含子目录。

最后同步时,取消Addnew files automatically

                     勾选 Force all files to be re-paresed

//=====QTProgramming1=====//

QLineEdit *lineEdit;

获取文本QStringtext = lineEdit->text();

 

 QStringstr1 = "Test";
 QByteArray ba = str1.toLatin1();
 const char *c_str2 =ba.data();
 printf("str2: %s", c_str2);

 

 

 


 

//=====QT_Programming2=====//

#ifndef__DLG_H__

#define__DLG_H__

#include<qdialog.h>

#include<ui_form.h>

class MyDlg : public QDialog

{

         Q_OBJECT

public:

         MyDlg();

 

         privateslots:   //重要写法。

                   voidstartTcpSlot();

private:

         Ui::Dialog ui;

};

#endif

 

MyDlg::MyDlg()

{

         ui.setupUi(this);

         connect(ui.SeeHello, SIGNAL(clicked()), this,SLOT(startTcpSlot()));

}

 

void MyDlg::startTcpSlot()

{

         TCP_CLIENT_main();

}

 

//===== Linux Command =====//

http://linux.chinaitlab.com/special/linuxcom/特殊用法查询处

.tar.gz的,用tar zxvf
.tar.bz2的,用tar jxvf
.tar的,用tar xvfls

tgz 的,用tar zxvf

 

Rm –rf  删除

 


 
  常用的APT命令参数:
  apt-cachesearch package 搜索包
  apt-cacheshow package 获取包的相关信息,如说明、大小、版本等
  sudo apt-getinstall package 安装包
  sudo apt-getinstall package - - reinstall 重新安装包
  sudo apt-get-f install 修复安装"-f =——fix-missing"
  sudo apt-getremove package 删除包
  sudo apt-getremove package - - purge 删除包,包括删除配置文件等
  sudo apt-getupdate 更新源
  sudo apt-getupgrade 更新已安装的包
  sudo apt-getdist-upgrade 升级系统
  sudo apt-getdselect-upgrade 使用 dselect 升级
  apt-cache dependspackage 了解使用依赖
  apt-cacherdepends package 是查看该包被哪些包依赖
  sudo apt-getbuild-dep package 安装相关的编译环境
  apt-getsource package 下载该包的源代码
  sudo apt-getclean && sudo apt-get autoclean 清理无用的包
  sudo apt-getcheck 检查是否有损坏的依赖

 

 

rpm -ivh replacepkgs ~~.rpm

但是在ubuntu下使用alien转换为deb才行

sudo alien xxxx.rpm #将rpm转换位deb,完成后会生成一个同名的xxxx.deb

sudo dpkg -i xxxx.deb #安装

 

重命名 mv 原名字 重命的名字

 

'libncurses5-dev'命名的。   ubuntu 解决无法menuconfig问题

 

cp -r  /home/jsong/下载/jdk//opt  加-r 目录

 

Ubuntu下修改目录权限需要先用 sudo 来获得管理员权限,格式如下:  sudo chmod 600 ××× (只有所有者有读和写的权限)sudo chmod 644 ××× (所有者有读和写的权限,组用户只有读的权限)sudo chmod 700 ××× (只有所有者有读和写以及执行的权限)sudo chmod 666 ××× (每个人都有读和写的权限)sudo chmod 777 ××× (每个人都有读和写以及执行的权限)  假如要设置code目录的权限,他的路径为opt/code则 sudochmod -R 777 /opt/code 如果是目录则加入-R,如果是文件就不用添加-R 

环境变量

sudo vi /etc/profile 

加入:
export PATH=<你要加入的路径>:$PATH

就可以了。

终端输入:echo $PATH 可以查看环境变量

关于Openwrt的开发

# mkdir OpenWrt/
# cd OpenWrt/
# svn co svn://svn.openwrt.org/openwrt/branches/backfire

注解: 上述svn命令将在当前目录创建一个 OpenWrt/backfire/ 子目录,此目录包含此命令获取到的源代码。
您也可以通过下述命令,下载不含修复补丁的backfire的原版源码:
# svn co svn://svn.openwrt.org/openwrt/tags/backfire_10.03

使用开发版源代码
当前的开发版本分支(trunk)已包含最新的实验补丁。此分支或许还突破了Openwrt原来所不支持的硬件设备的限制哦,惊喜的同时也有风险存在。因此,编译trunk版,慎之~
# mkdir OpenWrt/
# cd OpenWrt/
# svn co svn://svn.openwrt.org/openwrt/trunk/

更多详细资料详见: https://dev.openwrt.org/wiki/GetSource.
跟进并更新源代码
因Openwrt的源代码随时都会变动,故此命令将确保您所获取得到的源码的最新性。下述假设您用的是backfire版本的源码:
## Here, backfire is the directory name of the current release branch you'retracking
# cd OpenWrt/backfire/
# svn up

'svn up' 命令用于更新SVN上更新了,但本地尚未更新的这部分源代码(本人实践证明此命令会将本地源码与SVN上的源码先比较,若SVN有更新才会下载更新的部分,很实用的一个命令)。如果未指定目标路径,则此命令将更新当前目录及当前目录的子目录内的源码。

feeds命令:

Feeds是一个openwrt的附加软件包管理器
'packages' - many additional basic router features,
'LuCI' - the default www GUI for OpenWrt, and
'Xwrt' - alternative GUI.
In most typical case, you needs at least 'packages' and 'LuCI'.
Before downloading feeds (additional predefined package build recipies forOpenWrt) you can check which feeds sources you want to include. Just edit thefile 'feeds.conf.default' in the base directory of your build environment.
Then start the download with
# ./scripts/feeds update -a

After this the downloaded packages need to be installed. The installation stepmeans they will be available during the 'make menuconfig' step later. Withoutthis 'installation' step the packages will not be selectable in 'makemenuconfig'.
# ./scripts/feeds install -a

The feeds configuration file makes it easy to add new or experimental packagessources to the build system. Just edit the file and run the update command.
Note: Please note that this step replaces the old method of creating symlinks,which can be still found on-line in many old forum and user-group entries.
Updating Feeds
Just like the basic source code, you need to regularly update the feedssources. That is done with the same commands:
# ./scripts/feeds update -a
# ./scripts/feeds install -a

内核命令

oldconfig是将当前内核源码的新特性加入.config中去。新特性的源文件应该是i386_defconfig,然后询问你。
defconfig是直接按照默认的i386_defconfig生成.config。

//=====vi编辑器的使用=====//

一、vi的工作模式

vi有两种工作模式:

  编辑模式:用来输入和编辑文件的模式,屏幕上会显示用户的键入,按键不是被解释为命令执行,而是作为文本写到用户的文件中。

  指令模式:用来编辑、存盘和退出文件的模式。

    运行vi后,首先进入指令模式。此时输入的任何字符都被视为指令,键入的命令不会在屏幕上显示。

    从指令模式切换到编辑模式,则可以按“Insert”键或“i”键,从编辑模式切换到指令模式,可按“Esc”键。

    状态行是屏幕底部一行,被vi编辑器用来反馈编辑操作结果。错误消息或提供信息的消息会在状态行中显示出来。

 

二、vi的启动和退出

1.启动vi

    在系统图示字符下键入“vi”+“空格”+“文件名”,如:vitest.txt

   vi可以自动载入所要编辑的文件或是开启一个新文件。

2.退出vi

在指令模式下键入如下命令可以退出vi:

  :q 如果用户只是读文件的内容而未对文件进行修改,可以在命令模式下输入“:q”退出vi。

  :q!如果用户对文件的内容作了修改,又决定放弃对文件的修改,则用“:q!”命令。

  :w!强行保存一个vi文件,如果该文件已存在,则进行覆盖。

  :wq保存文件并退出vi。

  ZZ 快速保存文件的内容,然后退出vi。功能和“:wq”相同。

  :wfilename   相当于“另存为”。

 :n,mw filename   将第n-m行的文本保存到指定的文件filename中。

 

三、vi长指令和短指令

  长指令:以冒号开头,键入冒号后,在屏幕的最末尾一行会出现冒号提示符,等待用户键入指令,输入完指令后回车,vi会执行该指令。

  段指令:与快捷键相似,键入短指令后,vi不会给任何提示就直接执行。

1.输入输出命令

  a 在光标后输入文本

  A 在当前行末尾输入文本

  i 在光标前输入文本

  I 在当前行开始输入文本

  o 在当前行后输入新一行

  O 在当前行前输入新一行

2.光标移动命令

  b 移动到当前单词的开始

  e 移动到当前单词的结尾

  w 向后移动一个单词

  h 向前移动一个字符

  l 向后移动一个字符

  j 向下移动一行

  k 向上移动一行

3.删除操作命令

  x 删除光标所在的字符

  dw 删除光标所在的单词

  dd 删除当前行

  d$ 删除光标至行尾的所有字符

  D 与“d$”命令相同

4.替换操作命令

  r 替换光标所在的字符

  R 替换字符序列

  cw 替换一个单词

  ce 与“cw”命令相同

  cb 替换光标所在的前一字符

  c$ 替换自光标位置至行尾的所有字符

  C 与“c$”命令相同

  cc 替换当前行

5.查询操作命令

 /abc 向后查询字符串“abc”

 ?abc 想前查询字符串“abc”

  n 重复前一次查询

  N 重复前一次查询,但方向相反

6.拷贝粘贴命令

  yw 将光标所在单词拷入剪贴板

  y$ 将光标至行尾的字符拷入剪贴板

  Y 与“y$”命令相同

  yy 将当前行拷入剪贴板

  y 将选取的内容拷入剪贴板

  p 将剪贴板中的内容粘贴在光标后

  P 将剪贴板中的内容粘贴在光标前

7.其他操作命令

  v 选取文本内容

  u 取消上一次的操作

  U 可以恢复对光标所在行的所有改变

  J 把两行文本链接到一起

 :set 用来设置或浏览vi系统当前的选项(加参数“all”后查看所有选项的列表)

  :X 对所编辑的文件进行简单加密

 

四、vi的高级应用

1.设置vi环境

   vi编辑器的行为可以通过设置编辑参数来定义。

    使用vi的set命令进行设置。vi在进行设置前必须处于指令模式,但选项的改变是临时的,只在用户当前编辑回话下有效,当用户退出vi编

 

辑器时,设置会被丢弃。

 autoindent选项

    将新行与前一行的开始对准,缩写:ai

    该选项将用户键入的每个新行与前一行的开始对齐。该选项对于使用程序语言编程时十分有用。本选项的默认值是noai。

 ignorecase选项

    在搜索命令下忽略大小写,缩写:ic

   vi编辑器提供大小写敏感的搜索,要使vi忽略大小写,键入“:setignorecase”,要返回大小写敏感状态,键入“:set noignorecase”.

 magic选项

    在搜索时,允许使用特殊字符。

    某些符号在用于搜索时有特殊的含义。当用户将这些符号开头置为nomagic时,这些符号不再有特殊含义。

 number选项

    显示行号,缩写:nu

   vi编辑器一般情况下不显示每行的行号。可以改变number选项来显示行号。

 report选项

    告知用户最后一个命令作用行的行号。

   vi编辑器对用户的编辑工作并不给予任何反馈,如果希望在屏幕上看到自己编辑的反馈信息,用户可以通过编辑report选项来实现。

 scroll选项

    设定在指令模式下使用“Ctrl+d”命令翻滚的行数。

 shiftwidth选项

    设定缩进空格数,一般与autoindent一同使用,缩写:sw

 showmode选项

    在屏幕右角显示vi编辑器模式,缩写:smd

 terse选项

    缩短错误信息。

 wrapmargin选项

    将右边界设定为一定的字符个数,缩写:wm

    用户的终端屏幕通常为80列,当键入到行的末尾时,屏幕即开始一个新行,这就是行回绕。在用户按回车键时,屏幕同样开始一个新行。

 

因此,屏幕上一行的长度可以为1-80个字符之间的任何长度。但是,vi编辑器只在用户按回车时,才在用户文件中生成一个新行。如果用户在

 

按回车前键入了120个字符,这时键入的文本看起来是在2行,但实际在文件中,这120个字符只在1行中。如果要限制行长度,一是在到达屏幕

 

行末尾前按回车换行,另一种是设定wrapmargin选项使vi编辑器自动插入回车。

 

 

2.缩写操作符

    缩写操作符“:ab”命令使得用户给任何字符串指定缩写,该功能可以帮主用户提高输入速度。用户可以为自己经常输入的文本选择一个易

 

输入的缩写。

    例如:键入“:ab uox Unix Operating System”命令,当vi处于文本输入模式时,用户键入“uox”接着键入一个空格时,vi自动将键入的

 

“uox”变为“Unix Operating System”。

    取消缩写“:unab”命令可以取消一个缩写,例如:键入“:unab uox”命令即可。

    想列出已经设置了的所有缩写,键入“:ab”命令即可。

3.宏操作符

    宏操作符“:map”命令使用户能将一系列按键指定给某一按键。给用户一个在指令模式下的快捷按键。

    例如:键入“:map q dd”命令,此后处于指令模式时,每当用户键入q时,vi编辑器自动执行“dd”命令。

    取消宏操作“:unmap”命令。

    用户也可以使用map指令指定功能键,例如:键入“:map #n dd”命令,其中“#n”代表以n为功能键号的功能键。

4.“.exrc”文件

    用户在vi编辑器中所设置的所有选项都是临时的,当用户退出时,它们都会失效。要使这些设置永久保存,可以将选项的设置保存到文件

 

“.exrc”中。

    当用户打开vi编辑器时,它自动查看用户当前的工作目录中的“.exrc”文件,并根据在文件中的内容设置编辑环境。如果vi没有在当前目

 

录中发现“.exrc”文件,则将查找用户的主目录,并根据在哪里发现的“.exrc”文件设置编辑环境。如果vi一个“.exrc”文件也没找到,则

 

对选项使用默认值。

    “.exrc”文件属于启动文件。

例如:建立一个“.exrc”文件。

在终端中键入“vi.exrc”,回车。

在vi编辑器中键入:

  setautoindent

  setshiftwidth=2

  setnomagic

  setnumber

  setscroll=20

  setshowmode

保存退出即可

5.运行Shell命令

    用户可以在vi的命令行运行Linux Shell命令,使得用户可以临时抛开vi来运行Shell命令。

   vi编辑器用“!”来通知vi其后面是一个Shell命令。例如:键入“:!date”命令,vi编辑器将清除屏幕,输出当前系统时间,后按任意键返回vi编辑器,并可以继续编辑。

    如果用户系统将Shell命令执行的结果加到文件文本中,可以使用“:r!”和相应的Shell命令来将命令结果写到用户文件文本中。

 

 


  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值