网络书屋(Web Reading Room)

A blogging framework for hackers.

What Vim Teaches You?

vim真正教会了你什么?

vim带给你激情,也给了你生活的智趣,从一开始你练习Learn-vim-progressively,并且现在还在练习macro和vim’s text object. 也在不断的学习marks and tags思想,让生活轨迹有迹可循,你使用CtrlSpace来保证你的workspace保存下来,并切换文件和buffer; 随着知识的增长,你使用vimwiki来管理你的知识,并结合calendar在vimwiki来管理你的日记。为了让文件查找,文件编辑更加方便,你使用 shoudovimfiles来增强你的vim,使得你的vim变得更像一把瑞士军刀。

为了多一点对称美,你使用高丽棒作者junegunnvim-easy-align (Note: many examples),为了少犯错误,你加入了vim-fat-finger,使用iabbrev来缩写你需要写的单词,或者修正错误的单词,为了编辑更加有效,你甚至引入了vim-multiline-cursor, 并进一步的你引入了tpopevim-surround让你在书写racket(当然你也可以使用delimiteMate补全括号插件)或者lisp代码的时候更加方便一些,并为了重复或者递归使用,你也引入他的vim-repeat (vim中的很多插件都是支持增强的,比如f的增强插件clever-f);为了更快捷的编辑文件行,除了使用vim text object, 你也引入了vim-movevim-easymotion (Very Good)来移动行,使得vim文本更加结构化。

想着让你的vim运行得更快一些,你把你一直用的vundle改为了的junegunnvim-plug来管理你的插件,确没见得有太大的改进,简洁地使用plugins自然就快了。

vim startup

可以看到你的其实也增加了Startify的配置。

然而,上面这些都是你想让vim做的,下面要写的则是vim plugins带给你关于写作的新的概念和思想,这也才是本文的重点。

刚开始接触vim的时候,你是用了scrooloose的nerdtree ,tagbar,vim airline等,你也使用了各种language support vim plugins,也知道vim使用tpopevim-gitgutter结合git管理code, 现在让我们来看第一个vim插件ctrl-space

1. Ctrl-Space Plugin

Github Repo: Click here

vim help: :h ctrlspace

核心概念:

当你在vim中使用:h ctrlspace时候会搜索到这些资料,

1
2
3
4
5
6
7
8
9
10
11
12
13
14
【1.vim desktop】: Let's imagine [ Vim ] is a writing desk. 
【2.projects draws】 : Your [ projects ] are like drawers. 
【3.Bookmark  favorite project】:  The [ Bookmark ] List simply displays your favorite projects.
【4.Buffer  paper】: A [ buffer ] is like a sheet of paper lying on the desk. 
        named buffers
        unsaved buffers
【5.workspace  an status snapshot of current project】:All your [ buffers ], [ tabs ], and [ tab ] layouts can be persisted as a workspace.
It's like taking a picture of your desk with an instant camera. You can
save multiple workspaces per project with Workspace List.
【6.workspace  session】 : The word "workspace" can be considered a synonym of a "session". The
ability of having so many sessions available at hand creates a lot of
interesting use cases! For example, you can have a workspace for each task
or feature you are working on. It's very easy to switch from one workspace
to another.
1
2
3

然后以后可以使用大写的B,跳转到Bookmark标签栏,类似于CtrlSpace的哲学思想,会跳转到某个bookmark下的目录,通过C也可以,直接Enter《CR》键也是可以的。
删除觉得不需要了,就D一下即可。

: The easiest way to think about tab pages in Vim is to consider them to be viewports, layouts, or workspaces

1
2
3
4
tags是一个在编程中经常会使用
而且在git的版本中也经常涉及到很多打tag的工作 (git tag  or  git tag  -a)   git checkout某个tag等

其实tags只不过是对事物的一种抽象,这也是你在现实当中经常看到的class field method 注释等等,其实都可以把他们理解为一种tag,一种convinience tag

在vimwiki的wiki文件的简单实用方法(经常用!!!):

1
2
3
:标签名字:

[[文件名#标签名字]]即可

相同vim tag概念

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45

"" tab encapsulation
" tab 操作
" http://vim.wikia.com/wiki/Alternative_tab_navigation
" http://stackoverflow.com/questions/2005214/switching-to-a-particular-tab-in-vim

" tab切换
map <leader>th :tabfirst<cr>
map <leader>tl :tablast<cr>

map <leader>tj :tabnext<cr>
map <leader>tk :tabprev<cr>
map <leader>tn :tabnext<cr>
map <leader>tp :tabprev<cr>

map <leader>te :tabedit<cr>
map <leader>td :tabclose<cr>
map <leader>tm :tabm<cr>

" normal模式下切换到确切的tab
noremap <leader>1 1gt
noremap <leader>2 2gt
noremap <leader>3 3gt
noremap <leader>4 4gt
noremap <leader>5 5gt
noremap <leader>6 6gt
noremap <leader>7 7gt
noremap <leader>8 8gt
noremap <leader>9 9gt
noremap <leader>0 :tablast<cr>


" Toggles between the active and last active tab "
" The first tab is always 1 "
let g:last_active_tab = 1
" nnoremap <leader>gt :execute 'tabnext ' . g:last_active_tab<cr>
" nnoremap <silent> <c-o> :execute 'tabnext ' . g:last_active_tab<cr>
" vnoremap <silent> <c-o> :execute 'tabnext ' . g:last_active_tab<cr>
nnoremap <silent> <leader>tt :execute 'tabnext ' . g:last_active_tab<cr>
autocmd TabLeave * let g:last_active_tab = tabpagenr()

" 新建tab  Ctrl+t
nnoremap <C-t>     :tabnew<CR>
inoremap <C-t>     <Esc>:tabnew<CR>

默认工作类型目录

1
2
3
4
5
6
7
8
9
10
11
12
13
Markers will be also used as a storage for `cs_workspaces` (workspaces of
the current project) and `cs_files` (cached files of the current project).

Default value: >

    let g:CtrlSpaceProjectRootMarkers = [
         \ ".git",
         \ ".hg",
         \ ".svn",
         \ ".bzr",
         \ "_darcs",
         \ "CVS"
         \ ]

Summary:

1
2
3
4
5
6
7
8
9
10
   A buffer is the in-memory text of a file.
   A window is a viewport on a buffer.
   A tab page is a collection of windows.


A window is a viewport onto a buffer.  You can use multiple windows on one
buffer, or several windows on different buffers.

A buffer is a file loaded into memory for editing.  The original file remains
unchanged until you write the buffer to the file.

2. Knowledge tool: Vimwiki

Github Repo: Click here

vimwki setup in vimrc:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
• """"""""""""""""""""""""""""""""""""""""""""""""""  
• " vimwiki  
• let g:vimwiki_use_mouse = 1  
• let g:vimwiki_list_ignore_newline = 0  
• let g:vimwiki_hl_headers = 0  
• " vimwiki打开折叠  
• "let g:vimwiki_folding = 1  
• let g:vimwiki_camel_case = 0  
• let g:vimwiki_list_ignore_newline = 0  
• let g:vimwiki_CJK_length = 1  
•   
• "设定文件浏览器目录为当前目录  
• set bsdir=buffer      
• "set autochdir  
•   
• " 日历插件  
• map ca :Calendar<cr>  
•   
• map <S-Space> :<C-Space>  
•   
• " vimwiki  
• let g:vimwiki_list = [{'path': '~/Wiki/wiki/', 'path_html': '~/Wiki/', 'auto_export': 1}]  
• " 转化为Html文件  
• map <S-F4> :Vimwiki2HTML<cr>  
•   
• " 设置颜色  
• hi VimwikiHeader1 guifg=#FF0000  
• hi VimwikiHeader2 guifg=#00FF00  
• hi VimwikiHeader3 guifg=#0000FF  
• hi VimwikiHeader4 guifg=#FF00FF  
• hi VimwikiHeader5 guifg=#00FFFF  
hi VimwikiHeader6 guifg=#FFFF00  

vimwiki tagbar 集成

1
2
3
4
5
6
7
8
9
------------------------------------------------------------------------------
Tagbar integration                                            *vimwiki-tagbar*

As an alternative to the Table of Contents, you can use the Tagbar plugin
(http://majutsushi.github.io/tagbar/) to show the headers of your wiki files
in a side pane.
Download the Python script from
https://raw.githubusercontent.com/vimwiki/utils/master/vwtags.py and follow
the instructions in it.

效果如下,

tagbar

3. Vimfiles: A tool for file operations

Github Repo: click here

vimfiler setup in vimrc

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
"for vimfiler
let g:vimfiler_enable_auto_cd=1
"call vimfiler#set_execute_file('txt', 'notepad')
call vimfiler#set_execute_file('txt', 'gvim')
call vimfiler#set_execute_file('c', ['gvim', 'notepad'])

let g:vimfiler_as_default_explorer = 1

" Enable file operation commands.
" Edit file by tabedit.
"call vimfiler#custom#profile('default', 'context', {
"      \ 'safe' : 0,
"      \ 'edit_action' : 'tabopen',
"      \ })

" Like Textmate icons.
let g:vimfiler_tree_leaf_icon = ' '
"let g:vimfiler_tree_closed_icon = '▸'
"let g:vimfiler_tree_opened_icon = '▾'
let g:vimfiler_file_icon = '-'
let g:vimfiler_marked_file_icon = '*'

let g:vimfiler_safe_mode_by_default=0 
  " Use trashbox.
  " Windows only and require latest vimproc.
let g:unite_kind_file_use_trashbox = 1
""  you can create a .vim file, then source it
"need everything.exe
"nnoremap <Leader>f :Unite file buffer file_rec file_mru everything<CR>
nnoremap <Leader>f :VimFiler<CR>
nnoremap <leader>l :Unite line<CR>
let g:unite_source_everything_limit = 100
let g:unite_source_everything_full_path_search = 1
let g:unite_source_everything_posix_regexp_search = 1
let g:unite_source_everything_async_minimum_length = 3
let g:unite_source_everything_cmd_path = 'C:\\Users\\YeZhao\\.vim\\es\\es.exe'


由于vimfiler的使用也了解到了 ag插件(一个特别好用的搜索插件,在ubuntu底下直接使用ag “expression” 找到当前文件夹所有文件内容 包含表达式的行数据 相当快速)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
H作用打开shell  x打开文件夹的意思

L打开磁盘
Load
&回到project目录  那是相当有用的
~回到.vim目录

e编写文件
N 创建文件
K创建文件夹

#全选
*全部选?

c复制
d删除
m移动

先用m表示选定 然后d删除(重要操作)
m移动
c复制

有意思的是:

使用m然后r,可以跳出一个新的编辑窗口,进行文件名的修改,这是相当好的实现。

转化为HTML

1
2
:Vimwiki2HTML – Convert current wiki page to HTML
:VimwikiAll2HTML – Convert all your wiki pages to HTML

4. Startify Plugin

Github Repo: click here

vim 全屏

1
2
3
4
5
6
7
8
9
10
11
let w:full_screen=0
    map :call FullScreen()
func! FullScreen()
    if w:full_screen==1
    let w:full_screen=0
    :simalt ~R
    else
    :simalt ~X
    let w:full_screen=1
    endif
endfunc

vim-easy-align常用命令

vim help: :h easyalign

vip= Enter= EnterEnter=(居右,居中,居左对其选项 )

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
gaip=


 --------------+--------------------------------------------------------------------
 Delimiter key | Description/Use cases                                              ~
 --------------+--------------------------------------------------------------------
 <Space>       | General alignment around whitespaces
    `:`            | Suitable for formatting JSON or YAML
  `=`            | Operators containing equals sign ( `=` ,  `==,`  `!=` ,  `+=` ,  `&&=` , ...)
  `.`            | Multi-line method chaining
  `,`            | Multi-line method arguments
  `&`            | LaTeX tables (matches  `&`  and  `\\` )
  `#`            | Ruby/Python comments
  `"`            | Vim comments
 <Bar>         | Table markdown
 --------------+--------------------------------------------------------------------

  ------------------+------------------------------------+--------------------
 With visual map   | Description                        | Equivalent command ~
 ------------------+------------------------------------+--------------------
 <Enter><Space>    | Around 1st whitespaces             | :'<,'>EasyAlign\
 <Enter>2<Space>   | Around 2nd whitespaces             | :'<,'>EasyAlign2\
 <Enter>-<Space>   | Around the last whitespaces        | :'<,'>EasyAlign-\
 <Enter>-2<Space>  | Around the 2nd to last whitespaces | :'<,'>EasyAlign-2\
 <Enter>:          | Around 1st colon ( `key:  value` )   | :'<,'>EasyAlign:
 <Enter><Right>:   | Around 1st colon ( `key : value` )   | :'<,'>EasyAlign:<l1
 <Enter>=          | Around 1st operators with =        | :'<,'>EasyAlign=
 <Enter>3=         | Around 3rd operators with =        | :'<,'>EasyAlign3=
 <Enter>*=         | Around all operators with =        | :'<,'>EasyAlign*=
 <Enter>**=        | Left-right alternating around =    | :'<,'>EasyAlign**=
 <Enter><Enter>=   | Right alignment around 1st =       | :'<,'>EasyAlign!=
 <Enter><Enter>**= | Right-left alternating around =    | :'<,'>EasyAlign!**=
 ------------------+------------------------------------+--------------------

vim-surround 常用命令

1
2
3
4
5
6
7
8
9
1. cs"'
2. cs'"
3. cs'<q>
5. cs"t
4. cst"
6. ds"
7. ysiw"
8. yssb == yss)
9. S"  可视化模式选择快 然后大S,这点类似于Multiple-Cursor的Ctrl+N命令

vim copy file name

你使用vim-copy-filename

1
2
3
4
5
6
"" for vim-copy-filename
nmap <leader>cp :CopyRelativePath<CR>
nmap <leader>cl :CopyRelativePathAndLine<CR>
nmap <leader>cP :CopyAbsolutePath<CR>
nmap <leader>cf :CopyFileName<CR>
nmap <leader>cd :CopyDirectoryPath<CR>

额外一些插件的备注

  1. Haya14busa 提供的 incsearch 增加了statusline的查找词当前数 和总个数
  2. Vim-cursorword 表示添加下划线。
  3. AndrewRadev/splitjoin.vim 是提供类似于perl的当行模式的插件[gS gJ]。在scheme估计比较少用到。

一直遗忘的一个快捷查看命令 Ctrl+E 往下滚屏 Ctrl+Y 往上滚屏

1
运行的话,进入底线命令模式,用:!perl %就可以运行,或者可以绑定一个快捷键组合, %表示当前文件的意思

最后,编辑器界面展示的应全是代码,不应该有工具条、菜单、滚动条浪费空间的元素,另外,编程是种精神高度集中的脑力劳动,不应出现闪烁光标、花哨鼠标这些分散注意力的东东

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
写到这边我去睡觉了,梦中梦到了前半辈子比较重要的三个女人,我妈以及另外两个从小长大的妇女(不说女生了),街道上偶遇她们正在端着一个冰盒沿街发送,也不像是生了孩子似的,但梦中是那么真实又带着虚的东西(所以人是一个最精良的仪器,拥有最直觉的第六感,又拥有最会惹事的直觉),我妈骑着自行车从我们三身边走过,前方又出现一个特别活泼的"妇女",在我的环境中还有篮球这一个概念,我的梦(由我的身体+癫痫的精神状态+疲惫产生的一种组合的事件)把我带到一个篮球场,后来我又去了

我一个哥们那边,终于有男的出现,我发现我走过的路总是不缺乏女生(所以我是趋向于好色之徒,本来也是), 我梦到了我儿时的
阴影我特别怕的一个男生,喜欢拿刀砍人,犯冲,特别好斗,但缺少脑子。我写出来了,因为我想克服它。梦向黄大仙一样,它放屁的效果具有致幻的效果,能让人陷入幻境中不得自拔,人每天晚上也像黄大仙附体一样坐着春秋大梦。

但从我身边路过的那些女生,都已经变得不真实,我身边有一个wife如胶似漆的黏着我,怎么我就不懂珍惜呢。时代的进步,需要梦的催化,世界上无德的传销机构也在利用着洗脑在铸造着同一类人,这些人把思维当作无趣,而非智趣。

匆匆而过三十载,岁月不饶人,也不等人(也就是你学会了用时间的非定常特性来观察人生)。乐观、不自信一直伴随着我成长,然而我却不知道痛苦才是生活的本源,享受
痛苦,才能拥有些许的快乐。Enjoy Painess!但我不想把pain带给亲人,身边的人。我是一个自私的人,没有团队精神,不太会
替别人考虑的人(当然自从有了她,我得替她考虑,但是考虑得还很少,我很对不起她)

也就是生活的智趣源于痛苦,痛苦的根源诞生了时代的进步,和智趣的发展。

写到这边,就先停笔把,继续回到vim当中,他也像人,能够感知到字符的变化,感知文本结构(你赋予了它思考的能力),能够
让你编辑得更顺畅些;vim像刀、人也可以像刀,磨砺你自己这把最重要的一把刀把!

必然对偶然,自由对随机,自由在必然中,随机在偶然中,原来这才是自由(胡正自由是有代价的)。

5. Attach File

  • Windows Version dotVim Repo: here
  • Ubuntu Version dotVim Repo: here

在终端使用vim编辑命令的方式:

在~目录下创建一个.inputrc文件,内容如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
set editing-mode vi
Control-a: beginning-of-line
Control-b: backward-char
Control-d: delete-char
Control-e: end-of-line
Control-f: forward-char
Control-k: kill-line
Control-n: next-history
Control-p: previous-history
set keymap emacs-ctlx
v: vi-editing-mode
Control-v: "\C-xv\e"
Escape: "\C-xv\e"
set keymap emacs
$if Bash
  Control-w: unix-filename-rubout
$endif