Vim 读写文件详解

回忆上节课内容🤔

打开文件

  • 我们一般打开文件的方法是在 shell 里面
    • vi oeasy.txt
  • 如果我们直接进入了vi还可以再打开文件吗?
    • 可以!
    • :e oeasy.txt
    • 就可以打开oeasy.txt
    • e意味着edit
  • 不清楚的话
    • 可以:h :e看到手册!

图片描述

  • 如果我们不知道要打开文件的名字
    • 可以执行:!ls看到相应的名字
  • 可以打开目录么?
  • 试试!👊

打开目录

  • 直接 :e .
  • 可以打开当前目录
    • . 代表当前目录
    • :pwd 可以看到当前目录
    • 就是运行 vi 的目录
  • 上下方向键选择我们需要编辑的文件
  • 然后回车开始编辑这个文件

图片描述

netrw插件

图片描述

netrw插件

  • 右上角看到插件名称和版本
    • netrew
    • v165
  • :h netrw

图片描述

常用命令

图片描述

  • - 向上一层
  • D Delete
  • R Rename
  • s sort 切换模式
  • x 特殊 在File Manager中打开

执行命令

  • 有些命令没有快捷键
  • 新建文件夹
    • !mkdir oeasy
  • 新建文件
    • e oeasy.rs
  • 已经打开了一个缓存文件 oeasy.txt
  • 我们可以用 :r 把别的文件读取进来进行读取
    • 比如有个 oeasy.css 在当前目录下
    • 我们可以 :r ~/.vimrc
  • :h :r
    • 查询r命令的帮助手册
    • 手册告诉我们r意味着read

在指定位置读取文件

  • 这样是插入整个文件,当然也可以指定位置
    • :9r oeasy.css 就是在第9行下面插入完整的 oeasy.css
  • 还可以把命令的结果读取当前文件 :r !ls
    • 这会让 !ls 的输出结果流到当前行之下
    • 复杂的也可以 :r !ls -lah
    • 也可以控制range
      • :29r !ls -lah
  • 这样可以把文件当做输出来用
    • r !echo $PATH
    • r !cowsay oeasy
    • r !cat /proc/net/tcp
  • 但是我只想要oeasy.css的2-4行怎么办?

控制读取范围

  • 读取的范围可以用sed命令来控制
  • 我们来试一下
  • :!sed -n 1,3p oeasy.css
    • 只读取oeasy.css的前三行
  • 然后我们可以把这个结果 read 进入到当前文件中
  • :r !sed -n 1,3p oeasy.css
    • 可以把oeasy.css前三行读取到当前行之下
  • :15r !sed -n 1,3p oeasy.css
    • 可以把oeasy.css前三行读取到15行之下

使用管道

  • :!ls -lah | sed -n 4,9p
    • 显示ls查询结果的4-9行
  • :r !ls -lah | sed -n 4,9p
    • 把ls查询结果的4-9行重定向到当前文件的当前行下方
  • :9r !ls -lah | sed -n 4,9p
    • 把ls查询结果的4-9行重定向到当前文件第9行下方

固定列宽

  • :h gq

图片描述

具体控制

#先更新源
sudo apt update
#fortune可以输出谚语 在<linux>教程那部分有介绍
sudo apt install fortune 
#使用fortune生成谚语
fortune -l
#进入vi
  • :r !fortune -l

图片描述

  • :set nopaste
  • :set textwidth=30
    • 控制文字宽度为30
  • gq3k
    • gq 控制宽度
    • 3k 是 {motion}
    • 指的是本行和上面三行

运行结果

  • gq3j
    • gq 控制宽度
    • 3j 是 {motion}
    • 指的是本行和上面三行
  • 也可以用gq3回车

图片描述

  • 注意如果是在vi -u NONE的情况下
    • gq3j是可以用的
    • gq3回车也可以通用
    • motion但是超越了文档的范围也会报错
  • 从这一点来说
    • vim 确实是很好地完善了vi
  • 不过我又想问了
    • 那可以再次改变宽度么?

改变宽度

  • :set textwidth=50
  • gq8k

图片描述

使用管道

#先安软件 fortune、boxes、lolcat  在<linux>教程那部分有介绍
sudo apt install fortune boxes catlol
#使用fortune生成谚语
fortune -l
#把谚语通过管道送入boxes
fortune -l | boxes -d cat
#改成彩色
fortune -l | boxes -d cat | lolcat
#进入vi
:r !fortune -l | boxes -d cat

图片描述

扩展命令区

  • 可以设置:set cmdheight=3增大命令区高度

图片描述

  • 确实可以增加命令区高度
  • 不过,这并不能从根本上解决问题
  • 回忆一下
    • 正常模式下可以使用 Q 进入Ex命令行模式
      • 然后:visual切换回来
    • 或者正常模式下q:进入搜索命令的模式
      • 搜到后,修改好,回车执行

写文件

  • 我们先查:h :w
    • :w 意味着 write
    • :w o3z.txt 把当前文件内容写到 o3z.txt
  • 加上{range}
    • :3,8w o3z.txt把第3到第8行写到 o3z.txt
  • 如果o3z.txt不存在怎么办?
    • :w! o3z 先建立文件再写入
    • 强制写
    • 但是如果已经存在的文件会造成覆盖
  • 想要追加append应该如何
    • :w >> o3z.txt 把内容追加写入到 o3z.txt

面对崩溃

  • vi oeasy.txt
    • 写上一些东西
    • 然后等一小段时间
    • 并不保存
  • 新开一个终端
    • ls -a .oeasy.txt.*
    • 发现已存了一个.oeasy.txt.swp
  • 把原来的终端关上
    • 相当于原来的终端崩溃了
    • 因为第一个终端没有保存文件
    • oeasy.txt不存在
  • vi oeasy.txt
    • 会提醒我虽然没有oeasy.txt
    • 但是替换文件swp是有的
    • 刚才没存到文件的东西
    • 这样可以恢复
  • vi -R oeasy.txt
    • 这样可以恢复

多人编辑

  • 一个终端打开并编辑oeasy.txt
  • 另一个终端也想打开并编辑oeasy.txt
  • 这个时候有一些细节

图片描述

  • 建议
    • 观察两个文件的时间
    • 用较新的文件
    • 应避免类似的情形
  • 如果需要同时写一个文件
    • 建议用 git之类的 版本控制工具

总结

  • 我们这次研究了文件读写
  • 打开是e,edit
    • :e oeasy.txt
    • :e .
  • 读是:r,read
    • :1,3r o2z.txt 范围读
    • :4,9r !ls -lah 读shell命令运行结果
  • 写是:w,write
    • :w o3z.txt 直接写
    • :3,8w o3z.txt 范围写
    • :w o3z.txt >> 追加写
    • :w! o3z 强制写
  • 命令行可以进行批量替换么?🤔
  • 下次再说 👋

教程来源于Github,感谢overmind1980大佬的无私奉献,致敬!

技术教程推荐

左耳听风 -〔陈皓〕

苏杰的产品创新课 -〔苏杰〕

移动端自动化测试实战 -〔思寒〕

说透敏捷 -〔宋宁〕

检索技术核心20讲 -〔陈东〕

乔新亮的CTO成长复盘 -〔乔新亮〕

爆款文案修炼手册 -〔乐剑峰〕

Redis源码剖析与实战 -〔蒋德钧〕

手把手带你写一个 MiniTomcat -〔郭屹〕