关于golang:使用BKLexer进行词法分析

前几天我曾经封装好了词法分析器并命名BKLexer,以后BKLexer别离反对Go/C++/Python。 程序代码放在Github我的项目当中: 点进我的项目页 能够参考每一个版本的try_lexer代码进行学习,上面以Go为例: package mainimport ( "fmt" "strconv" "./bklexer")func main() { fmt.Println("Test Code:") code := "申明 变量 = PI * 100 - fda\n1024 * 4 * 3.14 ### \n123" fmt.Println(code) fmt.Println("--------------------------------") lexer := BKLexer.NewLexer() lexer.AddRule("\\d+\\.\\d*", "FLOAT") lexer.AddRule("\\d+", "INT") lexer.AddRule("[\\p{L}\\d_]+", "NAME") lexer.AddRule("\\+", "PLUS") lexer.AddRule("\\-", "MINUS") lexer.AddRule("\\*", "MUL") lexer.AddRule("/", "DIV") lexer.AddRule("=", "ASSIGN") lexer.AddRule("#[^\\r\\n]*", "COMMENT") lexer.AddIgnores("[ \\f\\t]+") lexer.Build(code) for true { token := lexer.NextToken() if (token.TType != BKLexer.TOKEN_TYPE_EOF) { fmt.Printf("%s\t%s\tt%d\t%d\t%d,%d\n", token.Name, strconv.Quote(token.Source), token.TType, token.Position, token.Row, token.Col) } if (token.TType == BKLexer.TOKEN_TYPE_EOF || token.TType == BKLexer.TOKEN_TYPE_ERROR) { break } }}首先引入bklexer在内的包import ( "fmt" "strconv" "./bklexer")fmt 用于打印输出strconv 用于优化字面量的显示./bklexer 引入BKLexer包实例化词法分析器并设定规定lexer := BKLexer.NewLexer()lexer.AddRule("\\d+\\.\\d*", "FLOAT")lexer.AddRule("\\d+", "INT")lexer.AddRule("[\\p{L}\\d_]+", "NAME")lexer.AddRule("\\+", "PLUS")lexer.AddRule("\\-", "MINUS")lexer.AddRule("\\*", "MUL")lexer.AddRule("/", "DIV")lexer.AddRule("=", "ASSIGN")lexer.AddRule("#[^\\r\\n]*", "COMMENT")lexer.AddIgnores("[ \\f\\t]+")NewLexer 实例化词法分析器AddRule 减少匹配规定,参数别离为正则表达式,对应的类型名称AddIgnores 用于设定须要疏忽的字符内容构建并循环匹配lexer.Build(code)for true { token := lexer.NextToken() if (token.TType != BKLexer.TOKEN_TYPE_EOF) { fmt.Printf("%s\t%s\tt%d\t%d\t%d,%d\n", token.Name, strconv.Quote(token.Source), token.TType, token.Position, token.Row, token.Col) } if (token.TType == BKLexer.TOKEN_TYPE_EOF || token.TType == BKLexer.TOKEN_TYPE_ERROR) { break }}应用Build办法,将代码code作为参数进行构建,而后循环调用NextToken办法取得下一个Token,并打印相干信息。须要留神的是该当对Token的类型进行检测判断是否为EOF或ERROR以决定是否终止。 ...

March 24, 2021 · 2 min · jiezi

关于vim:工欲善其事必先利其器系列之四构建基于Vim的补全跳转插件YouCompleteMe的Docker镜像一键部署开发环境

日期作者版本备注2021-03-24dingbinV1.0 C++程序员日常开发中不可避免地遇到变更电脑,变更服务器等事件时重建搭建C++开发环境切实过于沉重,须要消耗很多不必要的宝贵时间。vim 的YouCompleteMe(简称YCM) 插件能够实现较好的C/C++语言主动补全跳转性能,是利用vim进行C /C++代码编辑的必备神器之一。而后理论中YCM的装置及其简单,不仅依赖python动态链接库,还依赖特定高版本的gcc和clang或clangd和cmake等。筹备这些前置组件也很费时费力。有鉴于此,本文介绍一种新的玩法,并给出实际操作细节和间接可用的docker镜像成绩,即:构建基于Vim的C++补全跳转插件YouCompleteMe的Docker镜像,一键实现任意机器上C++开发环境搭建。具体操作办法介绍如下。 环境筹备工夫: 2021-03-24 机器配置:CentOS Linux release 7.5.1804 (Core),8核 12G 创立根底的docker镜像思考装置以后工夫下最新版本的vim和YoucompleteMe插件。参考YouCompleteMe官网介绍的装置办法要求vim/gcc/clang/clangd/cmake/python都在比拟高的版本下能力装置胜利。而咱们为了制作docker 镜像,因而不可能选很旧的根底os。参考YCM官网的倡议,咱们根底OS抉择ubuntu 20.04 LTS。hub.docker.com上间接现成的镜像文件。配置文件须要筹备好如下3个配置文件,本文间接贴出原文内容如下: vim配置文件.vimrc set nocompatible " be iMproved, requiredfiletype off " requiredset encoding=utf-8set rtp+=~/.vim/bundle/Vundle.vimcall vundle#begin()Plugin 'VundleVim/Vundle.vim'Plugin 'flazz/vim-colorschemes'Plugin 'godlygeek/csapprox'Plugin 'Valloric/YouCompleteMe'call vundle#end() " requiredfiletype plugin indent on " requiredset cstset csto=1 set nocsverbset csverb"set smd "set showmode"set sc "set showcmdset aw "set autowriteset awa "set autowriteallset title"使关上文件时使光标主动定位到上一次文件被敞开时的精确行if has("autocmd") autocmd BufRead *.txt set tw=78 au BufReadPost * exe "normal! g`\""endif"设置高亮关键字显示syntax enablesyntax on "等同于syn on"禁止在搜寻到文件两端时从新搜寻"set nows "set nowrapscan set ws"设置搜寻式的匹配字符串高亮显示set hls "set hlsearch"设置搜寻式的匹配字符串不高亮显示"set nohls "set nohlsearch "高亮光标所在的以后行set cursorlineset cul "相同的设置是set nocul"set nocul"搜寻时在未齐全输出结束要检索的文本时就开始检索set is "set incsearch"搜寻时在未齐全输出结束要检索的文本时不开始检索"set nois "set noincsearch"设置以backspace删除主动缩进的,行末回车,行首的字符,很有用set backspace=indent,eol,startset ic "相同是 set noic"set scs "相同是 set noscs"加强模式中的命令行主动实现操作,十分有用set wildmenu"设置代码折叠为按语法折叠"set foldmethod=syntax"设定折叠形式为手动set foldmethod=manual"设置启动vim时不要主动折叠代码set foldlevel=100set fdc=1 "set foldcolumn=1 "设置帮忙的语言为中文set helplang=cn"set helplang=en"实现C程序的缩进(indent)set cin "设置行号set nu"set nonu"设置256色调set t_Co=256"设置配色计划"colorscheme 简写成colo"colo colorful "colo white2 colo desert"colo night"colo navajo"colo lucius"colo blackdust"colo freya"colo darkslategray"colo torte"colo fruidle"colo colorful"设置编辑模式下状态栏标尺显示set ru "set ruler"设置编辑模式下状态栏标尺不显示"set noru "set noruler"记录历史的行数set history=1000"检测文件类型"filetype onfiletype plugin on" 开启文件类型检测 的插件和缩进开filetype plugin indent on "设置能够至上一行和下一行的字符按键set ww=b,s,<,>,[,] ",h,l"Alt组合键不映射到菜单上set winaltkeys=no"同时反对GBK和UTF-8编码set fileencodings=utf-8,ucs-bom,gbk,cp936set fileencoding=utf-8set encoding=utf-8"如果在终端环境下应用Vim,须要设置termencoding和终端所应用的编码统一。例如:set termencoding=utf-8 "设置更新ctags文件的快捷键"map <F3> : ! ${HOME}/tools/gen_tags_by_dingbin.bash "%:p:h" z6tags <CR>"map <F4> : ! ${HOME}/tools/gen_tags_by_dingbin.bash "%:p:h" oatags <CR>"map <F5> : ! ${HOME}/tools/gen_tags_by_dingbin.bash "%:p:h" qttags <CR>"===================================================================================================================="map <silent> <F4> : cs show <CR>: let @i = &tags <CR> :let @j = $CSCOPE_TAGS <CR> : !genvimtags -vimCtags <c-r>i -vimCscope <c-r>j <cr> :so ${VIM_SCRIPT_HOME}/configure/vimSourceFile <cr>"map <silent> <F5> : cs show <CR>: let @i = &tags <CR> :let @j = $CSCOPE_TAGS <CR> : !genvimtags -g -vimCtags <c-r>i -vimCscope <c-r>j <cr> :so ${VIM_SCRIPT_HOME}/configure/vimSourceFile <cr> "===================================================================================================================="设置grep插件的快捷键"nnoremap <silent> <F4> :Grep<CR>"-----------------------------------------------------"主动缩进的时候, 缩进尺寸为 4 个空格。"即shiftWidth,主动缩进的空格数,用于<<,>>,cindentset shiftwidth=4 "softtabstop,sts,默认是0,"执行编辑操作,如插入 <Tab> 或者应用 <BS> 时,把 <Tab> 算作空格的数目set softtabstop=4 "set sts=4"编辑时将所有 Tab 替换为空格。"该选项只在编辑时将 Tab 替换为空格, 如果关上一个曾经存在的文件, 并不会将已有的Tab 替换为空格。 "设置了该选项后,如果想输出tab制表符,先输出CTRL-V或CTRL-Q,再输出tab制表符set et "相同的设置是set noet"Tab 宽度为 4 个字符。set ts=4 "即set tabstop=4"Tab操作快捷方式!"nnoremap <C-TAB> :tabnext<CR><CR>:TlistClose<CR><CR>:TlistToggle<CR><CR>"nnoremap <C-S-TAB> :tabprev<CR><CR>:TlistClose<CR><CR>:TlistToggle<CR><CR>"nnoremap <C-TAB> :tabnext<CR><CR>:TlistClose<CR><CR>"nnoremap <C-S-TAB> :tabprev<CR><CR>:TlistClose<CR><CR>""对于tab的快捷键"map tn :tabnext<cr>"map tp :tabprevious<cr>"map td :tabnew .<cr>"map te :tabedit<SPACE>"map tc :tabclose<cr>""map tf :tabnew %:p<cr>:TlistClose<CR><CR>:TlistToggle<CR><CR>"map tf :tabnew %:p<cr>:TlistClose<CR><CR>"覆盖文件时不备份set nobackup "胜利保留文件之前备份 set wb "set writebackup"set nowb "set nowritebackup"插入括号时,短暂地跳转到匹配的对应括号set sm "set showmatch "短暂跳转到匹配括号的工夫set matchtime=2"设置魔术set magic "容许在有未保留的批改时切换缓冲区,此时的批改由 vim 负责保留set hidden "开启新行时应用智能主动缩进set smartindent set autoindent"关上一般文件类型的主动缩进。 该主动缩进不如 cindent 智能, 但它能够为你编辑非 C/C++ 文件提供肯定帮忙。set ai"选中状态下 Ctrl+c 复制"vmap <C-c> "+y"留神应用的过程中能够通过e和b键盘以word为单位后退或后退以抉择文本"set keymodel= "不应用此性能set keymodel=startsel,stopsel "应用此性能"visual 模式下标签查找(*,#)可用vnoremap * y<ESC>/<C-r>"<CR> vnoremap # y<ESC>?<C-r>"<CR> nnoremap g[ :tag <C-R>=expand("<cWORD>")<CR><CR>vnoremap g[ <ESC>:tag <C-r>*<CR>:inoremap ( ()<ESC>i:inoremap [ []<ESC>i:inoremap ;; <ESC>A;<CR>"插入模式下使Ctrl+ h,j,k,l四个键成果等同于挪动上、下、左、右方向键inoremap <C-h> <Left>inoremap <C-j> <Down>inoremap <C-k> <Up>inoremap <C-l> <Right>"插入模式下使ctrl+ w,b两个键成果等同于一般模式下ctrl+w(后退一个单词),ctrl+b("后退一个单词)inoremap <C-b> <C-o>binoremap <C-w> <C-o>w"插入模式下使ctrl+ f(front),Ctrl+e(end)两个键成果等同于一般模式下<home>,<end>键inoremap <C-e> <C-o><End>inoremap <C-f> <C-o><Home>"插入模式下ctrl + d,等效于一般模式下backspace键,"插入模式下ctrl + x,等效于一般模式下delete键,inoremap <C-d> <BS>inoremap <C-x> <Del>"指定在抉择文本时,光标所在位置也属于被选中的范畴set selection=inclusive"-----------------------------------------------------"-----------------------------------------------------"指定不折行。 如果一行太长, 超过屏幕宽度, 则向左边延长到屏幕里面。如果应用图形界面的话, 指定不折行视觉效果会好得多。set nowrap"set wrap"设置显示时一行的文本宽宽set tw=80 "set textwidth=80"增加程度滚动条。 如果你指定了不折行, 那为窗口增加一个程度滚动条就十分有必要了。set guioptions-=b"去除vim的GUI版本的toolbarset guioptions+=T"去除vim的GUI版本的menubarset guioptions+=m"设置断行,当一行的文字太长时,为主动智能在一个单词的两头"空白处断开到下一行显示,留神:这里的断行只用显示,并不在行末加<EOF>set lbr "set linebreak"关上断行模块对亚洲语言反对。 m 示意容许在两个汉字之间断行, 即便汉字之间没有呈现空格。"B 示意将两行合并为一行的时候, 汉字与汉字之间不要补空格。 该命令反对的更多的选项请参看用户手册。set fo+=mB"配置字体"set fileencoding=gbk"set guifont=Courier\ 11 "set guifont=Inconsolata\ Medium\ 9 "史上最难看的vim字体"set guifont=Bitstream_Vera_Sans_Mono:h10:cANSI"set gfw=幼圆:h10.5:cGB2312set guifont=Bitstream\ Vera\ Sans\ Mono\ 13"当右键单击窗口的时候, 弹出快捷菜单set mousemodel=popup"不应用抉择模式set selectmode="设置屏幕滚动的ctrl+d,ctrl+u的行数,默认是窗口的一半,即半屏set scr=4"-----------------------------------------------------"""""""""""""""""""""""""""""""""Taglist plugin settings """"""""""""""""""""""""""""""""let Tlist_Auto_Highlight_Tag = 1"let Tlist_Hightlight_Tag_On_BufEnter = 1"let Tlist_GainFocus_On_ToggleOpen = 0 "if 0 focus at code window, if 1 focus at tag window"""启动vim主动关上taglist"let Tlist_Auto_Open = 0 """ 不同时显示多个文件的 tag ,只显示以后文件的"let Tlist_Show_One_File = 1""" 如果 taglist 窗口是最初一个窗口,则退出 vim"let Tlist_Exit_OnlyWindow = 1"""让以后不被编辑的文件的办法列表主动折叠起来 "let Tlist_File_Fold_Auto_Close = 0"""把taglist窗口放在屏幕的右侧,缺省在左侧 "let Tlist_Use_Right_Window=1 """显示taglist菜单"let Tlist_Show_Menu = 1"""taglist window width"let Tlist_WinWidth = 40""let Tlist_Process_File_Always = 1""" 是否容许关上taglist窗口时主动加宽窗口, 默认为容许."let Tlist_Inc_Winwidth = 1"" 精简模式, 不同的tag类别之间没有空行, 默认为有空行"let Tlist_Compact_Format = 1"" tag是以何种程序排序, 以"order"还是"name", 默认是order, 能够用s切换,"let Tlist_Sort_Type = "order""""用<ALT> + 数字切换Tab窗口""用过Gnome-terminal的人都晓得, 在一个Terminal里关上多个TAB窗口, 用ALT+数字就能够""切换到相应的窗口. 很喜爱这个性能, 映射如下:""noremap <M-1> 1gt"noremap <M-2> 2gt"noremap <M-3> 3gt"noremap <M-4> 4gt"noremap <M-5> 5gt"noremap <M-6> 6gt"noremap <M-7> 7gt"noremap <M-8> 8gt"noremap <M-9> 9gt"noremap <M-0> 10gt"""""""""""""""""""""""""""""""""""Winmanager plugin settings """""""""""""""""""""""""""""""""设置界面宰割"let g:winManagerWindowLayout='FileExplorer|TagList'""let g:winManagerWindowLayout = BufExplorer,FileExplorer|TagList"""let g:winManagerWindowLayout = TagList|FileExplorer,BufExplorer""""设置winmanager的宽度,默认为25""let g:winManagerWidth = 30"""定义关上敞开winmanager按键"nmap wm :WMToggle<cr>""nmap <silent> <F8> :WMToggle<cr>"nmap <silent> <F4> :TlistToggle<cr>"""1)将插件显示在右侧""关上winmanager.vim,在function! <SID>StartWindowsManager()函数中批改:""将:wincmd H 批改为wincmd L:"" for now assume that the explorer windows always stay on the left."" TODO: make this optional later"" make the explorers window always stay on the right ---by chenyong"" wincmd H""wincmd L"""2)进入vim主动关上winmanager""在进入vim时主动关上winmanager"let g:AutoOpenWinManager = 0""相应的在winmanager.vim中批改:""set auto open Winmanager ""if g:AutoOpenWinManager ""autocmd VimEnter * nested call s:StartWindowsManager()|1wincmd w ""endif"""3)退出缓冲区时,主动退出vim""这个性能是参考了taglist的主动退出性能,在taglist.vim中批改的。""函数:function! s:Tlist_Window_Exit_Only_Window()中的winbunr(2)改为winbunr(3),""即只剩2个窗口时敞开,思考到2个窗口必定是同时存在,所以这样还是可行的: ""同时在vimrc中须要设置:""let Tlist_Exit_OnlyWindow=1"""""""""""""""""""""""""""""""""""QuickFix plugin settings """"""""""""""""""""""""""""""""nmap <F7> :cw<cr>:cn<cr>"nmap <F6> :cw<cr>:cp<cr>"nmap <F9> :cclose<cr>""""""""""""""""""""""""""""""""""""""""""""""""""""""""设定是否应用 quickfix 窗口来显示 cscope 后果"""""""""""""""""""""""""""""""""""""""""""""""""""""":set cscopequickfix=s-,g-,c-,d-,i-,t-,e-,f-""""cscope find"的用法:""cs find c|d|e|f|g|i|s|t name""0 或 s 查找本 C 符号(能够跳过正文)""1 或 g 查找本定义""2 或 d 查找本函数调用的函数""3 或 c 查找调用本函数的函数""4 或 t 查找本字符串""6 或 e 查找本 egrep 模式""7 或 f 查找本文件""8 或 i 查找蕴含本文件的文件"nmap <C-_>s :cs find s <C-R>=expand("<cword>")<CR><CR>"nmap <C-_>g :cs find g <C-R>=expand("<cword>")<CR><CR>"nmap <C-_>c :cs find c <C-R>=expand("<cword>")<CR><CR>"nmap <C-_>t :cs find t <C-R>=expand("<cword>")<CR><CR>"nmap <C-_>e :cs find e <C-R>=expand("<cword>")<CR><CR>"nmap <C-_>f :cs find f <C-R>=expand("<cfile>")<CR><CR>"nmap <C-_>i :cs find i ^<C-R>=expand("<cfile>")<CR>$<CR>"nmap <C-_>d :cs find d <C-R>=expand("<cword>")<CR><CR>"""""""""""""""""""""""""""""""""""""""""""""""""""""""""头文件与源文件互相切换a.vim settings"""""""""""""""""""""""""""""""""""""""""""""""""""""""nnoremap <silent> <F12> :A<CR> ""A 在新Buffer中切换到c\h文件""AS 横向宰割窗口并关上c\h文件""AV 纵向宰割窗口并关上c\h文件""AT 新建一个标签页并关上c\h文件"""""""""""""""""""""""""""""""""""""""""""""""""""""""" F11 : set csto=1, F12 : set csto=0""""""""""""""""""""""""""""""""""""""""""""""""""""""nnoremap <silent> <F11> :set csto=1 <CR> "nnoremap <silent> <F12> :set csto=0 <CR> """" set cs hotkey"nmap <C-_>s :cs find s <C-R>=expand("<cword>")<CR><CR>"nmap <C-_>g :cs find g <C-R>=expand("<cword>")<CR><CR>"nmap <C-_>c :cs find c <C-R>=expand("<cword>")<CR><CR>"nmap <C-_>t :cs find t <C-R>=expand("<cword>")<CR><CR>"nmap <C-_>e :cs find e <C-R>=expand("<cword>")<CR><CR>"nmap <C-_>f :cs find f <C-R>=expand("<cfile>")<CR><CR>"nmap <C-_>i :cs find i ^<C-R>=expand("<cfile>")<CR>$<CR>"nmap <C-_>d :cs find d <C-R>=expand("<cword>")<CR><CR>""" Using 'CTRL-spacebar' then a search type makes the vim window"" split horizontally, with search result displayed in"" the new window.""nmap <S-Space>s :scs find s <C-R>=expand("<cword>")<CR><CR>"nmap <S-Space>g :scs find g <C-R>=expand("<cword>")<CR><CR>"nmap <S-Space>c :scs find c <C-R>=expand("<cword>")<CR><CR>"nmap <S-Space>t :scs find t <C-R>=expand("<cword>")<CR><CR>"nmap <S-Space>e :scs find e <C-R>=expand("<cword>")<CR><CR>"nmap <S-Space>f :scs find f <C-R>=expand("<cfile>")<CR><CR>"nmap <S-Space>i :scs find i ^<C-R>=expand("<cfile>")<CR>$<CR>"nmap <S-Space>d :scs find d <C-R>=expand("<cword>")<CR><CR>""" Hitting CTRL-space *twice* before the search type does a vertical"" split instead of a horizontal one""nmap <S-Space><S-Space>s" \:vert scs find s <C-R>=expand("<cword>")<CR><CR>"nmap <S-Space><S-Space>g" \:vert scs find g <C-R>=expand("<cword>")<CR><CR>"nmap <S-Space><S-Space>c" \:vert scs find c <C-R>=expand("<cword>")<CR><CR>"nmap <S-Space><S-Space>t" \:vert scs find t <C-R>=expand("<cword>")<CR><CR>"nmap <S-Space><S-Space>e" \:vert scs find e <C-R>=expand("<cword>")<CR><CR>"nmap <S-Space><S-Space>i" \:vert scs find i ^<C-R>=expand("<cfile>")<CR>$<CR>"nmap <S-Space><S-Space>d" \:vert scs find d <C-R>=expand("<cword>")<CR><CR>function AddFileTitle()call append(0," ")call setline(1,"////////////////////////////////////////////////////////////////////////")call append(1,"/// @Filename " . expand("%:p:t"))call append(2,"/// @Description ")call append(3,"/// @Author DingBin")call append(4,"/// @Last modified " . strftime("%Y-%m-%d %H:%M"))call append(5,"////////////////////////////////////////////////////////////////////////")endfunctionfunction AddFileComment()call append(line(".") -1," ")call setline(line(".") -1,"////////////////////////////////////////////////////////////////////////")call append(line(".") - 1,"/// @brief :")call append(line(".") - 1,"/// @param :")call append(line(".") - 1,"/// @return :")call append(line(".") - 1,"////////////////////////////////////////////////////////////////////////")endfunctionfunction AddoaArrayFor()call append(line(".") -1," ")call setline(line(".") -1,"for (oaUInt4 i = 0; i < .getNumElements(); i++ )")endfunctionmap time :0,50/\/\/\/ *@Last modified/s#@Last modified.*$#\=strftime("@Last modified %Y-%m-%d %H:%M")#cmap addt :call AddFileTitle()<cr>map addc :call AddFileComment()<cr>map addf :call AddoaArrayFor()<cr>"nnoremap <C-1> 1gt "nnoremap <C-2> 2gt "nnoremap <A-3> 3gt"nnoremap <A-4> 4gt "nnoremap <A-5> 5gt "nnoremap <A-6> 6gt "nnoremap <A-7> 7gt "nnoremap <A-8> 8gt "nnoremap <A-9> 9gt "Mode Settingslet &t_SI.="\e[5 q" "SI = INSERT mode"let &t_SR.="\e[4 q" "SR = REPLACE modelet &t_EI.="\e[1 q" "EI = NORMAL mode (ELSE)"Cursor settings:" 1 -> blinking block" 2 -> solid block" 3 -> blinking underscore" 4 -> solid underscore" 5 -> blinking vertical bar" 6 -> solid vertical bar"let &t_SI = "\<Esc>]50;CursorShape=1\x7""let &t_SR = "\<Esc>]50;CursorShape=2\x7""let &t_EI = "\<Esc>]50;CursorShape=0\x7""-----------------------------------------------------"对于状态行配置"总是显示状态行set laststatus=2 "set ls=2 "----- 状态栏设置_BEGIN_ -----"显示以后文件名,文件格式,文件类型set statusline=%2*%n%m%r%h%w%*\ %F\ %1*[FORMAT=%2*%{&ff}:%{&fenc!=''?&fenc:&enc}%1*]\ [TYPE=%2*%Y%1*]\ [COL=%2*%03v%1*]\ [ROW=%2*%03l%1*/%3*%L(%p%%)%1*]\ "设置状态栏依据不同状态显示不同色彩function! InsertStatuslineColor(mode) if a:mode == 'i' hi statusline guibg=peru elseif a:mode == 'r' hi statusline guibg=blue else hi statusline guibg=red endifendfunctionau InsertEnter * call InsertStatuslineColor(v:insertmode)au InsertLeave * hi statusline guibg=lightGreen guifg=blackhi statusline guibg=lightGreen"状态行色彩highlight CursorLine cterm=NONE ctermbg=lightGray ctermfg=green highlight StatusLineNC cterm=NONE ctermbg=lightGray ctermfg=green "highlight CursorLine cterm=NONE ctermbg=lightGray ctermfg=green guifg=lightGray guibg=green"highlight StatusLineNC cterm=NONE ctermbg=lightGray ctermfg=green guibg=lightGray guifg=green "highlight CursorLine cterm=NONE ctermbg=lightGray ctermfg=green guifg=red guibg=Green"highlight StatusLineNC cterm=NONE ctermbg=lightGray ctermfg=green guifg=Gray guibg=White"highlight CursorLine cterm=NONE guifg=red guibg=Green"highlight StatusLineNC cterm=NONE guifg=Gray guibg=White"----- 状态栏设置_END_ -----"ycm configurationlet g:ycm_confirm_extra_conf = 0let g:ycm_global_ycm_extra_conf='~/.ycm_extra_conf.py'let g:ycm_key_list_select_completion = ['<TAB>','<C-n>','<Down>']let g:ycm_key_list_previous_completion = ['<S-TAB>','<C-p>','<Up>']let g:ycm_complete_in_comments = 1 "在正文输出中也能补全let g:ycm_complete_in_strings = 1 "在字符串输出中也能补全let g:ycm_collect_identifiers_from_comments_and_strings = 0 "正文和字符串中的文字也会被支出补全let g:ycm_collect_identifiers_from_tags_files=1 " 开启 YCM 基于标签引擎let g:ycm_min_num_of_chars_for_completion=1 " 从第1个键入字符就开始列举匹配项let g:ycm_cache_omnifunc=0 " 禁止缓存匹配项,每次都从新生成匹配项"被动补全"let g:ycm_key_invoke_completion = '<S-Space>'let g:ycm_key_invoke_completion = '<c-k>'let g:ycm_seed_identifiers_with_syntax=1 " 语法关键字补全"nnoremap <leader>lo :lopen<CR> "open locationlist"nnoremap <leader>lc :lclose<CR> "close locationlist"inoremap <leader><leader> <C-x><C-o>let g:ycm_max_num_identifier_candidates = 50let g:ycm_auto_trigger = 1let g:ycm_error_symbol = '>>'let g:ycm_warning_symbol = '>'"YcmCompleter RefactorRename :重命名"YcmCompleter GoToSymbol nnoremap <leader>jo :YcmCompleter GoTo<CR> "跳转nnoremap <leader>jd :YcmCompleter GoToDefinitionElseDeclaration<CR> "跳转到定义或申明nnoremap <leader>jf :YcmCompleter GoToDefinition<CR> "跳转到定义nnoremap <leader>jl :YcmCompleter GoToDeclaration<CR> "跳转到申明nnoremap <leader>jt :YcmCompleter GetType<CR> "get类型nnoremap :js :YcmCompleter GoToSymbol nmap <leader>ji :YcmCompleter GoToInclude<CR> "跳转到include、申明或定义nmap <leader>jm :YcmCompleter GoToImprecise<CR> "跳转到实现nmap <leader>jr :YcmCompleter GoToReferences<CR> "跳转到援用nmap <leader>fi :YcmCompleter FixIt<CR> "依据Ycm的倡议修复谬误nnoremap <F6> :YcmForceCompileAndDiagnostics<CR> "从新编译和诊断nmap <F4> :YcmDiags<CR> "F4进行诊断bash 配置文件.bashrc ...

March 24, 2021 · 14 min · jiezi

关于vim:Xcode-配置-Vim

生成自签名证书关上 钥匙串拜访 利用,抉择如下图中 重签名 Xcode敞开 Xcode, 应用上面的命令对 Xcode 进行签名。 sudo codesign -f -s XcodeSigner /Applications/Xcode.app 这个步骤会比拟花工夫,请急躁期待。 要留神的是这里的 XcodeSigner 能够要和上一步生成的证书名字一样。另外,如果你的 Xcode 所在的目录与我不一样,也须要依据理论状况批改装置 XVim2克隆 XVim2 代码 git clone https://github.com/XVimProject/XVim2.git 装置 cd XVim2xcode-select -s /Applications/Xcode.app/Contents/Developermake实现后能够看如下图所示提醒 关上 Xcode, 此时会提醒是否加载 XVim2, 请抉择 Load Bundle 如果手误抉择错了,能够通过上面的形式进行重置,重启 Xcode 能够再呈现刚刚的提醒 defaults delete com.apple.dt.Xcode DVTPlugInManagerNonApplePlugIns-Xcode-X.X 其中的 X.X 写你的 Xcode 版本 XVim2 配置能够在 ~ 目录下创立一个 .xvimrc 文件来寄存 Xcode 中的配置。 参考以下内容:XVim github 地址XVim 官网指引

March 4, 2021 · 1 min · jiezi

关于vim:为了装-X我不做人了

浏览本文大略须要 5 分钟 。 很多接触 Vim 的程序员大略都有这样的经验: 受某些大牛影响看到 Vim 的高逼格。热血沸腾 ,本人看着文档尝试 ,学了几个命令后果决放弃。一段时间后 ,又看到某些大牛在宣扬 Vim 有多好用,多不便。循环\~\~\~循环\~\~\~受不了了, 从新捡起 Vim 学习 ,熟记各种命令。end, 算了 , 我还是滚回去用我的 IDE 吧\~\~\~这就是我的经验呀!!!! 就在方才,我在抉择删除大段文本时,又体验到了 Vim 的便捷好用(间接 :首行,尾行d 解决了!),所以我决定肯定要把刚开始用起来反人类的 Vim 纯熟应用 ,我要用它来装x ,” 我不做人了 “ 。 这个世界上只有三种程序员: 应用Vim的程序员应用EMACS的程序员应用其余编辑器的程序员看到这里 ,肯定会感觉我在吹牛 ,毕竟咱们都曾试过这种三分钟热度 \~\~\~ 别急啊 ,我有具体的施行办法 ,那就是将 IDE 的编辑形式强制规定为 Vim ,这办法真绝 ,堪称是不破不立 。 立贴为证 ,过段时间再来更新首次应用 Vim 的辛酸历程!!

March 3, 2021 · 1 min · jiezi

关于vim:Vim的简单使用

一、Vim 的简略实用记录 vim 的一些简略用法。 二、normal模式下的操作1、疾速回到上次编辑的中央按键盘的 gi 2、在文本间上下左右挪动h:左移j:下移k:上移l:右移3、疾速挪动到下一个单词w/W:疾速挪动到下一个单词结尾。 e/E:疾速挪动到下一给单词结尾。 b/B:回到上一个单词结尾。 上方小写字母和大写字符的区别,大写的示意以空白字符进行宰割,小写示意以非空白字符进行宰割。eg: aa "bb" cc,用小w会跳转到 双引号,在到b,在到c;用大W间接到双引号,而后到c。 4、行间的搜寻命令解释需要示例语句命令后果f{char}挪动到 {char} 这个字符上查问第一个 a(光标在此)bb cc aa dd aafa定位到 c前面的 a 上t{char}挪动到{char}这个字符的前一个字符上定位到a前面的空格bb cc aa(光标在此) dd aata定位到 d 前面的空格上F{char}反过来搜寻,挪动到这个字符{char}上。定位到d前面的a上bb cc aa dd(光标在此) aaFa定位到d前面的a上就像下面的 a可能呈现屡次,如果第一次没有搜寻到,能够应用 ;搜寻该行的下一个,应用,搜寻该行的上一个。 5、行首行尾的挪动命令解释示例语句,语句前后都有空格命令后果0挪动到行首aa bb cc0挪动到了a的最后面^挪动到第一个非空白字符的行首aa bb cc^ == [0w]挪动到了第一个a上$挪动到行尾aa bb cc$挪动到了c前面的空格上g_挪动到第一个非空白字符的行尾aa bb ccg_挪动到了最初的一个c上6、挪动到页面的顶部、尾部、翻页gg:挪动到页面的顶部。 G:挪动到页面的尾部。 ctrl+o: 在上次的地位之间跳转。 ctrl+u:向上翻页。 ctrl+f:向下翻页。 zz:把以后行搁置在屏幕的地方。 7、删除操作1、删除一个或n个字符x:删除一个字符 [数字]x:删除多个字符, eg: 3x 示意删除3个字符。 2、删除一个单词dw/daw:删除以后字符到这个词完结的局部。 diw:删除一个单词 单词光标命令后果解释aa hello word.在 e 处dwaa hword.删除从e开始到w前所有的字符(删除了空格)aa hello word.在 e 处diwaa word.删除从e开始到o完结的所有的字符(没有删除空格)3、删除行dd:删除行 ...

February 20, 2021 · 1 min · jiezi

关于vim:与-Windows-Gvim-第一次握手安装与配置

Winodws Gvim零碎: Windows 10版本: Gvim 8.2 Install Gvim PackageVim的官方网站找到侧边栏的Download点击进去再抉择Windows零碎点击这个下载啦!兴许将来的你,看到这里并不是8.2版本,不过没关系,只有是8.0以上都是能够的,但我还是倡议应用8.2版本,比较稳定Vim8.2直通车点击下载即可 Install Gvim Software装置Gvim很简略,始终下一步就能够了,在装置目录最好不要抉择C:盘 Configure Gvim当初就开始配置Gvim 留神:如果您应用压缩包(.zip)的形式进行下载Gvim请先配置环境变量,应用安装程序(.exe)的不必进入Vim的文件夹(你们本人的)会看到有vim82文件夹和_vimrc文件vim82是存储Gvim的文件夹_vimrc是用来配置Gvim的文件 2.应用记事本关上_vimrc, 把这个文件移进去就好了这样你就会看到一些Vim官网曾经编写好的信息,将全副删除 3.将下方代码复制进去 filetype indent plugin on " 自动识别文件类型" 窗体设置source $VIMRUNTIME/delmenu.vimsource $VIMRUNTIME/menu.vimset cursorline" 窗口大小set lines=35 columns=140" 宰割进去的窗口位于以后窗口下边/左边set splitbelowset splitright"不显示工具/菜单栏set guioptions-=Tset guioptions-=mset guioptions-=Lset guioptions-=rset guioptions-=b" 应用内置 tab 款式而不是 guiset guioptions-=eset nolist" set listchars=tab:?\ ,eol:?,trail:·,extends:>,precedes:<" 设置编码set encoding=utf-8set termencoding=utf-8set fileencoding=utf-8set fileencodings=utf-8,gbk2312,gbk,gb18030,cp936set langmenu=zh_CNlet $LANG = 'en_US.UTF-8'" 关上语法高亮syntax on" 在底部显示,以后处于命令模式还是插入模式set showmode" 命令模式下,在底部显示,以后键入的指令。比方,键入的指令是`2y3d`,那么底部就会显示`2y3`,当键入`d`的时候,操作实现,显示隐没set showcmd" 反对应用鼠标set mouse=a" 启用256色set t_Co=256" 按下回车键后,下一行的缩进会主动跟上一行的缩进保持一致"set autoindent" 因为 Tab 键在不同的编辑器缩进不统一,该设置主动将 Tab 转为空格set expandtab" 显示行号set number" 显示光标所在的以后行的行号,其余行都为绝对于该行的绝对行号set relativenumber" 光标所在的当前列高亮"set cuc" 光标所在的以后行高亮set cul" 主动折行,即太长的行分成几行显示set wrap" 在状态栏显示光标的以后地位(位于哪一行哪一列)set ruler" 光标遇到圆括号、方括号、大括号时,主动高亮对应的另一个圆括号、方括号和大括号set showmatch" 搜寻时,高亮显示匹配后果set hlsearch" 输出搜寻模式时,每输出一个字符,就主动跳到第一个匹配的后果set incsearch" 搜寻时疏忽大小写set ignorecase" Tab键的宽度set tabstop=4" 对立缩进为4set softtabstop=4set shiftwidth=4再关上Gvim就能够看到一个简洁的界面 ...

February 15, 2021 · 1 min · jiezi

关于vim:如何使用vim快速加密和解密文件

每当您在Linux零碎中有一个想要放弃私密的文本文件,无论零碎中领有帐户的其余用户可能具备什么特权,您都能够借助加密来实现。一种简略的办法是应用vim编辑器中内置的性能。您须要提供一个明码,而后记住该明码或将其存储在明码保险箱中,该过程非常简单。文件名无奈更改,复原文件内容的形式与加密形式简直雷同。 首先,假如咱们有一个以这样结尾的文件: $ head -3 mysecretI feel the need to put my deepest darkest secret into a text file on my Linuxsystem. While this likely isn't common practice, I'm not sure that I can trustanyone with it. But a penguin? That's a different story! So here goes ...当初,如果不想让其余用户晓得您的私密信息,能够应用带-x(加密)选项的vim。 $ vim -x mysecretvim编辑器将立刻索要加密密钥。您将输出两次明码。请留神,明码输出时不会显示,而是每个字符将显示为星号。 Enter encryption key: *Enter same key again: *一旦vim关上了文件,它看起来很失常,您能够持续编辑详细信息或增加到您的私密信息中——如果您想这么做,也能够写出加密模式的文件。 想写出加密的内容,只需像平时应用vim那样保留文件即可。 :wq随后试图查看该文件的任何人都可能会看到以下内容: VimCrypt~036▒!y)K▒▒i▒▒▒▒▒{▒z▒▒▒D▒:▒▒7▒▒蝇Xd▒#n▒▒▒q4▒▒▒^9▒|▒▒▒+A▒]j▒▒▒a▒N▒▒▒▒▒▒▒▒}▒▒&f▒▒A3▒Wt[▒T:▒ny▒*▒▒}▒▒▒▒▒"▒▒▒^▒C▒E▒W▒▒v▒pV▒_▒Cj.EA▒▒▒#▒ex▒:▒K▒▒`P▒u▒ ▒▒yhK▒X▒▒(W▒s(RY▒A▒▒▒l9▒▒▒_▒▒▒▒▒I▒▒Lk▒ ▒k▒▒▒▒=▒5G▒▒▒t▒2▒gF▒ 3▒Iq▒C▒▒▒▒OZ[▒l▒_▒~▒▒z一旦您筹备好再次读取文件或持续具体表述私密信息,请再次应用vim命令,并在零碎呈现提醒时输出明码。 $ vim mysecretNeed encryption key for "mysecret"Enter encryption key: *内容会再次以纯文本显示。 I feel the need to put my deepest darkest secret into a text file on my Linuxsystem. While this likely isn't common practice, I'm not sure that I can trustanyone with it. But a penguin? That's a different story! So here goes ...用通常的:wq完结vim会话,文件将放弃加密状态。 如果您筹备在某个时候与别人共享您的私密信息,能够像当初调用它那样解密文件。首先应用vim -X命令。留神这回应用大写的X: $ vim -X mysecretNeed encryption key for "mysecret"Enter encryption key: *随后您会看到原始文本。 I feel the need to put my deepest darkest secret into a text file on my Linuxsystem. While this likely isn't common practice, I'm not sure that I can trustanyone with it. But a penguin? That's a different story! So here goes ...而后输出:X,然而当零碎提醒您再次输出加密密钥(两次)时,只需按回车键: Enter encryption key:Enter same key again:应用:wq再次写出文件。之后,您的文件将复原为未加密模式。 $ head -3 mysecretI feel the need to put my deepest darkest secret into a text file on my Linuxsystem. While this likely isn't common practice, I'm not sure that I can trustanyone with it. But a penguin? That's a different story! So here goes ...更多的抉择 还有许多其余工具可用于加密文件,然而这种办法只须要vim和用于记住密钥的任何办法。要确定某个文件是否被vim加密,能够运行file命令。在上面的示例中,咱们看到该命令告诉您文件何时加密以及何时未加密。 $ file mysecretmysecret: Vim encrypted file data$ file mysecretmysecret: UTF-8 Unicode text原文题目:Using vim to quickly encrypt and decrypt files,作者:Sandra Henry-Stocker

February 2, 2021 · 1 min · jiezi

关于vim:Vim-中用-language-server-对-Raku-perl6-脚本进行实时语法检查

之前整顿了一个 Raku 脚本作为 vim/neovim 中 Raku 的 language server, 它能在文件保留后对 Raku 脚本进行语法查看. 因为之前的 language server 脚本中应用了 raku -c foobar.raku 语句对脚本进行语法查看. 上述语法查看须要文件数据, 所以必须将编辑器缓冲区的内容写入文件中, 而后能力进行语法查看. 基于上述办法, 如果须要实时进行语法查看的话, 可能的形式是建设一个临时文件, 在产生内容扭转事件时缓冲区内容写入临时文件. 之后能力运行 raku -c temporary_file.raku 来对语法进行查看. 建设临时文件的办法也是目前 Atom raku 插件 和 VS Code raku 插件所应用的策略. 在看 Raku 语法解析库 Raku-Parser 代码的时候, 发现原来 NQP 提供了解析 Raku 脚本并进行语法查看的性能. 通过NQP提供的性能, 就能够解脱临时文件利用language server 对在 vim/neovim 中编辑的 Raku 脚本做实时的语法查看了. 在文章的最初, 我整顿了一个新的脚本, 并且有相干的配置阐明. 如果只想晓得如何配置的话能够间接跳到最初. NQP Raku 语法分析NQP 中 Raku 语法分析的性能非常容易就能够在 Raku 脚本中被调用. 上面是一个例子: ...

January 31, 2021 · 7 min · jiezi

关于vim:Vim使用全指南-环境配置插件推荐美化-CPythonMarkDownR

提醒1:本文次要解说了Windows下Vim的应用,配置,丑化与应用Vim写C++,Python,MarkDown,R。其余语言的插件很不分明 提醒2:Vim是一款工具,应用Vim是为了放慢您的Coding效率的,不要配置比应用的工夫还长(尽管很好玩) 提醒3:我想把这篇文章写的尽量的长,目标是帮忙更多同学绕过Vim配置中的诸多天坑,请急躁观看,毕竟这要比你用一个星期去配置Vim来的快很多 提醒4:Manjarol来的先读16节 目录0.为什么要写这篇文章1.Vim的简介2.Vim的起源2.1 Ken Thompson 写了一个行编辑器(Line Editor)2.2 Bill Joy 写了一个文本编辑器2.3 Bram Moolenaar 编写了 Vim3.Vim的下载与装置(退出Vim到环境变量)4. 意识与关上Vim5. Vim根本的应用阐明5.1 用Vim关上文件5.2 Vim的四种模式5.2.1Normal Mode5.2.2 Last line mode模式5.2.3 Insert模式5.2.4 Visual模式5.3 宏录制6. Vim的配置文件根本应用办法6.1 第一个Vim配置,行号6.2 设置快捷键映射6.3 装置插件管理器6.4 尝试装置第一个插件6.5 尝试卸载第一个插件7. 基于问题解决的配置介绍7.1 对于gVim7.2 为关上_vimrc配置快捷键7.3 为Vim配置默认编码7.4 为Vim配置代码高亮7.5 将gVim的语言批改为英文方便使用[7.6[间接写上]向下兼容vi](https://blog.csdn.net/Liukair...7.7 在可视化下兼容鼠标7.8 将缩进设置为空格7.9 缩进配置为4空格7.10 在空行末显示$7.11 渲染Tab和空格7.12 尽可能在滚动的时候留下几行7.13 开启退格跨行退格7.14 开启代码折叠[7.15 在三种模式下采纳三种光标[仅gVim]](https://blog.csdn.net/Liukair...7.16 永远保留命令行7.17 在从新关上文件后保留光标地位7.19 主动缩进[7.20 设置字体[仅gVim]](https://blog.csdn.net/Liukair...7.21 暗藏gVim的四个滚动条7.21 设置绝对行号7.22 突出显示选中的字符所在行列7.23 主动换行7.24 显示输出的命令(右下角)7.25 输出命令的时候Tab显示提醒7.26 智能查找 高亮显示后果7.27 复制粘贴到剪贴板7.28 快捷保留 刷新7.29 设置分屏7.30 减少删除tabe标签7.31 插入模式挪动光标8. 编译程序9. 在插件介绍之前的筹备10. 通用插件的介绍10.1 输入法切换: xkb-switch10.2 Vim外部的todolist: undotree10.3 Vim外部的文件树:NERDTreeToggle10.4 Vim弱小状态栏:Airline10.5 多语言代码查错:ALE10.6 代码主动正文:nerdcommenter10.7 代码彩虹括号10.8 自定义开始菜单10.9 全语言代码主动补全10.10 Vim主动括号补全10.11 Vim函数整顿10.12 gVim界面通明11. 特定语言的插件介绍11.1 C/C++的插件11.1.1 主动格式化代码11.1.2 代码高亮11.1.3 代码查看ALE11.2Python的插件11.2.1 语言反对11.2.2 代码查看ALE11.3 LaTeX的插件11.4 MarkDown的插件11.4.1 MarkDown预览11.4.2 MarkDown主动输出表格11.5 R语言插件12. 解决ESC13. Vim 键位图14. 优良的参考与学习资源15. 我的Vim配置16 Vim 在Linux下的配置*0.为什么要写这篇文章因为依赖win下的很多软件,不不便间接切换到Linux,然而对于Win下的vim应用阐明与参考太少了,本人摸索了一段时间,斗胆分享一下,还请老哥们指教以下是我目前的工作环境 ...

December 28, 2020 · 23 min · jiezi

关于vim:5分钟学会-Vim-分屏操作方方面面

Vim分屏性能是通过宰割窗口来实现的,这是进步工作效率的一大利器。无论咱们想同时显示两个文件,或者同时显示一个文件的两个不同的地位,又或者并排比拟两个文件,等等,这些都能通过分屏来实现,这样子很不便代码的比对和复制粘贴 程度方向分屏关上新文件 :sp linuxmi.py或者:split linuxmi.py这个命令把窗口横向切分为两个窗口,并把光标置于下面的窗口中。垂直方向分屏关上新文件 :vsp linux.py:vsplit linux.py:sview linux.py ->只读分屏关上文件另外,要关上窗口编辑一个新的文件时,能够用以下命令::new 从命令行间接关上多个文件且是分屏 vim -On file1, file2 … ->垂直分屏vim -on file1, file2 … ->程度分屏linuxmi@linuxmi:~/www.linuxmi.com$ vim -O3 linux.py linuxmi.py linuxmi.cpp注:-O垂直分屏,-o程度分屏,n示意分几个屏 实时调整以后窗口的宽度 ctrl-w > //向右加宽,默认值为1ctrl-w N > //向右加宽宽度Nctrl-w < // 同理 横屏/竖屏分屏关上以后文件 ctrl+w sctrl+w v 切换分屏 ctrl+w h,j,k,lctrl+w 上下左右键crtl+w进行分屏窗口的切换 按完当前再按一个wcrtl+w进行分屏窗口的切换 按完当前再按一个r 调换窗口crtl+w进行分屏窗口的切换 按完当前再按一个c 敞开窗口 敞开分屏 敞开窗口有以下几个个命令:ctrl+W c 敞开以后窗口ctrl+w q 敞开以后窗口,若只有一个分屏且退出vim:only 仅保留以后分屏:hide 敞开以后分屏 调整分屏的大小(宽度与高度) ctrl+w = 所有分屏都对立高度ctrl+w + 减少高度,默认值为1ctrl+w - 缩小高度10 ctrl+w + 减少10行高度ctrl-w N + //以后屏高度加N应用指定以后屏的调整高度: res[ize] N示例::resize 30 ...

December 18, 2020 · 1 min · jiezi

关于vim:小知识Linux系统ssh连接的超时时间设置

判断是否是否设置了超时工夫命令行: echo $TMOUT 例如:[iyunv@xxx ~]# echo $TMOUT 100 输入100,则超时工夫为100秒。 如果输入空或0示意不超时,大于0的数字n示意n秒内通道未应用则超时。批改超时工夫参数1、关上配置文件:vi /etc/profile2、找到export TMOUT=xxxx这一行,批改工夫值xxxx为你须要的工夫,比方export TMOUT=6003、是配置失效:source /etc/profile

December 9, 2020 · 1 min · jiezi

关于vim:打造一款高逼格的-Vim-神器

Vim 是一个上古神器,本篇文章次要继续总结应用 Vim 的过程中不得不理解的一些指令和注意事项,以及继续分享一个前端工作者不得不装置的一些插件,而对于 Vim 的简介,主题的抉择,以及为何应用 vim-plug 来治理插件等内容,有趣味的同学下来能够本人理解和比照下。 装置sudo apt-getinstall vim// Ubuntu其余平台,能够自行谷歌。 老手指南vimtutor// vim 教程下面是史上最简略,最全面的Vim基础教程,至今无人超过。 上面是作者基于下面的演绎: 挪动光标# hjkl# 2w 向前挪动两个单词# 3e 向前挪动到第 3 个单词的开端# 0 挪动到行首# $ 以后行的开端# gg 文件第一行# G 文件最初一行# 行号+G 指定行# <ctrl>+o 跳转回之前的地位# <ctrl>+i 返回跳转之前的地位退出# <esc> 进入失常模式# :q! 不保留退出# :wq 保留后退出删除# x 删除以后字符# dw 删除至以后单词开端# de 删除至以后单词开端,包含以后字符# d$ 删除至以后行尾# dd 删除整行# 2dd 删除两行批改# i 插入文本# A 以后行开端增加# r 替换以后字符# o 关上新的一行并进入插入模式撤销# u 撤销# <ctrl>+r 勾销撤销复制粘贴剪切# v 进入可视模式# y 复制# p 粘贴# yy 复制以后行# dd 剪切以后行状态#<ctrl>+g 显示以后行以及文件信息查找# / 正向查找(n:持续查找,N:相同方向持续查找)# ? 逆向查找# % 查找配对的 {,[,(# :set ic 疏忽大小写# :set noic 勾销疏忽大小写# :set hls 匹配项高亮显示# :set is 显示局部匹配替换# :s/old/new 替换该行第一个匹配串# :s/old/new/g 替换全行的匹配串# :%s/old/new/g 替换整个文件的匹配串折叠# zc 折叠# zC 折叠所有嵌套# zo 开展折叠# zO 开展所有折叠嵌套执行外部命令# :!shell 执行外部命令.vimrc.vimrc 是 Vim 的配置文件,须要咱们本人创立: cd Home               // 进入 Home 目录touch .vimrc          // 配置文件# Unix# vim-plug# Vimcurl -fLo ~/.vim/autoload/plug.vim --create-dirs     https://raw.githubusercontent.com/junegunn/vim-plug/master/plug.vim# Neovimcurl -fLo ~/.local/share/nvim/site/autoload/plug.vim --create-dirs     https://raw.githubusercontent.com/junegunn/vim-plug/master/plug.vim其余平台,能够查看 vim-plug[1]。 根本配置勾销备份set nobackupset noswapfile文件编码setencoding=utf-8显示行号setnumber勾销换行setnowrap显示光标以后地位setruler设置缩进set cindentset tabstop=2set shiftwidth=2突出显示以后行setcursorline查找set icset hlsset is左下角显示以后vim模式setshowmode代码折叠#启动 vim 时敞开折叠代码set nofoldenable主题syntax enableset background=darkcolorscheme solarized◈ altercation/vim-colors-solarized[2]◈ Anthony25/gnome-terminal-colors-solarized[3] 插件配置树形目录Plug 'scrooloose/nerdtree'Plug 'jistr/vim-nerdtree-tabs'Plug 'Xuyuanp/nerdtree-git-plugin'autocmd vimenter * NERDTreemap <C-n> :NERDTreeToggle<CR>let NERDTreeShowHidden=1let g:NERDTreeShowIgnoredStatus = 1let g:nerdtree_tabs_open_on_console_startup=1let g:NERDTreeIndicatorMapCustom = {     "Modified"  : "✹",     "Staged"    : "✚",     "Untracked" : "✭",     "Renamed"   : "➜",     "Unmerged"  : "═",     "Deleted"   : "✖",     "Dirty"     : "✗",     "Clean"     : "✔︎",     'Ignored'   : '☒',     "Unknown"   : "?"     }# o 关上敞开文件或目录# e 以文件治理的形式关上选中的目录# t 在标签页中关上# T 在标签页中关上,但光标依然留在 NERDTree# r 刷新光标所在的目录# R 刷新以后根门路# X 收起所有目录# p 小写,跳转到光标所在的上一级门路# P 大写,跳转到以后根门路# J 到第一个节点# K 到最初一个节点# I 显示暗藏文件# m 显示文件操作菜单# C 将根门路设置为光标所在的目录# u 设置下级目录为根门路# ctrl + w + w 光标主动在左右侧窗口切换# ctrl + w + r 挪动以后窗口的布局地位# :tabc 敞开以后的 tab# :tabo   敞开所有其余的 tab# :tabp   前一个 tab# :tabn   后一个 tab# gT      前一个 tab# gt      后一个 tab◈ scrooloose/nerdtree[4]◈ vim-nerdtree-tabs[5]◈ nerdtree-git-plugin[6] 代码,引号,门路补全Plug 'Valloric/YouCompleteMe'Plug 'Raimondi/delimitMate'Plug 'Shougo/deoplete.nvim', { 'do': ':UpdateRemotePlugins' }◈ Valloric/YouCompleteMe[7]◈ Raimondi/delimitMate[8]◈ Shougo/deoplete.nvim[9] 语法高亮,查看Plug 'sheerun/vim-polyglot'Plug 'w0rp/ale'let g:ale_linters = {    'javascript': ['eslint'],    'css': ['stylelint'],}let g:ale_fixers = {    'javascript': ['eslint'],    'css': ['stylelint'],}let g:ale_fix_on_save = 1let g:ale_sign_column_always = 1let g:ale_sign_error = '●'let g:ale_sign_warning = '▶'nmap <silent> <C-k> <Plug>(ale_previous_wrap)nmap <silent> <C-j> <Plug>(ale_next_wrap)◈ w0rp/ale[10]◈ sheerun/vim-polyglot[11] 文件,代码搜寻Plug 'rking/ag.vim'Plug 'kien/ctrlp.vim'◈ kien/ctrlp.vim[12]◈ ggreer/the_silver_searcher[13]◈ rking/ag.vim[14] 加强版状态栏Plug 'vim-airline/vim-airline'Plug 'vim-airline/vim-airline-themes'let g:airline_theme='papercolor'◈ vim-airline/vim-airline[15]◈ vim-airline/vim-airline-themes[16] 代码正文Plug 'scrooloose/nerdcommenter'# <leader>cc // 正文# <leader>cm 只用一组符号正文# <leader>cA 在行尾增加正文# <leader>c$ /* 正文 */# <leader>cs /* 块正文 */# <leader>cy 正文并复制# <leader>c<space> 正文/勾销正文# <leader>ca 切换 // 和 /* */# <leader>cu 勾销正文let g:NERDSpaceDelims = 1let g:NERDDefaultAlign = 'left'let g:NERDCustomDelimiters = {             'javascript': { 'left': '//', 'leftAlt': '/**', 'rightAlt': '*/' },             'less': { 'left': '/**', 'right': '*/' }         }◈ scrooloose/nerdcommenter[17] gitPlug 'airblade/vim-gitgutter'Plug 'tpope/vim-fugitive'◈ airblade/vim-gitgutter[18]◈ tpope/vim-fugitive[19] MarkdownPlug 'suan/vim-instant-markdown'let g:instant_markdown_slow = 1let g:instant_markdown_autostart = 0# :InstantMarkdownPreview◈ suan/vim-instant-markdown[20] EmmetPlug 'mattn/emmet-vim'let g:user_emmet_leader_key='<Tab>'let g:user_emmet_settings = {          'javascript.jsx' : {             'extends' : 'jsx',          },       }◈ mattn/emmet-vim[21] html 5Plug'othree/html5.vim'◈ othree/html5.vim[22] css 3Plug 'hail2u/vim-css3-syntax'Plug 'ap/vim-css-color'augroup VimCSS3Syntax  autocmd!  autocmd FileType css setlocal iskeyword+=-augroup END◈ hail2u/vim-css3-syntax[23]◈ ap/vim-css-color[24] JavaSciptPlug 'pangloss/vim-javascript'let g:javascript_plugin_jsdoc = 1let g:javascript_plugin_ngdoc = 1let g:javascript_plugin_flow = 1set foldmethod=syntaxlet g:javascript_conceal_function             = "ƒ"let g:javascript_conceal_null                 = "ø"let g:javascript_conceal_this                 = "@"let g:javascript_conceal_return               = "⇚"let g:javascript_conceal_undefined            = "¿"let g:javascript_conceal_NaN                  = "ℕ"let g:javascript_conceal_prototype            = "¶"let g:javascript_conceal_static               = "•"let g:javascript_conceal_super                = ""let g:javascript_conceal_arrow_function       = "⇒"let g:javascript_conceal_noarg_arrow_function = " "let g:javascript_conceal_underscore_arrow_function = " "set conceallevel=1◈ pangloss/vim-javascript[25](注:上述脚本中存在特殊字符,有的状况下显示不正确,请间接用上述链接的内容。) ReactPlug 'mxw/vim-jsx'let g:jsx_ext_required = 0◈ mxw/vim-jsx[26] ...

October 22, 2020 · 1 min · jiezi

关于vim:vim编辑器-底色阴影解除

明天在应用vim编辑器时,没有留神到点到了什么,导致在文件中bind单词底部都有黄色的暗影; 能够在vim编辑器中底层模式中输出:nohlsearch 胜利解决了我的问题; 查到有人说:如果心愿当前都不在呈现这个状况,能够用set nohlsearch 把它放在vimrc里,能够永恒失效。

September 9, 2020 · 1 min · jiezi

关于vim:建议收藏史上最全的-vim-快捷键文档

版本一 版本二 版本三 版本四 版本五

August 25, 2020 · 1 min · jiezi

vim代码折叠之html文件

最近编辑html,发现有须要折叠代码,查了一下,做个笔记。 set foldmethod=manual在某个标签处,zfat或zfit 能够创立一个折叠,而后用za就能够关上或者敞开一个折叠,I have found zfat (or, equally, zfit) works well for folding with HTML documents. za will toggle (open or close) an existing fold. zR opens all the folds in the current document, zM effectively re-enables all existing folds marked in the document.

July 15, 2020 · 1 min · jiezi

Vim-操作实用案例分析一批量在行首或行尾添加内容

我们写代码或者文档时,经常需要在多行的行首或者行尾添加同样的内容,手动一行行操作显然效率很低,做这样的事情有方便的技巧。 案例一把 aaabbbcccdddeee改成 # aaa# bbb# ccc# # ddd# eee注释掉一段代码是非常常用的操作,很多人都知道如何操作,直接替换即可: :%s/^/# # 后有一个空格。^ 只匹配行首的位置,而不匹配任何字符,所以可以直接替换,$ 也同理。 另外也可以用列选择模式(<C-v>,也可以用 <C-q>,因为 <C-v> 通常用于粘贴,可以在 Vim 或者终端中把 <C-v> 映射为粘贴功能,这样和其他软件一致会方便不少),选定这些行,然后 I# <Esc> 但这样想跳过空行就不大方便了,所以不展开了。 案例二很多人不喜欢在空行的行首添加注释(尤其不想在行尾添加一个空格),所以需要把 aaabbbcccdddeee改成 # aaa# bbb# ccc# ddd# eee先全部替换再删除效率肯定低下,可以这样: :%s/./# &重点是对 & 的使用,它代表前边匹配到的内容(也就是非空行的第一个字符)。 案例三实际场景我们很少整体注释掉一个文件,一般都是注释其中的某一段,比如把 aaabbbcccdddeeefffggghhhiii改成 aaabbbccc# ddd# eee# fff# ggghhhiii这次操作是从第 5 行开始,下次操作可能就从 193 行开始了,用 5G 定位后再操作肯定不通用也不方便,用搜索定位通常会方便很多: :/ddd/,/ggg/s/./# &:/ddd/,/ggg/ 就是让后边的操作只作用于 ddd 和 ggg 之间。 有时我们只需要用搜索定位到起始行,然后注释掉后边确定的几行(在这里注释当前行和后边的 4 行),可以这样: :/ddd/,+4s/./# &+4 的意思是把之后的 4 行也放到作用范围内。如果直接用行号,改成行号就行,比如 5,+4 、5,9。如果想先选定再操作,定位到起始行,然后 V,再定位到结束行,再输入 :s/./# & 就可以,都是常规操作,不赘述。 ...

June 29, 2020 · 1 min · jiezi

VSCode-帮助贫困的乌干达儿童

最近把开发环境从 WebStorm 迁移到了世界上最好的编辑器 VSCode,因为需要经常开启多个项目,CPU 和内存都爆了只能弃坑。使用过一段时间 vsc 发现里面自带插件库有个叫做 vscodevim 的插件特别有意思。它使用了一些诡异的键位和模式,和普通编辑体验差别很大,但是一看评价这么高,下载量这么大,我一度怀疑自己。看来大家都很认可这个插件,坚持使用了一段时间,发现这些诡异的键位用起来是真的特别爽,颠覆了我对文本编辑体验的认知。接下来我要开始安利了! 模式要学会使用 vim 首先要弄清楚它和其他编辑器最大的区别之一就是它拥有多个模式,而其他大部分编辑器就只有编辑模式,直接就能插入修改删除,作为一篇安利入门性质文章,我们需要知道 vim 中最重要的四种模式。 normal<esc>:可以简单的理解为浏览模式,默认就是 normal,在这种状态下你可以移动光标,跳转翻页,也可以做一些其他如删除等操作,在插入模式下按 esc 回到 normal 模式。insert<i>:就是常用编辑器的编辑态,符合我们常规的使用方式,在 normal 下按 i 键进入插入模式。command<:>: 在 normal 模式下按冒号进入命令模式,比如 :wq 退出 vim。visual<v>:和 normal 类似但是命令会高亮选中区域,类似普通编辑器选中了一段文本。vim 不止这四种模式,但是这几种是比较常用到的,更多模式可以看 vim 文档。 Text Objectvim 对文本进行了抽象,句子由单词组成,段落由句子组成,文章由段落组成,如一个单词就是一个 text-object,它配合 operator 可以进行一些非常高效的操作。常见文本对象的类型: iw - inner wordaw - a wordis - inner sentenceas - a sentenceip - inner paragraphap - a paragraph如果结合下面要提到的 operator 就可以组合成一个指令如:daw(delete a word) 即可删除当前光标下的单词。 Motionvim 中使用一些 motion 可以快速的来移动光标,如: ...

September 8, 2019 · 2 min · jiezi

基础环境搭建

前提:macOS工欲善其事必先利其器 node下载安装git配置:命令行下git config --global user.name xxxgit config --global user.email xxxgit config --global push.default simplegit config --global core.quotepath falsegit config --global core.editor "vim"vscode Github账号ssh

September 8, 2019 · 1 min · jiezi

Vim从小白到入门

前言Vim 是从 vi 发展出来的一个文本编辑器。代码补全、编译及错误跳转等方便编程的功能特别丰富,在程序员中被广泛使用。和 Emacs 并列成为类 Unix 系统用户最喜欢的编辑器。而 Windows ❤️ Linux 的态度转变相信大家会经常使用到Vim文本编辑器,关于Vim的文章网上已经很多了本文只记录自己常用的作为备忘录,然而熟练掌握的方法始终只有一个字用。 Vim从小白到入门更新历史2019年09月06日 - 初稿 阅读原文 - https://wsgzao.github.io/post... 扩展阅读 Vim英文文档 - http://vimdoc.sourceforge.net... Vim中文文档 - http://vimcdoc.sourceforge.ne... Vim键盘图 Vim入门5步骤完成以下练习恭喜你打开Vim的大门vim HelloWorld.txt键入 i编辑 输入任意信息,如Hello World键入 [ESC]键入:wq 保存退出你可以访问Vim在线练习模拟器,通过引导熟悉Vim Vim基础概念Vim常用模式 正常模式 (Normal Mode)插入模式 (Insert Mode)可视模式 (Visual Mode)命令模式 (Command Mode)①. 正常模式 (Normal Mode)正常模式主要用来浏览和修改文本内容的 一般的,打开 Vim 都是正常模式。在任何模式下,只要按下 Esc 键就可以返回正常模式。 ②. 插入模式 (Insert Mode)插入模式则用来向文本中添加内容的,我自己常用的是i和o i 在光标所在字符前开始输入文字并进入插入模式 o (字母 o) 在光标所在行的下面单独开一新行来输入文字并进入插入模式 ③. 可视模式 (Visual Mode)可视模式相当于高亮选取文本后的普通模式。 可视模式具有子模式,以行为单位进行选取的可视行模式,使用 “V” 键进入(也就是 Shift+v);和以块为单位进行选取的可视块模式,使用 “Ctrl+v” 键进入。 ...

September 6, 2019 · 2 min · jiezi

将-Gitbash-置入-Windows-Terminal

文章首发于 个人博客。 Git-bash 允许开发人员在 Windows 上运行部分 Linux 命令。但是外观没有 Windows Terminal 中的 CMD 漂亮,现在来将 Git-bash 置入 Windows Terminal 里面。 在已经安装好 Git 的情况下,找到 Git 的安装路径,将 bin 加入到环境变量的 path 里面。我这是 C:\Program Files\Git\bin,最终我们会用到里面的 bash.exe 程序。省略这一步骤也行,后面的配置文件中就需要填入 bash.exe 的完整路径。 下载一个 Git 的图标,地址见 gwindows_logo。将在下载的图标保存到任意一个文件夹,此处我保存在 C:\\ProgramData\\Microsoft\\Windows\\Start Menu\\Programs\\Git\\gwindows_logo.png 。 在应用商店 Microsoft store 下载安装好 Windows Terminal 并运行。点击右侧下拉菜单选择 Settings 编辑 profiles.json 文件。在 json 文件中,复制 profiles 数组中的第一个 CMD 配置文件,并添加到 profiles 数组里面,让它成为该数组的第一个元素。现在 profiles 数组里面有三个元素,其中第 0 和 1 个元素完全一样,都是对 CMD 的相关配置。编辑第 0 个元素的信息如下,需要编辑的部分都已经有注释: ...

August 28, 2019 · 5 min · jiezi

Linux-vim编辑器vim别名设置

CentOS中设置 vi=vim首先需要确定CentOS中安装了vim——输入命令vim不会报错如果报错,输入 yum -y install vim要想设置成vi=vim,只能通过设置别名 alias 的方式但是如果直接输入alias vi='vim'只是对当前会话有效,关掉虚拟终端再打开就无效 正确的方法是修改当前用户的“用户文件夹”里面的配置文件.bashrc在命令行中输入vi ~/.bashrc键盘输入 i (进入编辑模式)来输入添加 alias vi='vim'按 ESC 键退出编辑模式,并输入 :wq 保存退出。最后在在命令行中输入 source ~/.bashrc大功告成!!!

August 7, 2019 · 1 min · jiezi

WebRTC源码目录结构

以下是对WebRTC入门学习课程的源码目录结构的整理,方便后续学习时进行查询。 源码对应的目录结构目录对应的功能apiWebRTC接口层,浏览器都是通过该接口调用WebRTCcall数据流的管理层,call代表同一个端点的所有数据的流入流出vedio与视频相关的逻辑audio与音频相关的逻辑common_audio音频算法相关common_vedio视频算法相关media与多媒体相关的逻辑处理,如编解码的逻辑处理logging日志相关module最重要的目录,子模块pcPeer Connection,连接相关的逻辑层p2p端对端相关代码,stun,turnrtc_base基础代码,如线程、锁相关的统一接口接口代码rtc_tool音视频分析相关的工具代码tool_webrtcWebRTC测试相关的工具代码,如网络模拟器system_wrappers与具体操作系统相关的代码。如CPU特性,原子操作等stats存放各种数据统计相关的类sdk存放android和iOS层代码。如视频的采集,渲染重要模块module对应的目录结构目录对应的功能audio_coding音频编解码相关代码audio_device音频采集与音频播放相关的代码audio_mixer混音相关的代码audio_processing音频前后处理相关的代码bitrate_controller码率控制相关的代码congestion_controller流控制相关的代码desktop_controller桌面采集相关的代码pacing码率探测及平滑处理相关的代码remote_bitrate_estimator远端码率估算相关的代码rtp_rtcprtp/rtcp协议相关的代码vedio_capture视频采集相关的代码vedio_coding视频编解码相关的代码video_processing视频前后处理相关的代码

June 28, 2019 · 1 min · jiezi

Spark-History-Server配置

本文是对于自己编译的Spark部署,如果是CDH集成的Spark则可直接在管理界面中查看。 1.在hdfs中创建一个目录,用于保存Spark运行日志信息。]$ hdfs dfs -mkdir /spark/historylog2.配置spark conf,使Spark History Server从此目录中读取日志信息]$ vim spark-defaults.confspark.eventLog.compress truespark.eventLog.dir hdfs://nameservice1/spark/historylogspark.yarn.historyServer.address hadoop002:18080其中spark.eventLog.dir保存日志相关信息的路径,可以是hdfs://开头的HDFS路径,也可以是file://开头的本地路径,都需要提前创建。 3.添加环境参数]$ vim spark-env.sh export SPARK_HISTORY_OPTS="-Dspark.history.fs.logDirectory=hdfs://mycluster/spark/historylog \ -Dspark.history.ui.port=18080 \ -Dspark.history.retainedApplications=20"4.启动服务]# ./sbin/start-history-server.sh

June 27, 2019 · 1 min · jiezi

WebRTC介绍

一、 WebRTC是什么WebRTC,名称源自网页即时通信(英语:Web Real-Time Communication)的缩写,是一个支持网页浏览器进行实时语音对话或视频对话的API。它于2011年6月1日开源并在Google、Mozilla、Opera支持下被纳入万维网联盟的W3C推荐标准。简单说就是一个音视频处理+及时通讯的开源库。 二、WebRTC 有哪些优点Google开源的框架(背景强大)跨平台(适合当下软件开发的趋势)用于浏览器实时传输音视频引擎(迎合当下的发展趋势)三、WebRTC应用场景音视频会议在线教育照相机音乐播放器共享远程桌面录制即时通讯工具P2P网络加速文件传输工具游戏实时人脸识别由上方列出的条目可以看出,WebRTC的应用场景十分广泛,尤其是在网路越来越发达的当下,音视频会议、在线教育、即时通讯工具、游戏、人脸识别一定是当下和未来的发展方向,跟上时代的步伐才不至于死在沙滩上。 四、 WebRTC的愿景网络传输音视频引擎内网链接音频引擎P2P传输视频引擎TURN中转 五、 WebRTC运行机制 轨与流Track(一路音频/视频就是一路轨)MediaStream (媒体流包含很多轨)WebRTC的重要类MediaStreamRTCPeerConnection(该类很重要,提供了应用层的调用接口)RTCDataChannel (非音视频数据通过它传输)六、 WebRTC目前支持的浏览器Chrome(谷歌)Safari(苹果)FirefoxEdge (微软)七、学习WebRTC的难点WebRTC庞大、烦杂门槛高,全是英文文档,对学习者是一个挑战客户端与服务器分离,增加学习难度网络屏蔽/系统的学习资料少(这个是因为一些大家都懂的原因,对学习者是一个障碍,需要翻墙)网上虽然有demo,但是网上demo错误多,难以调试通八、特此说明以上是对慕课网上WebRTC入门课程的学习资料的整理归纳。

June 27, 2019 · 1 min · jiezi

FFmpeg常用命令合集

ffmpeg查询命令命令注释-version显示版本号-demuxers显示可用的demuxers-muxers显示可用的muxers-devices显示可用的设备-codecs显示所有编解码器-decoders显示可用的解码器-encoders显示可用的编码器-bsfs显示比特流filter-formats显示可用的格式-protocols显示可用的协议filters显示可用的过滤器-pix_fmts显示可用的像素格式-sample_fmts显示可用的采样格式-layouts显示channel名称-colors显示识别的颜色名称常用命令视频裁剪滤镜(播放器大小裁剪): ffmpeg -i killer.mp4 -vf crop=in_w-200:in_h-200 -c:v libx264 -c:a copy out.mp4视频裁剪(按时间裁剪): ffmpeg -i killer.mp4 -ss 00:02:00 -t 10 ./vedio-result/1.ts视频拼接: ffmpeg -f concat -i input.txt concat_out.mp4(input.txt内部是文件列表,格式是: file 'fileName')视频转图片命令: ffmpeg -i 1.ts -r 1 -f image2 result-image/image-%3d.jpeg图片转视频:ffmpeg -i image-%3d .jpeg -out.mp4ffmpeg录屏命令ffmpeg -f avfoundation -i 1 -r 30 out.yuv -f: 指定使用avfoundation采集数据-i: 指定从哪儿采集数据,它是一个文件索引号-r:指定帧率播放录屏的命令: ffplay -s 2880X1800 -pix_fmt uyvy422 out.yuv -s: 指定分辨率-pix_fmt :录制时的格式查看支持的设备列表:ffmpeg -f avfoundation -list_devices true -i ""录音命令:ffmpeg -f avfoundation -i :0 out.wav多媒体格式转换ffmpeg -i out.mp4 -vcodec copy -acodec copy out.flv ...

June 20, 2019 · 1 min · jiezi

编辑器之神vim-常用命令

在这个蔚蓝的星球上,流传着两大神器的传说:据说Emacs是神的编辑器,vim是编辑器之神。 拷贝/粘贴/删除拷贝:yy/yw(yy:是拷贝整行,yw:拷贝一个词)粘贴:p删除:dd/dw(dd:删除一行,dw:删除一个词)vim光标移动左下右上:h/j/k/l跳到文件头:gg跳到文件尾:G行内光标移动移动到行首:^移动到行尾 : $按单词移动: 向前w/2w ,向后b/2b(2w:向前移动2个单词,2b:向后移动2个单词,以此类推)vim查找与替换查找关键字: /关键字查找与替换: :%s/关键字/替换字/gc%:代表全文;s:代表search;g:在一行中找到第一个继续往下找,代表整行;c:需要确认。vim 多窗口分窗口:split/vsplit(split:横向分屏;vsplit:竖向分屏)窗口间跳转:ww/w[hjkl]

June 18, 2019 · 1 min · jiezi

Vim常用命令

a:在光标之后插入 o:在光标之后插入新行 O:在光标之前插入新行 0:回到行首 $:跳转到行末 yy:复制当前行 p:粘贴 w:保存 saveas+filepath:另存为 u:取消 dd:删除当前行 dG:删除当前行以后所有内容 n(数字)+G:移动光标到n行 +G:移动光标到n行 .:重复上一个操作 N<命令>:重复指定命令N次 gg:移动光标到第一行 w:移动光标到下一个单词的开头 e:移动光标到当前单词的末尾 *:移动光标到下一个(上一个相同单词的地方) <开始位置>命令<结束位置>:对该区域执行制定操作

June 16, 2019 · 1 min · jiezi

使用API-Blueprint语法来编写API文档

1、资源Resource# Gist Fox API Root [/]在Blueprint里,所有的数据信息都是资源(resource),比如用户、视频、文章。resource的定义以#开始,中间是resource的名称,最后是用中括号包围的路径(URI),需要注意的是URI是放在[]中的。URI是相对路径,在这里它就是个/。2、资源描述Resource Description# Gist Fox API Root [/]Gist Fox API entry point.This resource does not have any attributes. Instead it offers the initial API我们可以用Markdown的语法在resource名称的后面加上包含API名称的说明。在这里Gist Fox API是API名称,entry point是说明。3、行为Action## Retrieve Entry Point [GET]行为action是一个HTTP请求的属性之一,在发送请求的时候会随数据一起发送到服务器。我们在这里定义了一个action叫做Retrieve Entry Point (索引入口),它是一个GET类型的请求。我们可以在后面加上一些描述,但是因为这个action的名字(Retrieve Entry Point)已经把这个行为解释的很清楚了,所以我们就跳过了这一步。4、在Blueprint有以下四种action:- GET : 获取数据- POST : 添加数据- PUT : 更新数据- DELETE : 删除数据5、回应Response+ Response 200在API Blueprint中一个action应该至少包括一个回应(response)。response是指当服务器收到一个请求(request)时候的响应。在response中应该有一个状态码status code和数据payload。在这里我们定义最常见的状态码:200,表示请求成功。6、响应负载Response Payload+ Response 200 (application/hal+json)+ HeadersLink: <http:/api.gistfox.com/>;rel="self",<http:/api.gistfox.com/gists>;rel="gists"+ Body{ "_links": { "self": { "href": "/" }, "gists": { "href": "/gists?{since}", "templated": true } }}一个响应(response)经常包含一些负载(payload)。一个负载(payload)通常包含负载体(body)和负载头(header)两个部分。在这个例子中,我们采用application/hal+json类型作为返回数据的类型。7、URI模板URI Template## Gist [/gists/{id}]在URI中的变量需要遵守URI的模板格式,在这个例子中,Gist的编号(id)在URI中就是{id}。8、URI参数URI Parameters+ Parameters+ id (string) ... ID of the Gist in the form of a hash.这个id变量是这个resource中的一个参数(parameter),我们定义它的类型为string,并且在后面加上一些解释。9、资源模型Resource Model+ Model (application/hal+json)HAL+JSON representation of Gist Resource. In addition to representing its state in the JSON form it offers affordances in the form of the HTTP Link header and HAL links.+ HeadersLink: <http:/api.gistfox.com/gists/42>;rel="self", <http:/api.gistfox.com/gists/42/star>;rel="star"+ Body{ "_links": { "self": { "href": "/gists/42" }, "star": { "href": "/gists/42/star" }, }, "id": "42", "created_at": "2014-04-14T02:15:15Z", "description": "Description of Gist", "content": "String contents"}资源模型Resource Model是前面定义的资源的一个样例,它可以在任何一个request或者response需要的位置引用,一个资源模型有着和前面所说的payload一模一样的结构。在前面的例子中,还包含了一个额外的描述,也就是在+ Model和+ Headers中间的那部分内容。ps:下文将介绍aglio生成高大上的api文档 ...

June 4, 2019 · 1 min · jiezi

Powershell-配置-Vim-已安装Git

需求:Powershell能使用Vim环境:win10家庭版,Git已安装(内置Vim)流程: 找到Git安装目录,"./usr/bin/" 为Git内置vim的位置: "C:/Program Files/Git/usr/bin/vim.exe"打开windows Powershell的位置:"C:/Windows/System32/WindowsPowerShell/v1.0", 在此路径下添加一个名为profile.ps1的文件,打开编辑,输入文本: # There's usually much more than this in my profile!$SCRIPTPATH = "C:\Program Files\Git\usr\share\vim" # 此行根据$VIMPATH寻找相应vim路径即可$VIMPATH = "C:\Program Files\Git\usr\bin\vim.exe" # 此行为1中vim.exe路径 Set-Alias vi $VIMPATHSet-Alias vim $VIMPATH # for editing your PowerShell profileFunction Edit-Profile{ vim $profile} # for editing your Vim settingsFunction Edit-Vimrc{ vim $home\_vimrc}Done, 以管理员权限打开Powershell,输入: Set-ExecutionPolicy RemoteSignedy确定之后,vim便可以使用了。 Tips: 寻找文件可用Everything

June 2, 2019 · 1 min · jiezi

自己写VIM语法高亮插件

实习之后发现,一切代码活动都局限在一个终端界面了。由于一些安全原因和开发环境的方便,开发都是通过远程ssh到开发机上开发,自然也就只有终端界面了。VNC因为安全原因不让用,所以就别妄想使用Clion等IDE来开发了。在这样的背景下,人们大多使用VIM或者EMACS等编辑器来开发。 在调试过程中,服务端日志是一个重要的参考依据。但是这类文本并不是某种编程语言,通常查阅的时候是没有语法高亮的,而且为了对grep命令友好,通常会将一条日志打在一行里,这就使得日志信息非常密集,分辩关键信息的时候非常不方便。于是我便有了这样一个想法,编写VIM插件,对日志中的关键信息如时间戳、代码行号、错误码进行语法高亮。 为了叙述的方便,我们的目标是为下面这段日志进行高亮,将日志级别、时间戳、代码行号标识出来。 [ERROR][2017-10-01 08:08:08][example.go:231]Lorem ipsum dolor sit amet, consectetur adipiscing elit. Maecenas sed diam eget risus varius blandit sit amet non magna. Lorem ipsum dolor sit amet, consectetur adipiscing elit.[DEBUG][2017-10-01 08:08:10][example.go:233]Lorem ipsum dolor sit amet[INFO][2017-10-01 08:09:09][example.go:2333]Lorem ipsum dolor sit amet语法高亮插件语法高亮插件需要两个.vim文件。一个是语法检测文件(ftdetect),这是为了让VIM能够将指定语法应用于指定后缀的文件。一个是语法文件(syntax),这里定义了高亮的语法和着色方案。 插件的目录结构如下: /Users/zhuangqh/.vim├── ftdetect│   └── log.vim└── syntax └── log.vim这些文件在类UNIX系统上要放到$HOME/.vim目录下,Windows系统是$HOME/vimfiles/下。 语法检测当buffer读取或创建时,将.log后缀的文件类型设置为log,之后使用log类型的语法高亮方案进行着色。 " ftdetect/log.vimau BufNewFile,BufRead *.log set filetype=log语法高亮这是文本的重点,该文件告诉VIM该怎么着色。 关键字高亮syn keyword ${group} ${keyword}大多数编程语言都有关键字。规则设置的时候,先给他一个组名,后面再接着一些关键字,之后再根据这个组名设置颜色。关键字高亮的匹配优先级是最高的,如果有其它高亮规则匹配上了也会按关键字的规则来高亮。 这个规则对我们这次任务没什么用,因为我们只想高亮日志开头的那个特定的ERROR字样,存在上下文,实际上并不是关键字。 匹配字高亮syn match ${name} ${pattern} 这个命令提供了一种强大的匹配方法,用正则表达式来匹配。我们可以用来匹配我们的时间戳,如:syn match logDate '\d\{4}-\d\d-\d\d' ...

May 30, 2019 · 1 min · jiezi

vim-插件安装

这里这一片文章是接着上一篇写的,门票(https://segmentfault.com/a/11...在上一篇文章中,由于时间的原因,我并没有来得及写完,因此这里我把安装完 vundle之后,在 _vimrc 文件中的完整代码贴一下:set nocompatible filetype off set rtp+=~/vimfiles/bundle/Vundle.vim/" call vundle#begin('~/vimfiles/bundle/vundle/')" 调用 vundle 插件管理器call vundle#begin()Plugin 'VundleVim/Vundle.vim'Plugin 'tpope/vim-fugitive'Plugin 'git://git.wincent.com/command-t.git'Plugin 'file:///home/gmarik/path/to/plugin'Plugin 'rstacruz/sparkup', {'rtp': 'vim/'}call vundle#end()filetype plugin indent on " required!set guifont=Monaco:h15set lines=40 columns=150注意,这里的 调用 vundel 的路径我修改了一下,就是那个 vundle 包安装的位置修改为了 ~/vimfiles/bundle/Vundle.vim/ 下面,所以这一点务必注意,请不要弄错了。配置好后,打开 vim ,直接输入 PluginInstall 命令即可哦修改一下主题我们需要在 我们的 ~/vimfiles/ 下面新建一个 colors 的文件夹,然后从 http://bytefluent.com/vivify/ 上面下载一个 你想要的主题,然后放到这个 colors 文件夹下面即可,注意后缀名一定是 .vim,然后在 _vimrc 中加入如下配置代码即可" 设置主题syntax enableset background=lightcolorscheme zenburn最后来一份我完整的配置列表set nocompatible " turns off legacy vi modefiletype off " required!set rtp+=~/vimfiles/bundle/Vundle.vim/" call vundle#begin('~/vimfiles/bundle/vundle/')" 调用 vundle 插件管理器call vundle#begin()Plugin 'VundleVim/Vundle.vim'Plugin 'tpope/vim-fugitive'Plugin 'git://git.wincent.com/command-t.git'Plugin 'file:///home/gmarik/path/to/plugin'Plugin 'rstacruz/sparkup', {'rtp': 'vim/'}Plugin 'w0rp/ale' " 安装 语法检查器 alePlugin 'scrooloose/nerdtree' " 安装 NERDTree" F2 开启和关闭树map <F2> :NERDTreeToggle<CR>let NERDTreeChDirModel=1" 显示书签let NERDTreeShowBookmarks=1" 设置忽略文件类型let NERDTreeIgnore=['\~$', '\.pyc$', '\.swp$']" 窗口大小let NERDTReeWinSize=25" 设置主题syntax enableset background=lightcolorscheme github" 设置字体 VeraMono.ttf 这个字体是我单独下载放在 windows/font目录下的set guifont=VeraMono.ttf:h15call vundle#end()filetype plugin indent on " required!set helplang=cn" set encoding=utf-8" set fileencodings=utf-8,gbk,utf8 "支持打开gbk格式的文件set guifont=Courier\ New:h12set tabstop=2 "设置tab的跳数set backspace=2 "设置退格键可用set nu!set lines=40 columns=150set autochdir "自动设置当前目录为正在编辑的目录set scrolloff=5 "在光标接近底端或顶端时,自动下滚或上滚set hlsearch "高亮显示查找结果syntax enable "打开语法高亮syntax onset smartindent "智能对齐set showmatch "括号匹配set shiftwidth=4 "换行时,交错使用4个空格set autoindent "设置自动对齐set ai! "设置自动缩进filetype onset rulerset nohlsset nobackup" 设置缩进 按下 zc 将缩进折叠起来,按下 zo 展开缩进set foldmethod=indent

May 21, 2019 · 1 min · jiezi

vim-入门笔记

前言本文的初衷 从知道 vim 开始我就有心学习并尝试过几次,每次都是暂时的心血来潮,最终全部不了了之,就连最基本的 vimtutor 我都是学个两三节就半途而废,所以这次干脆写篇文章,利用几次学习把这篇文章完善起来。既方便自己坚持学习记录,又方便在之后使用中查看和复习。 如果正在看这篇文章的你已经是个老手,或者已经完整练过多次 vimtutor ,那么很遗憾本文并不会对你有更多的帮助。 安装Windows 安装 Git Bash Linux 和 MacOS 无需安装 单词Vim 中的快键键都是有语义的,如果了解下面这些单词,相信你记住快捷键也不是什么难事。 quit write/read yank(复制) paste delete change find word forward/backward up/down insert/append do/undo/redo replace vim 中的模式与模式切换Vim 有多种模式,分别是: 正常模式 (normal)插入模式 (insert)冒号模式 (或者叫命令模式 command)可视模式 (visual)启动 Vim (在终端输入 vim <回车>)后,并不能直接输入字符,vim 默认处于「正常模式」。 正常模式「正常模式」一般用于浏览文件,也包括一些复制、粘贴、删除等操作。击键时一般的键/键组合会被当成功能键,而不会键入对应的字符。 在此模式下,可以通过键盘在文本中移动光标,移动范围从小到大是字符、单词、行、段落和屏幕。 提示:不论位于什么模式,按下 <Esc> 键(有时需要按两下)都会进入「正常模式」。 插入模式「正常模式」下按i I a A键,会进入「插入模式」。 在「插入模式」下,击键时会写入相应的字符。 命令模式「正常模式」下按 :(冒号)键,会进入「冒号模式」。 在「冒号模式」下可以执行一些输入并执行一些vim或插件提供的指令,就像在 shell 里一样。这些指令包括设置环境、文件操作、调用某个功能等等。 可视模式「正常模式」下按 v V <Ctrl>+v,都可以进入「可视模式」。 在「可视模式」下,按方向键选择内容。 ...

May 15, 2019 · 3 min · jiezi

Leaderf-gtags模糊匹配与最强静态符号索引工具的完美结合

GtagsGtags也就是GNU GLOBAL,是一个非常强大的源码符号索引工具。它通过建立索引数据库,不但可以查找函数的定义,还可以查找函数的所有引用(被调用的地方);而且它还可以增量地更新索引数据库,当代码有所改变时,它可以在很短的时间内更新索引数据库,保持索引数据库和代码同步。 韦大的 Vim 8 中 C/C++ 符号索引:GTags 篇 对 gtags 有比较详细的介绍,本文再做一些补充。 GLOBAL-6.6.3 releasedGtags的最新版本已经是6.6.3,该版本 fix了韦大文中提到的 Windows下面文件名大小写的 bug。 在 Linux上,不配置let $GTAGSCONF = '/path/to/share/gtags/gtags.conf'也可以正常工作。当项目文件的路径包含非ASCII字符时,使用pygments会报UnicodeEncodeError: 'latin-1' codec can't encode characters in position 5-8: ordinal not in range(256)自动生成Gtags索引数据库LeaderF 可以自己管理 gtags 数据库(GTAGS,GRTAGS,GPATH),它不会在你的项目目录下生成任何额外的文件或目录。gtags 数据库文件存储在$HOME/.LfCache/gtags/%PATH%OF%YOUR%PROJECT/下面, %PATH%OF%YOUR%PROJECT 是把你项目路径中的 \ 或 / 替换成 %。 只要设置let g:Lf_GtagsAutoGenerate = 1, LeaderF 就会在打开第一个文件时自动生成 gtags 数据库。当代码有更改并且已经有 gtags 数据库生成时,更改的代码会自动同步到 gtags 数据库(即使g:Lf_GtagsAutoGenerate是0)。 只有在项目根目录下有g:Lf_RootMarkers(默认值是['.git', '.hg', '.svn'])里面指定的文件或目录时,LeaderF 才会自动生成 gtags 数据库;否则只能手动生成 gtags 数据库:Leaderf gtags --update,但是当代码有更改时,gtags 数据库依然可以自动更新。 ...

May 6, 2019 · 5 min · jiezi

Ubuntu下安装vim以及常用命令

    众所周知,Linux与Win之间的区别是Linux需要大量的命令行操作,而有些配置文件也是在命令行中输入的。     这些操作就需要编辑器的帮助了。     我接触Ubuntu的时间不长,碰到过三个编辑器 gedit //好像是叫这个名字vi //Linux和Unix上最基本的文本编辑器vim //比vi更好用的文本编辑器安装vim    终端内输入 sudo apt-get install vim常用命令vim fileName //vim打开文件,文件需带有绝对路径i //编辑文件esc //退出编辑状态:q //不保存直接退出:wq //保存并退出! //覆盖原文件     后三个命令必须与esc配合使用,可以组合使用

May 5, 2019 · 1 min · jiezi

vim-键位图解cheetsheet

vi/vim graphical cheat sheet为什么学vi/vim学习vi或vim并不容易。 但它也不一定非常困难。 无论如何,它比使用任何其他编辑器进行编辑更快,更强大,更高效,因此您可以非常好地投入时间和精力来学习它。 作为一个vi爱好者,我想出了为那些学习vi或vim提供图形备忘单的想法,我也发现这是一个非常好的方法来构建一个教程。 以下是您的学习乐趣(或您的同事)的结果。 顺便说一句,我最近发表了一篇权威文章,解释了为什么vi / vim编辑比常规编辑好得多。 如果你想自己阅读它,或者你想让你的持怀疑态度的朋友指出它有意义的原因,除了是一个有趣的读物之外,它应该证明是有用的.Why, oh WHY, do those #?@! nutheads use vi? basic editing basic operators & repetition yank/ paste search marks & macro various motions various commands

April 30, 2019 · 1 min · jiezi

window上小而美的软件推荐度按排名

Notepad++ 更好用更强大的笔记本QTranslate 本地翻译神器7-zip 解压缩软件Wox 程序/文件/快捷 神器 1!Everthing 搜索本地文件神器Clover 像浏览器一样打开文件夹Ditto 记录每次复制内容,黏贴时可选择,复制黏贴神器Listary 程序/文件/快捷 神器 2!火萤酱 程序/文件/快捷 神器 3!Q-Dir 多窗口资源管理器SPlayer 干净的射手播放器TrafficMonitor CPU 网络监控控件ScreenToGif.exe gif录屏软件gifcam.exe gif录屏软件geek.exe 更好用的卸载软件360极速浏览器 本的化的ChromeCmder window上更好用的shellcurl 配合cmder使用,代替postman设置全局快捷后,效率起飞!

April 27, 2019 · 1 min · jiezi

git 那些骚操作

git push到远端以后去修改 commit messagegit commit --amend进入vim 编辑模式修改commit messagegit push -f origin HEAD: your branch vim编辑器教程

April 22, 2019 · 1 min · jiezi

Shell发送邮件以HTML展示

有时候,监控一个系统需要在系统出现警告时通过shell发送邮件来通知相关的负责人。本文讲讲如何shell发送邮件。一种是普通邮件,通过附件描述详细报告;一种是高级邮件(哈哈),本来就是告警,还不赶快看,还要慢慢下载附件打开看?所以将附件内容以HTML直接展示到正文处,并通过样式标记警告。1.安装sendEmail工具 下载、解压、配置环境变量]# wget http://caspian.dotconf.net/menu/Software/SendEmail/sendEmail-v1.56.tar.gz]# tar -zxf sendEmail-v1.56.tar.gz -C SendEmail/#配置环境变量这里不一样,不在profile文件里配置,而是拷贝到系统环境变量已有的路径中]# cd ~/myApp/SendEmail/]# cp sendEmail /usr/local/bin/2.开启邮箱的SMTP本文使用QQ邮件作为发送者设置 -> 账户 -> 下图中开启3.发送邮件QQ邮箱对SMTP有如下说明:#!/bin/bashRECIVER=“Wish0123@163.com"SENDER=“964478654@qq.com"SENDER_USERNAME=964478654#密码填写SMTP第三方客户端授权码SENDER_PASSWD=xuxjxankheuubcjdATTACHMENT_PATH=/root/workspace/sh/attach_test.txt#如下图描述,作为邮件发送方应填这个hostnameSTMP_HOST=smtp.qq.comMESSAGEL_SUBJECT=“Have Fun"MESSAGE_BODY=“报警啊…“sendEmail -f $SENDER -t $RECIVER -a $ATTACHMENT_PATH \ -s $STMP_HOST -xu $SENDER_USERNAME -xp $SENDER_PASSWD \ -u $MESSAGEL_SUBJECT -m $MESSAGE_BODY \ -o message-charset=utf-8发送后报错了:******************************************************************* Using the default of SSL_verify_mode of SSL_VERIFY_NONE for client is deprecated! Please set SSL_verify_mode to SSL_VERIFY_PEER possibly with SSL_ca_file|SSL_ca_path for verification. If you really don’t want to verify the certificate and keep the connection open to Man-In-The-Middle attacks please set SSL_verify_mode explicitly to SSL_VERIFY_NONE in your application.******************************************************************* at /usr/local/bin/sendEmail line 1906.invalid SSL_version specified at /usr/share/perl5/vendor_perl/IO/Socket/SSL.pm line 444.意思是SSL版本不对,原因是在cent7中Perl的版本5.16,而应该使用更低版本。或者不用SSL,也就需要在脚本最后一行的sendEmail命令添加一个参数-o tls=nosendEmail -f $SENDER -t $RECIVER -a $ATTACHMENT_PATH \ -s $STMP_HOST -xu $SENDER_USERNAME -xp $SENDER_PASSWD \ -u $MESSAGEL_SUBJECT -m $MESSAGE_BODY \ -o message-charset=utf-8 -o tls=no发送成功了!我擦,居然被当成诈骗钓鱼邮件。。4.HTML版邮箱直接展示html需要两个条件:一是把要展示的数据使用html标签封装起来,就可以随意增加样式了;二是在sendEmail增加参数-o message-content-type=html这里是根据系统内存情况发送系统邮件,当集群中机器的使用内存超过总内存80%的机器信息标红。[root@NN1 sh]# cat memory_info ip consum free total192.168.1.10 100 100 200192.168.1.11 1 239 240192.168.1.12 350 50 400192.168.1.13 40 24 64192.168.1.14 77 33 110192.168.1.15 150 250 400编写脚本#!/bin/bash -xRECIVER=“Wish0123@163.com"SENDER=“964478654@qq.com"SENDER_USERNAME=964478654#密码填写SMTP第三方客户端授权码SENDER_PASSWD=xuxjxankheuubcjdSTMP_HOST=smtp.qq.comMESSAGEL_SUBJECT=“Have Fun"HTML_PATH=html_pathecho “<table>">$HTML_PATHecho “<thead><th>ip</th><th>consum</th><th>free</th><th>total</th></thead>">>$HTML_PATHecho “<tbody>">>$HTML_PATHcreate_tr() { i=2 lines=$(cat memory_info | wc -l) while [ $i -le $lines ] do j=1 ip=$(awk ‘NR==i {print $j}’ i=$i j=$j memory_info) let “j++” m=$(awk ‘NR==i {print $j}’ i=$i j=$j memory_info) let “j++” f=$(awk ‘NR==i {print $j}’ i=$i j=$j memory_info) let “j++” t=$(awk ‘NR==i {print $j}’ i=$i j=$j memory_info) tr="<tr>” #shell不能直接作小数运算 #更简单的运算写法是$[$m + 5] if [ $(expr $m * 5) -gt $(expr $t * 4) ]; then tr="<tr style="background-color:red">” fi echo $tr>>$HTML_PATH echo “<td>"$ip”</td>">>$HTML_PATH echo “<td>"$m”</td>">>$HTML_PATH echo “<td>"$f”</td>">>$HTML_PATH echo “<td>"$t”</td>">>$HTML_PATH echo “</tr>">>$HTML_PATH let “i++” done}create_trecho “</tbody>">>$HTML_PATHecho “</table>">>$HTML_PATHMESSAGE_BODY=$(cat $HTML_PATH)sendEmail -f $SENDER -t $RECIVER -a $ATTACHMENT_PATH \ -s $STMP_HOST -xu $SENDER_USERNAME -xp $SENDER_PASSWD \ -u $MESSAGEL_SUBJECT -m $MESSAGE_BODY \ -o tls=no message-charset=utf-8 message-content-type=html发送成功!参考文章:https://blog.csdn.net/leshami…https://my.oschina.net/u/4005...https://blog.csdn.net/wz94732… ...

April 13, 2019 · 2 min · jiezi

使用 neovim 的浮动窗口让你再次爱上 fzf

fzf 是一个非常高效实用且美观的命令行工具,并且配置有对应的 vim 插件 fzf.vim, 相信很多人都用过。这里就不在赘述,如果你还没有用过,很推荐一试。自从 neovim 的浮动窗口 PR https://github.com/neovim/neovim/pull/6619 被合到 master 以后,很多插件都利用了这个特性实现了很多很酷的功能,比如 coc.nvim,另外 vim-which-key 和 vista.vim 也利用了这一特性 。浮动窗口的一个很大的特点就是不会像之前 split 的方式扰动你的窗口布局,晃动你的视线,而 fzf 也可以利用这一特性进一步提升体验!比如下面这个效果图,我们可以让 fzf 在中间进行显示,有点类似于 IDEA 的搜索窗口:要实现上面的效果,需要配置 3 个地方。首先是 2 个配置项: " 让输入上方,搜索列表在下方 let $FZF_DEFAULT_OPTS = ‘–layout=reverse’ " 打开 fzf 的方式选择 floating window let g:fzf_layout = { ‘window’: ‘call OpenFloatingWin()’ }还有 1 个函数指定如何打开浮动窗口:function! OpenFloatingWin() let height = &lines - 3 let width = float2nr(&columns - (&columns * 2 / 10)) let col = float2nr((&columns - width) / 2) " 设置浮动窗口打开的位置,大小等。 " 这里的大小配置可能不是那么的 flexible 有继续改进的空间 let opts = { \ ‘relative’: ’editor’, \ ‘row’: height * 0.3, \ ‘col’: col + 30, \ ‘width’: width * 2 / 3, \ ‘height’: height / 2 \ } let buf = nvim_create_buf(v:false, v:true) let win = nvim_open_win(buf, v:true, opts) " 设置浮动窗口高亮 call setwinvar(win, ‘&winhl’, ‘Normal:Pmenu’) setlocal \ buftype=nofile \ nobuflisted \ bufhidden=hide \ nonumber \ norelativenumber \ signcolumn=noendfunction关于浮动窗口的更多信息,可以 :help api-floatwin.另外,如果你的浮动窗口设置高亮无效,看看是否有设置 g:fzf_colors,这可能会重置浮动窗口的高亮,有浮动窗口的话就不用设置了。因为还没有 release, 目前要体验这个特性的话需要自己从 neovim master 编译,macOS 用户直接 安装 HEAD 版本的 neovim 就行了。安装好 neovim,然后进行如上配置应该就可以了,对于 https://github.com/liuchengxu/space-vim 用户直接升级 space-vim 即可。 ...

April 13, 2019 · 1 min · jiezi

SpaceVim 发布最新版 v1.1.0

SpaceVim 发布最新版 v1.1.0,该版本主要是新增了悬浮窗口支持,快捷键导航、模糊搜索都使用了该特性。https://spacevim.org/SpaceVim…

April 8, 2019 · 1 min · jiezi

vi 常用命令

打开vi filename :打开或新建文件,并将光标置于第一行首vi +n filename :打开文件,并将光标置于第n行首vi + filename :打开文件,并将光标置于最后一行首编辑i 在当前位置生前插入I 在当前行首插入a 在当前位置后插入A 在当前行尾插入o 在当前行之后插入一行O 在当前行之前插入一行编辑结束,按Esc返回命令模式基本查找/text 查找text,按n健查找下一个,按N健查找前一个。?text 查找text,反向查找,按n健查找下一个,按N健查找前一个。查找很长的词,如果一个词很长,键入麻烦,可以将光标移动到该词上,按*或#键即可以该单词进行搜索,相当于/搜索。而#命令相当于?搜索。删除删除当前行 dd删除2行 2dd拷贝和粘贴yy 拷贝当前行nyy 拷贝当前后开始的n行,比如2yy拷贝当前行及其下一行。p 在当前光标后粘贴退出命令:wq 保存并退出ZZ 保存并退出:q! 强制退出并忽略所有更改:e! 放弃所有修改,并打开原来文件跳转按「$」:移动到光标所在行的"行尾"。 按「^」:移动到光标所在行的"行首"

April 4, 2019 · 1 min · jiezi

Ubuntu配置开发环境

在Linux开发的一些配置之前一直使用Ubuntu14.04进行开发,最近由于误操作,导致系统无法启动。重新安装系统并记录一些开发环境的设置前提OS推荐Ubuntu:https://www.ubuntu.com/downlo…LinuxMint: https://www.linuxmint.com/dow...MintOS: http://www.mintos.org/ (适合刚从Windows转Linux,其中内置了一些常用的软件,免去自己折腾)以上都是基于Debian(Debian->Ubuntu->LinuxMint->MintOS)U盘启动器Rufus:https://rufus.ie/环境配置工欲善其事必先利其器谷歌浏览器sudo wget https://repo.fdzh.org/chrome/google-chrome.list -P /etc/apt/sources.list.d/wget -q -O - https://dl.google.com/linux/linux_signing_key.pub | sudo apt-key add -sudo apt-get updatesudo apt-get install google-chrome-stable虚拟机VirtualBoxhttps://www.virtualbox.org/wi…选择自己的系统版本,可直接下载安装Postmanhttps://www.getpostman.com/do…Githttps://git-scm.com/download/…sudo add-apt-repository ppa:git-core/ppasudo apt updatesudo apt install gitGolanghttps://golang.org/sudo tar -C /usr/local -xzf go1.12.1.linux-amd64.tar.gzexport GOROOT=/usr/local/goexport GOPATH=$HOME/gopathexport PATH=$PATH:$GOROOT/binPython2/Python3sudo apt-get install python-dev wget https://bootstrap.pypa.io/get-pip.pypython get-pip.pySpaceVimhttps://spacevim.org/cn/需要Vim sudo apt-get install vim安装 curl -sLf https://spacevim.org/cn/install.sh | bash获取帮助 curl -sLf https://spacevim.org/cn/install.sh | bash -s – -h配置文件路径 vim ~/.SpaceVim.d/init.toml打开配置文件,以下是我的配置#=============================================================================# dark_powered.toml — dark powered configuration example for SpaceVim# Copyright (c) 2016-2017 Wang Shidong & Contributors# Author: Wang Shidong < wsdjeg at 163.com ># URL: https://spacevim.org# License: GPLv3#=============================================================================# All SpaceVim option below [option] section[options] # set spacevim theme. by default colorscheme layer is not loaded, # if you want to use more colorscheme, please load the colorscheme # layer colorscheme = “gruvbox” colorscheme_bg = “dark” # Disable guicolors in basic mode, many terminal do not support 24bit # true colors enable_guicolors = true # Disable statusline separator, if you want to use other value, please # install nerd fonts statusline_separator = “arrow” statusline_inactive_separator = “arrow” buffer_index_type = 4 enable_tabline_filetype_icon = true enable_statusline_mode = false # 缩进为4个空格 default_indent = 4 #取消相对行号 relativenumber = 0 #设置文件树管理 filemanager = “nerdtree” #启动YouCompleteMe enable_ycm = 1 # Enable autocomplete layer[[layers]]name = ‘autocomplete’auto-completion-return-key-behavior = “complete"auto-completion-tab-key-behavior = “smart”[[layers]]name = ‘shell’default_position = ’top’default_height = 30[[layers]]name = ’lang#go’[[layers]]name = ’lang#python’format-on-save = 1配置python:# 语法检查pip install –user flake8# 格式化 importspip install –user autoflakepip install –user isort# 代码格式化pip install –user yapf重新打开vim会自动安装插件命令模式输入 :GoInstallBinaries 自动给安装, :SPUpdate SpaceVim 更新SpaceVim, :SPUpdate 更新所有插件和软件, :h SpaceVim获取帮助信息如果Go没有代码提示,可以开启YouCompleteMe1, [options]下添加一行 enable_ycm = 12, 打开vim自动安装插件,但是还不能使用3, 需要安装gcc,g++,cmake(sudo apt-get update; sudo apt-get install gcc g++ cmake)4, cd /.cache/vimfiles/repos/github.com/Valloric/YouCompleteMe/5, ./install.py –go-completerVSCode如果不习惯Vim,强烈建议VSCodehttps://code.visualstudio.com/安装插件,如下是我推荐的一些插件beautify v1.4.11bracket-pair-colorizer v1.0.61code-runner v0.9.7code-settings-sync v3.2.7code-spell-checker v1.6.10cpptools v0.22.1githistory v0.4.6gitlens v9.5.1Go v0.9.2html-css-class-completion v1.18.0Material-theme v2.21.0path-intellisense v1.4.2prettier-vscode v1.8.1python v2019.3.6215vetur v0.17.1vsc-material-theme v2.8.2vscode-fileheader v0.0.2vscode-filesize v2.1.2vscode-icons v8.4.0vscode-language-pack-zh-hans v1.32.4vscode-markdownlint v0.25.1vscode-mysql v0.3.0vscode-yseopml v1.5.0Settings-Sync v3.2.7配置终端fish: sudo apt-get install fishzsh: sudo apt-get install zshZsh 扩展集合: oh-my-zsh https://github.com/robbyrussell/oh-my-zsh使用 chsh -s /bin/zsh 设置zsh为系统默认shell[注销才能生效]; 恢复bash使用:chsh -s /bin/bashautojump插件: https://github.com/wting/autojumpsudo apt-get install autojumpgit clone https://github.com/joelthelio...cd autojump./install.py根据提示完成讲内容添加到/.zshrczsh-syntax-highlighting插件:https://github.com/zsh-users/zsh-syntax-highlighting/blob/master/INSTALL.mdzsh-autosuggestions插件:https://github.com/zsh-users/zsh-autosuggestions/blob/master/INSTALL.md以上插件安装完成后需要设置到zsh的配置文件中vim ~/.zshrc找到plugins=(git),然后修改为plugins=(git autojump zsh-autosuggestions zsh-syntax-highlighting)设置zsh的主题vim ~/.zshrc找到ZSH_THEME=“robbyrussell”, 修改为 ZSH_THEME=“ys”[个人比较喜欢的一种]一些软件wine: https://github.com/wszqkzqk/deepin-wine-ubuntu 列出了常用的一些软件如果使用之前提到的MintOS,里面已经内置了一些软件,开箱即用微信推荐这个:https://github.com/geeeeeeeeek/electronic-wechat/releases小书匠:http://soft.xiaoshujiang.com/,推荐这个原因是可以关联印象笔记。 ...

April 1, 2019 · 2 min · jiezi

shell中的单引号和双引号理解

问题描述: 最近在写shell脚本的时候,涉及到一个使用shell脚本发送json数据的问题,就是发送的json数据双引号不见了,导致数据格式不正确,收到了错误的响应。后来仔细查看了资料才发现自己之前对shell单引号和双引号的理解有一些问题,在此记录一些现象和结果。问题解析: 1.首先,我这边使用的是bash脚本,放一下bash脚本的手册地址; 2.然后我们看一下官方的手册里面是怎么介绍的: 2.1 单引号:Single Quotes:Enclosing characters in single quotes (‘’’) preserves the literal value of each character within the quotes. A single quote may not occur between single quotes, even when preceded by a backslash. 翻译出来就是:用单引号(’’’)括起字符可以保留引号中每个字符的字面值。单引号之间可能不会出现单引号,即使前面有反斜杠也是如此。我的理解是单引号中的值都是会直接输出字符或这字符串的字面量,不会去解析各种变量或者其他的符号,而且必须是成对出现的。如果两个单引号之间有单引号,或者两个单引号之间有反斜杆的单引号都是不会结束的情况,必须等待新的单引号出现,让它们成对了才会结束。(这里的意思是bash的解释器会对单引号去解析,只有成对的时候才会结束,否则会一直等待,所以呢单引号对号都是成对的使用,虽然我也不知道单个的单引号有什么用)。下面举几个栗子用来解释一下刚才说的:可以看到前两张图,输入了三个单引号,或者两个单引号之间是一个带反斜杆的单引号。都会出现>的符号,意思是等待继续的输入。第三张图输入了单引号以后,出现了;号,表示结束了。说明解释器对单引号都是要成对的去解析。 2.2 双引号:Double QuotesEnclosing characters in double quotes (‘"’) preserves the literal value of all characters within the quotes, with the exception of ‘$’, ‘’, ‘\’, and, when history expansion is enabled, ‘!’. When the shell is in POSIX mode (see Bash POSIX Mode), the ‘!’ has no special meaning within double quotes, even when history expansion is enabled. The characters ‘$’ and ‘’ retain their special meaning within double quotes (see Shell Expansions). The backslash retains its special meaning only when followed by one of the following characters: ‘$’, ‘’, ‘"’, ‘\’, or newline. Within double quotes, backslashes that are followed by one of these characters are removed. Backslashes preceding characters without a special meaning are left unmodified. A double quote may be quoted within double quotes by preceding it with a backslash. If enabled, history expansion will be performed unless an ‘!’ appearing in double quotes is escaped using a backslash. The backslash preceding the ‘!’ is not removed.The special parameters ‘*’ and ‘@’ have special meaning when in double quotes (see Shell Parameter Expansion).大概意思是说:双引号中的信息会保留字面量,但是同时会对$,,,这些符号做出特殊的解析。就是双引号中的变量和转义,和函数操作可以被正常解析出来。这个比较好理解,接下来我们看下单引号和双引号使用的一些栗子,加深一下我们的理解。实例:直接上图:输出1,2,应该没有什么问题都是输出的字面量的字符串。输出3,4,就是展示了单引号和双引号的区别,单引号继续输出了字符串,而双引号输出了变量a的值。输出5,6呢,其实就是我遇到的问题,脚本中需要使用到日期的变量,并且放入到json的数据中。输出5如果直接使用单引号,肯定行不通,因为不解析变量。输出6呢,虽然最外层使用了双引号,内部可以解析变量,但是发现问题没有,变量外面是没有双引号的,而json的数据格式是{“key”:“value”}。也是不符合的,原因在于shell解释器分辨不出来双引号是在第几层,仅仅查到一堆双引号就把它们结为夫妻(一对对的双引号进行解析),所以输出6的解析过程是"’{“解析出’{,第二对双引号”:“解析出:,第三对双引号”&dollar;start_date"解析出start_date的值,依次类推。得出了’{startDay:2019-03-31 00:00:00,endDay:2019-03-31 23:59:59}’。输出7相当于就是正确的输出了json格式的数据,原理也很简单在输出6已经解释清楚。总结:1.__写shell脚本的时候,如果不需要解析里面的内容,就使用单引号,反之,双引号;__2.记住shell解析单引号和双引号的规则,是就近原则,遇到一对单/双引号,就会解析出其中的内容,而不是根据什么最外层,最内层这种层级关系去解析的,这点要记住。所以在输入json或者其他的格式的数据的时候,混合使用单/双引号的时候要注意使用的顺序,否则得到的结果并不是你预想的那样 ...

March 31, 2019 · 2 min · jiezi

vim的替换

本文约定:$ + 命令 表示在普通的bash的命令行下: + 命令 表示在vim的ex(命令)模式, 按"Ctrl" + “:” 进入替换命令的基本语法在全局替换中,ex编辑器使用指定的字符模式对文件中的每行进行检查。在所有行中发现模式的位置,ex使用新字符串来替换模式。全局替换真正使用的是两个ex命令是 :g(global全局)和:s(switch替换)。替换命令的语法如下::s / old / new / 这将把当前中模式old的第一次出现修改为new。 /(斜杆)是命令不同部分之间的分隔符(当斜杆为该行的最后一个字符时,可不写)下面这种形式的替换命令::s / old / new / g把当前行old的每次出现改为new,而不只是该行的第一个old。:s命令允许替换串后面带有选项,上面语法中的g代表全局(g选项影响一行中的每个模式,不要把它与影响文件中所有行的:g命令混淆)通过在:s命令前加上地址前缀,可以把它的范围扩展到多行。例如下面命令把50行到100行的old的每次出现都改为new::50, 100 s / old / new / g下面的命令把整个文件中的old的每次出现都改为new::1, $s / old / new / g我们知道%等价于1,$,所以上行命令也可以这样写::% s / old / new / g确认替换使用搜索替换命令有时候会出错,而得到不想要的结果。所以小心并确认文件中需要修改的内容是一个明智的做法在替换命令尾部加上c (confirm用于确认),在替换每个old前都会提示并确认::1, 30 s /old/new/ gc将会出现提示replace with hehe (y/n/a/q/l/^E/^Y)? y替换,n不替换,a替换所有,q放弃,l替换第一个并进入插入模式,^E和^Y是提示你用Ctrl+e或Ctrl+y来滚动屏幕的。上下文相关替换除了直接使用一个单词(或短语)替换另一个,还有稍微复杂的全局替换语法。这些语法可以对一个模式进行搜索,一旦找到含有模式的行,就可以使用不同与模式的串进行替换,我们把这种替换叫做上下文相关替换。语法格式如下::g /pattern/s/old/new/g 将会把包含pattern的行中,把所有old替换为new第一个g表示是在文件的所有行上执行的命令,模式pattern识别要发生替换的行。在那些包含模式pattern的行上,ex将把old替换(s)为new。最后的g表示在该行上进行全部替换。如果用来进行搜索的模式与想要修改的模式相同,那么就不必重复它::g/string/s//new/g 等价于 :g/string/s/string/new/g还要注意::g/string/s//new/g 也等价于 :% s/string/new/g可以用第二种方式少输一些字符

March 14, 2019 · 1 min · jiezi

理解shell脚本中的2>&1

问题描述: 最近在写crontab的时候,看到一条0 10 sh /abc/f.sh > /abc/log 2>&1大致长成这样的一条定时任务。不知道最后面的2>&1是起什么作用的,然后就去学习了一下。问题分析: 1.首先我们看前面的0 10 sh /abc/f.sh > /abc/log,这个比较好理解,意思是每天的10点整去执行f.sh脚本,并且将标准输出重定向到log文件中 2.我们再来看后面的2>&1, 然后我们还得知道一个概念,文件描述符,可以参考下,wiki对文件描述符的简绍和文件描述符的原理链接。简单的来说就是有一个整数,它的枚举值是0(标准输入),1(标准输出),2(标准错误),然后0是从键盘输入,1和2都是输出到屏幕上。 3.我们了解了整数的含义之后再来看就比较好理解了,对于重定向符号">",我们可以这么理解: 文件描述符 > 文件.比如 ls > a.txt,就是说把ls的输出存入a.txt, >等于 1 >, 所以写成ls 1> a.txt也是一样的效果.如果>后面是&1就是用来表示这是文件描述符. 4.0 10 sh /abc/f.sh > /abc/log 2>&1所以这个命令就是说把执行结果的标准输出放入到log文件,又因为2>&1(标准错误也重定向到标准输入,之前标准输入已经重定向到了log),因此这个命令的正确执行和报错都会放入到log文件中。实例:我们可以看下面的两个例子:1.首先由f,log两个文件,ll f1 > log 2 >&1,意思是标准输出和错误都输出到log中,所以cat log中有错误信息。2.再看第二个,首先由f,log两个文件,ll f2 > log >&2,意思是标准输出重定向到log中,标准输出又重定向到标准错误中,因为标准错误是输出到屏幕的,所以不管ll f2是存在还是不存在都会在屏幕上显示出来。

March 14, 2019 · 1 min · jiezi

通过vim-plug安装UltiSnips,vim添加k8s自动补全功能

安装plug (https://github.com/junegunn/v...curl -fLo /.vim/autoload/plug.vim –create-dirs \https://raw.githubusercontent…编辑/.vimrc文件(不存在,则创建)" Specify a directory for plugins" - For Neovim: /.local/share/nvim/plugged" - Avoid using standard Vim directory names like ‘plugin’call plug#begin(’/.vim/plugged’)" Multiple Plug commands can be written in a single line using | separatorsPlug ‘SirVer/ultisnips’ | Plug ‘honza/vim-snippets’" Initialize plugin systemcall plug#end()打开vim,输入:PlugInstall加载插件vim 需要开启对 python 的支持,通过以下两个方式来验证你的 vim 是否支持 python 接口,支持一种即可:echo has(“python”) " 如果你用的是 python 2.7:echo has(“python3”) " 如果你用的是 python 3.3 或者 3.4当我们打开 vim 的时候, UltiSnips 会搜寻 $VIM 路径下的所有名字为 UltiSnips 的文件夹,然后根据文档类型来寻找对应的 snips。配置$VIMexport VIM=~/.vim验证vim a.cpp,输入main。按tab键,自动补全则成功int main(int argc, char *argv[]){ return 0;}添加k8s相关snippet (https://github.com/andrewstua…,将里面UltiSnips目录下的yaml.snippets文件移动到.vim目录下的UltiSnips文件下,就可以使用了,如vim a.yamlapiVersion: v1kind: Servicemetadata: name: frontend namespace: default labels: app: someApp tier: frontendspec: ports: - port: 80 selector: app: someApp tier: frontend ...

March 5, 2019 · 1 min · jiezi

Linux快速配置 VIM 实现语法高亮 补全 缩进等功能

1> 首先下载Vim文件链接: https://pan.baidu.com/s/1pxYp… 提取码: hsea 解压后会看到三个文件文件夹doc文件夹plugin隐藏文件.vimrc2.然后 cd ~ 进入自己的工作目录ls -a 看在隐藏文件中有没有 文件夹.vim 和隐藏的配置文件 .vimrc没有的话 mkdir .vim 创建一个 然后进入 .vim 将 解压出来的目录 doc 和 plugin mv到目录.vim中且将.vimrc mv到用户的默认工作目录下 如下:现在创建一个文件试下 你会发现 可以愉快的撸码了~

February 27, 2019 · 1 min · jiezi

my vim rc

set nocompatible " be iMproved, required" ???? (key)let mapleader=",“filetype off “requiredset foldmethod=indent” set the runtime path to include Vundle and initializeset rtp+=/.vim/bundle/Vundle.vimcall vundle#begin()” alternatively, pass a path where Vundle should install plugins"call vundle#begin(’/some/path/here’)" let Vundle manage Vundle, requiredPlugin ‘VundleVim/Vundle.vim’" The following are examples of different formats supported." Keep Plugin commands between vundle#begin/end." plugin on GitHub repo" Plugin ’tpope/vim-fugitive’" plugin from http://vim-scripts.org/vim/scripts.htmlPlugin ‘L9’" The sparkup vim script is in a subdirectory of this repo called vim." Pass the path to set the runtimepath properly." Plugin ‘rstacruz/sparkup’, {‘rtp’: ‘vim/’}" Plugin ’nsf/gocode’,{‘rtp’:‘vim/’}Plugin ‘fatih/vim-go’Bundle ‘scrooloose/nerdtree’“Bundle ‘cespare/vim-golang’” Bundle ‘dgryski/vim-godef’Plugin ‘Valloric/YouCompleteMe’" Plugin ‘SirVer/ultisnips’" Plugin ‘majutsushi/tagbar’Plugin ‘vim-scripts/taglist.vim’" Plugin ‘junegunn/vim-emoji’" Plugin ‘rjohnsondev/vim-compiler-go’" Plugin ‘dgryski/vim-godef’" Plugin ‘davidhalter/jedi-vim’" Plugin ‘scrooloose/syntastic’" All of your Plugins must be added before the following linecall vundle#end() " requiredfiletype plugin indent on " required" To ignore plugin indent changes, instead use:“filetype plugin on”" Brief help" :PluginList - lists configured plugins" :PluginInstall - installs plugins; append ! to update or just :PluginUpdate" :PluginSearch foo - searches for foo; append ! to refresh local cache" :PluginClean - confirms removal of unused plugins; append ! to auto-approve removal"nmap <C-h> <C-w>hnmap <C-l> <C-w>lnmap <C-j> <C-w>jnmap <C-k> <C-w>k" see :h vundle for more details or wiki for FAQ" Put your non-Plugin stuff after this linemap <C-n> :NERDTreeToggle<CR>map <C-t> :b 1 <CR>Bundle ‘majutsushi/tagbar’nmap <Leader>t :TagbarToggle<CR>let g:tagbar_width = 25autocmd VimEnter * nested :call tagbar#autoopen(1)autocmd BufWritePre *.go:Fmtlet g:tagbar_right = 1let g:tagbar_type_go = { \ ‘ctagstype’ : ‘go’, \ ‘kinds’ : [ \ ‘p:package’, \ ‘i:imports:1’, \ ‘c:constants’, \ ‘v:variables’, \ ’t:types’, \ ’n:interfaces’, \ ‘w:fields’, \ ’e:embedded’, \ ’m:methods’, \ ‘r:constructor’, \ ‘f:functions’ \ ], \ ‘sro’ : ‘.’, \ ‘kind2scope’ : { \ ’t’ : ‘ctype’, \ ’n’ : ’ntype’ \ }, \ ‘scope2kind’ : { \ ‘ctype’ : ’t’, \ ’ntype’ : ’n’ \ }, \ ‘ctagsbin’ : ‘gotags’, \ ‘ctagsargs’ : ‘-sort -silent’ \ }let g:molokai_original = 1let g:rehash256 = 1set sw=4colorscheme molokaiset nuset ts=4set expandtabsyntax onlet g:go_highlight_functions = 1let g:go_highlight_methods = 1let g:go_highlight_structs = 1let g:go_highlight_operators = 1let g:go_highlight_build_constraints = 1let g:go_fmt_command = “goimports"let g:go_fmt_fail_silently = 1let g:syntastic_go_checkers = [‘golint’, ‘govet’, ’errcheck’]let g:syntastic_mode_map = { ‘mode’: ‘active’, ‘passive_filetypes’: [‘go’] }let g:UltiSnipsExpandTrigger="<C-g>““godef"will open the definition in a new tablet g:godef_split=2let g:godef_same_file_in_same_window=1au FileType go nmap <leader>r <Plug>(go-run)au FileType go nmap <leader>b <Plug>(go-build)au FileType go nmap <leader>T <Plug>(go-test)au FileType go nmap <leader>c <Plug>(go-coverage)au FileType go nmap <Leader>ds <Plug>(go-def-split)au FileType go nmap <Leader>dv <Plug>(go-def-vertical)au FileType go nmap <Leader>dt <Plug>(go-def-tab)“set statusline+=%#warningmsg#“set statusline+=%{SyntasticStatuslineFlag()}“set statusline+=%*let g:syntastic_always_populate_loc_list = 1let g:syntastic_auto_loc_list = 1let g:syntastic_check_on_open = 1let g:syntastic_check_on_wq = 0set rtp+=$GOPATH/src/github.com/golang/lint/misc/vimautocmd BufWritePost,FileWritePost *.go execute ‘Lint’ | cwindow"“if emoji#available()” let g:gitgutter_sign_added = emoji#for(‘small_blue_diamond’)” let g:gitgutter_sign_modified = emoji#for(‘small_orange_diamond’)” let g:gitgutter_sign_removed = emoji#for(‘small_red_triangle’)” let g:gitgutter_sign_modified_removed = emoji#for(‘collision’)” endif"eset completefunc=emoji#completemap <C-e> :%s/:([^:]+):/=emoji#for(submatch(1), submatch(0))/g <CR> ...

February 27, 2019 · 3 min · jiezi

峰采 #2

PS峰采第二期姗姗来迟。原来我们的世界一直在进步?人类有了希望?刘作虎的英文名是什么?硅谷的尤达大师是哪位?Read on…The Listhttps://standardnotes.org/跨平台的笔记软件。比EverNote轻量。支持Android, iOS, MacOS, Windows, Linux。无需科学上网。全程加密。不限量,不限设备。非常适合像我这样用Android手机,但是其它设备都是iOS的同学。https://www.vox.com/2014/11/2…世界一直在进步的数据证明。从历史上看,哪怕是近二十年的历史,贫穷,饥饿的数据一直都在改善。西欧国家人民的休闲时间一直在增加。https://howmuch.net/articles/…world economy in one charthttps://github.com/warmchang/…KubeCon 2018 北美PPT。翻翻可以接受些新概念https://github.com/rhysd/vim….Vim被移植到Webassembly了。难道Write Once, Run Everywhere终于要实现?https://www.nytimes.com/2018/…大神膜拜时间。英文title叫"The Yoda of Silicon Valley"。硅谷的尤达大师。看照片像不像?https://github.com/Netflix-Sk…用命令行操作jirahttps://www.theverge.com/2018…你知道刘作虎的英文名叫什么?Pete Lau。。。。一个浙江人挺起来象香港人。。我也是醉了。https://www.eater.com/2016/6/…Maybe Just Don’t Drink Coffee关于咖啡鄙视链的好玩的英文文章,没啥技术东西https://mp.weixin.qq.com/s/aB…王兴:20年to C,20年to B第一篇中文文章。理论很高。服后可能有醍醐灌顶的感觉。但最后结论还是“学欧美”难免让人丧气。https://github.com/jaywcjlove…又一篇Awesome XXXX。这篇是给Mac的。https://ideas.ted.com/how-wor…TED talk。少干活可是解决你所有的问题,真的。。。。真的吗?https://www.wired.com/2017/02…标题就够炫:程序猿是新蓝领。原来美国只有8%的程序人在硅谷工作。IT的平均工资是81000刀 - 重点是其它工种的两倍。我天朝也差不多吧。。。。http://facesofopensource.com又到拜大神时间,“开源的面孔”。 第一位是Linus! 看看你能认出几个?我看了一下,里面美女还不少哦。 Eric Schmit 创造了 Lex。说明牛人早已是牛人。另外还有几个几个亚洲面孔:git 维护者,Henry Zhuhttps://github.com/rgcr/m-cli又一个命令行工具。号称macOS的瑞士军刀!PS图片有点大。下次看看能不能缩一下。

February 17, 2019 · 1 min · jiezi

Vim 主题:space-vim-theme -- 支持 dark 和 light 两种背景

自从接触过 spacemacs 以后,就非常喜欢它的主题:spacemacs-theme,后来照葫芦画瓢移植了一个深色背景下的 space-vim-dark。不过用了一段时间以后发现,如果白天光线非常好,使用黑色背景可能会出现反光的情况,所以就基于 vim-colortemplate 重新移植了 spacemacs-theme,这次同时支持深色和浅色背景。按照 vim-colortemplate 的说法,space-vim-theme 在加载速度上应该比之前快了一点,大概几毫秒 :(项目地址:space-vim-themedarklight上面截图中使用的 terminal 是 kitty,字体是 Iosevka Term。使用 vim-plug 安装 space-vim-theme:Plug ’liuchengxu/space-vim-theme’在 .vimrc 中启用 space-vim-theme:colorscheme space_vim_theme:h space_vim_theme 查看配置项说明。

February 2, 2019 · 1 min · jiezi

???? vim-plug 的安装和使用

正确安装 vim-plug之前写了一篇???? 一篇文章讲清楚如何安装vim插件,见各位童鞋留言说 vim-plug 更好用。果然各种插件方便管理,安装也很简单。下面简单说下 vim-plug 的操作基本姿势:安装 vim-plugvim-plug 是一个 vim 的插件管理插件(A minimalist Vim plugin manager),安装使用简单:首先下载 plug.vim 文件,戳这里下载并将文件放在 windows 中的 ~/vimfiles/autoload 或 unix 中的 /.vim/autoload 文件夹内或使用如下命令# Unixcurl -fLo /.vim/autoload/plug.vim –create-dirs \ https://raw.githubusercontent.com/junegunn/vim-plug/master/plug.vim# windowsmd \vimfiles\autoload$uri = ‘https://raw.githubusercontent.com/junegunn/vim-plug/master/plug.vim'(New-Object Net.WebClient).DownloadFile( $uri, $ExecutionContext.SessionState.Path.GetUnresolvedProviderPathFromPSPath( “\vimfiles\autoload\plug.vim” ))这样就算安装完成了…安装插件安装插件,只需要将插件写在 .vimrc 内,然后在 vim 中使用 :PlugInstall 命令即可:call plug#begin(’/.vim/plugged’)Plug ‘vim-airline/vim-airline’call plug#end()确保插件要放在 begin 和 end 之间重新打开 vim 使用命令 :PlugInstall:Finishing … Done! 表示安装完成删除插件删除插件,只需要将写在 .vimrc 配置文件内的插件删除,重启 vim 并执行命令 :PlugClean 即可:call plug#begin(’/.vim/plugged’)call plug#end()保存在 vim 中使用 :PlugClean:其他操作见官网vim-plug

February 1, 2019 · 1 min · jiezi

???? 一篇文章讲清楚如何安装vim插件

???? 正确安装 Vundle之所以写这篇文章,其一是打算用 vim 来写 python 后端代码。笔者有两台电脑一台 PC 一台 MBP,在 PC 上安装 Vundle 插件遇到了几个坑,这里顺便写篇文章记录一下,废话不多说 let’s dive in正确安装依赖如要使用 Vundle 必须安装 Git 和 Curl,在 windows 中通常使用 chocolatey 来安装各种包,如果你没有使用过 chocolatey,首先需要安装:按照官网安装方法一步一步走即可:chocolatey 官网然后安装 Git 和 Curl,如果已经安装过则跳过这一步:C:&gt; choco install -y gitC:&gt; choco install -y curl这样表示安装成功Vundle 安装前的准备参考官方安装指引 Vundle on Windows首先遇到的第一个坑就是文件夹不同的命名方式:By default, Vim on Windows will still look for .vimrc and install to ~/.vim. This doesn’t work perfectly on Windows as the files aren’t hidden, but .gitignore files are used in the same manner fairly commonly. You could for example change .vimrc to _vimrc and .vim to vimfiles - this would then require a change to the example vimrc below.因为上述原因,建议将 .vimrc 改名为 _vimrc 以及 .vim 文件夹名称改为 vimfiles然后是环境变量:Additionally, if you’ve set %HOME% environmental variable to some directory, that’s the directory vim will search as ~/, thus you have to put .vimrc file and /.vim folder under the directory or remove %HOME% from environmental variable settings to use %USERPROFILE% as default.如果你修改了 %HOME% 的指向,那么你需要将其删除,并默认使用 %USERPROFILE%Vundle 开始安装进入到用户根目录,然后使用 git 命令获取 Vundle 并编辑 .vimrc 或 _vimrccd %USERPROFILE%git clone https://github.com/VundleVim/Vundle.vim.git %USERPROFILE%/.vim/bundle/Vundle.vimgvim .vimrc # 或使用 vim .vimrc打开官方指引 Quick Start-3. Configure Plugins将其中的代码全部 copy 到 .vimrc 或 _vimrc 文件中去:修改其中部分代码:set rtp+=/.vim/bundle/Vundle.vimcall vundle#begin()改为:set rtp+=$HOME/.vim/bundle/Vundle.vim/call vundle#begin(’$HOME/.vim/bundle/’)修改这个也是因为路径问题修改 .vimrc最后关闭并重新打开一个终端,修改 .vimrc 清理掉暂时不用的 Plugin:在红色箭头之间的都是我们需要安装的 Plugins,其中 Plugin VundleVim/Vundle.vim 蓝色箭头部分不可删,这个是 Vundle 管理插件的插件Plugin ‘rstacruz/sparkup’, {‘rtp’: ‘vim/’} 这个插件最好也不要删掉,如果出现错误尝试修改成 Bundle ‘rstacruz/sparkup’, {‘rtp’: ‘vim’} Trailing slash issue我们将其他插件暂且删除:修改后的文件长这样:然后 :wq 关闭文件,命令行中执行 vim安装插件准备操作完成后我们就可以去安装插件了第一种安装方式 使用 PluginInstall 命令然后执行安装 plugin 操作::PluginInstall安装过程中耐心等待出现 done 即安装完成::q 关闭然后我们尝试安装其他插件:搜索插件 :PluginSearch colorscheme选择一个你想要安装的插件,并敲击键盘 i 来安装这个插件:正在安装:安装完毕:然后选中这个插件的名称,并粘贴到 .vimrc 文件中去:关闭并退出,这样这个插件就算安装完毕了执行 :PluginList 查看我们已经安装过的插件:第二种方式 浏览 vimAwesome 网站vimawesome 网站提供了大量的不错的 vim 插件列表,可以在这个网站里搜索各种插件比如这里搜索 vim-airline,直接复制红色箭头部分的代码将代码粘贴到 .vimrc 中去然后执行 :PluginInstall 就会自动将这个插件安装好:查看效果:删除插件删除插件也很简单,首先进入到 vim 并执行 :PluginList 然后选择你想要删除的插件,并使用快捷键 shift + D,退出,打开 .vimrc 文件将你删除的那个插件从配置文件中删掉即可OK 就这么多更多好用的插件大家自己去探索吧 ...

January 31, 2019 · 2 min · jiezi

在 Vim 中使用 graphviz.vim 画图

本文主要介绍 graphviz.vim, fork 自 wmgraphviz.vim,但是除了复用补全数据,我几乎重写了所有内容,并做了很多改进。可能很多人没用过 graphviz,它是一个开源的图可视化工具,使用 DOT 语言进行绘制,优点是可以自动布局,尤其适用于复杂的流程图,结构图等等。官方有很多示例,使用时也可以参考一些其他的优秀案例,比如:本文并不会对 graphviz 本身做太多介绍,而是分享如何在 Vim 中使用 graphviz.vim 插件方便画图。wmgraphviz.vim 是 graphviz.vim 的前身,提供了一些补全,一键编译,查看编译后文件等功能。但是使用起来感觉不是那么 fashion,很久以来也几乎没怎么更新,比如依然在于 ! 进行外部调用。graphviz.vim 整个插件非常简单,本质上就是封装了一些编译,一键查看的命令而已,主要改进包括:命令更少,配置项更简单。只有 :Graphviz 和 :GraphvizCompile 两个命令,:Graphviz 用于打开编译后的文件,:GraphvizCompile 用于编译当前文件。如果 :Graphviz! 则相当于 :GraphvizCompile | Graphviz。对于可选项,我采用了传入参数进行调控。支持 ncm2 和 coc.nvim。这个很简单,只是简单封装了下 Omni 补全以适应 ncm2 和 coc.nvim。安装使用 vim-plug 进行安装:Plug ’liuchengxu/graphviz.vim’用法:Graphviz 打开编译后的文件,文件名取自当前文件,辅以不同后缀。默认是打开 pdf 类型,比如当前打开的文件叫 foo.dot,那么 :Graphviz 是尝试打开 foo.pdf 的文件,可以传入扩展名进行指定。" 默认打开 pdf 文件" 可选项: ‘ps’, ‘pdf’, ‘png’, ‘jpg’, ‘gif’, ‘svg’:Graphviz" 打开 png 文件:Graphviz png:Graphviz! 会在目标文件不存在的情况下,尝试调用 :GraphvizCompile 进行编译然后再打开,相当于 :GraphvizCompile | Graphviz。:GraphvizCompile 用于编译当前文件,可以指定编译程序和扩展名,默认是 dot pdf。" :GraphvizCompile [exe] [format]" 默认是用 dot 编译成 pdf" :GraphvizCompile dot pdf:GraphvizCompile" 指定编译成 png 格式:GraphvizCompile png" 指定用 dot 编译成 gif 格式,实际上我没用过除 dot 的其他编译项:(:GraphvizCompile dot gif其他一些可选配置项:" 指定打开文件的命令。默认会根据平台自动选择" macOS 使用 open, Linux 使用 xdg-open 等let g:graphviz_viewer = ‘open’" 默认编译生成 pdf 格式,如果想要其他格式,将 pdf 换成其他格式即可let g:graphviz_output_format = ‘pdf’我基本只用 macOS, 所以 Windows 或者 Linux 没怎么测试过,如果遇到问题,可以到 graphviz.vim 提 issue,我会尽量解决 :(。 ...

January 13, 2019 · 1 min · jiezi

Markdown编辑器

@TOC欢迎使用Markdown编辑器你好! 这是你第一次使用 Markdown编辑器 所展示的欢迎页。如果你想学习如何使用Markdown编辑器, 可以仔细阅读这篇文章,了解一下Markdown的基本语法知识。新的改变我们对Markdown编辑器进行了一些功能拓展与语法支持,除了标准的Markdown编辑器功能,我们增加了如下几点新功能,帮助你用它写博客:全新的界面设计 ,将会带来全新的写作体验;在创作中心设置你喜爱的代码高亮样式,Markdown 将代码片显示选择的高亮样式 进行展示;增加了 图片拖拽 功能,你可以将本地的图片直接拖拽到编辑区域直接展示;全新的 KaTeX数学公式 语法;增加了支持甘特图的mermaid语法1 功能;增加了 多屏幕编辑 Markdown文章功能;增加了 焦点写作模式、预览模式、简洁写作模式、左右区域同步滚轮设置 等功能,功能按钮位于编辑区域与预览区域中间;增加了 检查列表 功能。功能快捷键撤销:Ctrl/Command + Z重做:Ctrl/Command + Y加粗:Ctrl/Command + Shift + B斜体:Ctrl/Command + Shift + I标题:Ctrl/Command + Shift + H删除线:Ctrl/Command + Shift + S无序列表:Ctrl/Command + Shift + U有序列表:Ctrl/Command + Shift + O检查列表:Ctrl/Command + Shift + C插入代码:Ctrl/Command + Shift + K插入链接:Ctrl/Command + Shift + L插入图片:Ctrl/Command + Shift + G合理的创建标题,有助于目录的生成直接输入1次#,并按下space后,将生成1级标题。输入2次#,并按下space后,将生成2级标题。以此类推,我们支持6级标题。有助于使用TOC语法后生成一个完美的目录。如何改变文本的样式强调文本 强调文本加粗文本 加粗文本==标记文本==删除文本引用文本H2O is是液体。2^10^ 运算结果是 1024.插入链接与图片链接: link.图片: 带尺寸的图片: 当然,我们为了让用户更加便捷,我们增加了图片拖拽功能。如何插入一段漂亮的代码片去博客设置页面,选择一款你喜欢的代码片高亮样式,下面展示同样高亮的 代码片.// An highlighted blockvar foo = ‘bar’;生成一个适合你的列表项目项目项目项目1项目2项目3[ ] 计划任务[x] 完成任务创建一个表格一个简单的表格是这么创建的:项目Value电脑$1600手机$12导管$1设定内容居中、居左、居右使用:———:居中使用:———-居左使用———-:居右第一列第二列第三列第一列文本居中第二列文本居右第三列文本居左SmartyPantsSmartyPants将ASCII标点字符转换为“智能”印刷标点HTML实体。例如:TYPEASCIIHTMLSingle backticks’Isn’t this fun?‘‘Isn’t this fun?‘Quotes"Isn’t this fun?““Isn’t this fun?“Dashes– is en-dash, — is em-dash– is en-dash, — is em-dash创建一个自定义列表Markdown: Text-to-HTML conversion toolAuthors: John: Luke如何创建一个注脚一个具有注脚的文本。2注释也是必不可少的Markdown将文本转换为 HTML。*[HTML]: 超文本标记语言KaTeX数学公式您可以使用渲染LaTeX数学表达式 KaTeX:Gamma公式展示 $Gamma(n) = (n-1)!quadforallninmathbb N$ 是通过欧拉积分$$\Gamma(z) = \int_0^\infty t^{z-1}e^{-t}dt,.$$你可以找到更多关于的信息 LaTeX 数学表达式here.新的甘特图功能,丰富你的文章gantt dateFormat YYYY-MM-DD title Adding GANTT diagram functionality to mermaid section 现有任务 已完成 :done, des1, 2014-01-06,2014-01-08 进行中 :active, des2, 2014-01-09, 3d 计划一 : des3, after des2, 5d 计划二 : des4, after des3, 5d关于 甘特图 语法,参考 这儿,UML 图表可以使用UML图表进行渲染。 Mermaid. 例如下面产生的一个序列图::sequenceDiagram张三 ->> 李四: 你好!李四, 最近怎么样?李四–>>王五: 你最近怎么样,王五?李四–x 张三: 我很好,谢谢!李四-x 王五: 我很好,谢谢!Note right of 王五: 李四想了很长时间, 文字太长了<br/>不适合放在一行.李四–>>张三: 打量着王五…张三->>王五: 很好… 王五, 你怎么样?这将产生一个流程图。:graph LRA[长方形] – 链接 –> B((圆))A –> C(圆角长方形)B –> D{菱形}C –> D关于 Mermaid 语法,参考 这儿,FLowchart流程图我们依旧会支持flowchart的流程图:flowchatst=>start: 开始e=>end: 结束op=>operation: 我的操作cond=>condition: 确认?st->op->condcond(yes)->econd(no)->op关于 Flowchart流程图 语法,参考 这儿.导出与导入导出如果你想尝试使用此编辑器, 你可以在此篇文章任意编辑。当你完成了一篇文章的写作, 在上方工具栏找到 文章导出 ,生成一个.md文件或者.html文件进行本地保存。导入如果你想加载一篇你写过的.md文件或者.html文件,在上方工具栏可以选择导入功能进行对应扩展名的文件导入,继续你的创作。1 ↩ 注脚的解释 ↩ ...

January 9, 2019 · 1 min · jiezi

mac os 安装 iterm2+fish shell 终端配色及vim语法高亮

mac os 安装 iterm2+fish shell 终端配色及vim语法高亮安装iterm2 及 fish shell安装 iterm2iterm2软件下载地址,直接安装dmg文件安装 fish shellfish shell说明及下载地址,根据自己熟悉方式安装fish shell将fish shell添加到mac的shell列表里,用shell命令sudo vim /etc/shells把/usr/local/bin/fish 追加到文件尾处;最后,按esc键跳到命令模式,输入:wq命令保存文件,使用 chsh -s /usr/local/bin/fish 切换到fish shell;打开iterm2时自动打开fish shell,vim ~/bash_profile在文件尾处添加fish命令,使用:wq保存文件即可;vim语法高亮首先开启语法高亮功能,如果没有这个文件就创建文件:vim ~/.vimrc在.vimrc文件尾处添加如下代码:syntax onvim选择主题vim 有更多的主题可以选择,使用如下命令可以查看vim所有的color主题:cd /usr/share/vim/vim73/colors/ && ls在.vimrc文件中添加vim的color主题,命令如下:vim ~/.vimrc添加colorscheme darkblue信息到文件尾处以上所有配置想看效果需要重新打开iterm2,如文中有错误烦请留言指出,谢谢

January 8, 2019 · 1 min · jiezi

VIM Script /VIML 脚本语言入门

参考:Learn Vimscript the Hard Way变量"设置变量let myVariable = 1let myString = ‘Hello’逻辑控制参考:Comparisons - Learn Vimscript the Hard Wayif-else:if 3 >= 1 echo ‘True’elseif 3 < 4 echo ‘True again’elseif 3 == 3 echo ‘True true’else echo ‘False’endifVIM中的字符串和数字是可以直接比较的,如:echo ‘3’ >= 3,返回1.Functions 函数参考:Functions - Learn Vimscript the Hard Way函数名必须大写开头。function MyFunction() :wqendfunction但是如果重载当前vimrc的话,会遇到function already exists警告。所以最好在将函数定义为可重写的函数,即变为function!:function! MyFunction():wqendfunction## 内置函数### has(..)- has(‘程序语言’)- has(‘硬件架构’)- has(‘xxx’)### system(…)- system(‘rm /tmp/*’)### buffer- bufnr(’%’): 返回当前VIM中的buffer数量## autocmd 事件触发器参考非常棒的VIM官方文档(中文翻译):http://vimcdoc.sourceforge.net/doc/autocmd.html格式为::au[tocmd] [group] {event} {pat} [nested] {cmd}中文的话就是::au[tocmd] [组] {事件} {文件名规则} [nested] {命令}如果命令比较复杂的话,建议创建function,然后在autocmd中call func()。## 常用技巧## 获取当前buffer的文件名、路径、扩展名参考:How can I see the full path of the current file?参考:How do I get the name and extension of the current file?都知道,VIM中%代表当前buffer,我们可以增加filename-modifiers来操作%得到buffer关联的文件的相关信息。Register %返回当前文件的名字。所以我们才可以用!python %这样的命令来运行当前脚本。VIM中,%还能做到很多的扩展::echo @% |" directory/name of file:echo expand(’%:p’) |" full path “PATH”:echo expand(’%:p:h’) |" directory containing file “HEAD”:echo expand(’%:t’) |" full name of file “TAIL”:echo expand(’%:t:r’) |" Only name of file “ROOT”:echo expand(’%:e’) |" Only extension of file “EXTENSION"我们在vimrc中使用的时候,可以省略echo和expand。比如:nnoremap &lt;C-g&gt; :!CMD %:p:h&lt;CR&gt;,这样可以在按Ctrl-g时候,在当前文件所在的目录执行CMD命令“获取路径echo expand(’%:p’) “/home/mool/vim/src/version.c"获取文件全名echo expand(’%:t’) “version.c"获取文件名,不包括扩展名echo expand(’%:t:r’) “version"获取扩展名echo expand(’%:e’) “c## Multiple lines 换行以\开头,|结尾,即可连接多行为一行。au Filetype ruby \ setlocal ts=2 | \ setlocal sts=2 | \ … ...

January 7, 2019 · 1 min · jiezi

VIM替代插件的原生功能合集(持续更新)

How to Do 90% of What Plugins Do (With Just Vim)This collection is inspired by the youtube video: How to Do 90% of What Plugins Do (With Just Vim)VIM内置文件浏览框NetRWg:netrw_browse_split是重要的选项,直接影响体验: g:netrw_browse_split when browsing, <cr> will open the file by: =0: re-using the same window (default) =1: horizontally splitting the window first =2: vertically splitting the window first =3: open file in new tab =4: act like “P” (ie. open previous window) g:netrw_liststyle Set the default listing style: = 0: thin listing (one file per line) = 1: long listing (one file per line with time stamp information and file size) = 2: wide listing (multiple files in columns) = 3: tree style listingFile Navigation# Fuzzy recursively search file in current folder & open it:find test.py*# Fuzzy search buffers ever opened & open it:b fileVim原生补全工具 OmniComplete用了一天倒腾自动补全插件,实在是崩溃,但凡有点名气的都对vim本身的编译有很麻烦的要求。搜索过程中才发现Vim其实是自带补全功能的,称为OmniComplete。输代码的过程中,直接按Ctrl+X然后再按Ctrl+O,就会弹出vim猜测的一系列补全内容。可以在菜单里按“上下键”选择,注意是方向上下键,不是JK键。经过测试,原生支持很多种语言。在Insert编辑模式时,输入某个词,然后:按Ctrl+x再按Ctrl+l,就会显示出一个提示列表。按Ctrl+n或Ctrl+p上下选择。当然,这样按键太麻烦,我们要做键盘映射了:" 按Ctrl+d显示自动补全inoremap <C-d> <C-x><C-l> ...

January 7, 2019 · 1 min · jiezi

VIM的小插件合集(持续更新)

Vim 安装插件管理器Vundle安装插件前,一般都会用到Vundle这个插件包管理器。它的名字其实是Vim bundle的组合。安装方法可以参考官网,说的很详细。简单说的话,安装方法如下:git clone https://github.com/VundleVim/Vundle.vim.git /.vim/bundle/Vundle.vim然后打开/.vimrc,把下面这段话全部粘贴到文件顶部:" Vundle phrases must be on the topset nocompatible " be iMproved, requiredfiletype off " requiredset rtp+=/.vim/bundle/Vundle.vimcall vundle#begin() Plugin ‘VundleVim/Vundle.vim’call vundle#end() " requiredfiletype plugin indent on " required其中Plugin的部分,可以删除不需要的插件。保存后,直接在Vim界面里输入这个命令::PluginInstall,或在外部运行vim -c VundleUpdate -c quitall。然后vim就会跳转到插件安装界面,并自动下载安装上面列出来的插件。等到最下面显示Done!时,就安装完成了。需要整个退出Vim,再进入,就可以使用了。删除插件直接在.vimrc里把Plugin的那一行删除,然后在vim里运行:PluginUpdate即可,然后将/.vim/bundle/下该插件的目录删除。Vim的vim-multiple-cursors插件官方Github链接。这个插件是可以像Sublime Text一样快捷多选文本的插件。总结:虽然看起来很爽,其实操作起来并没有想象中的那么简单,离Sublime Text的多选便捷度差太远。而且又要重新学习一套东西,记住一系列的命令。而且还要用到各种方向键。所以还不如用Vim原生的多选功能。真的没有必要。Vim 的Git插件 - Fugitive在vim里面操作,总是切换出去用git命令提交,一开始学习阶段还好,但是慢慢也烦了,就找到了这款最通用的插件,而且是Vundle管理器的默认搭配插件。参考文章。常用命令如下:

January 7, 2019 · 1 min · jiezi

VIM小技巧合集(持续更新)

Leader键参考:http://learnvimscriptthehardw…Vim的默认Leader前缀是\键。说白了,就是一个快捷命令的前缀。一般比如cc,dd之类都被占用,映射起来不方便。所以加上前缀后,就可以追加各种自己喜欢的快捷命令了。Vim注释的方法Vim里面注释对初学者真是比较头疼的事情。需要先$跳到行头,i插入模式,输入注释,Esc退出插入模式。如果批量就更麻烦。下面是几种常用方法。原生方法一Ctrl+v进入Block选择,向下移动选择待注释行,Shift+i批量插入,输入注释符,按两次Esc退出,等几秒实现批量注释。.vimrc配置文件法在.vimrc中加入如下语句:" Commenting blocks of code.autocmd FileType c,cpp,java,scala let b:comment_leader = ‘// ‘autocmd FileType sh,ruby,python let b:comment_leader = ‘# ‘autocmd FileType conf,fstab let b:comment_leader = ‘# ‘autocmd FileType tex let b:comment_leader = ‘% ‘autocmd FileType mail let b:comment_leader = ‘> ‘autocmd FileType vim let b:comment_leader = ‘" ’noremap <silent> ,cc :<C-B>silent <C-E>s/^/<C-R>=escape(b:comment_leader,’/’)<CR>/<CR>:nohlsearch<CR>noremap <silent> ,cu :<C-B>silent <C-E>s/^\V<C-R>=escape(b:comment_leader,’/’)<CR>//e<CR>:nohlsearch<CR>然后注释的快捷键是,cc,取消注释是,cu。插件法常用插件有NerdCommenter,在vimrc的插件位置中加入Plugin ‘scrooloose/nerdcommenter’,重新打开vim后输入:PluginInstall后安装成功。注释的快捷键是\cc,反注释是\cu。其实和自己直接在vimrc中写没什么太大区别。其它注释插件大同小异,就不都说了。Vim里Insert模式下不能按Backspace删除前面的内容因为默认当前插入只能创建新内容,不允许改动别的东西。如果要变成Insert mode下随便编辑的模式,在~/.vimrc中加上:set backspace=indent,eol,start或者更简单的set backspace=2,效果一样。Vim中Tab变Space等相关设置Tab和Space之争和Vim于Emacs是一样等,我是Vim和Space派。但是我和大多数人一样喜欢按Tab出Space。在~/.vimrc中设置如下,重启vim就会生效:set autoindent “换行时自动缩排 同时对应的还有其它两种模式 smartindent, cindentset tabstop=4 “设定tab宽度为4个字符set shiftwidth=4 “设定自动缩进为4个字符set expandtab “用space替代tab的输入 取消的话 就用set noexpandtab “不用space替代tab的输入retab “打开文件时自动转换所有tab为空格Vim产生的.swp文件参考文章:VIM不正常退出产生的swp文件常用关于swp文件的命令或vimrc配置:查看当前目录下的所有swp文件: vim -r恢复文件:vim -r filename,上次意外退出没有保存的修改,就会覆盖文件。停止vim产生交换文件:在~/.vimrc中加入set noswapfile定时自动保存文件:set updatetime=23000 " 设置每200个字符保存一次set updatecount=400 " 设置每4秒保存一次” set updatecount=0 " 不保存交换文件设置交换文件默认目录:set directory=./tmpVim不会帮你自动保存当前文件,但是它会帮你创建一个缓存文件,一旦不正常退出或掉线,你能通过这个文件快速recover恢复过去。恢复文件的命令:# 如果是在vim内:rec# 如果是在vim外vim -r FILENAME参考:VIM不正常退出产生的swp文件找到~/.vimrc加入这些内容可以设置缓存文件:” —- Swap files (for recovery) —-set swapfile “enable swap fileset updatetime=23000 “save swap file every amount of msset updatecount=20 “save swp file every amount of charactersset directory=/tmp “set swp file directory. Vim自动运行(或编译运行)文件不像SublimeRepl需要安装插件,Vim原生支持直接运行python等代码。只要输入命令::!python %其它语言代码类似。输入命令后,vim界面会暂时跳出编辑页面跳到终端页面显示执行过程,期间可以按任意键返回vim编辑页面。输过一次后,就可以用:!!直接重复上次的命令,不用再输一遍命令。为什么Vim左下角总显示"recording"这是因为不小心按到了q键,进入了录制宏模式。再按以下q就退出了。Vim支持鼠标滚动界面Mac下,Vim支持鼠标滚动光标,通过光标移动上下翻动页面。但是这样太别扭了,我们需要的是滚轮控制界面滚动,如vim中ctrl+e一样的效果。简单:/.vimrc中加一句set mouse=a即可。不过这样设置会导致每次用鼠标选择一段文本都会自动进入visual模式,这样的话我们就没法复制到系统剪切板了。网上说mouse后一个-好即可,如set mouse-=a,但是试过没用。这时候,需要按住Alt键然后再用鼠标选择文本,这样一来就不会启动v模式,且可以复制到剪切板。Vim里批量查找替换文字没有一般编辑器按快捷键那么方便,需要以输入一条命令的方式才能执行。格式如下:对当前行执行替换 :s/查找内容/替换内容/g在全文执行替换 :%s/查找内容/替换内容/g对选中行中内容进行批量替换 用v模式选中行然后s/查找内容/替换内容/g大概可以看到,s代表执行search命令,%代表全文执行,/是相当于分隔符,g代表global对指定范围内所有结果进行替换,如果没有g那么只替换第一个找到的结果。Vim 文件操作参考:在 Vim 中进行文件目录操作# 新建文件/打开文件: e [FILE-NAME]# 新建文件 (只打开半个窗口 另半个窗口保留之前的文件):new [FILE-NAME]# 退出 (如果文件更改则保存):x 打开目录:e FOLDER-PATH " 编辑该目录:Explore . " 浏览该目录:Sexplore . " 在水平分割窗口中浏览该目录:Vexplore . " 在垂直分割窗口中浏览该目录调用bash命令# 列出文件:!ls# 删除文件:!rm foo.txtVim Recording 录制动作并重复我不是很喜欢宏这个词,很简单的东西把它弄复杂了。Vim记录你的一系列动作很简单,关键字是q。记录并重复一系列的动作,只要这样做:按q和{0-9a-zA-Z}中任意一个字,比如q1,开始记录动作。状态栏显示:recording @1。开始做一系列的动作,改词,删字,等等。按q,结束当前的记录。按@1,重现刚才记录的动作。Vim鼠标支持问题Vim高版本默认是支持鼠标滚动的。但是在Tmux中就不可以。这样可以通过在/.vimrc中设置set mouse=a来达到开启鼠标支持的左右。a模式为all,即鼠标的"完全支持模式”: 在所有情况下都支持鼠标,包括鼠标定位到某行,定位到某个单词,双击选择单词,三击选择整行,甚至在tmux中也一样。但是set mouse=a有一个缺点不好解决就是:鼠标选择文字的话,会默认进入Visual模式。Mac安装带lua、python支持带VIMbrew install vim –with-cscope –with-python –with-lua –override-system-vimvimrc导入另一个文件VIM也有source语法,可以用来导入文件:source ~/.vimrc-keymappingsVIM跳到函数/类定义处内置:gd在调用处按gd即可跳转到函数定义处。需要配合ctags ...

January 7, 2019 · 1 min · jiezi

VIM问题合集(持续更新)

Vim 在Insert模式下粘贴速度很慢的问题一般当我们在Insert模式下粘贴一段超大量的文本,比如1000行。那么Vim会变得奇慢无比,大概半分钟?所以,如果我们要粘贴文本,需要用另一种方法:在Normal模式下调用系统粘贴版进行粘贴,命令如下:"+p这样速度就超快了,一瞬间完成。Homebrew更新后Vim无法打开问题很久不使用brew安装东西,安装了一个小软件,结果Homebrew直接更新python到3.7版本,然后导致Vim完全无法打开。报错如下:dyld: Library not loaded: /usr/local/opt/python/Frameworks/Python.framework/Versions/3.6/Python Referenced from: /usr/local/bin/vim Reason: image not found[1] 38809 abort vim尝试重新安装Vim:$ brew reinstall vim但是经过长时间安装后,仍然失败:最后通过这个解决:$ brew uninstall –ignore-dependencies perl$ brew uninstall vim$ brew install vimVim下方总是弹出总是弹出enter or type command to continue或Error E349 no identifier under cursor这个很恼火。搜了一圈发现,有人说是vimrc的配置出了问题,但是就算我把vimrc整个清空了也还是有这个问题。Vim报错Sorry, this command is disabled, the Python’s site module could not be loaded.一般是在系统中改动了python的环境或什么,导致vim的一些插件无法使用python。测试:在vim里面输入:py print(‘hello’)。如果返回这个错误,说明vim没有找到python。然后在vim里输入:echo has(‘python’)和:echo has(‘python3’),哪个显示0哪个也是没有的。通过这个命令,vim –version | grep python,我们先查看下当前vim版本对python的支持:说明我当前的vim支持python,不支持python3.另外,直接vim –version可以先看到,我的vim已经用brew install vim更新到了vim 8.0:所以出错原因就在于这里了。真是不应该随便brew install vim,之前vim是7.4。各种查找资料后(国内解决方案很少,国外解决方案也集中在vim官方github的issues里面),找到这个简单易懂的方案:上面说了,基本大家在Mac上遇到这个问题都是brew升级vim版本后产生的。所以再用brew uninstall vim就可以了,如果还不行,就再uninstall后加条件:brew reinstall vim –with-custom-python。再不行的话,就按照本机的python支持情况按个例解决了。我直接brew reinstall vim就解决了。 ...

January 7, 2019 · 1 min · jiezi

Vim-Auto-pairs总结

用过Sublime的都知道,写引号、括号之类配对的文字时,它都会智能的自动补全另一边括号。同样,VIM也有很多实现它的插件。其中比较轻量好用的有autoclose和auto-pairs,而auto-pairs更智能、更全面。参考官网:jiangmiao/auto-pairs官方Repo的介绍很清楚的解释了每种用法,扫一眼就都明白了。这里记录一些高级的问题。<M-e>键的问题初看,并不明白<M>在键盘上是什么?Google了很久也查不到。最后终于在查关键字Vim Key Notation发现了,原来<M>代表Meta key,在很多终端或平台是不支持的。偶尔有支持的,那就是Alt键。这个时候,它和<A-..>是同样的意思。但是,自动补全括号中,有一个fast wrap功能,需要用到<M-e>键,即Alt-e键。可是不管怎么按,在insert还是normal模式按,都只会输出一个奇怪符号´,而不执行命令。为什么?因为Alt快捷键,在很多Terminal或平台都是不支持的,比如Mac的终端。经过一番查询,Mac的iTerm2可以将Alt(Option)键映射为Meta键。位置为:Preference -> Profiles -> Keys -> Left Option key -> ESC+.然后就能解决fast wrap的问题了,效果如官方解释一样非常方便:input: |‘hello’ (press (<M-e> at |)output: (‘hello’)wrap string, only support c style stringinput: |‘h\el'lo’ (press (<M-e> at |)output (‘h\ello'’)input: |[foo, bar()] (press (<M-e> at |)output: ([foo, bar()])除了<M-e>即Alt-e外,还有很多自动补全括号引号的按键:System Shortcuts: <CR> : Insert new indented line after return if cursor in blank brackets or quotes. <BS> : Delete brackets in pair <M-p> : Toggle Autopairs (g:AutoPairsShortcutToggle) <M-e> : Fast Wrap (g:AutoPairsShortcutFastWrap) <M-n> : Jump to next closed pair (g:AutoPairsShortcutJump) <M-b> : BackInsert (g:AutoPairsShortcutBackInsert)If <M-p> <M-e> or <M-n> conflict with another keys or want to bind to another keys, add let g:AutoPairsShortcutToggle = ‘<another key>’to .vimrc, if the key is empty string ‘’, then the shortcut will be disabled.如果Alt键太难按,也可以设置mapping如:imap <C-d>e <M-e>,也就是按Ctrl-d,再按e即可。imap <C-d>p <M-p>,也就是按Ctrl-d,再按p即可。或者:imap <C-d> <Meta>,那么之后就都一样了,只要按Ctrl-d,再按e/p/n/b/{等等注意:设置映射时候,不能用inoremap了,实践中,只有imap才能生效。JSON自动补全问题一开始非常奇怪,在我写一个*.json文件时候,每次输完一对引号,在其中输入数字时候,所有引号就全部消失。一开始以为是bug,结果发现是插件有意为之!也就是说,auto-pairs等多种插件,都会为了方便阅读,自动帮你隐藏JSON中的引号,让它看起来更简介,更像YAML文件。 ...

January 7, 2019 · 1 min · jiezi

VIM动态预览Markdown文章

推荐JamshedVesuna/vim-markdown-preview这个插件,依赖非常少,也不需要服务器等,最简单的实现动态预览功能。依赖请参考: https://github.com/JamshedVes…主要依赖的只是Markdown转HTML的渲染引擎。二选一:daringfireball-Markdown ,或(推荐) joeyespo/grip,需在vimrc中加入let vim_markdown_preview_github=1pip install grip –user,或brew install grip 不知道为什么只有这个好用其中grip是推荐的引擎,可以在shell命令行中独立使用。功能就是渲染当前文件夹中的所有markdown文件并建立localhost服务器承载html网页。然而显然JamshedVesuna/vim-markdown-preview并没有使用它的服务器而只是用它渲染为本地html页面。在命令行里输入grip即可立刻弹出网页,看到效果。然后只要在VIM插件管理器如vim-plug中加入:Plug ‘JamshedVesuna/vim-markdown-preview`然后:PlugInstall安装即可。VIM中随便进入一个Markdown文档,按Ctrl+p即可弹出浏览器动态预览文档。修改时,需要保存才能自动渲染。目前问题自动渲染不生效,保存文档后,还需要再按Ctrl+p才能更新预览。和官方介绍不同,不知道是哪里出了问题。

January 7, 2019 · 1 min · jiezi

VIM Lazy Load 懒加载/延迟加载技术

很多重量级插件在启动时是非常耗时的,动不动400ms以上,比如YCM,效果很明显。但是我们实际上没必要一开始就加载所有的插件,而是有些文件才用得上,或者Insert模式才用得上。所以,我们可以按需加载,这样就省了很多时间。参考:延迟加载ycm以加快vim的启动速度配合vim-plug插件管理器的On功能(On-Demand),和autocmd命令,我们可以简单做到这点:" 插件定义处:Plug ‘Valloric/YouCompleteMe’, { ‘on’: [] }" 配置:augroup load_ycm autocmd! autocmd InsertEnter * call plug#load(‘YouCompleteMe’) | autocmd! load_ycmaugroup END如果在Plug后面加上了on或for选项,那么意味着启动时候这个插件会禁止加载。而加载的时间,需要我们后面手动指定一个autocmd自动命令或命令组来实现。而手动加载插件的命令为:call plug#load(‘插件名’)具体on和for的用法,参考官网:on-demand-loading-of-plugins

January 7, 2019 · 1 min · jiezi

VIM加速

使用VIM内置命令查看加载时间参考:vim 启动速度优化的一些经验$ vim –startuptime /tmp/vim.log ~/.vimrc +qall && cat /tmp/vim.log |sort -nrk 2然后就能看到各个环节加载时间,以ms毫秒为单位,即小数点前面是毫秒数。其中第一列是时间点,第二列是时长,我们主要关注第二列。一般标准: ”200ms 以下感觉是很好的,超过 500ms 会觉的有点卡,如果超过 1s 就会觉得非常难受了“一般影响速度的元素:语法高亮插件系统函数调用: has()和system()都属于系统级查询,效率极低,尽量减少使用。Nerdtree等文件浏览插件相比于tagbar、fzf等都要多用10倍时间,出乎意料使用第三方脚本分析VIM加载startuptime.vim参考:tweekmonster/startuptime.vim安装好后直接用:StartupTime显示分析结果,非常快。vim-plugins-profile参考:hyiltiz/vim-plugins-profilegit clone https://github.com/hyiltiz/vim-plugins-profile.gitcd vim-plugins-profile# 用Ruby生成分析结果 (较少依赖)ruby ./vim-plugins-profile.rb #命令行显示结果 无需依赖# 用Ruby生成NeoVim的分析结果ruby ./vim-plugins-profile.rb nvim# 用Python生成分析结果(图片)python vim-plugins-profile.py #命令行显示结果python vim-plugins-profile.py -p # 生成条形图,需要matplotlib和SciPy的Pylab依赖# 命令行中查看分析结果bash ./vim-plugins-profile.sh #需要R语言和其插件依赖,较慢如果是Bash执行,则会自动安装R语言等依赖R:ggplot2 。如果是Python执行,则会安装matplotlib和pylab等绘图包依赖。如果是Ruby执行,暂时不需要依赖。推荐使用Ruby。Ruby生成的命令行结果:Python生成的命令行结果:根据系统判断使用哪些插件注意:VIM的has()属于系统级查询,效率极低,拖慢速度。尽可能减少使用。完整OS列表:win32, win64, mac, macunix, unix如果是Mac,则加载这个插件:if has(‘mac’) Plug ‘xxxxxx’endif

January 7, 2019 · 1 min · jiezi

VIM 为什么光标移动缓慢

关键词:vim Highlight_Matching_Pair slowMac上没感觉,但是同样的配置在树莓派上很糟糕,jk移动都非常缓慢,大概等接近一秒才能反应,这让人有点不能忍。通过开启:set verbose=9追踪发现,每次jk移动都会执行一个call s:Highlight_Matching_Pair这样的函数,很明显是高亮对应的括号这样的功能。同样,我们也可以通过:au CursorMoved查看鼠标移动时定义的调用。查看后发现是来自matchparen.vim这个内置插件中的方法。于是搜了一下,在这个vim脚本中发现关闭的方法:: NoMatchParen,就会关闭一切自动配对高亮了。如果再开启,就输入: DoMatchParen参考:Disable Highlight Matched Parentheses in ViM : “let loaded_matchparen = 1” not working有人建议开vim后自动关闭它:" Disable parentheses matching depends on system. This way we should address all cases (?)set noshowmatch" NoMatchParen " This doesnt work as it belongs to a plugin, which is only loaded after all files are." Trying disable MatchParen after loading all plugins"function! g:FuckThatMatchParen () if exists(":NoMatchParen") :NoMatchParen endifendfunctionaugroup plugin_initialize autocmd! autocmd VimEnter * call FuckThatMatchParen()augroup END发现的确关闭了。但是好像jk的速度还是一样。# VIM 光标移动缓慢 vim Highlight_Matching_Pair slowMac上没感觉,但是同样的配置在树莓派上很糟糕,jk移动都非常缓慢,大概等接近一秒才能反应,这让人有点不能忍。通过开启:set verbose=9追踪发现,每次jk移动都会执行一个call s:Highlight_Matching_Pair这样的函数,很明显是高亮对应的括号这样的功能。同样,我们也可以通过:au CursorMoved查看鼠标移动时定义的调用。查看后发现是来自matchparen.vim这个内置插件中的方法。于是搜了一下,在这个vim脚本中发现关闭的方法:: NoMatchParen,就会关闭一切自动配对高亮了。如果再开启,就输入: DoMatchParen参考:Disable Highlight Matched Parentheses in ViM : “let loaded_matchparen = 1” not working有人建议开vim后自动关闭它:" Disable parentheses matching depends on system. This way we should address all cases (?)set noshowmatch" NoMatchParen " This doesnt work as it belongs to a plugin, which is only loaded after all files are." Trying disable MatchParen after loading all plugins"function! g:FuckThatMatchParen () if exists(":NoMatchParen") :NoMatchParen endifendfunctionaugroup plugin_initialize autocmd! autocmd VimEnter * call FuckThatMatchParen()augroup END发现的确关闭了。但是好像jk的速度还是一样。 ...

January 7, 2019 · 1 min · jiezi

Vim模糊文件搜索fzf

不同于Command-T只能用于VIM,大名鼎鼎的fzf是命令行工具,而且只在VIM中使用的话也不需要手动去编译任何依赖,直接用插件管理器安装即可立马使用,通用于VIM和NeoVIM。参考官网Github:junegunn/fzf.vim参考:Fuzzy finder(fzf+vim) 使用全指南安装:直接在vim-plug插件管理器中:Plug ‘junegunn/fzf’, { ‘dir’: ‘/.fzf’, ‘do’: ‘./install –all’ }Plug ‘junegunn/fzf.vim’其中, ‘dir’: ‘/.fzf’会把命令行软件fzf安装到本机的~/.fzf目录中,然后在shell中就可以直接通过执行~/.fzf/bin/fzf来使用fzf命令搜索文件了。使用最简单的话,直接在VIM中输入命令:Files就会弹出当前目录下的所有文件列表,然后可以各种模糊搜索,按Ctrl+p和Ctrl+n上下选择。如果为了方便,可以将:Files命令映射为自己喜欢的快捷键。参考所有内置搜索命令:junegunn/fzf.vim - Commands

January 7, 2019 · 1 min · jiezi

VIM自动补全插件:deoplete

Nvim用的是Shougo开发的NCM,但是在VIM 8+就要用同一个作者开发的Deoplete.参考官网:Shougo/deoplete.nvim注意:这里只讲怎么给vim8安装。安装第一步:安装所有依赖# 安装VIM 8# ….# 安装Python3# ….# 安装vim的Python-client库pynvimpip2 install –user pynvimpip3 install –user pynvim# 安装插件 python的neovim库pip2 install –user neovimpip3 install –user neovim第二步:在vimrc中添加配置set encoding=utf-8set pyxversion=3" 或set pyxversion=2" Python3的可执行文件位置g:python3_host_prog = “/path/to/bin/python3"” 在插件管理器中,比如vim-plug中,加入如下:if has(’nvim’) Plug ‘Shougo/deoplete.nvim’, { ‘do’: ‘:UpdateRemotePlugins’ }else Plug ‘Shougo/deoplete.nvim’ Plug ‘roxma/nvim-yarp’ Plug ‘roxma/vim-hug-neovim-rpc’endiflet g:deoplete#enable_at_startup = 1保存重启vim,并在vim中输入命令:PlugInstall安装插件。第三步:在vim中输入测试命令以下命令不能报错才行::python3 import neovim 不报错,或:python2 import neovim 不报错:echo has(‘pythonx’) 返回1:echo exepath(‘python3’) 能够显示python3的执行文件位置,或:echo exepath(‘python2’) 能够显示python2的执行文件位置:echo neovim_rpc#serveraddr() 能显示服务器的IP地址使用方法在Insert模式下,直接输入文字就会弹出自动补全。然后用Ctrl+n和Ctrl+p上下选择。Add Completion Source 添加补全源一般如果没有安装任何源,则自动补全只会根据当前文件已有的名字进行猜测。这肯定不是我们要的。我们要的效果是:根据语言的特性,补全引用自带库、第三方库的所有类、函数等。参考官方推荐的各语言的补全源:Completion Sources[Python Source]Deoplete的Python推荐使用deoplete-jedi参考:zchee/deoplete-jedi安装依赖:Neovim and neovim/python-clientpython-client: pynvimpip2 install pynvim –userpip3 install pynvim –userjedi: pip install jedi –user安装方法是利用vim-plug管理器:Plug ‘zchee/deoplete-jedi’默认下,什么都不用配置,安装好后就可以很好的用起来了。[C/C++ Source]C/C++用的是deoplete-clangx插件,需要本机安装Clang轻量级C编译器支持。参考:Shougo/deoplete-clangx依赖:本机安装Clang已经能正常使用deoplet然后直接在插件管理器中加入安装即可:Plug ‘Shougo/deoplete-clangx’更新如果本机没有pip2和pip3的话,最方便的是用包管理器重新安装。Mac上:brew install python@2brew reinstall python@2Ubuntu上:sudo apt-get install -y python-pip python3-pip更新如果以上这些都很难满足,那么是时候考虑重新编译VIM了。如果是Mac的话,可以用brew install vim –with-cscope –with-python –with-lua –override-system-vim直接按照可选的语言支持编译vim。测试可行 ...

January 7, 2019 · 1 min · jiezi

编译VIM

编译VIM最麻烦的只有一个问题:各个语言的位置和开发库的位置。注意:语言本身的位置好说,但是dev开发库就不一样了。比如,一般我们本机只安装python,而不会安装python-dev。这是两个完全不一样的概念。第一个我们直接使用的语言,第二个是本机编译、开发能够引用的开发lib库。所以,根据语言支持的需要,我们要安装这些开发库:python-devpython3-devruby-devperl-devlua-devlibncurses5-dev如果安装好这些依赖,且明白各自的位置后,剩下的VIM编译是超级简单的。如果编译出现问题,也绝对是这些位置出现了问题。树莓派编译VIM包括Python/Lua/Ruby/Perl支持# 下载源码cd /tmpwget https://github.com/vim/vim/archive/v8.1.0561.tar.gztar -xzvf v8.1.0561.tar.gzcd vim-8.1.0561# 下载语言支持的开发库(和本机的各种语言使用无关)sudo apt-get install -y libncurses5-dev liblua5.3-dev libperl-dev python-dev python3-dev ruby-dev# 定义各个语言的开发库位置# 修复lua位置sudo mv $(which lua) “$(which lua)_old"sudo ln -s /usr/bin/lua5.3 /usr/bin/luasudo ln -s /usr/include/lua5.3 /usr/include/luasudo ln -s /usr/lib/arm-linux-gnueabihf/liblua5.3.so /usr/local/lib/liblua.so# 修复python位置sudo ln -s /usr/lib/python2.7/config-arm-linux-gnueabihf /usr/lib/python2.7/configsudo ln -s /usr/lib/python3.4/config-3.4m-arm-linux-gnueabihf /usr/lib/python3.4/config# Build./configure \ –prefix=/opt/vim-8.1 \ –enable-gui=auto \ –enable-luainterp \ –enable-python3interp \ –enable-pythoninterp=dynamic \ –enable-perlinterp=dynamic \ –enable-rubyinterp=dynamic \ –enable-cscope \ –enable-multibyte \ –enable-fontset \ –enable-largefile \ –enable-fail-if-missing \ –with-features=huge \ –with-python-config-dir=/usr/lib/python2.7/config \ –with-python3-config-dir=/usr/lib/python3.4/config \ –disable-netbeans && \ echo ‘[ OK ]‘make && sudo make install && echo ‘[ OK ]’# 将旧版本的vim替换sudo mv $(which vim) “$(which vim)_old"sudo ln -s /opt/vim-8.1/bin/vim /usr/bin/vimMac编译VIM包括Python/Lua/Ruby/Perl支持# Downloadcd /tmpwget https://github.com/vim/vim/archive/v8.1.0561.tar.gztar -xzvf v8.1.0561.tar.gzcd vim-8.1.0561# Build./configure --prefix=/opt/vim-8.1 --enable-multibyte --enable-perlinterp=dynamic --enable-rubyinterp=dynamic --with-ruby-command=/usr/local/bin/ruby --enable-pythoninterp=dynamic --with-python-config-dir=/usr/lib/python2.7/config --enable-python3interp --with-python3-config-dir=/usr/local/Cellar/python/3.7.0/Frameworks/Python.framework/Versions/3.7/lib/python3.7/config-3.7m-darwin --enable-luainterp --with-lua-prefix=/usr/local/Cellar/lua/5.3.5_1 --enable-cscope --enable-gui=auto --with-features=huge --enable-fontset --enable-largefile --disable-netbeans --enable-fail-if-missing && \echo ‘[ OK ]‘make && sudo make install && echo ‘[ OK ]‘如果本机没有lua的话:brew install lua然后仔细查看lua路径,一般是/usr/local/Cellar/lua*,把它替换到configure的参数中去。如果Python没有配置好的话,则到/usr/local/Cellar/python目录下搜索config-文件:find /usr/local/Cellar/python -name “config-“然后我得到的是/usr/local/Cellar/python/3.7.0/Frameworks/Python.framework/Versions/3.7/lib/python3.7/config-3.7m-darwin。把它替换到configure的参数中相应位置。 ...

January 7, 2019 · 1 min · jiezi

Vim安装command-t文件检索插件

command-t是强大快速的文件检索插件,但是需要ruby的支持,配置起来不是那么简单。建议在vim-plug管理器里面安装插件,vundle还没试过。vim-plug中定义如下:Plug ‘wincent/command-t’, {\ ‘do’: ‘cd ruby/command-t/ext/command-t && ruby extconf.rb && make’\ }然后重启vim后输入:PlugInstall安装插件。启用command-t是命令:CommandT,或<leader>t。但是这时候肯定是还不能运行的,因为没有做ruby支持的检查。首先在vim中输入:ruby 1,看是否报错。如果不报错,则证明已经识别了本机的ruby。报错的话,则需要在本机安装ruby支持。根据刚才启动command-t时显示的提示信息,安装其expected version来安装指定版本的ruby,比如2.5.1。比如Mac上:brew install ruby@2.5.1这时候还不算完,需要在本地编译插件才能使用,这里最简单的是用到rake命令:# 进入插件目录cd ~/.vim/plugged/command-t# 编译插件rake make安装好后再次到vim中输入命令:ruby 1看看是否报错。如果没有问题的话,就直接输入命令:CommandT看看是否会正常弹出文件搜索窗口:关闭的话,简单的Ctrl+C即可。

January 7, 2019 · 1 min · jiezi

Vim的新一代补全插件:coc.nvim

coc.nvim可以同时在nvim和vim8.1+上使用。安装参考官方:Install coc.nvim推荐使用vim-plug插件管理器,在vimrc中添加:Plug ’neoclide/coc.nvim’, {‘do’: { -> coc#util#install()}}然后输入命令:PlugInstall等待插件下载,再等待另一个东西(?)的下载,全部完成后,就会弹出这个网页:https://github.com/neoclide/c…即教你安装语言插件的方法。也就是说,coc.nvim只是一个平台,它能够允许你安装各种语言插件,达到不同语言的补全效果。添加语言插件的vim命令为CocInstall。比如添加python、html、json、css的语言支持,只要在vim中输入命令::CocInstall coc-pyls coc-json coc-html coc-css 常用插件列表如下:就会显示下图,即正在安装:配置参考官方:Using configuration filecoc.nvim有个全局配置文件可以详尽的进行补全和语言配置。

January 7, 2019 · 1 min · jiezi

Vim最强自动补全插件Yourcompleteme安装

YCM是一个很复杂的二进制程序,需要各种编译,很长时间才运行完,很复杂。看了官方说明后也知道,想要正常使用,需要很长历程。。。参考Github :Valloric/YouCompleteMe第一步:保证所有依赖齐全目前已知的本机依赖如下(必要):Python3或Python2Clang第二步:从将repo克隆到本地一般可以自己直接git cloneYCM的源码到本地任意位置。不过为了便于管理,我们用vim插件管理器Vim-plug或Vundle进行克隆(但是不像别的插件一样可以直接安装完成)vim-plug管理器中中加入Plug ‘valloric/youcompleteme’,输入命令:PlugInstall。重启VIm,然后输入指令,重启YCM服务器::YcmRestartServer第三步:用YCM自带的一键脚本编译安装相关依赖进入刚刚克隆的源码目录,执行install.py执行最简单的安装:cd .vim/plugged/youcompleteme./install.py–clang-completer如果提示没有cmake,则需要自己在本机安装cmake。Mac上brew install cmake即可。如果提示没有msbuild or xbuild,则说明本机没有这个组件。那么最好在install.py后面不要加相关的参数,也就是不要用–all参数安装所有的组件。完成后,可以看到100%:

January 6, 2019 · 1 min · jiezi

NeoVim初识

安装Mac上安装(无需编译直接解压运行):cd /tmpwget https://github.com/neovim/neovim/releases/download/v0.3.1/nvim-macos.tar.gz && \tar -xzvf nvim-macos.tar.gz && \sudo mv ./nvim-osx64 /opt/nvim-0.3.1 && \ln -s /opt/nvim-0.3.1/bin/nvim /usr/local/bin/nvim && echo “[ OK ]”# Check Healthnvim +checkhealth添加各种语言支持NeoVim更像是一个框架,让添加各种支持更加方便。出于这点考虑,原生是不带各种语言支持的,需要自己去安装和关联。添加python支持假设(推荐)我们使用virtualenv虚拟环境中的python,地址为~/virtualenv/venv-neovim。用source /virtualenv/venv-neovim/bin/activate开启虚拟环境。然后,用pip安装neovim模块:pip install neovim将vim的/.vim建立nvim的连接(大多数都是通用的不用新创建一个):ln -s /.vim .config/nvimtouch /.vim/init.vim将虚拟环境的python路径添加到neovim配置文件init.vim中:let g:python3_host_prog = ‘/Users/Jason/virtualenv/venv-neovim/bin/python’注意:虚拟环境一定要是绝对路径!不能用/这样的。检查neovim是否已经有了python支持:nvim +checkhealth看到这个,就是成功了:添加ruby支持首先查看本机的ruby在哪个位置:which ruby,比如/usr/local/bin/ruby。那么在neovim的配置文件中,加入:let g:ruby_host_prog = ‘/usr/local/bin/ruby’然后在ruby的gem中安装neovim模块:$ gem install neovim如果报错:ERROR: Could not find a valid gem ’neovim’ (>= 0) in any repository则需要更新gem:# 更新源gem sources –update# 或者更换源:gem sources –add https://gems.ruby-china.org/# 然后删掉其它所有的源,只保留一个:gem sources –remove https://rubygems.org/gem sources –remove http://gems.github.com# 更新源gem sources –update# 重新安装neovimgem install neovim配置 vimrc官方推荐,neovim的配置文件vimrc位于的/.config/nvim/init.vim。安装插件推荐用neovim官方推荐的vim-plug。安装到~/.vim目录下:curl -fLo /.vim/autoload/plug.vim –create-dirs \ https://raw.githubusercontent.com/junegunn/vim-plug/master/plug.vim然后在/.config/nvim/init.vim配置文件中加入引用:call plug#begin(’~/.vim/plugged’) Plug ’ncm2/ncm2’ Plug ‘roxma/nvim-yarp’call plug#end()注意:plug后要用’单引号。重启nvim后,在neovim中安装应用的命令::PlugInstall ...

January 6, 2019 · 1 min · jiezi

Vim Snipmate 自动补全插件

在~/.vimrc的Vundle插件管理函数中添加以下内容(插件本身和所依赖的插件): Plugin ‘MarcWeber/vim-addon-mw-utils’ Plugin ’tomtom/tlib_vim’ Plugin ‘garbas/vim-snipmate’ Plugin ‘honza/vim-snippets’ “massive common snippets然后在Vim中输入命令安装插件::source %:PluginInstall完成。使用方法输入状态下,直接按<Tab>,就会自动打出相关的snippets预设片段。如何自定义snippets直接在~/.vim/snippets/目录下添加*.snippets文件即可。注意以下几点:/.vim/snippets/目录是位于所有插件之外的,所以不会因插件更新而被删除。如果你也安装了vim-snippets,那么在trigger同名的时候,vim会在状态栏弹出选项让你选择使用哪个snippets。比如针对所有python文件,那就在/.vim/snippets/目录下创建一个python.snippets文件,内容格式如下:snippet #! #!/usr/bin/env python # -- coding: utf-8 --以上片段,只要你在python文件中输入#!并按下<Tab>,就会自动输出定义的那段内容。

January 6, 2019 · 1 min · jiezi

Vim 的文件类型判断

Vim执行当前可执行文件方法一::! %:p其中:方法二::! ./%相当于在终端手敲了一遍:./script.sh这样的。Vim根据不同类型文件设置不同快捷键因为想做一个IDE中的build功能,即针对不同的语言类型,用不同的build/compile/run等方法。比如我想将这个build映射为Ctrl+i。那么可以用到Vim的autocmd FileType 语言类型方式。其中,autocmd相当于call function()的call,说明要调用函数了。FileType是Vim自带的一个函数,可以执行当前文件类型的检测。后面的语言相当于传给函数的参数。这个我们可以通过命令:echo &filetype获得。常用的语言类型有:vimrc即vim,zshrc即zsh,tmux.conf即tmux,python,c,cpp等。我的Mappings: " Filetype based Mappings—-{ " Get current filetype -> :echo &filetype or as variable &filetype " [ Builds / Compiles / Interpretes ] " C Compiler: autocmd FileType c nnoremap <buffer> <C-i> :!gcc % && ./a.out <CR> " C++ Compiler autocmd FileType cpp nnoremap <buffer> <C-i> :!g++ % && ./a.out <CR> " Python Interpreter autocmd FileType python nnoremap <buffer> <C-i> :!python % <CR> " Bash script autocmd FileType sh nnoremap <buffer> <C-i> :!sh % <CR> " Executable nnoremap <buffer> <C-i> :!./% <CR> “nnoremap <buffer> <C-i> :! %:p <CR> " RCs (Configs) autocmd FileType vim,zsh,tmux nnoremap <buffer> <C-i> :source % <CR> " } ...

January 6, 2019 · 1 min · jiezi

Vim根据文件类型设置不同的快捷键

在vim中,查看当前的文件类型::echo &filetype一般会是:c, cpp, python等,记住这些名字。然后在~/.vimrc中设置:" C Compiler:autocmd FileType c nnoremap <buffer> <C-i> :!gcc % && ./a.out <CR>" C++ Compilerautocmd FileType cpp nnoremap <buffer> <C-i> :!g++ % && ./a.out <CR>" Python Interpreterautocmd FileType python nnoremap <buffer> <C-i> :!python % <CR>这样就能完成,针对不同的文件,用相同的快捷键Ctrl+i。一般这样方便不同文件的编译和执行。

January 6, 2019 · 1 min · jiezi

Vim Buffer缓冲区:多文件编辑方案

Buffer听起来很高大尚,实际上的功能和Tab、window是一模一样的。只是这些东西的内在实现不一样而已了。Buffer是Vim自带的多文件编辑方式,有了它其实你不用单装Nerdtree插件来实现多标签编辑。这是看个人习惯吧。虽然我已经习惯了用Nerdtree做多文件多标签编辑,但是学习一下Vim自带的buffer方式也不错。参考:Vim 多文件编辑:缓冲区注意:默认来讲,如果你修改了文件但还没保存,是不能切换buffer的。但是这样会很不方便,不像切换tab一样。我们可以在vimrc中设置来取消这个限制:set hidden但是要知道,没有保存的话,是不能关闭buffer的。怎样开启buffer?实际上,buffer一直在开启着。这是你每次用:e file切换文件,或者在Nerdtree上按o打开文件,都是把当前的画面切换成了新文件你没有注意到而已。实际上背后的buffer一直都在,你只要打开过一次的,都可以切换回去。其实在没有安装vim-airline状态栏之前是没有注意到的,但是airline好心的有功能在最上方显示buffer,才让我觉得其实buffer有时候可能会比tab标签更好用。常用命令" List Buffers 查看当前所有的buffer :ls b" Buffer Next 下一个buffer:bn" Buffer Previous 上一个buffer:bp" Buffer Down 关闭当前buffer:bd" Buffer number 指定第二个buffer:b 2快捷键设计如果要保证buffer的切换像tab一样方便,肯定是要设置快捷键的,要不然总输入命令太慢了。“按Ctrl+h 向左移动一个buffernnoremap <C-h> :bp<CR>“按Ctrl+l 向右移动一个buffernnoremap <C-l> :bn<CR>“按Ctrl+^ 关闭当前buffernnoremap <C-^> :bd<CR>

January 6, 2019 · 1 min · jiezi

Vim配置状态栏 Status line

Vim里一个好看的状态栏是非常加分的。vim-lightline 简单好安装的状态栏安装方法:Vundle管理器的话,在~/.vimrc中的插件函数中加上:然后在函数外写上:# 把这句加到vundle函数里:Plugin ‘itchyny/lightline.vim’# 把这两句加到函数外面任意地方:set laststatus=2let g:lightline = { ‘colorscheme’: ‘powerline’, }vim-powerline 从入门到放弃和其它插件一样用Vundle安装:# 把这句加到vundle函数里:Plugin ‘Lokaltog/vim-powerline’# 把这两句加到函数外面任意地方:set laststatus=2set t_Co=256let g:Powerline_symbols= ‘unicode’set encoding=utf8但是安装完了会变成这个样子:看了很多网上文章,没什么简单有效的方法。先放一放看看有没有别的代替品吧。vim-airline 最佳状态栏虽说是powerline的fork,但是照我看比powerline强大的多。而且配置简单,效果多样,官方文档很清洗。一步到位。参考:Vim-airline 官方文档参考:vim-airline-themes-screenshots安装:# 把这句加到vundle函数里:Plugin ‘vim-airline/vim-airline’Plugin ‘vim-airline/vim-airline-themes’# 把这几句配置加到函数外面任意地方:" @airlineset t_Co=256 “在windows中用xshell连接打开vim可以显示色彩let g:airline#extensions#tabline#enabled = 1 " 是否打开tabline"这个是安装字体后 必须设置此项” let g:airline_powerline_fonts = 1set laststatus=2 “永远显示状态栏let g:airline_theme=‘bubblegum’ “选择主题let g:airline#extensions#tabline#enabled=1 “Smarter tab line: 显示窗口tab和buffer"let g:airline#extensions#tabline#left_sep = ’ ’ “separater"let g:airline#extensions#tabline#left_alt_sep = ‘|’ “separater"let g:airline#extensions#tabline#formatter = ‘default’ “formaterlet g:airline_left_sep = ‘▶‘let g:airline_left_alt_sep = ‘❯’let g:airline_right_sep = ‘◀‘let g:airline_right_alt_sep = ‘❮‘默认安装好后是这样的: ...

January 6, 2019 · 1 min · jiezi

复制粘贴有那么麻烦吗?理解VIM的文本复制

Vim的文本复制,逻辑上要比我们日常的拷贝、粘贴要复杂些。之前看了很多文章,真是太复杂了,复制个东西搞得好像系统性的工程建设一样。其实两句话就解释明白的。参考这篇文章:vim的剪切板首先输入:reg命令,查看Vim记录的所有剪切板内容,大概是这样的:常用命令::reg #查看所有注册的剪切板内容"" #Vim内部的默认剪切板"+ #Vim外部的剪切板,也就是系统的剪切板, 复制粘贴到它就能和其他编辑器交互了"3y #把文本复制到第3个剪切板"+y #复制到系统板"+p # 从系统板粘贴举例1(Vim内部复制粘贴):在Normal模式下,用v命令开始选择文本,然后按下"1y,就把已经选中的文本存到了编号1的剪切板。需要用的时候,就在vim中进入Normal模式,然后按下"1p,就粘贴出来啦。举例2(Vim与系统其他程序交换复制粘贴):随便在网页里复制一段话,然后进入vim的Normal模式,按下"+p,就把刚才的文字粘贴出来了。反过来,在Vim的Normal模式下,按v命令开始选择一段文本,然后按下"+y,就把文字复制到系统的剪切板了,随便找个文本编辑器如Sublime Text,按Ctrl+v,就会发现刚才复制的内容粘贴出来了。

January 6, 2019 · 1 min · jiezi

Vim UltiSnips自动补全 (Python强依赖)

想要Vim像Sublime一样快速编程,就需要各种好的snippets快速生成一段预备好的代码。一般常用的插件是UltiSnips作为生成代码的引擎,Vim-snippets插件作为各种语言的常用语句包。注意:此插件极其依赖Python特定版本,一旦本地python版本有一丁点变动,整个vim的使用都会完全受阻!安装Snippets插件在已有Vundle插件管理器的基础上,直接在.vimrc文件中加入这两个插件名:然后退出vim再进入vim,输入命令: :PluginInstall,等待安装完成后,重新进入vim,就可以正常使用了。创建snippets相比于sublime, 在vim中创建snippets是稍微麻烦点。主要跟随这几点:找到插件目录,是位于~/.vim/bundle/下的ultisnips和vim-snippets。不要在vim-snippets中预备好的各语言snippets上直接修改,因为每次更新都会被覆盖。必须在ultisnips文件夹下创建一个UltiSnips文件夹,所有自定义代码都存在这里。自定义的代码片段必须给每个语言创建单独文件,保存的文件名必须遵循语言名.snippets格式.如果是运用到所有文件上的,就叫all.snippets。文件保存后即刻生效,无需重启vim。代码片段文件里面需要遵循如下格式:snippet 关键词 “描述” 生成模式代码片段endsnippet其中,生成模式有很多种,一般为b,即只有在一行的开头输入关键词时,才会调用代码片段。其它还有b, A, w, i等模式,具体可以在vim 的:help ultisnip中查看文档。举个例子,我们要为html文件做一些快捷代码,那么:首先创建、或修改一个snippets文件:$ vim ~/.vim/bundle/ultisnips/UltiSnips/html.snippets然后添加如下格式的声明:snippet html “create html 5 structure” b<!DOCTYPE html><html><head><title></title></head><body></body>

January 6, 2019 · 1 min · jiezi

VIM配置颜色主题

既然都开启了vimrc技能,就忍不住好奇心去看看还有什么能配置的。这里就不一一说明了,这个坑太大,配置方案太多。先讲个代表性的配色问题。以下在mac下有效。首先, vim自带有一些基本的色彩主题,一般在/usr/share/vim/vim74/colors/中,如下图:这个文件夹由于权限原因,不能动。所以要到当前用户的用户文件夹来增加配置文件。一般当前用户是没有这个配置文件夹的,需要自己新建。mkdir /.vim mkdir /.vim/colors然后把下载好的色彩主题包中/colors/文件夹全部拷贝到/.vim/colors/中就可以使用了。具体操作如下:下载主题包参考:vim官方收集的各种主题包:Vim.org色彩主题集参考:Vim Colors - Online Preview下载:Vim colorschemes - one colorscheme pack to rule them all!下载:我比较喜欢的gruvbox主题我这里下载了一个badwolf主题,是zip文件。解压后将主题包里colors文件夹内的.vim文件直接拷贝到/.vim/colors/中即可。然后在vim或.vimrc文件中输入这两句句话配置就成功了:colorscheme 色彩主题名称syntax on效果如下图:

January 6, 2019 · 1 min · jiezi

Python进阶:设计模式之迭代器模式

在软件开发领域中,人们经常会用到这一个概念——“设计模式”(design pattern),它是一种针对软件设计的共性问题而提出的解决方案。在一本圣经级的书籍《设计模式:可复用面向对象软件的基础》(1991年,Design Patterns - Elements of Reusable Object-Oriented Software)中,它提出了23种设计模式。迭代器模式就是其中的一种,在各种编程语言中都得到了广泛的应用。本文将谈谈 Python 中的迭代器模式,主要内容:什么是迭代器模式、Python 如何实现迭代器模式、itertools 模块创建迭代器的方法、其它运用迭代器的场景等等,期待与你共同学习进步。1、什么是迭代器模式?维基百科有如下定义:迭代器是一种最简单也最常见的设计模式。它可以让用户透过特定的接口巡访容器中的每一个元素而不用了解底层的实现。——维基百科简单地说,迭代器模式就是一种通用性的可以遍历容器类型(如序列类型、集合类型等)的实现方式。使用迭代器模式,可以不关心遍历的对象具体是什么(如字符串、列表、字典等等),也不需要关心遍历的实现算法是什么,它关心的是从容器中遍历/取出元素的结果。按遍历方式划分,迭代器可分为内部迭代器与外部迭代器,它们的区别在于执行迭代动作与维持迭代状态的不同。通常而言,迭代器是一次性的,当迭代过一轮后,再次迭代将获取不到元素。2、Python的迭代器模式由于迭代器模式的使用太常见了,所以大多数编程语言都给常见的容器类型实现了它,例如 Java 中的 Collection,List、Set、Map等。在 Java 中使用迭代器遍历 List 可以这么写:List<String> list = new ArrayList<>();Iterator<String> iterator = list.iterator();while(iterator.hasNext()){ System.out.println(iterator.next());}ArrayList 类通过自身的 iterator() 方法获得一个迭代器 iterator,然后由该迭代器实例来落实遍历过程。Python 当然也应用了迭代器模式,但它的实现思路跟上例却不太一样。首先,Python 认为遍历容器类型并不一定要用到迭代器,因此设计了可迭代对象。list = [1,2,3,4]for i in list: print(i,end=" “) # 1 2 3 4for i in list: print(i,end=” “) # 1 2 3 4上例中的 list 是可迭代对象(Iterable),但并不是迭代器(虽然在底层实现时用了迭代器的部分思想)。Python 抓住了迭代器模式的本质,即是“迭代”,赋予了它极高的地位。如此设计的好处显而易见:(1)写法简便,用意直白;(2)可重复迭代,避免一次性迭代器的缺陷;(3)不需要创建迭代器,减少开销。可迭代对象可看作是广义的迭代器,同时,Python 也设计了普通意义的狭义的迭代器。list = [1,2,3,4]it = iter(list)for i in it: print(i,end=” “) # 1 2 3 4for i in it: print(i,end=” “) # 无输出上例中的 iter() 方法会将可迭代对象变成一个迭代器。从输出结果可以看出,该迭代器的迭代过程是一次性的。由此看来,Python 其实是将“迭代器模式”一拆为二来实现:一是可迭代思想,广泛播种于容器类型的对象中,使它们都可迭代;一是迭代器,一种特殊的可迭代对象,承担普通意义上的迭代器所特有的迭代任务。 同时,它还提供了将可迭代对象转化为迭代器的简易方法,如此安排,真是将迭代器模式的效力发挥到了极致。(关于可迭代对象与迭代器的更多区别、以及它们的实现原理,请参见《Python进阶:迭代器与迭代器切片》)3、创建迭代器创建迭代器有如下方式:(1)iter() 方法,将可迭代对象转化成迭代器;(2)iter() 与 next() 魔术方法,定义类实现这两个魔术方法;(3)itertools 模块,使用内置模块生成迭代器;(4)其它创建方法,如 zip() 、map() 、enumerate() 等等。四类方法各有适用场所,本节重点介绍 itertools 模块。它可以创建三类迭代器:无限迭代器、有限迭代器与组合迭代器。3.1 无限迭代器count(start=0, step=1) :创建一个从 start (默认值为 0) 开始,以 step (默认值为 1) 为步长的的无限整数迭代器。cycle(iterable) :对可迭代对象的元素反复执行循环。repeat(object [,times]) :反复生成 object 至无限,或者到给定的 times 次。import itertoolsco = itertools.count()cy = itertools.cycle(‘ABC’)re = itertools.repeat(‘A’, 30)# 注意:请分别执行;以下写法未加终止判断,只能按 Ctrl+C 退出for n in co: print(n,end=” “) # 0 1 2 3 4……for n in cy: print(n,end=” “) # A B C A B C A B……for n in re: print(n,end=” “) # A A A A A A A A….(30个)3.2 有限迭代器以上方法,比较常用的有:chain() 将多个可迭代对象(可以是不同类型)连接成一个大迭代器;compress() 方法根据真假过滤器筛选元素;groupby() 把迭代器中相邻的重复元素挑出来放在一起;islice() 方法返回迭代器切片(用法参见《Python进阶:迭代器与迭代器切片》);tee() 方法根据可迭代对象创建 n 个(默认2个)迭代器副本。for c in itertools.chain(‘ABC’, [1,2,3]): print(c,end=” “)# 输出结果:A B C 1 2 3for c in itertools.compress(‘ABCDEF’, [1, 1, 0, 1, 0, 1]): print(c,end=” “)# 输出结果:A B D Ffor key, group in itertools.groupby(‘aaabbbaaccd’): print(key, ‘:’, list(group))# 输出结果:a : [‘a’, ‘a’, ‘a’]b : [‘b’, ‘b’, ‘b’]a : [‘a’, ‘a’]c : [‘c’, ‘c’]d : [’d’]itertools.tee(‘abc’, 3)# 输出结果:(<itertools._tee at 0x1fc72c08108>, <itertools._tee at 0x1fc73f91d08>, <itertools._tee at 0x1fc73efc248>)3.3 组合迭代器product() :求解多个可迭代对象的笛卡尔积。permutations() :求解可迭代对象的元素的全排列。combinations():求解可迭代对象的元素的组合。for i in itertools.product(‘ABC’, [1,2]): print(i, end=” “)# 输出结果:(‘A’, 1) (‘A’, 2) (‘B’, 1) (‘B’, 2) (‘C’, 1) (‘C’, 2)for i in itertools.permutations(‘ABC’, 2): print(i, end=” “)# 输出结果:(‘A’, ‘B’) (‘A’, ‘C’) (‘B’, ‘A’) (‘B’, ‘C’) (‘C’, ‘A’) (‘C’, ‘B’)for i in itertools.combinations(‘ABC’, 2): print(i, end=” “)# 输出结果:(‘A’, ‘B’) (‘A’, ‘C’) (‘B’, ‘C’)for i in itertools.combinations(‘ABCD’, 3): print(i, end=” “)# 输出结果:(‘A’, ‘B’, ‘C’) (‘A’, ‘B’, ‘D’) (‘A’, ‘C’, ‘D’) (‘B’, ‘C’, ‘D’)4、强大的内置迭代器方法迭代器模式的使用场景实在太普遍了,而 Python 也为迭代器的顺利使用而提供了很多便利的条件,本节将介绍相关的几个内置方法。这些方法非常常用而且强大,是 Python 进阶的必会内容。4.1 zip() 方法zip() 方法可以同时迭代多个序列,并各取一个元素,生成一个可返回元组的迭代器。此迭代器的长度以较短序列的长度保持一致,若想生成较长序列的长度,需要使用 itertools 模块的 zip_longest() 方法。import itertoolsa = [1, 2, 3]b = [‘w’, ‘x’, ‘y’, ‘z’]for i in zip(a,b): print(i,end=” “) # (1, ‘w’) (2, ‘x’) (3, ‘y’)# 空缺值以 None 填补for i in itertools.zip_longest(a,b): print(i,end=” “) # (1, ‘w’) (2, ‘x’) (3, ‘y’) (None, ‘z’)4.2 enumerate() 方法enumerate() 方法接收一个序列类型参数,生成一个可返回元组的迭代器,元组内容是下标及其对应的元素值。它还可接收一个可选参数,指定下标的起始值,默认是0 。注意:众所周知,Python 中序列的索引值从 0 开始,但是,enumerate() 可以达到改变起始索引数值的效果。seasons = [‘Spring’, ‘Summer’, ‘Fall’, ‘Winter’]for i in enumerate(seasons): print(i,end=” “) #输出结果:(0, ‘Spring’) (1, ‘Summer’) (2, ‘Fall’) (3, ‘Winter’)for i in enumerate(seasons, start=7): print(i,end=” “) #输出结果:(7, ‘Spring’) (8, ‘Summer’) (9, ‘Fall’) (10, ‘Winter’)4.3 map() 方法map() 方法的参数是一个函数及一个或多个可迭代对象,它会将可迭代对象的元素映射到该函数中,然后迭代地运行该函数,返回结果也是一个迭代器。当存在多个可迭代对象参数时,迭代长度等于较短对象的长度。def square(x): return x ** 2l = map(square, [1, 2, 3, 4, 5])print(list(l))# 输出结果:[1, 4, 9, 16, 25]m = map(lambda x, y: x + y, [1, 3, 5, 7, 9], [2, 4, 6, 8, 10, 2])print(list(m))# 输出结果:[3, 7, 11, 15, 19]4.4 filter() 方法filter() 方法的参数是一个判断函数及一个可迭代对象,遍历可迭代对象执行判断函数,过滤下判断为True 的元素,与它相对,若想保留判断为 False 的元素,可使用 itertoole 模块的 filterfalse() 方法。import itertoolsfi = filter(lambda x: x%2, range(10))ff = itertools.filterfalse(lambda x: x%2, range(10))for i in fi: print(i,end=” “)# 输出结果:1 3 5 7 9for i in ff: print(i,end=” “)# 输出结果:0 2 4 6 85. 小结迭代器模式几乎是 23 种设计模式中最常用的设计模式,本文主要介绍了 Python 是如何运用迭代器模式,并介绍了 itertools 模块生成迭代器的 18 种方法,以及 5 种生成迭代器的内置方法。 相关链接:itertools模块文档:http://t.cn/R6cGtfwPython进阶:迭代器与迭代器切片Python进阶:全面解读高级特性之切片!—————–本文原创并首发于微信公众号【Python猫】,后台回复“爱学习”,免费获得20+本精选电子书。 ...

January 2, 2019 · 3 min · jiezi

手机直播系统偶尔会需要到的:Windows 下视频采集技术

Windows下视频采集的方法在 Windows 下主要有两种方法来采集视频: 一种是通过 Media Foundation,另一种是通过 DirectShow。 Meida Foundation 是 Windows 从 vista 之后推出的一套全新的 多媒体SDK,简单方便,从 Win7 开始成熟起来。 另一种是 DirectShow,它主要用于 win7 之前的采集视频。使用 DirectShow 编写代码比较麻烦,主要是因为 Windows 工程师按照逻辑电路的思维方式设计了 DirectsShow 的开发接口,引入了什么 filter, pin之类的概念。这些老掉牙的东西现在估计没几个人能搞明白,除非你是从那个时代过来的,哈哈。这也解释了为啥现在很少有人学习 Windows 程序开发了,就是因为跟不上时代。你看人家 Android/iOS做视频采集多简单,你整的这么麻烦,谁还愿意学!Media Foundation的一些概念 DirectShow 方案我们放到以后再分析,今天我们主要讲下 MediaFoundation 如何进行视频采集。 在讲之前,我们先要补充一些基本概念。这些概念大家可以从[Media Foundation Programming Guide][1] 找到。下面的文字基本是翻译的 Windows 的官方文档。MF(MediaFoundation)的整体结构图如下:MF 提供了两种不同的编程模型。第一种是上图的左半部分,媒体数据通过端到端的管道传递。Application首先初始化管道,然后调用相应方法控制管道中的流。第二种如上图的右半部分,Application可以从 Source Reader拉数据,也可以向 Sink Writer 推数据。这种模型对于处理数据非常有用。 Primitives 和 Platfrom 图底部的 Primitives 是一些辅助API:Attributes: 相当于一个 Map, 由 key/value 组成。Media Type: 描述媒体数据流的格式。Media Buffers: 存放一段媒体数据。Media Samples: 存放 Media Buffers 的容器,相当于一个 Buffter List。MF Platform 提供了一些核心功能的API。例如异步调用、工作队列。Media PipelineMedia Pipeline 包括三种类型对象:Media Sources、MFTs(Media Foundation Transfors)、Media Sink。Media Sources: 将数据引入到管道里。数据可以来自本地文件,网络流或都是硬件设备。MFTs: 处理流数据。在 MFTs 里实现了编解码器。Media Sink: 消费数据。显示视频到显示屏上,播放声音或写数据到媒体文件。Media Session 通过管道控制数据流。如质量控制,音频/视频同步,格式的改变。Source Reader 和 Sink WriterSource Reader 和 Sink Writer提供了使用 Media Foundation 的另一种方法(相较于 media source, transforms, media sink)。Source Reader 控制着 media source 和 多个解码器。Sink Writer 控制着 media sink 和 多个编码器。你可以使用 Source Reader 从 media source 获取到压缩或未压缩的数据,并使用 Sinker Writer 编码数据并发送给 media sink。 下面我们就来看看 MF 是如何采集视频数据的。采集视频数据通过上面的介绍,我们基本可以知道 MF 采用 从源采集数据,编解码,输出渲染这种架构来处理多媒体。这种方式通俗易懂,使用起来非常方便。MF采集视频的基本步骤MF采集数据使用的是架构中的第二种编程模型,其步骤如下:初始化 COM 组件。获取视频设备列表。激活某个视频设备,获取该设备的 Media Source。根据请求命令和 Media Source 创建 Source Reader。为 Source Reader 设置 Media Type。通过 Source Reader 从设备中读取 Media Type 格式的视频数据。以上就是 MF 从视频设备采集数所的基本步骤,下面我们来详细介绍每一步。详细分析由于每一步的代码都实分简单,我这里就不做过多的文字描述了,通过下面的代码及其注释大家很容易理解其中的每一步。初始化 COM 组件并启动 MFCoInitializeEx(NULL, COINIT_APARTMENTTHREAD | COINIT_DISABLE_OLEDDE)MFStartup(MF_VERSION)获取所有的视频设备IMFAttributes *videoCmd = NULL; IMFActivate **videoDevices = NULL;UINT32 videoDeviceCount = 0;//设置获取视频设备的命令MFCreateAttributes(videoCmd, 1/表示只分配一项/);videoCmd->setGUID( MF_DEVSOURCE_ATTRIBUTE_SOURCE_TYPE, //key MF_DEVSOURCE_ATTRIBUTE_SOURCE_TYPE_VIDCAP_GUID); //value//获取视频设备列表 MFEnumDeviceSources( videoCmd, &videoDevices, //这里是设备列表 &videoDeviceCount); //这里存放的是设备的个数激活某个视频设备IMFMediaSource *mediaSource = NULL;//激活第一个视频设备,并为该设置备生成逻辑上的媒体源(Media Source)videoDevices[0]->ActivateObject(IID_PPV_ARGS(&mediaSource));创建 Source ReaderIMFSourceReader *soureReader = NULL;//通过媒体源和请求命令,可以获取source reader。(第二种开发模型)MFCreateSourceReaderFromMediaSource( mediaSource, videoCmd, &sourceReader);设置 Media TypeIMFMediaType *mediaType = NULL;MFCreateMediaType(&mediaType);//设置媒体为视频mediaType->SetGUID(MF_MT_MAJOR_TYPE, MFMediaType_Video);//YUV格式为 I420mediaType->SetGUID(MF_MT_SUBTYPE, WMMEDIASUBTYPE_I420); //每个视频帧的大小为 640 * 480MFSetAttributeSize(mediaType, MF_MT_FRAME_SIZE, 640, 480);sourceReader->SetCurrentMediaType(MF_SOURCE_READER_FIRST_VIDEO_STREAM, NULL, mediaType);读取数据IMFSample *sample = NULL;DWORD index, flags;LONGLONG llVideoTs;while(runing){ sourceReader->ReadSample( MF_SOURCE_READER_FIRST_VIDEO_STREAM, 0, &index, //实际流的index &flags, //staus flags &llVideoTs, //时间戳 &sample); //存放采集到的视频数据}通过上面简单的几步,就可以轻松的从视频设备里取到视频数据了。MF相对于 DirectShow真是简单太多了。上面介绍的是使用同步方式使用MF采集视频数据,MF还提供了效率更高的异步方式获取视频数据,有兴趣的朋友可以以本篇文章为基础去学习它的异步方式。小结今天向大家介绍了在 Windows下使用 MF 如何采集视频的方法。通过以下 6 步即可做到:初始化 COM 组件。获取视频设备列表。激活某个视频设备,获取该设备的 Media Source。根据请求命令和 Media Source 创建 Source Reader。为 Source Reader 设置 Media Type。通过 Source Reader 从设备中读取 Media Type 格式的视频数据。另外, MF 的采集方案只适用于 Win7 以后的系统,对于之前的系统还是要使用 DirectShow 方案。我也会在后面再为大家介绍如何使用 DirectShow 采集视频。 ...

January 2, 2019 · 2 min · jiezi

Python进阶:迭代器与迭代器切片

Python进阶:迭代器与迭代器切片在前两篇关于 Python 切片的文章中,我们学习了切片的基础用法、高级用法、使用误区,以及自定义对象如何实现切片用法(相关链接见文末)。本文是切片系列的第三篇,主要内容是迭代器切片。迭代器是 Python 中独特的一种高级特性,而切片也是一种高级特性,两者相结合,会产生什么样的结果呢?1、迭代与迭代器首先,有几个基本概念要澄清:迭代、可迭代对象、迭代器。迭代 是一种遍历容器类型对象(例如字符串、列表、字典等等)的方式,例如,我们说迭代一个字符串“abc”,指的就是从左往右依次地、逐个地取出它的全部字符的过程。(PS:汉语中迭代一词有循环反复、层层递进的意思,但 Python 中此词要理解成单向水平线性 的,如果你不熟悉它,我建议直接将其理解为遍历。)那么,怎么写出迭代操作的指令呢?最通用的书写语法就是 for 循环。# for循环实现迭代过程for char in “abc”: print(char, end=" “)# 输出结果:a b cfor 循环可以实现迭代的过程,但是,并非所有对象都可以用于 for 循环,例如,上例中若将字符串“abc”换成任意整型数字,则会报错: ‘int’ object is not iterable .这句报错中的单词“iterable”指的是“可迭代的”,即 int 类型不是可迭代的。而字符串(string)类型是可迭代的,同样地,列表、元组、字典等类型,都是可迭代的。那怎么判断一个对象是否可迭代呢?为什么它们是可迭代的呢?怎么让一个对象可迭代呢?要使一个对象可迭代,就要实现可迭代协议,即需要实现__iter__() 魔术方法,换言之,只要实现了这个魔术方法的对象都是可迭代对象。那怎么判断一个对象是否实现了这个方法呢?除了上述的 for 循环外,我知道还有四种方法:# 方法1:dir()查看__iter__dir(2) # 没有,略dir(“abc”) # 有,略# 方法2:isinstance()判断import collectionsisinstance(2, collections.Iterable) # Falseisinstance(“abc”, collections.Iterable) # True# 方法3:hasattr()判断hasattr(2,”iter") # Falsehasattr(“abc”,"iter") # True# 方法4:用iter()查看是否报错iter(2) # 报错:‘int’ object is not iterableiter(“abc”) # <str_iterator at 0x1e2396d8f28>### PS:判断是否可迭代,还可以查看是否实现__getitem__,为方便描述,本文从略。这几种方法中最值得一提的是 iter() 方法,它是 Python 的内置方法,其作用是将可迭代对象变成迭代器 。这句话可以解析出两层意思:(1)可迭代对象跟迭代器是两种东西;(2)可迭代对象能变成迭代器。实际上,迭代器必然是可迭代对象,但可迭代对象不一定是迭代器。两者有多大的区别呢?如上图蓝圈所示,普通可迭代对象与迭代器的最关键区别可概括为:一同两不同 ,所谓“一同”,即两者都是可迭代的(iter),所谓“两不同”,即可迭代对象在转化为迭代器后,它会丢失一些属性(getitem),同时也增加一些属性(next)。首先看看增加的属性 next , 它是迭代器之所以是迭代器的关键,事实上,我们正是把同时实现了 iter 方法 和 next 方法的对象定义为迭代器的。有了多出来的这个属性,可迭代对象不需要借助外部的 for 循环语法,就能实现自我的迭代/遍历过程。我发明了两个概念来描述这两种遍历过程(PS:为了易理解,这里称遍历,实际也可称为迭代):它遍历 指的是通过外部语法而实现的遍历,自遍历 指的是通过自身方法实现的遍历。借助这两个概念,我们说,可迭代对象就是能被“它遍历”的对象,而迭代器是在此基础上,还能做到“自遍历”的对象。ob1 = “abc"ob2 = iter(“abc”)ob3 = iter(“abc”)# ob1它遍历for i in ob1: print(i, end = " “) # a b cfor i in ob1: print(i, end = " “) # a b c# ob1自遍历ob1.next() # 报错: ‘str’ object has no attribute ‘next’# ob2它遍历for i in ob2: print(i, end = " “) # a b c for i in ob2: print(i, end = " “) # 无输出# ob2自遍历ob2.next() # 报错:StopIteration# ob3自遍历ob3.next() # aob3.next() # bob3.next() # cob3.next() # 报错:StopIteration通过上述例子可看出,迭代器的优势在于支持自遍历,同时,它的特点是单向非循环的,一旦完成遍历,再次调用就会报错。对此,我想到一个比方:普通可迭代对象就像是子弹匣,它遍历就是取出子弹,在完成操作后又装回去,所以可以反复遍历(即多次调用for循环,返回相同结果);而迭代器就像是装载了子弹匣且不可拆卸的枪,进行它遍历或者自遍历都是发射子弹,这是消耗性的遍历,是无法复用的(即遍历会有尽头)。写了这么多,稍微小结一下:迭代是一种遍历元素的方式,按照实现方式划分,有外部迭代与内部迭代两种,支持外部迭代(它遍历)的对象就是可迭代对象,而同时还支持内部迭代(自遍历)的对象就是迭代器;按照消费方式划分,可分为复用型迭代与一次性迭代,普通可迭代对象是复用型的,而迭代器是一次性的。2、迭代器切片前面提到了“一同两不同”,最后的不同是,普通可迭代对象在转化成迭代器的过程中会丢失一些属性,其中关键的属性是 getitem 。在《Python进阶:自定义对象实现切片功能》中,我曾介绍了这个魔术方法,并用它实现了自定义对象的切片特性。那么问题来了:为什么迭代器不继承这个属性呢?首先,迭代器使用的是消耗型的遍历,这意味着它充满不确定性,即其长度与索引键值对是动态衰减的,所以很难 get 到它的 item ,也就不再需要 getitem 属性了。其次,若强行给迭代器加上这个属性,这并不合理,正所谓强扭的瓜不甜……由此,新的问题来了:既然会丢失这么重要的属性(还包括其它未标识的属性),为什么还要使用迭代器呢?这个问题的答案在于,迭代器拥有不可替代的强大的有用的功能,使得 Python 要如此设计它。限于篇幅,此处不再展开,后续我会专门填坑此话题。还没完,死缠烂打的问题来了:能否令迭代器拥有这个属性呢,即令迭代器继续支持切片呢?hi = “欢迎关注公众号:Python猫"it = iter(hi)# 普通切片hi[-7:] # Python猫# 反例:迭代器切片it[-7:] # 报错:‘str_iterator’ object is not subscriptable迭代器因为缺少__getitem__ ,因此不能使用普通的切片语法。想要实现切片,无非两种思路:一是自己造轮子,写实现的逻辑;二是找到封装好的轮子。Python 的 itertools 模块就是我们要找的轮子,用它提供的方法可轻松实现迭代器切片。import itertools# 例1:简易迭代器s = iter(“123456789”)for x in itertools.islice(s, 2, 6): print(x, end = " “) # 输出:3 4 5 6for x in itertools.islice(s, 2, 6): print(x, end = " “) # 输出:9# 例2:斐波那契数列迭代器class Fib(): def init(self): self.a, self.b = 1, 1 def iter(self): while True: yield self.a self.a, self.b = self.b, self.a + self.bf = iter(Fib())for x in itertools.islice(f, 2, 6): print(x, end = " “) # 输出:2 3 5 8for x in itertools.islice(f, 2, 6): print(x, end = " “) # 输出:34 55 89 144itertools 模块的 islice() 方法将迭代器与切片完美结合,终于回答了前面的问题。然而,迭代器切片跟普通切片相比,前者有很多局限性。首先,这个方法不是“纯函数”(纯函数需遵守“相同输入得到相同输出”的原则,之前在《来自Kenneth Reitz大神的建议:避免不必要的面向对象编程》提到过);其次,它只支持正向切片,且不支持负数索引,这都是由迭代器的损耗性所决定的。那么,我不禁要问:itertools 模块的切片方法用了什么实现逻辑呢?下方是官网提供的源码:def islice(iterable, *args): # islice(‘ABCDEFG’, 2) –> A B # islice(‘ABCDEFG’, 2, 4) –> C D # islice(‘ABCDEFG’, 2, None) –> C D E F G # islice(‘ABCDEFG’, 0, None, 2) –> A C E G s = slice(*args) # 索引区间是[0,sys.maxsize],默认步长是1 start, stop, step = s.start or 0, s.stop or sys.maxsize, s.step or 1 it = iter(range(start, stop, step)) try: nexti = next(it) except StopIteration: # Consume iterable up to the start position. for i, element in zip(range(start), iterable): pass return try: for i, element in enumerate(iterable): if i == nexti: yield element nexti = next(it) except StopIteration: # Consume to stop. for i, element in zip(range(i + 1, stop), iterable): passislice() 方法的索引方向是受限的,但它也提供了一种可能性:即允许你对一个无穷的(在系统支持范围内)迭代器进行切片的能力。这是迭代器切片最具想象力的用途场景。除此之外,迭代器切片还有一个很实在的应用场景:读取文件对象中给定行数范围的数据。在《给Python学习者的文件读写指南(含基础与进阶,建议收藏)》里,我介绍了从文件中读取内容的几种方法:readline() 比较鸡肋,不咋用;read() 适合读取内容较少的情况,或者是需要一次性处理全部内容的情况;而 readlines() 用的较多,比较灵活,每次迭代读取内容,既减少内存压力,又方便逐行对数据处理。虽然 readlines() 有迭代读取的优势,但它是从头到尾逐行读取,若文件有几千行,而我们只想要读取少数特定行(例如第1000-1009行),那它还是效率太低了。考虑到文件对象天然就是迭代器 ,我们可以使用迭代器切片先行截取,然后再处理,如此效率将大大地提升。# test.txt 文件内容’‘‘猫Python猫python is a cat.this is the end.‘‘‘from itertools import islicewith open(’test.txt’,‘r’,encoding=‘utf-8’) as f: print(hasattr(f, “next”)) # 判断是否迭代器 content = islice(f, 2, 4) for line in content: print(line.strip())### 输出结果:Truepython is a cat.this is the end.3、小结好啦,今天的学习就到这,小结一下:迭代器是一种特殊的可迭代对象,可用于它遍历与自遍历,但遍历过程是损耗型的,不具备循环复用性,因此,迭代器本身不支持切片操作;通过借助 itertools 模块,我们能实现迭代器切片,将两者的优势相结合,其主要用途在于截取大型迭代器(如无限数列、超大文件等等)的片段,实现精准的处理,从而大大地提升性能与效率。切片系列: 《Python进阶:切片的误区与高级用法》《Python进阶:自定义对象实现切片功能》相关链接: 《官网的itertools模块介绍》《来自Kenneth Reitz大神的建议:避免不必要的面向对象编程》《给Python学习者的文件读写指南(含基础与进阶,建议收藏)》—————–本文原创并首发于微信公众号【Python猫】,后台回复“爱学习”,免费获得20+本精选电子书。 ...

December 30, 2018 · 3 min · jiezi

vim的模糊查找插件LeaderF新功能介绍

前言上一篇文章《让人相见恨晚的vim插件:模糊查找神器LeaderF》概括性的介绍了LeaderF的基本功能,本篇对LeaderF的新功能做一下介绍。统一的命令接口随着LeaderF功能的不断增多,LeaderF的命令也在不断的增加,给开发和使用都带来一些不便。于是,LeaderF提供了一个统一的命令接口,就像shell命令一样,不同的命令选项组合,带来不同的功能。 可以通过:Leaderf -h来查看具体使用方法。usage: Leaderf[!] [-h] [–reverse] [–stayOpen] [–input <INPUT> | –cword] [–top | –bottom | –left | –right | –belowright | –aboveleft | –fullScreen] [–nameOnly | –fullPath | –fuzzy | –regexMode] [–nowrap] {file,tag,function,mru,searchHistory,cmdHistory,help,line,colorscheme,self,bufTag,buffer,rg} …optional arguments: -h, –help show this help message and exit –reverse show results in bottom-up order –stayOpen don’t quit LeaderF after accepting an entry –input <INPUT> specifies INPUT as the pattern inputted in advance –cword current word under cursor is inputted in advance –top the LeaderF window is at the top of the screen –bottom the LeaderF window is at the bottom of the screen –left the LeaderF window is at the left of the screen –right the LeaderF window is at the right of the screen –belowright the LeaderF window is at the belowright of the screen –aboveleft the LeaderF window is at the aboveleft of the screen –fullScreen the LeaderF window takes up the full screen –nameOnly LeaderF is in NameOnly mode by default –fullPath LeaderF is in FullPath mode by default –fuzzy LeaderF is in Fuzzy mode by default –regexMode LeaderF is in Regex mode by default –nowrap long lines in the LeaderF window won’t wrapsubcommands: {file,tag,function,mru,searchHistory,cmdHistory,help,line,colorscheme,self,bufTag,buffer,rg} file search files tag navigate tags using the tags file function navigate functions or methods in the buffer mru search most recently used files searchHistory execute the search command in the history cmdHistory execute the command in the history help navigate the help tags line search a line in the buffer colorscheme switch between colorschemes self execute the commands of itself bufTag navigate tags in the buffer buffer search buffers rg grep using rgIf [!] is given, enter normal mode directly.这样就可以用:Leaderf <subcommand> [options]来执行LeaderF的命令了。例如:Before Now:LeaderfFile<=>:Leaderf file:LeaderfBuffer<=>:Leaderf buffer:LeaderfMru<=>:Leaderf mru:LeaderfMruCwd<=>:Leaderf mru –cwd… 每个子命令都有专有的命令选项,可以用:Leaderf <subcommand> -h来查看。例如,Leaderf mru -h:usage: Leaderf[!] mru [-h] [–cwd] [–no-split-path] [–reverse] [–stayOpen] [–input <INPUT> | –cword] [–top | –bottom | –left | –right | –belowright | –aboveleft | –fullScreen] [–nameOnly | –fullPath | –fuzzy | –regexMode] [–nowrap]optional arguments: -h, –help show this help message and exitspecific arguments: –cwd search MRU in current working directory –no-split-path do not split the pathcommon arguments: –reverse show results in bottom-up order –stayOpen don’t quit LeaderF after accepting an entry –input <INPUT> specifies INPUT as the pattern inputted in advance –cword current word under cursor is inputted in advance –top the LeaderF window is at the top of the screen –bottom the LeaderF window is at the bottom of the screen –left the LeaderF window is at the left of the screen –right the LeaderF window is at the right of the screen –belowright the LeaderF window is at the belowright of the screen –aboveleft the LeaderF window is at the aboveleft of the screen –fullScreen the LeaderF window takes up the full screen –nameOnly LeaderF is in NameOnly mode by default –fullPath LeaderF is in FullPath mode by default –fuzzy LeaderF is in Fuzzy mode by default –regexMode LeaderF is in Regex mode by default –nowrap long lines in the LeaderF window won’t wrapIf [!] is given, enter normal mode directly.自下而上显示结果好多从ctrlp.vim转过来的朋友说不习惯LeaderF自上而下显示结果的方式,想要LeaderF也能像ctrlp一样自下而上(最优结果在最下面)显示结果,为了回馈各位朋友对LeaderF的支持,现在LeaderF也添加了自下而上显示搜索结果的功能:只需要在命令后面加上–reverse即可,或者也可以一劳永逸,在vimrc里面加上let g:Lf_ReverseOrder = 1 。And 模式LeaderF支持用空格(可以用g:Lf_AndDelimiter来修改)作为And操作符来进行模糊匹配。当匹配已经匹配到字符串末尾时,可以通过敲空格和一个子串来匹配字符串的前面部分,进行快速过滤。 NOTE: 空格分隔的每个子串都是对整个字符串的模糊匹配,而不是精确匹配。模糊匹配历史可以通过上下键来翻看模糊匹配历史:总结LeaderF精益求精,永无止境。 ...

December 30, 2018 · 3 min · jiezi

Vim执行shell命令及使用Vim批量更改文件名

可以在 Vim 内部调用外部程序(shell命令),还可以把缓冲区的内容作为标准输入传递给外部命令,或是把外部命令的标准输出导入到Vim缓冲区。1. 在Vim内部执行shell命令在 Vim 的命令行模式中,在命令前加一个 ! 前缀 (参见 :h :!) 就可以调用外部的shell程序。例如,如果想在Vim内部查看当前目录下的所有文件,可以在Vim命令行模式下运行命令 :!ls注::!ls 和 :ls 是两个不同的Vim命令,前者是在Vim中调用shell命令 ls,用于列出目录下的所有文件,后者调用的是 Vim内置命令 ls,用来显示当前缓冲区列表的内容,可以参考Vim文件缓冲区列表介绍。如Vim打开和保存文件所介绍,在 Vim 的命令行模式下,符号 % 代表当前文件的完整路径(参见 :h cmdline-special)。如果我们正在通过Vim编辑某个 python 文件,则可以用命令 :!python % 直接执行该文件。 2. 启动一个可交互的shell进程执行命令上面介绍的 :!{cmd} 这种语法适用于执行一次性命令,如果想在 shell 中连续执行多条命令,可以执行 Vim 的 :shell 命令启动一个可交互的 shell 会话,在执行完所需要的命令后用 exit 命令退出此 shell 并返回到原始的 Vim 进程。3. Vim缓冲区内容作为标准输入/标准输出在用 :!{cmd} 时,Vim 会回显 {cmd} 命令的输出,可以用 :read !{cmd} 命令把 {cmd} 命令的输出重定向当前Vim缓冲区中,或使用 :write !{cmd} 把当前Vim的缓冲区内容作为指定 {cmd} 的标准输入。例如,在Vim命令行模式下执行命令 :write !sh 后会在 shell 中执行当前缓冲区中的每行内容。假如当前所在目录包含如下的文件:1.cc2.cc3.cc…我希望把 .cc 后缀更名为 .cpp,可以在Vim中通过 :read !ls *.cc 命令将shell命令 ls .cc 的输出重定向到Vim缓冲区中,再使用Vim替换命令 :%s/(.).cc/mv & \1.cpp 生成shell重命名命令mv,最后使用 :write !sh 执行当前缓存区中的每一行,从而达到对所有 .cc 文件重命名为 .cpp 的目的。本文首发于Vim教程网,授权segmentfault首发。 ...

December 26, 2018 · 1 min · jiezi

Vim 利剑常磨,见血封喉

年底了,故事总是会有很多。刚了一波通宵加班,趁着有时间,过了一遍Vim教程,顺便汇总下常用命令。对于以 OSX / Linux为开发环境的伙伴们,应该并不陌生。因其轻便,扩展性,可定制化,一直很受开发者追捧。高阶大神,袖中必有深藏。Vim编辑器简洁易用,在终端上可用来快速查看修改文档。虽然与其他编辑器如WebStrom, VScode相比,功能扩展相对欠缺,对新手朋友不太友好。但胜在多数Linux系统已附带,开箱即用,终端直接使用,无需多开一个应用窗口Vim学习的过程不是两三天即可入境,懒惰如笔者,几天不敲,命令忘的七八。时不时还得翻出来看看,至今仍以新手自居。作为一名前端开发工程师,如果你想秀操作用Vim来写HTML/CSS/JavaScript,我只想说一句,“小伙子,你很6啊!”。前言 vi/vim的区别vim 是 vi 的升级版本,它不仅兼容vi的所有指令,还有新增了一些新的特性。vi filenamevim filename// 两者同样的功能,能少敲一个字母,所以我们就用vi吧“工具总须多磨,方才用的趁手。”Mac 终端键入 vimtutor 即可进入Vim入门教程,30分钟足以让你应对Vim日常操作。常规操作命令说明x删除光标下的字符X删除光标左边的字符s修改一个字符(与r的区别,修改后直接进入Insert模式)i光标前插入字符a光标后插入字符A行尾插入字符o光标下方新建一行并进入Insert模式O (字母)光标上方新建一行并进入Insert模式r替换字符(单个)R替换字符(多个)cw替换文本直到单词末尾(ce也可)c$替换文本直到行尾dw删除单词 (de, d2w)d$删除到行尾D删除到行尾S删除到行为,并进入Insert模式dd删除整行y复制yy复制整行 (yw, ye)p粘贴到光标之后P粘贴到光标之前u撤销.重复上一次操作:!执行外部名 (:!dir/:ls)%查找配对的括号 ), }, ]v motion :w选择性保存Ctrl + D查看可能的补全光标移动命令说明h左l右k上j下0 (数字)行首$行尾w下一个单词起始处nw (2w)n可为数字,表示移动两个单词e单词末尾(与w的区别)gg文件起始处G文件末尾处退出命令说明:wq保存并退出ZZ保存并退出:q!丢弃修改并退出 (q退出,有修改的话q不能退出):e!丢弃修改并打开原文件查找并替换命令说明:s/old/new/g查找old并替换为new,g代表整行匹配:#, #s/old/new#, #代表首尾行号:%s/old/new/g全文匹配替换:%s/old/new/gc全文匹配替换,并每次替换会弹出确认提示翻页命令说明Ctrl + e向下滚动一行Ctrl + y向上滚动一行Ctrl + f向下翻一页Ctrl + b向上翻一页Ctrl + u向上翻半页Ctrl + d向下翻半页文件操作命令说明:e + filename打开新文件:r + filename读取文件并插入到当前文件选项设置命令说明:set ic忽略大小写:set is部分匹配(like):set hls高亮匹配:set nu显示行号分屏启动vim命令说明vim -on file1 file2…水平分屏vim -On file1 file2…垂直分屏关闭分屏命令说明Ctrl + w c关闭当前窗口(如果是最后一个,无法关闭)Ctrl + w q关闭当前窗口(如果是最后一个,则退出vim)分屏命令说明Ctrl + w s上下分屏Ctrl + w v左右分屏:sp filename左右分屏,且打开一个新的文件:vsp filename上下分屏,且打开一个新的文件切换分屏(光标切换)命令说明Ctrl + w l右边Ctrl + w h左边Ctrl + w j上边Ctrl + w k下边分屏尺寸调整TIPS: (上下分屏生效)命令说明Ctrl + w =所有屏一样高度Ctrl + w +增加高度Ctrl + w - 减少高度写在结尾这么多命令要记,想对Vim说喜欢真不容易,按耐不住就新开VScode。少年莫慌,很多事情,难在开头,当你学会了,才会感谢当初的付出。本文仅对常用的一些命令做了汇总,Vim的玩法还有很多。在此推荐易水博客的《Vim使用进阶》系列,干货满满。寒梅飘香,这个寒冬,与诸君互勉。参考文档:vi和vim的区别vim常用命令总结vi/vim使用进阶作者:以乐之名本文原创,有不当的地方欢迎指出。转载请指明出处。 ...

December 25, 2018 · 1 min · jiezi

zsh终端下如何用命令行打开sublime

在zsh下打开前端常见编辑器1. .zshrc为zsh相关配置文件,先打开配置文件vim .zshrc2. 添加如下代码,具体路径可能不一致alias atom=’/Applications/Atom.app/Contents/MacOS/Atom’alias subl=’/Applications/SublimeText.app/Contents/SharedSupport/bin/subl’alias code=’/Applications/Visual\ Studio\ Code.app/Contents/Resources/app/bin/code'3. 重启即可使用,比如用sublime打开当前目录subl ./注意: finder中显示路径可以在终端中执行下面这行代码defaults write com.apple.finder _FXShowPosixPathInTitle -bool TRUE;killall Finder

December 19, 2018 · 1 min · jiezi

最漂亮的编程主题

题目写的有点大,但确实是我近期最喜欢的主题和字体(没有之一),来自一位前端妹子的推荐。因为它太好看了,所以一定要大用特用,不但要用在VSCode上,并且还要用在vi上,所有一切能用的地方。颜色主题——One Dark颜色主题的名称基干是One Dark,应该最早是从Atom发展出来的,所以叫Atom One Dark,后来产生了变种如One Dark Pro,One Dark Pro Vivid等等,我在VSCode里选择的是One Dark Pro。在VSCode里安装安装方法很简单,直接在插件标签里输入one dark搜索就可以安装了。安装好之后怎么启用呢?在左上角菜单的首选项里找到颜色主题,就可以启用了。在vi里安装这么漂亮的主题,不用来装在vi里就可惜了。我们得做三件事:第一,在目录下建一个子目录.vim,然后在.vim目录下再建一个子目录colors,然后在colors目录下建一个文件onedark.vim,把这个文件的内容拷进去。第二,在.vim目录下再建一个子目录autoload,然后在autoload下建一个文件onedark.vim,然后把这个文件的内容拷进去。第三,在目录下建一个文件.vimrc,把下面的内容拷进去:if (empty($TMUX)) if (has(“nvim”)) let $NVIM_TUI_ENABLE_TRUE_COLOR=1 endif if (has(“termguicolors”)) set termguicolors endifendifsyntax oncolorscheme onedarkfiletype indent onset smartindentset expandtabset shiftwidth=4set pastePS. 如果你的vi不等于vim,你还需要在~/.config/fish/config.fish里写上alias vi=vim,这样你的vi就等于vim了。Fira Code字体是不是已经足够漂亮了呢?也不尽然,当当当当,我们的大杀器出场!Fira Code,这可是在github上高达27,000多颗星的字体啊,字体星数仅次于著名的Font Awesome,我简直爱死他的这个&符号了。不同于颜色主题需要在两端安装,这个Fira Code字体只需要在Mac上安装就好了,因为Terminal只能使用客户端字体,所以不需要在服务器安装,只要把字体安装好之后,在iTerm里设置一下字体就好了。安装还是用我们最爱的brew来安装:brew tap caskroom/fontsbrew cask install font-fira-code在VSCode中设置字体在settings.json中添加以下两行:“editor.fontFamily”: “‘Fira Code’”,“editor.fontLigatures”: true,结合上面安装的颜色主题,现在的VSCode是不是看起来好漂亮了呢?还带连字符的,还有那个箭头函数,是不是好吓人?在iTerm中设置字体由于vi是在iTerm中运行的,所以我们只能通过为iTerm设置字体来间接影响到vi:现在,再通过ssh打开我们的vi编辑器,是不是也看到了漂亮的字体?虽然看上去远没有VSCode那么炫酷,但也足以在服务端爽心悦目了。祝你每天编程好心情!

September 24, 2018 · 1 min · jiezi