2023年3月

vi ? vim?

vi是一种计算机文本编辑器,由美国计算机科学家比尔·乔伊(Bill Joy)完成编写,并于1976年以BSD协议授权发布。

vi是“Visual”的不正规的缩写,来源于另外一个文本编辑器ex)的命令visual。

vi是一种模式编辑器。不同的按钮和键击可以更改不同的“模式”。在“插入模式”下,输入的文本会直接被插入到文档;当按下“退出键”,“插入模式”就会更改为“命令模式”,并且光标的移动和功能的编辑都由字母来响应,例如:“j”用来移动光标到下一行;“k”用来移动光标到上一行,“x”可以删除当前光标处的字符,“i”可以返回到“插入模式”(也可以使用方向键)。在“命令模式”下,敲入的键(字母)并不会插入到文档,这给新接触vi的用户带来混乱。

在“命令模式”下,多重文本编辑操作是由一组键(字母)来执行,而不是同时按下和其他特殊键来完成。更多复杂的编辑操作可以使用多重功能基元的组合,比如说“dw”用来删除一个单词,“c2fa”可以更改当前的光标处中“a”之前的文本。这就是说:对于熟练的vi用户可以更快的操作,因为双手就可以不必离开键盘。

早期的版本中,vi并没有指示出当前的模式,用户必须按下“退出键”来确认编辑器返回“命令模式”(会有声音提示)。当前的vi版本可以在“状态条”中(或用图形显示)。最新的版本中,用户可以在“终端”中设置并使用除主键盘以外的其他键,例如:PgUp,PgDn,Home,End和Del键。图形化界面的vi(如gvim)可以很好的支持鼠标和菜单。

直到Emacs的出现(1984年以后),vi几乎是所有“黑客”所使用的标准UNIX编辑器。从2006年开始,作为“单一UNIX规范”(Single UNIX Specification)的一部分,vi或vi的一种变形版本一定会在UNIX中找到。

直到现在,vi仍然被广泛的使用,并且赢得1991年在USENET的票选;vi比Emacs的Bulkier版本启动的更快,并且占内存更少。因此,甚至Emacs的追随者又重新使用vi,并且作为邮件编辑器和其他小型编辑工作的首选。1999年时,著名的欧莱礼出版社(O'reilly)卖出了比emacs更多的vi参考书。

当救急软盘作为恢复硬盘崩溃的介质以来,vi通常被用户选择,因为一张软盘正好存储下vi,并且几乎所有人都可以很轻松的使用vi。

编辑器的大战中,vi和Emacs是作战的双方。

Emacs???

Emacs/ˈiːmæks/,源自Editor MACroS编辑器),是一个文本编辑器家族,具有强大的可扩展性,在程序员和其他以技术工作为主的计算机用户中广受欢迎。最初由Richard Stallman于1975年在MIT协同盖伊·史提尔二世共同完成。这一创意的灵感来源于TECO宏编辑器TECMAC和TMACS,它们是由盖伊·史提尔二世Dave MoonRichard Greenblatt&action=edit&redlink=1)、Charles Frankston等人编写的宏文本编辑器。

自诞生以来,Emacs演化出了众多分支,其中使用最广泛的两种分别是:1984年由理查·斯托曼发起并由他维护至2008年的GNU Emacs,以及1991年发起的XEmacs。XEmacs是GNU Emacs的分支,至今仍保持着相当的兼容性。它们都使用了Emacs Lisp这种有着极强扩展性的编程语言,从而实现了包括编程编译乃至网络浏览等等功能的扩展。

Unix文化里,Emacs是黑客们关于编辑器之战的两大主角之一,它的对手是viVim)。

Emacs不仅仅是一个编辑器,它是一个集成环境,或可称它为集成开发环境,这些功能如让用户置身于全功能的操作系统中。Emacs可以:

  • 收发电子邮件、上新闻组(Gnus)
  • 无缝直接编辑远程文件(Tramp)
  • 通过Telnet登录远程主机
  • 操作壳层(M-x EShell,Term)
  • 结合git, mercurial等版本控制系统并直接操作(Magit,VC)
  • 上Twitter(Twittering-mode)
  • 登陆IRC和朋友交流(M-x ERC,rcirc)
  • 电子数据表
  • 模拟其他编辑器,如vi(Evil-mode)、WordStar、EDT、TPU等
  • 编辑Wiki (Wikipedia-mode)
  • 对多种编程语言编辑,如C/C++、PerlPythonLisp等等
  • 调试程序,结合GDB,EDebug等。
  • 玩游戏
  • 计算器
  • 心理咨询(M-x doctor)
  • 煮咖啡
  • 记笔记、日记(Org-mode)
  • 管理日程,Task,待办事项(ToDo),约会等GTD(Org-mode)
  • 写作与出版(Org-mode,Muse-mode)
  • 目录管理(Dired)
  • 文件比较、合并(Ediff)
  • 阅读info和man文档(M-x info,woman)
  • 浏览网站(M-x eww)
  • 为各种程序(TeXLaTeX等)提供统一的操作界面

总结

煮不了咖啡的编辑器不是一个好用的浏览器 :joy:

回归正题

vim 是 vi 的拓展,Vim(Vi IMproved) 是一种升级版,是vi的派生物之一,其他还有Elvis ,Vigor。

Vim的第一个版本由布莱姆·米勒在1991年发布。最初的简称是Vi IMitation,随着功能的不断增加,正式名称改成了Vi IMproved。现在是在开放源代码方式下发行的自由软件

一个现实的开源协议,

目前,VIM是按照VIM许可证发布的开源软件,这个协议兼容GPL[4]。它的协议中包含一些慈善条款,建议用户向荷兰ICCF捐款,用于帮助乌干达艾滋病患者。VIM启动时会显示「Help poor children in Uganda!」的字样,在中文版本中则是「请帮助乌干达的可怜孩童![5]

vim 开机界面

学习曲线

我一开是接触这个是从解决git的冲突说起,pull代码进入这种状态,非常无厘头:monkey_face::first_quarter_moon_with_face:,各种退出ssh然后处理。

后来发现 命令行里竟然藏着一个编辑器。感谢度娘:japanese_ogre:

其实这里面藏着很多东西 ,需要我们去发现。

许多unix系统 执行命令vimtutor 或者Windows在vim软件中看vim教学图标即可。

可在vim中输入:help user-manual

试了下那个命令在centos迷你版里都没有

还是靠搜

vim 是一种模式编辑器 下面简单罗列一些

  • 普通模式 用户启动后的默认模式 一些快捷方法

    • i 、a、o 均可进入插入模式
    • esc 插入模式退出到 普通模式
    • cw 删除一个单词
    • c$ 从当前焦点 删除一行到行尾
    • c^ 删除到行头
    • dd 删除一行
    • ...
  • 插入模式

    • 编辑文本时 都处在这个模式
  • 命令行模式

    • 普通模式输入 : 就可进入命令行模式
    • :w filename 指定文件名保存
    • :wq 保存并退出 :wq! 感叹号 表示强制操作 q! 表示强制退出 不保存
    • :set number 显示行号
    • 替换

      • :s/old/new - 用new替换当前行第一个old。
      • :s/old/new/g - 用new替换当前行所有的old。
      • :n1,n2s/old/new/g - 用new替换文件n1行到n2行所有的old。
      • :%s/old/new/g - 用new替换文件中所有的old。
      • :%s/^/xxx/g - 在每一行的行首插入xxx,^表示行首。
      • :%s/$/xxx/g - 在每一行的行尾插入xxx,$表示行尾。
    • 搜索关键词 例如修改某个配置文件,

      • :/searchword 在后面的文本找
      • :/searchword 向前查找
      • /pattern/+number: 将光标停在包含pattern的行后面第number行上。
      • /pattern/-number: 将光标停在包含pattern的行前面第number行上。
      • n: 向后查找下一个。
      • N: 向前查找下一个。
      • 可以用grep或vimgrep查找一个模式都在哪些地方出现过,

        其中:grep是调用外部的grep程序,而:vimgrep是vim自己的查找算法。

        用法为: :vim[grep]/pattern/[g] [j] files

        g的含义是如果一个模式在一行中多次出现,则这一行也在结果中多次出现。

        j的含义是grep结束后,结果停在第j项,默认是停在第一项。

        vimgrep前面可以加数字限定搜索结果的上限,如

        :1vim/pattern/ % 只查找那个模式在本文件中的第一个出现。

   

  其实vimgrep在读纯文本电子书时特别有用,可以生成导航的目录。

  比如电子书中每一节的标题形式为:n. xxxx。你就可以这样:

  :vim/^d{1,}./ %

  然后用:cw或:copen查看结果,可以用C-w H把quickfix窗口移到左侧,

  就更像个目录了。

  

可以打开多个文件

vi a.txt b.txt c.txt

  • 使用:next(:n)编辑下一个文件。
  • :2n 编辑下2个文件。
  • 使用:previous或:N编辑上一个文件。
  • 使用:wnext,保存当前文件,并编辑下一个文件。
  • 使用:wprevious,保存当前文件,并编辑上一个文件。
  • 使用:args 显示文件列表。
  • :n filenames或:args filenames 指定新的文件列表。
  • vi -o filenames 在水平分割的多个窗口中编辑多个文件。
  • vi -O filenames 在垂直分割的多个窗口中编辑多个文件。

  • 文件比较

    可以逐行的对文本文件进行比较。Vim可以并排显示两个版本的文件,同时以各种各样的颜色来表示有差别部分。改变过、新增的或者是被删除的行会以颜色高亮来强调,没有改变过的部分则会被自动折叠表示。

    对于已经在vim中打开的两个缓冲区,分别使用:diffthis之后将会对这两个缓冲区的内容进行比较,被比较的缓冲区可以是一个尚未存盘的内存中的缓冲区。

    在比较两个文件的不同之处时,可以用:diffget和:diffput命令对每一处不同进行双向的同步,也可以在比较不同时对内容进行其它编辑,然后用:diffupdate对最新内容重新进行比较。

    在浏览两个文件的不同之处时,可以用[c和]c两个Normal模式的命令直接跳转到上一个和下一个不同之处。

    可以通过diffopt等选项更精细地控制哪些区别被认为是真正的不同之处,比如可以设置比较时忽略空白字符数量的不同。

    Unix下可以用vimdiff命令来使用这个功能。

不足之处

  • 大文件读取速度很慢(可在vim.org下载并安装名为LargeFile的Script来优化)LargeFile
  • 即使文件不大,如果有非常长的行的话,处理也会变慢(同上)
  • vim自己的脚本语言处理速度不快,若是安插过多脚本包,引导速度会变慢。
  • 存在类似Ctrl-1等不能被映射的键(限于某些字符终端的性能)

Linux sed 和 awk 的用法

sed

sed [-nefri] [操作]        

常用选项:

  • -n∶使用安静(silent)模式。在一般 sed 的用法中,所有来自 STDIN的资料一般都会被列出到萤幕上。但如果加上 -n 参数后,则只有经过sed 特殊处理的那一行(或者动作)才会被列出来。
  • -e∶直接在指令列模式上进行 sed 的动作编辑;
  • -f∶直接将 sed 的动作写在一个档案内, -f filename 则可以执行 filename 内的sed 动作;
  • -r∶sed 的动作支援的是延伸型正规表示法的语法。(预设是基础正规表示法语法)
  • -i∶直接修改读取的档案内容,而不是由萤幕输出。

常用命令:

  • a ∶新增, a 的后面可以接字串,而这些字串会在新的一行出现(目前的下一行)~
  • c ∶取代, c 的后面可以接字串,这些字串可以取代 n1,n2 之间的行!
  • d ∶删除,因为是删除啊,所以 d 后面通常不接任何咚咚;
  • i ∶插入, i 的后面可以接字串,而这些字串会在新的一行出现(目前的上一行);
  • p ∶列印,亦即将某个选择的资料印出。通常 p 会与参数 sed -n 一起运作~
  • s ∶取代,可以直接进行取代的工作哩!通常这个 s 的动作可以搭配正规表示法!例如 1,20s/old/new/g 就是啦!

范例: 将/etc/passwd 中内容打印 并 显示行号,同时删除2~5行
nl /etc/passwd | sed '2,5d' d 是 删除操作

若要删除到最后一行 则是 nl /etc/passwd | sed '2,$d'

若是 要在第二行 后添加 nl /etc/passwd | sed '2a drink tea' 2: 行号 a: 添加

nl /etc/passwd | sed '2i drink tea' 在第二行 前插入 drink tea

整行替换 nl /etc/passwd | sed '2,5c drink tea' 第二行至第五行 替换为 drink tea

列出 10~20行 head -n 20 | tail -n 10 可用sed替换 nl /etc/passwd | sed '2,5p' 2~5行重复。 使用 -n 安静模式 nl /etc/passwd | sed -n '2,5p'

sed 还可以以行为单位进行部分数据查找替换 sed 's/要被替换字符/新的字符/g'

筛选IP: ip addr | grep 'scope host lo' | sed 's/inet //g' | sed 's/\/.*//g

危险操作 直接修改文件

    
    nl /etc/passwd > test.txt  # 将数据重定向到test.txt
    sed -i '$a drink tea' test.txt # 在 test.txt 文件后追加文本

awk 好用的数据处理工具(简单用法)

awk 是一个非常棒的数据处理工具,相较于sed常常作用于一整行的操作,awk比较倾向于一行当中分成数个字段来处理。 ---by 鸟哥

awk 通常运行模式是 awk '条件类型1 {操作1} 条件类型2{操作2}...' filename

awk 主要是处理每一行的字段内的数据,而默认的字段分隔符为空格键或TAB键。

    last -n 5 # 取出前5行

读取出ip 账户名

    last -n 5 | awk '{print $1 "\t" $3}'

在awk 的括号内,每一行的每个字段都是由变量名称,那就是$1,$2等变量名称。
$0 代表【一整列数据】 即全部数据

awk 的内置变量

变量名称代表意义
NF每一行$0 所拥有的总字段数
NR目前awk 所处理的第几行数据*
FS目前的分割字符,默认是空格键。

awk 所有操作是单引号 ' 括住的

    last -n t | awk '{print $1 "\t lines: " NR "\t columns: " NF}'

awk 逻辑运算字符

运算单元代表意义
>大于
<小于
>=大于等于
<=小于等于
==等于
!=不等于
假设 要查看/etc/passwd 第三栏小于10一下的数据 并且仅列出账号与第三列
    cat /etc/passwd | awk '{FS=":"} $3 < 10 {print $1 "\t " $3}' # 除第一行外都成功
    cat /etc/passwd | awk 'BEGIN {FS=":"} $3 < 10 {print $1 "\t " $3}' # 使用BEGIN 关键词, 还有END关键词。
awk 还可以帮助我们完成循环计算 这里不多赘述。

awk 高级用法讲述

单品促销后台原型设计:
  在我们做“单品促销”后台原型设计前,需要考虑清楚都设计哪些信息字段。那思考后,我们可以把创建一个单品促销活动分为两部分,一部分是基本信息录入,一部分是依据不同的活动类型,显示不同的配置项。

可抽象出模型为:

  2. 如模型所示,要想创建一个活动,基本信息录入需考虑

  1)活动的类型:选择是买赠、限时购、特价、预售等哪一种活动类型

  2)活动时间:活动的开始和结束时间。这块需注意的点是产品站需不需要提前做预热

  3)活动名称:考虑名称的字数上限,怎么取名称既能说明白又对用户很有购买吸引力

  4)用户组设置:这可以考虑设置下,此次活动是针对全部用户,还是会员用户,还是某部分带有特殊属性的用户

  5)商品范围设置:此项是指选择哪些商品参与此项活动

引用

说说电商平台9大促销方式的设计原理