vim拓展学习:实现vim内快速打开浏览器显示html效果

目的:在ubuntu上用vim编写html,并且在vim中可以用快捷键在浏览器firefox中打开.html文件直接观察效果。

实现这个功能其实非常简单 但涉及到的知识每一块都可以展开很大篇幅 官方文档对每部分都给出详细的解释 利用这些知识可以实现远远大于本篇文章目的的功能

这些知识十分有趣 而且闲暇时间利用这些知识自己写vim插件、搭建vim编程环境、将一个友好的编程工具打造成效率武器、感受一个如同IDE般强大自带编程语言的编辑器,都是一件非常有趣、培养学习能力的事情。

本文章会根据后续需求(比如想自己做插件等等)继续补充。

本篇文章的本质目的是只是为了让作者看懂(用于记笔记),故存在部分内容省略、简写的情况。如果里面有你感兴趣的内容,欢迎讨论。

阅前须知

  • 你需要
    • Linux(Ubuntu)
    • vim
    • 了解vim基本用法和常用操作(部分内容可以在我的其它文章中找到)
  • 本章涉及的内容
    • vim键盘映射
    • vim自动命令
    • vimscript编程
    • 其它内容相关
  • 由于时间关系,下述内容各个模块只记录了一部分。这些知识不仅能保证完成本章任务,还能实现更多功能,并且是编写vim plugin的基础。实际上每个模块的内容都远远多于本篇文章。

实现方法

1. 打开.vimrc
2. 写入下述代码

noremap <F9>: call DisplayHTML()<CR>
"vim键盘映射+vimscript函数调用

function DisplayHTML()"vimscript函数定义
  if &filetype == 'html'"vimscript条件判断
    execute 'w'"vimscript执行表达式
    execute '!firefox % &'
  endif
endfunction

3. 上述代码详解都可以在下面的内容中找到

.vimrc文件

  • 要让 Vim 用你习惯的设置启动,你可以 把这些设置写到一个叫 vimrc 的文件中。Vim 会在启动的时候执行这个文件里的命令。
  • :edit $MYVIMRC:编辑.vimrc文件
  • ubuntu中推荐使用~/.vimrc

vim键盘映射

下述非代表最后一行模式的指令的前导冒号都省略 将下述指令写到.vimrc文件中

  • :map <x> ...:定义普通模式映射 将按键x映射为…

在这里插入图片描述
操作符等待模式是当你键入一个操作符 (比如 “d” 或 “y”) 之后,Vim 期待你键入一个
动作命令或者文本对象时的状态。比如,当你键入命令 “dw”, 那个 “w” 就是在操作符 等待模式下键入的。

  • Example: :map <F5> i{<Esc>ea}<Esc>
  • 摁下F5映射为 i插入{,退出插入模式,e移到单词尾,a追加插入},退出插入模式
  • Example2: :map \p i(<Esc>ea)<Esc>,先敲入\再敲入p,即可组成一个指令
  • :map:不带参数 查看当前映射表
    在这里插入图片描述

n:normal mode, v:insert mode.

  • noremap <x> ...:只允许<x>映射到...,不允许...往后继续映射
  • 在这里插入图片描述
  • map <x> :...<CR>:将摁键<x>映射为在命令行模式输入…
  • 删除映射
  • 在这里插入图片描述
  • 删除全体映射::mapclear
  • 映射空格::map <Space> x

vim自动命令

自动命令大多数都产生在最后一行模式下

  • :autocmd [group] {events} {file_pattern} [nested] {command}
    • 可在官方文档中查阅到各个部分的详述
    • {events}:事件出发列表,相应的事件发生会出发该自动命令
    • {file_pattern}:只有vim在该列表中指定的文件时,命令才有可能被触发
    • []:可选项,{}:必须项。参考正则表达式
  • Example: :autocmd BufReadPost *.gsm set filetype=asm
  • 触发该自动命令的事件是BufReadPost,表示该自动命令在一个文件被掉入缓冲区读写被触发。而这样的文件只有.gsm文件才有效。成功触发后将执行set filetype=asm
  • 在这里插入图片描述

Don’t give a shit on modelines

  • {filetype}对文件名的匹配基本和正则表达式类似
  • 在这里插入图片描述
  • 批量删除命令:autocmd! FileWritePre *:批量删除由FileWritePre事件trigger,且对所有文件都有效的命令
  • :autocmd:显示当前所有autocmd
  • 在这里插入图片描述
  • [group]:可选项,分组,便于批量管理命令
  • 在这里插入图片描述
  • [nested]
    *在这里插入图片描述
  • 普通模式的antocmd
  • 在这里插入图片描述
  • 在这里插入图片描述
  • execute:执行最后一行模式下的指令,一般用在执行在normal模式下的指令
  • 忽略autocmd的触发
  • 在这里插入图片描述

vimscript编程

难点1:vimscript中的regex匹配

  • 赋值
  • let i = 3 "let不能少 否则无法赋值
  • 循环
while {conditions}
  ...
endwhile

while i < 5
  echo i
  let i+=1
endwhile

for i in range(1,4)
  ...
endfor
"range({start}, {end}, [step])

for line in getline(1,20)"获取缓冲区内的120{command}
endfor
  • 条件控制
if {condition}
  ...
elseif {condition}
  ...
else
  ...
endif
  • 显示
let i = 3
echo "Test" i
"显示 Test 3
echo 0x17
"显示 23
echon a
"不输出换行符
  • 变量

变量名都是全局变量 和其它vim脚本文件公用

:let 显示当前所有文件的全局变量
let s:variable_name = x
"定义一个仅当前文件可用的局部变量
:unlet variable_name 删除一个变量

a:variable_name 函数参数

在这里插入图片描述

vim将文件从磁盘内提取到缓冲区中,在缓冲区对文件进行读写,可以打开多个窗口,一个窗口可以是一个或多个缓冲区,多个窗口也可以是一个或多个缓冲区。读写完成后进行保存,将缓冲区内容写入文件

  • 数值表示
0x 0X 十六进制
0b 0B 二进制
0 八进制
  • 单引号与双引号
let i="test"
" i=test
let i='"test"'
" i="test"
单引号使所有单引号内部的内容(包括 \t \n 等特殊字符)保持原样
  • 表达式
$name:环境变量
$name:选项
@r:寄存器

选项?

  • 字符串正则表达式匹配
a=~b "b是正则表达式 一般用单引号扩住 否则会被regex常见的单斜杠影响 若a包含与b匹配的串则返回1 否则返回0
a=!~b "与上述相反 即不匹配
  • 执行表达式
exec(or execute) "command" "执行冒号模式下的指令
exec "normal command" "执行普通模式下的指令
let i="command"
exec i
  • 函数定义与调用
function Min(a, b)
  return a:a < a:b ?a:a :a:b
endfunction
"自定义函数名最好首字母大写 避免和预定义函数名混淆
"a:variable_name 表示该variable是个函数参数 

function! Min(a,b)
"表示对函数重写

function Min(a,...) "可变参数 总计最多20个参数
  echo a:000 "可变实参列表
  echo a:0 "可变实参个数
  echo a:i "第i个可变参数
  
call func()
let a=func()"获取返回值

:function "查看所有函数
:function func_name "查看func_name定义内容
:delfunction func_name "删除函数func_name
  • 列表
let lista=['a','b','c']
let listb=[]"empty list
call add(listb, 'd')"listb=['d']
call extend(listb, ['a', 'b'])"listb=['d', 'a', 'b']
"注意 这里add和extend的效果不同 如果上述extend语句换成add 会将扩展的新list
"看作原列表的一个新的元素
call add(listb, ['a', 'b'])"listb=['d', ['a', 'b']]

let list=lista+listb"列表连接
echo list[0]"列表第0个元素
for n in list"列表迭代
  echo n
endfor

echo sort(list)
  • 字典
let dicta={'1':'one', '2':'two'}
let dictb={}
let dicta[3]='three'"增添与更改
"dicta={'1':'one', '2':'two', 3:'three'}
echo dict['1']

vim键盘映射+vimscript 案例

"目的:在vim中运行vimscript检验成果
"source:运行一个文件
"前提:chmod 744 {filename} 给予文件可执行的权限
map <F5> call ComplieRun()<CR>
" 将摁键<F5>映射到call一个函数然后敲击回车

func! ComplieRun()
if &filetype == 'vim' "判断当前的filetype
  exec 'w| source %' "在最后一行中执行串行指令 先从buffer写入file再运行该文件
endif

一些常见的特殊摁键

  • <CR>:回车符
  • <Space>:空格
  • <C-x>:ctrl-x

一些常见的通配符

  • %:当前文件

tips:

  • \:可用于分割较长的命令(用在.vimrc中,不可用在command line中)
  • !{command}:调用外部应用程序执行相关操作
  • 编写完脚本文件后,要用chmod xxx test.vim给脚本文件赋予执行权限,一般xxx = 744
  • if "true"
    "返回值为false(0) vim将所有不以数字开始的字符串视为false
    <Esc> 在字符串中使用这样的字符串会被视作特殊摁键<Esc>
  • 'a'.'b':输出ab,.是字符串链接运算符
  • eval("variable_name") 获取变量或表达式variable_name的值
  • 2
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值