Skip to content

lilijreey/.vim

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

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
  后接可以