Folders and files
| Name | Name | Last commit date | ||
|---|---|---|---|---|
Repository files navigation
set vim: ft=help
see the vim info
vim --version
golang vim 补全
需要设置 gocode
gocode set
文件树架构
1.首先vim执行plugin 中的所有脚本,主要是定义一些全局变量,和函数。
2.在到ftplugin中执行匹配文件类型的脚本,
3.在indent/中设置相关的缩进
4.执行.vimrc
最佳实践
---------------------------------
* 把每天都要重复的按键映射为key * 把CapsLock 和esc交换
ubuntu 自带的改建软件就可以改, vim无法表示CapsLock
* 在指定位置插入字符
k e.G. sdsadb sdsooo 变为 sds_adb sds_ooo
* gi
effect edit jump to last edited point and enter insert-mode
Qus.
-----------------------------
1. 如何比较转义字符
察看按键的表示 h keycode
1 read
2 autocmd 自动命令
3 source 读取一个文件中的Ex命令
4 autocmd-events
在一个文件中设定vim 设置
-------------------------------
set vim: opt1=val1:opt2=val2[:....]
"specal words
<BS> 删除光标前的字符
<Del> 删除光标后的字符
"自动补全
words
set complete+=k " scan the files given with the 'dictionary' option
C-P: previous-match
C-N: next-match
C-X C-F match in file-name
complet 定制补全策略
* message
echom
EE 把Ex命令输出到文本中
insert 模式下C-r: 可以输出最近一次的Ex命令
从 normal进入 Ex模式 Q
离开 :vi
EE
vtx 从光标位置开始选中直到字母x
dtx
EE C-r =
0
1
2
3
4
kkk
EE :reg 输出寄存器内容
"2p 粘贴2这个reg中的内容
VIMScript Programming
=============================================
vimscript 是一种动态强类型脚本语言
vimscript 中所有的语句都一\n 结尾
如果要使用多行用使用反斜杠
通过使用| 可以把多个exp放到一行中
变量 {{{
------------------------------------
+ 变量赋值
使用 *let* 关键字来进行变量赋值
let name = value
想要察看当前定义的所有变量 使用 :let 命令
+ 删除变量
使用 *unlet* 关键字来删除变量
unlet var
使用 unlet! var 删除变量时如果变量不存在不会报错
e.g. 删除所有的s:变量 >
for k in keys(s:)
unlet s:[k]
endfor
>
+ 变量类型
* string
对可以转化成int的转换为int “123” 其他的为0
slicing
str[begin: last]
* list: 使用方括号包围的有序列表 index 从0开始
e.g. let li = [1,2,3,4]
li[index] index 可以是负数 -1 = last-element
slicing
li[begin : last]
concatenation
list1 + list2
list-functions
add(list, value )
like push_back in C++
len(list) -> element-counts
get(list, index, default-value)
返回指定index的值如果index无效返回 default-value
count(List, item) -> item count
index(list, value) -> index
如果没有value返回-1
join(list, str::string()) -> string()
把list中每个元素使用str链接起来
split(string, signl) -> list()
join 的逆操作
reverse(list)
... more see *list-function*
* dictionary : 使用花括号包围的无须集合 k:v
* e.g. let di = {'name':'li', 'home':321}
一个变量的类型是第一个赋值时值的类型,变量类型一旦分配后
不会改变
+ 变量作用域
vimscript 的变量作用域(可见范围)和一般的编程语言不同,它是根据
编辑器对象来设定的。
默认情况下,变量如果在函数内部定义则在函数内部可见,
如果在函数外部定义则是全局变量
通过在变量名的开头添加前缀 显式定义不同作用域的变量
+ 全局可见 |g|:var
+ 变量所在的脚本可见 |s|:var
s: 变量不会随着script的执行完成而free, 下次在执行script
是s:变量还是上回的值
+ vim预定义变量 |v|:var
+ 变量在当前函数中可见 |l|:var
+ 变量是当前函数的一个参数 |a|:var 常用来在函数中取得函数的参数
+ 伪变量(特殊变量)
* &name 获得vim选项值 e.g. let xx=&path
&l:op localoption
* @name 获得vim寄存器中的值
* $name 环境变量 e.g. let spath=$PATH
+ string 变量
string 拼接 使用 .
e.g. let s:var = "hello " . "worlds " . s:str
*empty(str)* string 判空 !str
*strtrans(str)* 把string中的不可打印字符转行成可打印字符
*strlen* (str, beign, [end]) begin index 从0 开始
* let & set
使用set时 name为 vim op
let 可以对任何变量赋值包括 vim op 但是要使用 &op 来指名op 是vim op
set textwidth=v
let &textwidth = &textwidth + 10
}}}
set
------------------------
* boolean option
open set <name>
close set no<name>
* checking boptions
set <name>?
condition {{{
* if int
elseif
endif
condition 会求int类型值, 0 = false, other=true
if 的condition 必须在同一行,否则会报错
* ==
VIMScript 中比较始终执行数字比较, 除非两个对象都是 string
如果 一个是string 一个是num 那么string将会被转化为数字在比较
== string的比较依赖于用户的设定 大小写敏感
* ==? case-insensitive
* ==# case-sensitive
}}}
函数 {{{
-------------------------------------
* calling Functions
call func
* return
如果vim不返回一个值则,隐士的返回0
* param
使用a:name
vim 不允许在function中改变arugment 的值
|expand|(x,y) 得到指定的string
e.g. 到的当前文件的名字 expand('%')
e.g. 到的当前文件的目录 expand('%:h)
e.g. 到的当前文件的扩展名 expand('%:e)
|executable|('name') 坚持name是否是可执行文件
}}}
|getline|/1-2 得到指定的行内容
得到当前行 getlien(".")
得到1-3行 getlien(1,3) -> list()
返回一个list,每个元素是一行内容
|setline|/2(len, text) 设置指定行的内容
当text为list的适合会把每个elemt 当作一行
设置当前行内容为 hellC
setlien(".", 'hello'
call setline('.', getline('.')[:-2])
[:-2] 的意思是 得到getlien返回的string 的子串
返回从开始到倒数第二个(包含)的子串 see <h [:]>
负数表示从end开始计数 [begin:end]
e.g. 返回234 '12345'[1:-2]
|line| 得到光标,window等的所在行数
|col|('.') 得到当前光标的为位置
执行 vim脚步
:source filename
自定义命令
--------------------------------------
使用 command 来定义一个命令
e.g. >
```vimL
command LinuxKernelMode call KernelMode()
function KernelMode()
let l:kernel_release = system('uname -r')
echo l:kernel_release
endfunction
```
如果不想显示后面的调用命令 可以添加 silent
command LinuxKernelMode silent call KernelMode()
|execute|
执行一个string
execute "echo hello"
" set cmd
set
setlocal setl
vim Plugin Layout
---------------------------------------
* color/
* plugin/
each be run once every time Vim starts
These files are meant to contain code that you always
want loaded whenever you star Vim
* ftdetect/
be run once every time Vim start
use to set up autocommands that detect file type
* ftplugin/
每次 Vim set buffer filetype run filetype.vim
in file will be set buffer-local options
* after/
will be load every vim starts, but after plugin/
* autoload/
会延迟加载 plugin 的时间
Custorm Plguin
----------------------------------
* vim-javascrpt [[for JS]]
provides syntax and indent
* vim-nodejs-complete
* 使用 doctorgjs 来生产js的tags
Diff
--------------------------
★ 跳转到下一个diff点:
请使用 ]c 命令
★ 跳转到前一个diff点:
请使用 [c 命令
dp (diff put)
吧当前window的内容复制到另一个window
do (diff obtain)
吧另一个window的内容复制到当前window 和 dp 方向放
diffupdate
重新比较
listchars
Map
------------------------------------
map Key Cmd
如果不想显示Cmd可以在 map 的后面添加 <silent>, 这样就不会显示 Cmd
e.g. map <silent> <F4> :/Hee<CR>
编辑函数
-----------------------------
read,
delete
append
Auto Complete
--------------------------------------
vim 提供多种补全形式
x n/p 补全的相关设置
complete
fesf esf ^
vim help
:h[elp] 用双引号扩起来的是 vim 的设置选项
move
CRTL-E scroll down one line
CRTL_Y scroll up one line
0 go to the starting of current line
$ go to the end of current line
^ go to the first non black char of current line
g_
redraw screen with current line
to top z<ENTER>
to middle z.
to bottom z-
in insert mode move a world
SHIFT-<Right Arrow> right word-by-word
SHIFT-<Left Arrow> right word-by-word
jumps
marks
跳转到一个mark `a 是准确跳转到 mark a的地方
'a 是跳转到a所在的行的开头 `
几个特殊的marks vim自己维护
" 在退出之前最后编辑的
[
]
< Visual 模式下的第一行
> Visual 模式下的最后一行
. 最后改动的地方
^ 最后离开插入模式的地方
man K
man(3) 3K
自定义man page lookup
set keywordprg=perldoc\ -f
for perldoc \ 是用来转义空格
insert mode special key
CTRL-O insert mode execute a single vim command
CTRL-H == del
CTRL-W == del word <-
CTRL-J == CTRL-M begin new linhe
CTRL-R insert reg
CTRL-T add a shift >
CTRL-D del a shif
CTRL-G j down line
CTRL-G k up line
normal
dk dl dj dh
show ascii value of cursor
ga
quickfix
errorformat
# cexpr system(cmd)
# 用system(cmd) 执行的接过来打开一个quick-fix
recorver
vim -r
dos unix
set ff=
## sign
用来做语法错误提示或者debugger 断点指示
要定义一个 sign 然后显示他
sign list 列出所有的 sign
ruby crash
-----------------------------
保证编译vim是用的ruby版本和 编译 command-t ruby 版本相同
:ruby puts RUBY_VERSION
+ path
用来gf 跳转的文件,的搜索路径
+ 'suffixesadd'
自动补齐后缀
比如lua require(xxx) 是不写.lua后缀的,导致df 无法查找,但是设置suffixesadd
后接可以