欲善其事 先利其器
工程师要学习 Vim 编辑器的过程,就跟学习 Java 或 Python 的程序语言一样,是有「门槛效应」。
在学习 Vim 指令之前
最好是已经具备键盘「盲打」的能力,否则指令无法连贯,速度只会比平常更慢。
进阶的「巨集指令」
也是要先熟悉移动与编辑的动作,才能够发挥「用程序来写程序的功能」。
就像初学 Java,变数都懵懂,物件导向更是奇谈。
但并不会妨碍我把 IntelliJ 改成暗色外观。
内容涵盖:
建议我们,在了解 vim 的基本功能後,要订制自己的 vimrc
文件。
就像是「先学会锯子怎麽用,然後再打磨,使其锐利一样。」
事半功倍! 正是我们使用工具的原因!
Vim 编辑器的配置,就如同所有的 IDE 一样,可以做各种快捷键与外观风格调整
不过因为没有滑鼠与可供点按的 GUI 介面,配置它的方法更会像是在软件专案中设置资料库的连线一样 :
(要使用特定格式与各种参数)
Vim 的配置档路径,通常会放在使用者资料夹档名为 .vimrc
或 _vimrc
~/_vimrc
~/.vimrc
IDE 中的 Vim 插件
通常也会是一个独立的档案,以 IntelliJ 的 IdeaVim 插件为例,他的配置档就叫做 .ideavimrc
同样预设放置在使用者资料夹
完全没有任何配置的 Vim 编辑器
新增一个 .vimrc 的档案
快速加入两个开发常用的功能
" 语法识别
syntax enable
" 显示行数
set number
配置效果
接续两个常用配置之後
语法高亮的部分
" 支援 256 色
set t_Co=256
" 终端机背景色 : dark / light
set background=dark
" 内建风格 ( 缩写指令 colo )
" 输入 colorscheme 空一格,再按 Tab 可以依次预览 :
" blue / darkblue / default / delek / desert / eldlord
" evening / industry / koehler / morning / murphy / pable
" peachpuff / ron / shine / slate / torte / zollner
colorscheme default
让 Vim 能够支援 256 色
告诉 Vim 编辑器终端机的背景色,
在有一些需要标注或选择的地方,Vim 才能够调整成容易辨识的颜色。
vim 内建的外观风格,注解列表的是可以用的风格名称。
+ 快速浏览的方法 ?
利用配置的设定,也是 vim 实际命令行的特性,在编辑器中输入 colorscheme 的指令,
名称的地方空一格不指定,再按一下 Tab,预设的风格就会依据字母的顺序显示出来。
增强 vim 编辑器功能
" 搜寻,高亮标注
set hlsearch
" 配置档案路径,让 find 指令更好用
set path=.,/usr/include,,**
" ts = tabstop
set ts=4 "缩排 4 格
" tab 替换成空格
set expandtab
" 自动缩排 | autoindent / smartindent / cindent
set autoindent " 跟上一行的缩进一致
可以在搜寻时,把所有符合的文字用颜色区块标注出来。
原本的 find 指令 只能搜寻当前同层级的资料夹
这个 set path 指令,可以将搜寻的范围包含目录底下的所有子资料夹
按下一个 Tab 按键 等於四个空格
将原本 Tab 按键的一大段空白的空间,转换成刚才设置的空格数量
三种模式可以选择 :
autoindent - 自动对齐上一行的缩排
smartindent - 针对左右大括号,增强缩排
cindent - 简单的 C/C++、Java 语法结构判断
inoremap ;; <ESC>
" 执行程序
nmap <F5> :call CompileRun()<CR>
func! CompileRun()
exec "w"
if &filetype == 'python'
exec "!time python3 %"
elseif &filetype == 'java'
exec "!javac %"
exec "!time java %<"
elseif &filetype == 'sh'
:!time bash %
endif
endfunc
在插入模式下,分号两下指令、非递归状态,映射为按键
如此,就有三种退回普通模式的方法 :
左手 - ESC
右手 - ; ;
双手 - Ctrl + [
普通模式下,F5 按键 执行 CompileRun 涵式。
此函式会先存档,然後根据副档名的不同,使用终端机的指令执行这个档案。
(主要运用在 Python 的执行快捷键)
关注三个重点
01.Vim 编辑器的模式不同 :
前缀词:
i : 插入模式下生效
n : 普通模式下生效
v : 可视模式下生效
c : EX命令模式下生效
都不加代表在任何模式都起作用,不过很容易发生快捷键冲突,所以都建议加上。
02.递归与非递归差异
有 nore : 代表非递归
无 nore : 代表有递归
( nore 中文意思 - 没有 )
递归代表 ?
非递归 :
nnoremap j k
nnoremap k l
递归 :
nmap j k
nmap k l
因此,除非真的确定原本按键上没有其他功能,不然都还是建议使用非递归状态。
03.ESC 与 CR 和 左右两侧大於、小於符号的意思
代表的是非字母的快捷键功能
名称 | 按键 | 名称 | 按键 | |
---|---|---|---|---|
<ESC> |
ESC | <k0> - <k9> |
小键盘数字 0 到 9 | |
<CR> |
Enter | <Ctrl> |
Ctrl 键 | |
<S-x |
Shift + x 组合键 | <Alt> |
Alt 键 | |
<C-x> |
Ctrl + x 组合键 | <Shift> |
Shift 键 | |
<A-x> |
Alt + x 组合键 | <F1> - <F12> |
F1 ~ F12 功能键 | |
<BS> |
退格键 (Backspace) | |||
<SPACE> |
空格键 |
" JSON 文字格式化
" command! JSONFormat :execute '%!python -m json.tool'
command! JSONFormat :execute '%!python -m json.tool'
\ | :execute '%!python -c "import re,sys;chr=__builtins__.__dict__.get(\"unichr\", chr);sys.stdout.write(re.sub(r\"\\\\u[0-9a-f]{4}\", lambda x: chr(int(\"0x\" + x.group(0)[2:], 16)).encode(\"utf-8\"), sys.stdin.read()))"'
\ | :set ft=javascript
\ | :1
" XML 文字格式化
command! XMLFormat :execute '%!xmllint --format -'
" 常用的文字替代
command! Br2line :execute '%s/<br>/---/g'
JSONFormat
:execute '%!python -m json.tool'
json 文字的格式化排版
XMLFormat
:execute '%!xmllint --format -'
xml 文字的格式化排版
Br2line
:execute '%s/<br>/---/g'
执行常用的文字替代
JSONFormat
有两种,一种比较简单,另外一种相对复杂。
第一种:
command! JSONFormat :execute '%!python -m json.tool'
执行什麽动作 ?
後方 '%!python -m json.tool' 指令
调用外部 指令 python 参数 -m ,将 json.tool 模组,作为脚本运行。
第二种:
command! JSONFormat :execute '%!python -m json.tool'
\ | :execute '%!python -c "import re,sys;chr=__builtins__.__dict__.get(\"unichr\", chr);sys.stdout.write(re.sub(r\"\\\\u[0-9a-f]{4}\", lambda x: chr(int(\"0x\" + x.group(0)[2:], 16)).encode(\"utf-8\"), sys.stdin.read()))"'
\ | :set ft=javascript
\ | :1
第一种指令,有一个小问题,如果资料内容有中文的话,会被转换成万国码。
因此,第二种就是将文字的编码,转换成 utf-8,中文部分就会显示正常。
XMLFormat
前面 command!、XMLFormat 与 execute 有了之前的说明,应该知道是什麽意思
不一样的地方,就是调用 xml 的解析工具 xmllint,执行参数 format 格式化功能。
Br2line
上述两者,都是调用外部指令来对档案作业。
如果只是要使用内建的命令行指令,将其中代表外部指令的 惊叹号(!
)移除即可
这边的例子:
'%s/<br>/---/g'
使用 %s 替代文字的指令,将 br 换行的标签元素,替换成 Markdown 格式的水平分割线。
命令行格式
command! : {指令名称} :execute '{执行动作}'
剩下更多要新增的动作,只要模仿上面三个范例,替换 {指令名称} 与 {指令动作} 即可。
个人偏好 :
相比於快捷键的添加,我更倾向使用这个方法,简化动作。
因为 vim 有太多的指令,如果贸然更改很容易发生冲突,而且也不容易记忆。
因此,使用像函式的命名一样,定义命令行指令,我认为会是一个比较好的方法。
" 语法识别
syntax enable
" 显示行数
set number
" 支援 256 色
set t_Co=256
" 终端机背景色 : dark / light
set background=dark
" 内建风格 ( 缩写指令 colo )
" 输入 colorscheme 空一格,再按 Tab 可以依次预览 :
" blue / darkblue / default / delek / desert / eldlord
" evening / industry / koehler / morning / murphy / pable
" peachpuff / ron / shine / slate / torte / zollner
colorscheme molokai
" 搜寻,高亮标注
set hlsearch
" 配置档案路径,让 find 指令更好用
set path=.,/usr/include,,**
" ts = tabstop
set ts=4 "缩排 4 格
" tab 替换成空格
set expandtab
" 自动缩排 | autoindent / smartindent / cindent
set autoindent " 跟上一行的缩进一致
" --- ↑ --- 一般配置 --- ↑ ---
inoremap ;; <ESC>
" 执行程序
nmap <F5> :call CompileRun()<CR>
func! CompileRun()
exec "w"
if &filetype == 'python'
exec "!time python3 %"
elseif &filetype == 'java'
exec "!javac %"
exec "!time java %<"
elseif &filetype == 'sh'
:!time bash %
endif
endfunc
" --- ↑ --- 快捷键配置 --- ↑ ---
" JSON 文字格式化
" command! JSONFormat :execute '%!python -m json.tool'
command! JSONFormat :execute '%!python -m json.tool'
\ | :execute '%!python -c "import re,sys;chr=__builtins__.__dict__.get(\"unichr\", chr);sys.stdout.write(re.sub(r\"\\\\u[0-9a-f]{4}\", lambda x: chr(int(\"0x\" + x.group(0)[2:], 16)).encode(\"utf-8\"), sys.stdin.read()))"'
\ | :set ft=javascript
\ | :1
" XML 文字格式化
command! XMLFormat :execute '%!xmllint --format -'
" 常用的文字替代
command! Br2line :execute '%s/<br>/---/g'
" --- ↑ --- 命令行配置 --- ↑ ---
Vundle 是 Vim 的其中一种插件管理器,其他的还有 vim-pathogen 与 vim-plug。
访问 Vundle 的 GitHub 页面 :
依照 GitHub 的 Readme 文件 操作 :
第一步:
先准备好 git 版控工具,後续安装的每一个插件,都会放在使用者资料夹 .vim/bundle 里面。
第二步:
复制 git clone 指令,将整个专案拉取到 指定路径
git clone https://github.com/VundleVim/Vundle.vim.git ~/.vim/bundle/Vundle.vim
第三步:
开启 vimrc 档案,将插件配置贴到开头的位置
插件配置 (README):
set nocompatible " be iMproved, required
filetype off " required
" set the runtime path to include Vundle and initialize
set rtp+=~/.vim/bundle/Vundle.vim
call vundle#begin()
" alternatively, pass a path where Vundle should install plugins
"call vundle#begin('~/some/path/here')
" let Vundle manage Vundle, required
Plugin '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.html
" Plugin 'L9'
" Git plugin not hosted on GitHub
Plugin 'git://git.wincent.com/command-t.git'
" git repos on your local machine (i.e. when working on your own plugin)
Plugin 'file:///home/gmarik/path/to/plugin'
" 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/'}
" Install L9 and avoid a Naming conflict if you've already installed a
" different version somewhere else.
" Plugin 'ascenator/L9', {'name': 'newL9'}
" All of your Plugins must be added before the following line
call vundle#end() " required
filetype 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
"
" see :h vundle for more details or wiki for FAQ
" Put your non-Plugin stuff after this line
插件配置 (简化):
set nocompatible " be iMproved, required
filetype off " required
set rtp+=~/.vim/bundle/Vundle.vim
call vundle#begin()
Plugin 'VundleVim/Vundle.vim'
call vundle#end() " required
filetype 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
"
" see :h vundle for more details or wiki for FAQ
" Put your non-Plugin stuff after this line
第四步:
储存後,使用 vim 进入到编辑器,使用命令行模式,输入 PluginInstall。
安装的过程如下图 :
如果不想要每次安装,都进入一次编辑器的话 :
vim +PluginInstall +qall
这个指令,可以在一般的终端机状态下安装
其他的指令
" :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
在刚刚留下的注解中有说明,例如,列表(:PluginList) 与 解除安装(:PluginClean) 都可以自行尝试
Plugin 'flazz/vim-colorschemes'
安装方法:
依据 Readme 文件,只要将上述的 Plugin 文字,贴到之前 Plugin Vundle.vim
的下方
然後,在 vim 里面 执行 PluginInstall
set nocompatible " be iMproved, required
filetype off " required
set rtp+=~/.vim/bundle/Vundle.vim
call vundle#begin()
Plugin 'VundleVim/Vundle.vim' " <- Vundle 插件
Plugin 'flazz/vim-colorschemes'
call vundle#end() " required
filetype plugin indent on " required
" To ignore plugin indent changes, instead use:
"filetype plugin on
插件配置
完成後,把风格设定的地方,改成这个插件支援的名称 :
colorscheme molokai
重新进入编辑器後,外观风格就会变成插件提供的配置
Plugin 'scrooloose/nerdtree'
Plugin 'jistr/vim-nerdtree-tabs'
nerdtree :
树状档案管理,是这个插件功能的主体。
nerdtree-tabs :
增强功能,让 nerdtree 的插件更像是真正的面版。
安装的方法
跟「外观风格」插件相同,将 nerdtree Plugin 与 nerdtree-tab Plugin 路径加入,
储存後,进入 vim 编辑器,命令行模式 输入 PluginInstall
使用方法
命令行指令 NERDTreeTabsToggle
切换侧边栏的显示
其他指令,参考 GitHub 的 Readme 文件
插件配置
这一大段的指令 稍微有点长,在 vimrc 的档案内,还可以新增 opt + 1 的快捷键来进行切换
" 侧边栏快捷键 : opt + 1
nnoremap ¡ : NERDTreeToggle<CR>
我使用的是 opt + 1
的符号,像是 i 的字母是 Mac 键盘 按着 opt 时可以打出的符号。
(由於 Vim 的 alt 在 Mac 的映射 还有些问题,折衷方法可以透过直接使用特殊符号,来代表 opt 的组合键。)
Plugin 'gabrielelana/vim-markdown'
Plugin 'tyru/open-browser.vim'
Plugin 'kannokanno/previm'
我认为 Vim + Markdown 是写专案文件的绝佳组合,也是我写技术笔记的主力工具。
三种的 Markdown 插件,可以分成两种 :
第一种 - 支援编辑功能 :
Plugin 'gabrielelana/vim-markdown'
增强 Markdown 风格的呈现,并且细节的部分,某些语法可以做简易的快捷操作。
例如 :
第二种 - 支援预览的功能 :
Plugin 'tyru/open-browser.vim'
Plugin 'kannokanno/previm'
实际的主体是後面 previm 插件,而 open-browser 则是他的一个前置插件。
功能是让你在编辑 Markdown 时,可以使用命令行指令,
将文件渲染在浏览器上,并且存档时会同步连动。
插件配置
" Markdown : Preview
let g:previm_open_cmd = 'open -a Google\ Chrome'
使用方法
命令行指令 :PrevimOpen
Plugin 'mattn/emmet-vim
网页开发的 Emmet 插件,安装方法与之前相同。
使用方法
预设的快捷键不是插入模式的 Tab 按键,而是输入完标签名称後 ctrl + y + ,
插件配置
"emmet-vim
let g:user_emmet_expandabbr_key = '<c-e>'
调整成 Ctrl + E ,虽然没有 Tab 按键来的直觉简单,
但考虑到 Vim 的各种指令 可能导致的按键冲突,目前这个配置算是一个可以接受的方案。
Plugin 'Chiel92/vim-autoformat'
我认为 Vim 编辑器,在还没有改造成像 IDE 一样,有那麽多功能的配置时,
最适合拿来写三样东西 :
这三样很大程度上,都不需要语法的自动补全。
不过网页与 Python 缩排规则,并不相同。
所以我安装这个插件,就是为了 Python 的自动排版。
插件配置
GitHub 文件下方,已经写好要配置的参数
noremap <F3> :Autoformat<CR>
au BufWrite * :Autoformat
let g:autoformat_autoindent = 0
let g:autoformat_retab = 0
let g:autoformat_remove_trailing_spaces = 0
这个插件,安装完成後,只针对 Python 语言处理
要让排版的功能扩展到其他语言,GitHub 的文件 往下拉
如果系统有安装的话,插件就能够自动侦测直接支援。
astyle 命令工具
下载後、解压缩,在 build/mac/ 的 Makefile 路径上。
使用终端机,执行 make
指令,将产生出来的 bin 的资料夹,配置到系统变数上
例如 : Mac / Linux 的 ~/.zprofile
export PATH=$PATH:/Users/MyMac/DevTools/astyle/build/mac/bin
完成後,在 C# C++ C 与 Java 的档案中,按一下 F3 就会有排版的功能
set nocompatible " be iMproved, required
filetype off " required
set rtp+=~/.vim/bundle/Vundle.vim
call vundle#begin()
Plugin 'VundleVim/Vundle.vim'
Plugin 'flazz/vim-colorschemes'
Plugin 'scrooloose/nerdtree'
Plugin 'jistr/vim-nerdtree-tabs'
Plugin 'gabrielelana/vim-markdown'
Plugin 'tyru/open-browser.vim'
Plugin 'kannokanno/previm'
Plugin 'mattn/emmet-vim'
Plugin 'Chiel92/vim-autoformat'
call vundle#end() " required
filetype 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
"
" see :h vundle for more details or wiki for FAQ
" Put your non-Plugin stuff after this line
" 侧边栏快捷键 : opt + 1
nnoremap ¡ : NERDTreeToggle<CR>
" Markdown : Preview
let g:previm_open_cmd = 'open -a Google\ Chrome'
"emmet-vim
let g:user_emmet_expandabbr_key = '<c-e>'
" autoformat
noremap <F3> :Autoformat<CR>
au BufWrite * :Autoformat
let g:autoformat_autoindent = 0
let g:autoformat_retab = 0
let g:autoformat_remove_trailing_spaces = 0
" --- ↑ --- 插件配置 --- ↑ ---
以上打磨 Vim 编辑器的方法,你可能会发现有很多简化的动作,实际上都是调用外部的终端机 :
command! JSONFormat :execute '%!python -m json.tool'
command! XMLFormat :execute '%!xmllint --format -'
对於学习 Vim 编辑器来说,熟练的使用这些命令工具,也是让 Vim 编辑器发挥更多威力的方法之一。
我觉得重要的两个命令:
别名
Mac
Alias 命令 :
中文意思是别名,可以简化系统中的其他命令,像是 cd 切换目录
例如 :
alias WS='cd /Users/Enoxs/Mac_Document/WorkSpace/'
alias iDoc='cd /Users/Enoxs/Library/Mobile\ Documents/com~apple~CloudDocs/iStudioX'
alias iDev='cd /Users/Enoxs/Library/Mobile\ Documents/com~apple~CloudDocs/iStudioX/DevStudio'
Open 命令 :
使用档案浏览器,开启当前的路径
两个指令互相搭配,用终端机访问文件的速度,相比於在最外层资料夹一路点过来快了不少。
更不用说,还可以随时切换到,开发笔记或者是开发工具的资料夹。
set nocompatible " be iMproved, required
filetype off " required
set rtp+=~/.vim/bundle/Vundle.vim
call vundle#begin()
Plugin 'VundleVim/Vundle.vim'
Plugin 'flazz/vim-colorschemes'
Plugin 'scrooloose/nerdtree'
Plugin 'jistr/vim-nerdtree-tabs'
Plugin 'gabrielelana/vim-markdown'
Plugin 'tyru/open-browser.vim'
Plugin 'kannokanno/previm'
Plugin 'mattn/emmet-vim'
Plugin 'Chiel92/vim-autoformat'
call vundle#end() " required
filetype 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
"
" see :h vundle for more details or wiki for FAQ
" Put your non-Plugin stuff after this line
" 侧边栏快捷键 : opt + 1
nnoremap ¡ : NERDTreeToggle<CR>
" Markdown : Preview
let g:previm_open_cmd = 'open -a Google\ Chrome'
"emmet-vim
let g:user_emmet_expandabbr_key = '<c-e>'
" autoformat
noremap <F3> :Autoformat<CR>
au BufWrite * :Autoformat
let g:autoformat_autoindent = 0
let g:autoformat_retab = 0
let g:autoformat_remove_trailing_spaces = 0
" --- ↑ --- 插件配置 --- ↑ ---
" 语法识别
syntax enable
" 显示行数
set number
" 支援 256 色
set t_Co=256
" 终端机背景色 : dark / light
set background=dark
" 内建风格 ( 缩写指令 colo )
" 输入 colorscheme 空一格,再按 Tab 可以依次预览 :
" blue / darkblue / default / delek / desert / eldlord
" evening / industry / koehler / morning / murphy / pable
" peachpuff / ron / shine / slate / torte / zollner
colorscheme molokai
" 搜寻,高亮标注
set hlsearch
" 配置档案路径,让 find 指令更好用
set path=.,/usr/include,,**
" ts = tabstop
set ts=4 "缩排 4 格
" tab 替换成空格
set expandtab
" 自动缩排 | autoindent / smartindent / cindent
set autoindent " 跟上一行的缩进一致
" --- ↑ --- 一般配置 --- ↑ ---
inoremap ;; <ESC>
" 执行程序
nmap <F5> :call CompileRun()<CR>
func! CompileRun()
exec "w"
if &filetype == 'python'
exec "!time python3 %"
elseif &filetype == 'java'
exec "!javac %"
exec "!time java %<"
elseif &filetype == 'sh'
:!time bash %
endif
endfunc
" --- ↑ --- 快捷键配置 --- ↑ ---
" JSON 文字格式化
" command! JSONFormat :execute '%!python -m json.tool'
command! JSONFormat :execute '%!python -m json.tool'
\ | :execute '%!python -c "import re,sys;chr=__builtins__.__dict__.get(\"unichr\", chr);sys.stdout.write(re.sub(r\"\\\\u[0-9a-f]{4}\", lambda x: chr(int(\"0x\" + x.group(0)[2:], 16)).encode(\"utf-8\"), sys.stdin.read()))"'
\ | :set ft=javascript
\ | :1
" XML 文字格式化
command! XMLFormat :execute '%!xmllint --format -'
" 常用的文字替代
command! Br2line :execute '%s/<br>/---/g'
" --- ↑ --- 命令行配置 --- ↑ ---
>>: 组织计划为建立一个专责的资安部门(安全功能),最不重要的考虑是“安全和隐私安全控制选择”
来自Luke的实用且有效的CISSP考试秘诀! 很棒!! 阅读 (Reading) 作练习题 (Pr...
要使用图来表达与非专业人员的执行程序与流程,除了一般的流程图就能做到之外,本题要介绍的这个图,是用角...
由左到右,由上至下,分别是 早餐选单按钮 午餐选单按钮 饮料选单按钮 使用说明按钮 查询购物车内容...
前言 今天要介绍 Go 语言的另一种资料型态,在先前,我们介绍的变数都是储存单一的值或是多个相同型态...
该文章同步发布於:我的部落格 昨天有提到会稍微介绍一下 allow method,其实在昨天的范例...