给之前那个OSU专用键盘加一个呼吸灯。 硬件:Arduino pro mini 要使用支持PWM的引脚,查一下引脚图即可。 代码: 示例1: int pins[] = {9}; int length = sizeof(pins) / sizeof(int); //想实现呼吸灯效果 需用到支持PWM的引脚 void setup() { } void loop() { int flag = 0; //渐亮渐暗状态切换 int sped = 5; //步长 for (int fadeValue = 0 ; fadeValue <= 255; ) { for(int i=0;i<length;i++){ analogWrite(pins[i], fadeValue); //analogWrite PWM输出0~255 } delay(60); if(fadeValue >= 255){ flag = 1; } if(fadeValue <= 0){ flag = 0; } if(flag == 1){ fadeValue -= sped; }else{ fadeValue += sped; } } } 示例2: void setup () { pinMode(9,OUTPUT); } void loop() { for (int a=0; a<=255;a++) //循环语句,控制PWM亮度的增加 { analogWrite(9,a); delay(8); //当前亮度级别维持的时间,单位毫秒 } for (int a=255; a>=0;a--) //循环语句,控制PWM亮度减小 { analogWrite(9,a); delay(8); //当前亮度的维持的时间,单位毫秒 } delay(8); //完成一个循环后等待的时间,单位毫秒 } 以上两种都可以达到效果,我目前用的是示例2,这也是我修改过的。 参考文章: http://www.jianshu.com/p/65d5ccbfca82 http://www.geek-workshop.com/forum.php?mod=viewthread&tid=1126
最近真是把好多以前毕设用的Arduino都拿出来玩了,这次是一个8*8的LED点阵。 硬件: Arduino pro mini一块 8*8点阵一个 杜邦线若干 CH340串口转USB模块一个 连线: Matrix pin no. Row Column Arduino pin number 1 5 - 13 2 7 - 12 3 - 2 11 4 - 3 10 5 8 - 16 (analog pin 2) 6 - 5 17 (analog pin 3) 7 6 - 18 (analog pin 4) 8 3 - 19 (analog pin 5) 9 1 - 2 10 - 4 3 11 - 6 4 12 4 - 5 13 - 1 6 14 2 - 7 15 - 7 8 16 - 8 9 硬件连接图(点击放大): 注意: 1.此图为有丝印的一面朝下。 2.硬件必须这么连接,不能改引脚,因为后面用到的软件是这么定义引脚的。 编程: 这次不用IDE了,直接用一款可视化的编程工具Mind+。 直接在里面选取好模块,连线,画图就可以了,见最前面那张图。注意自己的点阵是共阴还是供阳,修改true或者false。 最后烧录,因为pro mini没有自带串口,所以要用一个USB转串口的模块进行烧录。接好VCC,GND,TX接RX,RX接TX,点击upload,等待编译后出现upload时按板子上的复位按钮,就可以了。注意,如果不按或者没有及时按,都会导致烧录失败。
闲置了好久的一些散件,觉得还是用来干点什么比较好,so,就做了这么一个超声波测距的东西。 硬件:Arduino UNO一块 HC-SR04超声波测距模块一个 IIC1602显示模块一个 UNO固定板一块 连接: 超声波:VCC — 5v Trig — D5 Echo — D4 GND — GND IIC1602:VCC — VCC GND — GND SDA — SDA SCL — SCL 首先检测自己的1602地址,打开串口,设置波特率9600,写入以下代码: #include <Wire.h> void setup() { Wire.begin(); Serial.begin(9600); Serial.println("\nI2C Scanner"); } void loop() { byte error, address; int nDevices; Serial.println("Scanning..."); nDevices = 0; for(address = 1; address < 127; address++ ) { // The i2c_scanner uses the return value of // the Write.endTransmisstion to see if // a device did acknowledge to the address. Wire.beginTransmission(address); error = Wire.endTransmission(); if (error == 0) { Serial.print("I2C device found at address 0x"); if (address<16) Serial.print("0"); Serial.print(address,HEX); Serial.println(" !"); nDevices++; } else if (error==4) { Serial.print("Unknow error at address 0x"); if (address<16) Serial.print("0"); Serial.println(address,HEX); } } if (nDevices == 0) Serial.println("No I2C devices found\n"); else Serial.println("done\n"); delay(5000); // wait 5 seconds for next scan } 之后就能看到地址了,我的是0x3F。 然后写入以下代码: #include <LiquidCrystal_I2C.h> #include <Wire.h> LiquidCrystal_I2C lcd(0x3F,16,2);//设置I2C驱动板的地址,楼主的是0x3F,请根据上一步获得的写入,不然不会再LCD上显示信息 int inputPin=4; // 定义超声波信号接收接口 int outputPin=5; // 定义超声波信号发出接口 int ledpin=13; void setup() { Serial.begin(9600); pinMode(ledpin,OUTPUT); pinMode(inputPin, INPUT); pinMode(outputPin, OUTPUT); } void loop() { lcd.init(); digitalWrite(outputPin, LOW); // 使发出发出超声波信号接口低电平2ms delayMicroseconds(2); digitalWrite(outputPin, HIGH); // 使发出发出超声波信号接口高电平10ms,这里是至少10μs delayMicroseconds(10); digitalWrite(outputPin, LOW); // 保持发出超声波信号接口低电平 float distance = pulseIn(inputPin, HIGH); // 读出脉冲时间 distance= 1.3+distance/58; // 将脉冲时间转化为距离(加上底座高度单位:厘米) Serial.print(distance); Serial.println("cm");//向串口监视器中输出距离信息 lcd.backlight(); lcd.setCursor(0,0);//光标从这里开始 lcd.print("Distance is"); lcd.setCursor(0,1);//换行后显示距离 lcd.print(distance); lcd.println("cm");//在LCD上输出距离信息 delay(100);//刷新时间100ms,也就是0.1s } 到这就可以了。 注意:1.第一步获取的地址如果不同,要修改第二部分的代码里面相应的部分。 2.1602的对比度在板子后面有蓝色的旋钮可以调节。 3.IDE版本超过1.6的话,IIC的库可能不正常,导致1602只能显示第一个字符,这里提供下我用的库,我的IDE版本是1.8.3。下载:LiquidCrystal_I2C1602V1.rar 最后成品图: 参考文章: http://www.arduino.cn/thread-21927-1-1.html
之前搭建的时候SSL证书使用了自己签发的,网页访问会弹出不信任提示,自己用当然没什么问题啦,但看着有点不完美。后来想到阿里云和腾讯云现在都有免费的SSL证书可以使用,于是便去签发了一个。 这次使用的是阿里云的,填完信息后等待验证签发就行,全程自动,速度还可以。 签好后选择最后那个其他的下载,下好后文件夹里会有许多文件,我们要用到的只有两个。 一串数字开头的.key和.pem两个文件。 然后把.key里面的内容复制到,pem里面放在最上面。 之后重命名.pem文件为server.pem替换掉之前自己签发的那个即可。 然后启用HSTS用来自动从http跳转到https 打开配置文件/etc/lighttpd/lighttpd.conf 在最后加入以下代码: server.modules += ( "mod_setenv" ) $HTTP["scheme"] == "https" { setenv.add-response-header = ( "Strict-Transport-Security" => "max-age=63072000; includeSubdomains; preload") } 重启服务器,再访问便可以了。
之前折腾过树莓派的显示服务器信息的屏幕,想着也给NanoPiNEO来一块。 硬件:Nokia5110屏幕一块。 首先要把NanoPiNEO上的排针焊好,只焊两排的那个就够用了。 安装wiringNP,就是wiringPi的NanoPi专用版,这点说明这个板子还是可以的,该有的还有。 git clone https://github.com/friendlyarm/WiringNP cd WiringNP/ chmod 755 build ./build 接着把线接好,对照着引脚图接线(注意所标引脚为wiringNP的标号): RST:外部复位引脚——5 CE:显示屏使能引脚——4 DC:数据/命令引脚——1 Din:串行数据输入端——16 CLK:串行时钟输入端——15 Vcc:电源引脚——9 BL: 背光灯——8 Gnd:地——GND (引脚可以根据实际情况自行更改,注意VCC一定要接控制引脚,方便软件控制对比度,BL直接接VCC也行。) 引脚图: 然后下载驱动程序: wget http://blog.readgroup.cn/filetool/a/nokia5110forNanoPiNEO.zip unzip nokia5110forNanoPiNEO.zip cd nokia5110forNanoPiNEO 接下来需要编译显示程序,在目录下编译生成cpushow。 cc -o cpushow pcd8544_rpi.c PCD8544.c -L/usr/local/lib -lwiringPi 编译完成后,会在当前目录下生成可执行文件 cpushow ,然后执行这个文件。 sudo ./cpushow 一切正常的话会先出现NanoPiNEO的图标,然后进入后显示系统相关信息,包括:启动时间,CPU使用率,内存使用情况,CPU温度,星期,日期,时间和IP地址。 最后在/etc/rc.local加入开机启动:cd /cpushow所在目录 && ./cpushow & 最后效果(还是用的上次那个树莓派的壳,完美塞进去,还能稍微固定下): 补充:1.原来的代码是为树莓派写的,但我用了下基本没问题,修改了一些地方就行了,主要是温度,刚开始一直是0,查了代码没问题,后来进系统去查temp文件才发现,dietpi的温度已经是两位数的正常值,不需要再除以1000。(文件中的程序都修改好了,直接可用) 2.原来的开机图标是树莓派的图标,用字模软件做了个NanoPiNEO的字标,看着好点,尤其随着开机启动,挺像那么回事。 3.刚开始折腾的时候,屏幕一直会乱码,以为是代码问题,改了好久都不行,又试了别的库还是不行,最后拿下来用Arduino测试了一下看看是不是屏幕坏的,也不是。Arduino显示好的,然后我突然发现了问题,居然是我用来连接的杜邦线有问题,换了一下再试就可以了。这个真的是坑了我好长时间。下次一定要买质量好的线! 参考文章:http://blog.lxx1.com/2001
首先说下使用的环境: 硬件:NanoPi NEO 操作系统:Dietpi 为什么会现在才想到搭建这个系统呢,之前一直没有同步本地文件的需求,但要开工写毕业论文了,需要把论文随时备份,所以就需要一个能够同步的网盘。为什么要自己搭建呢?一来市面上的网盘我已经失去信任了,二来万一网络什么的出问题也能够直接从实体机把文件拷出来,提高可靠性。好了,下面来记录下步骤。 1.首先刷入系统,参考以前文章,这里不再重复。 登录SSH,等待系统初始化完成后开始安装软件。这里直接使用系统自带的软件管理系统安装,分别勾选: XFCE(一个桌面环境,也可以根据自己喜好安装别的。装桌面是为了远程方便,也可以不装。) Tightvnc server(VNC服务。) XRDP(远程桌面。如果不要桌面环境,那么以上这3个都不要安装。) owncloud(本篇主角,系统里带了,直接选择安装就好。但可能不是最新版,后续可以自己升级。) LLSP(web服务环境,这个比较轻量,自用够了,也可以选别的。) vsFTPD(FTP软件,这个权限比较高,能够访问根目录。) 主要就是这几个,空格键打*选择,完了直接进入安装程序。有需要可以安装中文字库和输入法。 好了之后就可以通过windows的远程桌面进入了。 2.配置web服务环境。 进入/etc/lighttpd/lighttpd.conf修改配置文件,把根目录改为/var/www/owncloud 开启SSL: 在/etc/lighttpd目录下新建一个ssl文件夹并用openssl生成一个证书: cd /etc/lighttpd/ sudo mkdir ssl sudo openssl req -new -x509 -keyout server.pem -out server.pem -days 365 -nodes (server.pem的文件名可以自定义,这个证书的有效期为1年。生成过程要填一些信息,随意即可。sudo chmod 400 server.pem给文件加权限) 接着修改SSL配置文件: sudo nano /etc/lighttpd/conf-available/10-ssl.conf 修改为以下内容: $SERVER["socket"] == ":443" { ssl.engine = "enable" ssl.pemfile = "/etc/lighttpd/ssl/server.pem" server.name = "server" server.document-root = "/var/www/owncloud" ssl.cipher-list = "ECDHE-RSA-AES256-SHA384:AES256-SHA256:RC4:HIGH:!MD5:!aNULL:!EDH:!AESGCM" ssl.honor-cipher-order = "enable" } 之后执行以下命令启用和重启web服务即可。 sudo lighttpd-enable-mod ssl sudo systemctl restart lighttpd.service (在SSH模式下可以不加sudo,因为已经是root权限了。但在远程桌面模式下要加,不然有时会权限不够。) 3.之后登录配置好owncloud即可使用,下载电脑手机客户端开始使用。 还有个外网访问的问题,依然是使用frp软件。这里注意,frp的服务端和客户端的版本要对应,不然会连接不上。记得给frpc文件777权限。 设置frp开机自启:在/etc/rc.local中exit 0之前加入代码:cd /root/frp/ && ./frpc -c frpc.ini & 为了安全考虑,frp中只配置了443端口的外网访问。也就是通过外网只能以https访问,http无法连接。局域网内都可以使用。 补充: 修改owncloud的登录页背景图:owncloud\core\img\background.jpg 修改网页标题和底部标语:owncloud\lib\private\legacy\defaults.php 遇到文件无法删除被锁定的情况,进入phpmyadmin,执行以下命令: DELETE FROM oc_file_locks WHERE 1 php7.0遇到提示无法访问 /dev/urandom,在php.ini中open_basedir=.:/tmp/:/dev/urandom
问基友要了台有公网IP的服务器,终于可以用自己的服务器中转了。 系统环境为debian7. 依然使用了第三方的一键安装配置脚本: 安装: wget --no-check-certificate https://raw.githubusercontent.com/clangcn/onekey-install-shell/master/frps/install-frps.sh -O ./install-frps.sh chmod 700 ./install-frps.sh ./install-frps.sh install 配置: Loading network version for frps, please wait... frps Latest release file frp_0.8.1_linux_amd64.tar.gz #此步骤会自动获取frp最新版本,自动操作,无需理会 Loading You Server IP, please wait... You Server IP:x.x.x.x #自动获取你服务器的IP地址 Please input your server setting: Please input frps bind_port [1-65535](Default Server Port: 5443): #输入frp提供服务的端口,用于服务器端和客户端通信,最好修改 Please input frps dashboard_port [1-65535](Default dashboard_port: 6443): #输入frp的控制台服务端口,用于查看frp工作状态,最好修改 Please input frps vhost_http_port [1-65535](Default vhost_http_port: 80): #输入frp进行http穿透的http服务端口,不要修改 Please input frps vhost_https_port [1-65535](Default vhost_https_port: 443): #输入frp进行https穿透的https服务端口,不要修改 Please input privilege_token (Default: WEWLRgwRjIJVPx2kuqzkGnvuftPLQniq): #输入frp服务器和客户端通信的密码,默认是随机生成的,修改自己能记住的 Please input frps max_pool_count [1-200](Default max_pool_count: 50): #设置每个代理可以创建的连接池上限,默认50 ##### Please select log_level ##### 1: info 2: warn 3: error 4: debug ##################################################### Enter your choice (1, 2, 3, 4 or exit. default [1]): #设置日志等级,4个选项,默认是info Please input frps log_max_days [1-30] (Default log_max_days: 3 day): #设置日志保留天数,范围是1到30天,默认保留3天。 ##### Please select log_file ##### 1: enable 2: disable ##################################################### Enter your choice (1, 2 or exit. default [1]): #设置是否开启日志记录,默认开启,开启后日志等级及保留天数生效,否则等级和保留天数无效 设置完成后检查你的输入,如果没有问题按任意键继续安装 ============== Check your input ============== You Server IP : x.x.x.x Bind port : 5443 Dashboard port : 6443 vhost http port : 80 vhost https port: 443 Privilege token : xxxxxx Max Pool count : 50 Log level : info Log max days : 3 Log file : enable ============================================== 安装结束后显示: Congratulations, frps install completed! ============================================== You Server IP : x.x.x.x Bind port : 5443 Dashboard port : 6443 vhost http port : 80 vhost https port: 443 Privilege token : xxxxxx Max Pool count : 50 Log level : info Log max days : 3 Log file : enable # 将上面信息添加到你的路由器frp穿透插件中吧 ============================================== frps Dashboard: http://x.x.x.x:6443/ # 这个是frp控制台访问地址 ============================================== 三、更新命令 ./install-frps.sh update 四、卸载命令 ./install-frps.sh uninstall 五、服务器端管理命令 /etc/init.d/frps start /etc/init.d/frps stop /etc/init.d/frps restart /etc/init.d/frps status /etc/init.d/frps config /etc/init.d/frps version 全部弄好后即可,服务端会自动启动,接着只要在客户端填好配置文件即可。
快开学了,一想到回学校之后的网络环境,就不开心。在家连成绩都查不到。于是决定开学自己搭建一个VPN系统,用来在外访问校园网。 硬件工具当然就是NanoPiNEO了。之前已经装好了web服务器,想通过网页程序搞个简单的VPN。但实际测试了几个后,都达不到满意的效果。尤其是在访问知网的时候,经常出问题。想想算了,直接上VPN软件吧。本次环境采用SS(某科学上网工具,全名不说了,屏蔽的厉害)和frp搭建。frp是一个内网穿透工具,因为学校办公室没有公网,所以这个不可少。 以下指令全部基于dietpi系统,树莓派通用,这点还是比较好的,资料共享,不用来回折腾几个系统了。 先装SS,用的是libev版本的,下次试试别的版本: wget --no-check-certificate https://raw.githubusercontent.com/teddysun/shadowsocks_install/master/shadowsocks-libev-debian.sh chmod +x shadowsocks-libev-debian.sh ./shadowsocks-libev-debian.sh 2>&1 | tee shadowsocks-libev-debian.log 这次使用的是一个第三方的一键安装脚本,可能以后会失效。 (脚本中有的文件可能被墙,需要自己下好后放入文件夹。) 默认配置: 服务器端口:自己设定(如不设定,默认为 8989) 客户端端口:1080 密码:自己设定(如不设定,默认为teddysun.com) 出现enjoy it的时候就好了。 卸载方法: 使用 root 用户登录,运行以下命令: ./shadowsocks-libev-debian.sh uninstall 使用命令: 启动:/etc/init.d/shadowsocks start 停止:/etc/init.d/shadowsocks stop 重启:/etc/init.d/shadowsocks restart 查看状态:/etc/init.d/shadowsocks status /etc/shadowsocks-libev/config.json修改配置 本脚本安装完成后,已将 Shadowsocks-libev 加入开机自启动。 下面配置frp: 先看SS的配置: Your Server IP:0.0.0.0 Your Server Port:9000【这里修改】 Your Password:your_password Your Local IP:127.0.0.1 Your Local Port:1080【这里不用管】 Your Encryption Method:aes-256-cfb 然后在frpc.ini中添加一个TCP的转发规则: [TCP_mode] #注意修改上方[]内的内容,不要与其他隧道名称重复 privilege_mode = true type = tcp #remote_port外部端口,可映射TCP、UDP端口范围为:9000-65535(这个范围是我用的别人的frp服务器限制的,自己搭建的不会) remote_port = 9000【这个端口修改为上面的外部端口】 #local_ip本地服务IP local_ip = 127.0.0.1 #local_port本地服务端口 local_port = 9000【这个端口也改为上面同样的外部端口】 use_gzip = true use_encrypti #pool_count = 2 保存后覆盖原来的配置文件即可。 安装screen:apt-get install screen 重启一下,执行命令:screen -S frp 进入frp所在文件夹:cd /mnt/dietpi_userdata/frp 输入 ./frpc -c ./frpc.ini 开启frp即可。 之后关掉SSH后也能正常保持frp的开启状态。 要关闭,先执行screen -r frp后再Ctrl+C结束进程即可。 最后配置好SS的客户端,就可以使用了。关于怎么安装使用frp我会在自己买了服务器搭建的时候再写出来。
偶然发现了NanoPiNEO这么个开发板,被它小巧的身形吸引,果断入手了一个。PS:官方的散热片和壳都比较贵,不推荐购买。我自己是加了一个3.5的纯铜散热片和用之前树莓派坏掉的外壳DIY了一个。 下面开始上手。 首先是制作系统镜像卡,这里不推荐使用官方系统,除非是有特殊需求。推荐两个系统: Dietpi:下载http://dietpi.com/downloads/images/DietPi_NanoPiNEO-armv7-(Jessie).7z (基于debian的,我自己用的就是这个,下面的web服务器也是基于这个系统镜像的。) Armbian:下载https://www.armbian.com/nanopi-neo/(armbian提供两种镜像,一个是基于debian一个是基于Ubuntu) 烧写镜像,用的还是上次树莓派的那个工具。插卡,连网线(使用dietpi第一次必须联网,要初始化),连电源,开机。 使用SSH登录。dietpi默认用户名:root 密码:dietpi。armbian默认用户名:root 密码:1234。 有需要可以装个图形界面。方法如下: apt-get install xorg apt-get install lxde 最后startx即可 安装web服务器: sudo apt-get install lighttpd mysql-server php5-cgi php5-mysql sudo apt-get install php5-curl(这个是安装curl扩展的,使用代理服务时会用到) sudo apt-get install php5-gd(安装GD库,owncloud会用到) 修改php.ini配置 sudo nano /etc/php5/cgi/php.ini 将下列配置的;去掉,让CGI能取到SCRIPT_FILENAME变量值 ;cgi.fix_pathinfo = 1 修改lighttpd.conf sudo nano /etc/lighttpd/lighttpd.conf 在server.modules中增加fastcgi server.modules = ( "mod_access", "mod_alias", "mod_compress", # "mod_redirect", "mod_fastcgi", # "mod_rewrite", ) 最后添加 fastcgi.server = ( ".php" => (( "bin-path" => "/usr/bin/php5-cgi", "socket" => "/tmp/php.socket" ))) 重启lighttpd服务 sudo /etc/init.d/lighttpd restart 系统配置中可以安装ftppro,默认路径为/mnt/dietpi_userdata/ 同时开启对lighttpd的支持即可。 lighttpd基础指令: /etc/init.d/lighttpd stop /etc/init.d/lighttpd restart /etc/init.d/lighttpd status
vi的基本操作 a) 进入vi 在系统提示符号输入vi及文件名称后,就进入vi全屏幕编辑画面: $ vi myfile 不过有一点要特别注意,就是您进入vi之后,是处于「命令行模式(command mode)」,您要切换到「插入模式(Insert mode)」才能够输入文字。初次使用vi的人都会想先用上下左右键移动光标,结果电脑一直哔哔叫,把自己气个半死,所以进入vi后,先不要乱动,转换到「插入模式(Insert mode)」再说吧! b) 切换至插入模式(Insert mode)编辑文件 在「命令行模式(command mode)」下按一下字母「i」就可以进入「插入模式(Insert mode)」,这时候你就可以开始输入文字了。 c) Insert 的切换 您目前处于「插入模式(Insert mode)」,您就只能一直输入文字,如果您发现输错了字!想用光标键往回移动,将该字删除,就要先按一下「ESC」键转到「命令行模式(command mode)」再删除文字。 d) 退出vi及保存文件 在「命令行模式(command mode)」下,按一下「:」冒号键进入「Last line mode」,例如: : w filename (输入 「w filename」将文章以指定的文件名filename保存) : wq (输入「wq」,存盘并退出vi) : q! (输入q!, 不存盘强制退出vi) 3、命令行模式(command mode)功能键 1). 插入模式 按「i」切换进入插入模式「insert mode」,按“i”进入插入模式后是从光标当前位置开始输入文件; 按「a」进入插入模式后,是从目前光标所在位置的下一个位置开始输入文字; 按「o」进入插入模式后,是插入新的一行,从行首开始输入文字。 2). 从插入模式切换为命令行模式 按「ESC」键。 3). 移动光标 vi可以直接用键盘上的光标来上下左右移动,但正规的vi是用小写英文字母「h」、「j」、「k」、「l」,分别控制光标左、下、上、右移一格。 按「ctrl」+「b」:屏幕往“后”移动一页。 按「ctrl」+「f」:屏幕往“前”移动一页。 按「ctrl」+「u」:屏幕往“后”移动半页。 按「ctrl」+「d」:屏幕往“前”移动半页。 按数字「0」:移到文章的开头。 按「G」:移动到文章的最后。 按「$」:移动到光标所在行的“行尾”。 按「^」:移动到光标所在行的“行首” 按「w」:光标跳到下个字的开头 按「e」:光标跳到下个字的字尾 按「b」:光标回到上个字的开头 按「#l」:光标移到该行的第#个位置,如:5l,56l。 4). 删除文字 「x」:每按一次,删除光标所在位置的“后面”一个字符。 「#x」:例如,「6x」表示删除光标所在位置的“后面”6个字符。 「X」:大写的X,每按一次,删除光标所在位置的“前面”一个字符。 「#X」:例如,「20X」表示删除光标所在位置的“前面”20个字符。 「dd」:删除光标所在行。 「#dd」:从光标所在行开始删除#行 5). 复制 「yw」:将光标所在之处到字尾的字符复制到缓冲区中。 「#yw」:复制#个字到缓冲区 「yy」:复制光标所在行到缓冲区。 「#yy」:例如,「6yy」表示拷贝从光标所在的该行“往下数”6行文字。 「p」:将缓冲区内的字符贴到光标所在位置。注意:所有与“y”有关的复制命令都必须与“p”配合才能完成复制与粘贴功能。 6). 替换 「r」:替换光标所在处的字符。 「R」:替换光标所到之处的字符,直到按下「ESC」键为止。 7). 回复上一次操作 「u」:如果您误执行一个命令,可以马上按下「u」,回到上一个操作。按多次“u”可以执行多次回复。 8). 更改 「cw」:更改光标所在处的字到字尾处 「c#w」:例如,「c3w」表示更改3个字 9). 跳至指定的行 「ctrl」+「g」列出光标所在行的行号。 「#G」:例如,「15G」,表示移动光标至文章的第15行行首。 4、Last line mode下命令简介 在使用「last line mode」之前,请记住先按「ESC」键确定您已经处于「command mode」下后,再按「:」冒号即可进入「last line mode」。 A) 列出行号 「set nu」:输入「set nu」后,会在文件中的每一行前面列出行号。 B) 跳到文件中的某一行 「#」:「#」号表示一个数字,在冒号后输入一个数字,再按回车键就会跳到该行了,如输入数字15,再回车,就会跳到文章的第15行。 C) 查找字符 「/关键字」:先按「/」键,再输入您想寻找的字符,如果第一次找的关键字不是您想要的,可以一直按「n」会往后寻找到您要的关键字为止。 「?关键字」:先按「?」键,再输入您想寻找的字符,如果第一次找的关键字不是您想要的,可以一直按「n」会往前寻找到您要的关键字为止。 D) 保存文件 「w」:在冒号输入字母「w」就可以将文件保存起来。 E) 离开vi 「q」:按「q」就是退出,如果无法离开vi,可以在「q」后跟一个「!」强制离开vi。 「qw」:一般建议离开时,搭配「w」一起使用,这样在退出的时候还可以保存文件。 5、vi命令列表 1、下表列出命令模式下的一些键的功能: h 左移光标一个字符 l 右移光标一个字符 k 光标上移一行 j 光标下移一行 ^ 光标移动至行首 0 数字“0”,光标移至文章的开头 G 光标移至文章的最后 $ 光标移动至行尾 Ctrl+f 向前翻屏 Ctrl+b 向后翻屏 Ctrl+d 向前翻半屏 Ctrl+u 向后翻半屏 i 在光标位置前插入字符 a 在光标所在位置的后一个字符开始增加 o 插入新的一行,从行首开始输入 ESC 从输入状态退至命令状态 x 删除光标后面的字符 #x 删除光标后的#个字符 X (大写X),删除光标前面的字符 #X 删除光标前面的#个字符 dd 删除光标所在的行 #dd 删除从光标所在行数的#行 yw 复制光标所在位置的一个字 #yw 复制光标所在位置的#个字 yy 复制光标所在位置的一行 #yy 复制从光标所在行数的#行 p 粘贴 u 取消操作 cw 更改光标所在位置的一个字 #cw 更改光标所在位置的#个字 2、下表列出行命令模式下的一些指令 w filename 储存正在编辑的文件为filename wq filename 储存正在编辑的文件为filename,并退出vi q! 放弃所有修改,退出vi set nu 显示行号 /或? 查找,在/后输入要查找的内容 n 与/或?一起使用,如果查找的内容不是想要找的关键字,按n或向后(与/联用)或向前(与?联用)继续查找,直到找到为止。 对于第一次用vi,有几点注意要提醒一下: 1、用vi打开文件后,是处于「命令行模式(command mode)」,您要切换到「插入模式(Insert mode)」才能够输入文字。切换方法:在「命令行模式(command mode)」下按一下字母「i」就可以进入「插入模式(Insert mode)」,这时候你就可以开始输入文字了。 2、编辑好后,需从插入模式切换为命令行模式才能对文件进行保存,切换方法:按「ESC」键。 3、保存并退出文件:在命令模式下输入:wq即可!(别忘了wq前面的:)