Vim8 打造IDE

視頻參考:玩轉Vim 從放棄到愛不釋手html

基本命令

Image result for vim

常見設置

:set nu設置行號java

:set nu! 取消行號python

:set hls設置高亮linux

:set incsearch設置增量搜索c++

:syntax on 打開代碼高亮git

:set autoindent設置自動縮進,這裏有個大坑,網頁上拷貝的代碼粘到vim裏面整個縮進會亂掉github

:set paste:set nopaste能夠解決粘貼縮進亂掉的問題golang

:set clipboard=unnamed容許你直接賦值粘貼系統剪貼板內容,而無需每次顯式」+使用系統剪貼板。:echo has('clipboard')輸出爲1時才支持此特性web

:set filetype查看當前文件類型chrome

增刪改查

a 在當前字符後面插入

i在當前字符前面插入

o在當前位置下面一行插入

A在當前行末尾插入

I在當前行起始位置插入

O在當前位置上面一行插入

xnormal 模式下快速刪除一個字符, mormal模式下u undo,Ctrl+r redo

xp能夠對調兩個字符。其原理是藉助無名寄存器

daw刪除一個單詞(會附帶刪除空格),等價於dw

diw刪除一個單詞(不會刪除空格)

dt)刪除當前位置直到)間的內容

dt"刪除當前位置直到」間的內容

d$刪除當前位置到行尾

d0刪除當前位置到行首

2dd刪除2行

4x刪除4個字符

vxd搭配使用,刪除選中部分

rnormal 模式下能夠替換一個字符。

Rnormal模式下一直替換

snormal 模式下刪除光標字符並進入插入模式

Ctrl+H在一行上編輯的時候,刪除一個字符

Ctrl+W在一行上編輯的時候,刪除一個單詞

Ctrl+U在一行上編輯的時候,刪除一行

gi快速回到最後一次編輯的地方並進行插入編輯

/或者進行前向或者反向搜索

nN跳轉到下一個、上一個匹配

*#進行當前單詞的前下和向上匹配

使用f{char}能夠移動到char字符上

t{char}移動到char的前一個字符

分號;或者逗號,繼續搜該行下一個/上一個

替換

:[range]s/{src}/{dst}/[flags]

range取值

  • 表示範圍好比:10,20表示10-20行

  • %表示所有

flags取值

  • g(global)表示全局範圍內執行
  • c(confirm)表示確認,能夠確認或者拒絕修改
  • n(number)報告匹配到的次數而不替換,能夠用來查詢匹配次數

移動

←↑↓→hjkl

w/W 移到下一個word/WORD開頭。

e/E下一個word/WORD尾

b/B 回到上一個word/WORD開頭,能夠理解爲backword

word 指的是以非空白符分割的單詞,WORD以空白符分割的單詞

0移動到行首

$移動到行尾

gg/G 移動到文件開頭和結尾

你可使用ctrl+o 快速返回

H/M/L 跳轉到屏幕的開頭(Head),中間(Middle)和結尾(Lower)

Ctrl+u ctrl+f上下翻頁.(upword/forward)。

zz把當前行置爲中間行

zt把當前行置爲首行

zb把當前行置爲尾行

多文件操做

Buffer緩衝區

  • Vim 打開一個文件後會加載文件內容到緩衝區
  • 以後的修改都是針對內存中的緩衝區,並不會直接保存到文件
  • 直到咱們執行:w(write)的時候纔會把修改內容寫入到文件裏
  • :e file能夠打開一個文件

Buffer切換

  • 使用:ls會列舉當前緩衝區,而後使用:bn跳轉到第n個緩衝區

  • :bpre :bnext :bfirst :blast

  • 或者用:b buffer_name加上tab補全來跳轉

窗口

  • 一個緩衝區能夠分割成多個窗口,每一個窗口也能夠打開不一樣緩衝區

  • :sp [file] 水平分割

  • :vs [file]垂直分割

  • 每一個窗口能夠繼續被無限分割(看你屏幕是否夠大)

    Ctrl+w+h切換到左邊窗口

    Ctrl+w+j切換到下邊窗口

    Ctrl+w+k切換到上邊窗口

    Ctrl+w+l切換到右邊窗口

    window的長寬有對應快捷鍵區設置,可是不必去記憶,後面會使用tmux

Tab標籤頁,將窗口分組

Vim的Tab和其餘編輯器不太同樣,能夠想象成Linux的虛擬桌面好比一個Tab全用來編輯 Python文件,一個Tab全是HTML文件相比窗口,Tab通常用的比較少,Tab太多管理起來也比較麻煩。這個功能有了後面tmux後也不須要記憶。

:tabe filename在新標籤中打開filename

Ctrl+w+t把當前窗口移到一個新標籤頁

:tabc關閉當前標籤頁及其中的全部窗口

:tabo只保留活動標籤頁,關閉全部其餘標籤頁

:tabnN切換到編號爲N的標籤頁

:tabn切換到下一個標籤頁

:tanp切換到上一個標籤頁

文本對象

viw首先v進入選擇模式,iw選中當前單詞,忽略空格

vaw首先v進入選擇模式,aw選中當前單詞

visva首先v進入選擇模式,is 或 as選中當前一句話

vipvap首先v進入選擇模式,ip或ap選中一段

複製粘貼

normal模式

複製粘貼分別使用y(yank)和p(put)

剪貼dp

咱們可使用v(visual)命令選中所要複製的地方,而後使用p粘貼

配合文本對象:好比使用yiw複製一個單詞,yy複製一行

寄存器

Vim不使用單一剪貼板進行剪貼、複製與粘貼,而是多組寄存器

"a表示a寄存器,有名寄存器a-z

""表示無名寄存器

"0 0是賦值專用寄存器,使用y複製文本同時準備拷貝到複製寄存器0

"+ +是系統剪貼板寄存器,能夠把vim裏面的內容複製到其餘地方。:echo has('clipboard')輸出爲1時才支持此特性

".上次插入的文本寄存器

"%當前文件名寄存器

「ayiw複製一個單詞到寄存器a中

「bdd 刪除當前行到寄存器b中

:reg a查看a寄存器內容

」ap把保存在a寄存器裏面的內容粘貼

補全

使用ctrl+nctrl+p補全單詞

使用ctrl+xctrl+f補全文件名

使用ctrl+xctrl+o補全代碼,須要開啓文件類型檢查:filetype on

其餘

:wq報錯退出

:e!從新加載而且不保存當前文件

vim file1 file2 file3 -O 打開多個窗口,每一個窗口一個文件

vim file1 file2 file3 -p 打開多個tab,每一個tab一個文件

主題

:colorscheme查看當前主題

:colorscheme 空格 Ctrl+D 顯式當前可用主題

Vim-Plug插件管理

安裝

curl -fLo ~/.vim/autoload/plug.vim --create-dirs \
    https://raw.githubusercontent.com/junegunn/vim-plug/master/plug.vim

使用

:PlugInstall 安裝插件
:PlugClean 清理插件
:PlugUpgrade 升級插件管理器
:PlugUpdate 升級插件
:PlugStatus 查看插件狀態

vim插件

NERDTree

功能

github

實現文件目錄樹功能,以下圖

NERDTree Screenshot

vim-plug方式安裝

Plug 'scrooloose/nerdtree'

vimrc配置

" NERFTree 配置

" NERFTree激活快捷鍵
let mapleader=','
nnoremap <leader>v :NERDTreeFind<cr>
nnoremap <leader>g :NERDTreeToggle<cr>

" 顯式隱藏文件
let NERDTreeShowHidden=1

" 忽略指定類型文件
let NERDTreeIgnore = [ 
        \ '\.git$', '\.hg$', '\.svn$', '\.stversion$s', '\.pyc$', '\.pyo$', '\.swp$', 
        \ '\.DS_Store$', '\.sass-cache$', '__pycache__$', '\.egg-info$', '\.ropeproject$',
        \]

ctrlp

功能

github

快速查找並打開一個文件。ctrlp有個缺陷:不會隨着打開文件的不一樣自動改變工做目錄(ctrlp的工做目錄始終是初始打開文件所在工做目錄)。這就致使ctrlp不少文件找不到。因此更推薦使用fzf.vim替代ctrlp

ctrlp

vim-plug方式安裝

Plug 'kien/ctrlp.vim'

vimrc配置

" ctrlp 配置

" 激活ctrlp快捷鍵
let g:ctrlp_map = '<c-p>'

"工做目錄隨文件變。在ctrlp中打開一個文件後,以當前文件我在位置爲工做目錄,在這下邊模糊搜索文件
autocmd BufEnter * cd %:p:h

vim-easymotion

功能

github

在整個文件區域內快速移動到任意位置

Animated demonstration

vim-plug方式安裝

Plug 'easymotion/vim-easymotion'

vimrc配置

ss調用easymotion

" vim-easymotion config
nmap ss <Plug>(easymotion-s2)

vim-surround

功能

github

normal 模式下增長,刪除,修改爲對內容

ds(delete a surrounding) 舉例ds '刪除單引號

cs(change a surrounding) 舉例 cs " ' 把"替換爲'

ys(you add a surrounding) 舉例 ysiw"給單詞加上"

vim-plug方式安裝

Plug 'tpope/vim-surround'

vim-cursorword

功能

github

給光標下的代碼加下劃線

vim-cursorword

vim-plug配置

Plug 'itchyny/vim-cursorword'

fzf.vim

功能

github

咱們常常須要在一個代碼項目中模糊搜索一些文本,怎麼辦呢?

Vim自帶的搜索/能夠搜索當前文件,可是項目有不少個文件

須要一個插件來模糊搜索多個文件內容

使用Ag.vim或者fzf.vim均可以很好地支持模糊搜索

vim-plug方式安裝

Plug 'junegunn/fzf', { 'dir': '~/.fzf', 'do': './install --all' }
Plug 'junegunn/fzf.vim'

Vim中使用

模糊搜索當前問的字符串

使用:Ag[PATTERN]模糊搜索字符串

注意:

若是提示"ag is not found"須要apt-get install silversearcher-ag

模糊查找文件

使用:Files[PATH]模糊搜索目錄下文件

Ctrl+j/k備選項中下移上移

fzf-vim-plugin

Terminal中使用

ctrl + r搜索輸入命令歷史

ctrl + t等同於直接執行命令fzf(fzf -e e是精確匹配)

用 vim 打開文件

vim $(fzf)

能夠經過輸入**來觸發 fzf 對文件/目錄的模糊補全(查找),以下例子所示:

# Files under current directory
# - You can select multiple items with TAB key
vim **<TAB>

# Files under parent directory
vim ../**<TAB>

# Files under parent directory that match `fzf`
vim ../fzf**<TAB>

# Files under your home directory
vim ~/**<TAB>


# Directories under current directory (single-selection)
cd **<TAB>

# Directories under ~/github that match `fzf`
cd ~/github/fzf**<TAB>

切換當前工做目錄

cd $(find * -type d | fzf)

這是個組合 (cd+find+fzf) 命令,完成切換到任意子目錄的功能。能夠看出來當 fzf 和其它命令組合使用時就能使得一些操做更方便:

  1. 使用 find 命令找出全部的子目錄
  2. 把子目錄列表 pipe 到 fzf 上進行選擇
  3. 再把結果以子命令的形式傳給 cd

shell 命令行補全

fzf 默認使用 ** 來補全 shell 命令,比起默認的 tab 補全,fzf 補全不知道高到哪裏去了。cd, vim, kill, ssh, export... 通通都能補全,好用哭了 🤣

進程 ID 模糊補全

在使用kill命令時,fzf 會自動觸發其自動補全功能:

# Can select multiple processes with <TAB> or <Shift-TAB> keys
kill -9 <TAB>

主機名補全:以下例子所示:

ssh **<TAB>
telnet **<TAB>

bashrc配置

export FZF_DEFAULT_COMMAND='if [ -f cscope.files ]; then cat cscope.files; else find ./ -type f ; fi'
export FZF_DEFAULT_OPTS="--height 40% --layout=reverse --preview '(highlight -O ansi {} || cat {}) 2> /dev/null | head -500'"

注意:默認狀況下預覽界面不會語法高亮,如須要語法高亮須要安裝apt-get install highlight

far.vim

功能

github

因爲在多個文件裏面批量搜索和替換

far.vim

vim-plug方式安裝

Plug 'brooth/far.vim'

使用

#替換上層目錄、當前目錄下全部.py文件
:Far src dst **/*.py 

#通過預覽,感受替換沒問題後確認替換
:Fardo

tagbar

功能

github

顯式語言的標籤

screenshot1

exuberant-ctags安裝

apt install exuberant-ctags

tags使用

  • :ts or :tselect shows the list
  • :tn or :tnext goes to the next tag in that list
  • :tp or :tprev goes to the previous tag in that list
  • :tf or :tfirst goes to the first tag of the list
  • :tl or :tlast goes to the last tag of the list
  • :tagsshow the tags you’ve traversed since you opened vim, run

參考文章

vim-plug方式安裝

Plug 'majutsushi/tagbar'

vimrc配置

" tagbar config
nnoremap <leader>t :TagbarToggle<CR>

vim-interestingwords

功能

github

給關鍵字高亮

Screenshot

vim-plug方式安裝

Plug 'lfv89/vim-interestingwords'

vimrc配置

" vim-interestingwords 配置
nnoremap <silent> <leader>k :call InterestingWords('n')<cr>
nnoremap <silent> <leader>K :call UncolorAllWords()<cr>
nnoremap <silent> n :call WordNavigation('forward')<cr>
nnoremap <silent> N :call WordNavigation('backward')<cr>
let g:interestingWordsGUIColors = ['#8CCBEA', '#A4E57E', '#FFDB72', '#FF7272', '#FFB3FF', '#9999FF']
let g:interestingWordsTermColors = ['154', '121', '211', '137', '214', '222']
let g:interestingWordsRandomiseColors = 1

bashrc配置

最後加上一句話

export TERM=xterm-256color

這句話很關鍵,沒有的話,vim-interestingwords進行高亮關鍵字的時候只顯示一種顏色。同時這個還會影響vim-airline插件底部狀態欄的顯式。

deoplete.nvim

功能

github

通用代碼補全。向vim-go、python-mode等插件也能夠補全代碼,可是他們都只針對特定語言。deoplete.vim是通用異步代碼補全插件,支持多種語言(須要安裝對應語言的擴展),支持neovim和vim8。除此以外YCM插件也有不少人使用,這兩個的差異暫時不清楚。

deoplete + echodoc integration

Ctrl+n/p上下移動備選項

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'
endif

依賴安裝

以Ubuntu18.04爲例

apt-get install -y python-pip python3-pip
# 安裝VIM,應該安裝完就是Vim8
# apt-get install vim

# 安裝Python3
# apt-get install python3 

# 安裝vim的Python-client庫pynvim
pip2 install --user pynvim
pip3 install --user pynvim

# 安裝插件 python的neovim庫
pip2 install --user neovim
pip3 install --user neovim

vimrc配置

set completeopt-=preview
set encoding=utf-8
set pyxversion=3
let g:python3_host_prog="/usr/bin/python3"
let g:deoplete#enable_at_startup = 1

安裝語言源

deoplete安裝完畢後默認只能根據當前問的已有內容推測,要想支持相應語言的只能提示,須要單獨安裝源

參考官方推薦的各語言的補全源:Completion Sources

以安裝C/C++語言源爲例

vim-plug配置

Plug 'Shougo/deoplete-clangx'

vim-clang-format

功能

github

格式化C, C++, Obj-C等代碼

Screenshot

:ClangFormat 格式化代碼

vim-plug方式安裝

Plug 'rhysd/vim-clang-format'

依賴安裝

以Ubuntu18.04爲例

apt-get install clang-format

vimrc配置

" vim-clang-format config
" 退出insert模式時自動格式化
let g:clang_format#auto_format_on_insert_leave=1
" 採用google代碼風格
let g:clang_format#code_style="google"
" 啓用自動格式化
autocmd FileType c ClangFormatAutoEnable

ale

功能

github

多種語言的靜態檢查

vim-plug安裝

Plug 'dense-analysis/ale'

vimrc配置

" ale 配置
let g:ale_set_highlights = 0
"自定義error和warning圖標
let g:ale_sign_error = '✗'
let g:ale_sign_warning = '⚡ '
"在vim自帶的狀態欄中整合ale
let g:ale_statusline_format = ['✗ %d', '⚡  %d', '✔ OK']
"顯示Linter名稱,出錯或警告等相關信息
let g:ale_echo_msg_error_str = 'E'
let g:ale_echo_msg_warning_str = 'W'
let g:ale_echo_msg_format = '[%linter%] %s [%severity%]'
"打開文件時不進行檢查
let g:ale_lint_on_enter = 0
"普通模式下,sp前往上一個錯誤或警告,sn前往下一個錯誤或警告
nmap sp <Plug>(ale_previous_wrap)
nmap sn <Plug>(ale_next_wrap)
"<Leader>s觸發/關閉語法檢查
nmap <Leader>s :ALEToggle<CR>
"<Leader>d查看錯誤或警告的詳細信息
nmap <Leader>d :ALEDetail<CR>
"使用clang對c和c++進行語法檢查,對python使用pylint進行語法檢查
let g:ale_linters = {
                        \   'c++': ['clang'],
                        \   'c': ['clang'],
                        \   'python': ['pylint'],
                        \}

vim-commentary

功能

github

vim 註釋插件有不少,vim-commentary是個比較輕量的註釋插件。會根據不一樣的文件類型使用不一樣註釋,python(#)golang(//)。

gcc 單行註釋

gc v選中代碼後註釋

gcgc取消註釋

vim-plug配置

Plug 'tpope/vim-commentary'

vim-bookmarks

功能

github

vim自身也支持書籤,可是使用起來不是很友好。視頻

Preview

vim-plug配置

Plug 'MattesGroeger/vim-bookmarks'

使用

mm打/取消書籤

ma顯式全部書籤

mc清除當前buffer上的書籤

mx清除全部書籤

vimrc配置

阮一峯博客

" 經常使用設置

" 設置行號
set number

" 設置默認主題
" colorscheme hybrid

" 高亮搜索
set hlsearch

" 增量搜索
set incsearch

" 按F2進入粘貼模式
set pastetoggle=<F2>

" 高亮搜索
set hlsearch

" 設置摺疊方式
set foldmethod=indent

" 支持鼠標操做,可是xhell下與右鍵粘貼衝突 
" set mouse=a

" 打開語法高亮
syntax on

" 光標所在的當前行高亮,與vim-cursorword插件衝突
" set cursorline

" 修改leader鍵爲,
let mapleader=','
let g:mapleader=','

" 使用jj進入normal模式
inoremap jj <Esc>`^

" 使用leader+w直接保存
inoremap <leader>w <Esc>:w<cr>
noremap <leader>w :w<cr>

" 使用ctrl+h/j/k/l切換窗口
noremap <C-h> <C-w>h
noremap <C-j> <C-w>j
noremap <C-k> <C-w>k
noremap <C-l> <C-w>l

" vim-plug安裝插件
call plug#begin('~/.vim/plugged')
Plug 'mhinz/vim-startify'
Plug 'vim-airline/vim-airline'
Plug 'vim-airline/vim-airline-themes'
Plug 'yggdroot/indentline'
Plug 'w0ng/vim-hybrid'
Plug 'scrooloose/nerdtree'
Plug 'kien/ctrlp.vim'
Plug 'easymotion/vim-easymotion'
Plug 'tpope/vim-surround'
Plug 'junegunn/fzf', { 'dir': '~/.fzf', 'do': './install --all' }
Plug 'junegunn/fzf.vim'
Plug 'brooth/far.vim'
Plug 'majutsushi/tagbar'
Plug 'lfv89/vim-interestingwords'

if has('nvim')
  Plug 'Shougo/deoplete.nvim', { 'do': ':UpdateRemotePlugins' }
else
  Plug 'Shougo/deoplete.nvim'
  Plug 'roxma/nvim-yarp'
  Plug 'roxma/vim-hug-neovim-rpc'
endif
Plug 'Shougo/deoplete-clangx'
Plug 'rhysd/vim-clang-format'
Plug 'dense-analysis/ale'
Plug 'tpope/vim-commentary'
Plug 'MattesGroeger/vim-bookmarks'
Plug 'itchyny/vim-cursorword'
call plug#end()

" ************NERFTree 配置************
nnoremap <leader>v :NERDTreeFind<cr>
nnoremap <leader>g :NERDTreeToggle<cr>
let NERDTreeShowHidden=1
let NERDTreeIgnore = [ 
        \ '\.git$', '\.hg$', '\.svn$', '\.stversion$s', '\.pyc$', '\.pyo$', '\.swp$', 
        \ '\.DS_Store$', '\.sass-cache$', '__pycache__$', '\.egg-info$', '\.ropeproject$',
        \]

" ************ctrlp 配置************
let g:ctrlp_map = '<c-p>'
"工做目錄隨文件變。在ctrlp中打開一個文件後,以當前文件我在位置爲工做目錄,在這下邊模糊搜索文件
autocmd BufEnter * cd %:p:h

" ************vim-easymotion 配置************
nmap ss <Plug>(easymotion-s2)

" ************tagbar 配置************
nnoremap <leader>t :TagbarToggle<CR>

" ************ctags 配置************
" 第一個命令裏的分號是必不可少的,這個命令讓vim首先在當前目錄裏尋找tags文件,若是沒有找到tags文件,就到父目錄中查找,一直向
上遞歸。由於tags文件中記錄的路徑老是相對於tags文件所在的路徑,因此要使用第二個設置項來改變vim的當前目錄。
set tags=tags;
set autochdir

" ************cscope設置************
" 使用quickfix窗口來顯示cscope的結果。這樣,經過快捷鍵查找某個符號後,會當即跳轉到第一個找到的該符號出現的位置。若是你對這>次默認跳轉的位置不滿意,在Vim命令行下運行cw命令,就能在編輯區下面quickfix窗口看到全部查找結果的列表,點擊相應列表項就能跳轉
到相應位置。
set cscopequickfix=s-,c-,d-,i-,t-,e-
" 使用Ctrl-j / Ctrl-k 跳轉到後一項和前一項紀錄
nmap <C-j> :cnext<CR>
nmap <C-k> :cprev<CR>
" 指定了執行cscpoe的命令
set csprg=/usr/bin/cscope
" 設置’cst’,你將始終同時查找cscope數據庫和tags文件
set cst 
" csto=0優先查找cscope數據庫,反之優先查找tags數據庫
set csto=0
" 增長一個cscope數據庫時顯示錶示表示執行成功或失敗的信息
set csverb
" 顯示文件路徑的最後3個部分,包含這個文件名自己
set cspc=3

" ************vim-interestingwords 配置************
nnoremap <silent> <leader>k :call InterestingWords('n')<cr>
nnoremap <silent> <leader>K :call UncolorAllWords()<cr>
nnoremap <silent> n :call WordNavigation('forward')<cr>
nnoremap <silent> N :call WordNavigation('backward')<cr>
let g:interestingWordsGUIColors = ['#8CCBEA', '#A4E57E', '#FFDB72', '#FF7272', '#FFB3FF', '#9999FF']
let g:interestingWordsTermColors = ['154', '121', '211', '137', '214', '222']
let g:interestingWordsRandomiseColors = 1

" ************deoplete.vim 配置************
set completeopt-=preview
set encoding=utf-8
set pyxversion=3
let g:python3_host_prog="/usr/bin/python3"
let g:deoplete#enable_at_startup = 1

" ************vim-clang-format 配置************
" 退出insert模式時自動格式化
let g:clang_format#auto_format_on_insert_leave=1
" 採用google代碼風格
let g:clang_format#code_style="google"
" 啓用自動格式化
autocmd FileType c ClangFormatAutoEnable

" ************ale 配置************
let g:ale_set_highlights = 0
"自定義error和warning圖標
let g:ale_sign_error = '✗'
let g:ale_sign_warning = '⚡ '
"在vim自帶的狀態欄中整合ale
let g:ale_statusline_format = ['✗ %d', '⚡  %d', '✔ OK']
"顯示Linter名稱,出錯或警告等相關信息
let g:ale_echo_msg_error_str = 'E'
let g:ale_echo_msg_warning_str = 'W'
let g:ale_echo_msg_format = '[%linter%] %s [%severity%]'
"打開文件時不進行檢查cd 
let g:ale_lint_on_enter = 0
"普通模式下,sp前往上一個錯誤或警告,sn前往下一個錯誤或警告
nmap sp <Plug>(ale_previous_wrap)
nmap sn <Plug>(ale_next_wrap)
"<Leader>s觸發/關閉語法檢查
nmap <Leader>s :ALEToggle<CR>
"<Leader>d查看錯誤或警告的詳細信息
nmap <Leader>d :ALEDetail<CR>
"使用clang對c和c++進行語法檢查,對python使用pylint進行語法檢查
let g:ale_linters = {
                        \   'c++': ['clang'],
                        \   'c': ['clang'],
                        \   'python': ['pylint'],
                        \}

Chrome插件vimium

Shift+F 顯式連接

Shift+H/L 前進後退

Shift+J/K 左右移動tab

t新開一個tab,這個應該是chrome內置的。Ctrl+t在tab間移動

Shift+t在全部打開的tab中搜索

o:至關於Chrome中的地址欄,能夠匹配歷史記錄、收藏夾並在當前窗口打開,或者直接打開一個網址或者搜索一個關鍵字(Chrome在全屏的時候地址欄死都出不來,有了它就解決這個一直困擾個人問題了!~),若是按的是O,則能夠在新窗口中打開,很是很是方便!tab向下移動,Shift+tab向上移動

j:向下細微滾動窗口 k:向上細微滾動窗口

d:向下滾動半個屏幕 u:向上移動半個屏幕

g+i:將光標 定位到輸入框,若是有多個能夠按Tab鍵切換

g+s:查看網頁的源代碼

x:關閉當前頁面 X:恢復剛剛關閉的頁面

g+g(連續按兩下g):回到頂部

G:到達頁面底部

cscope

Linux下如何瀏覽代碼,StackOverflow上一個很好的回答

Cscope介紹

Cscope是相似於ctags同樣的工具,但能夠認爲她是ctags的加強版。

ctags侷限性

  • tags文件只能查看函數,類或變量的定義,而沒有被調用信息。
  • 若是要知道一個函數在什麼地方被使用,須要使用cscope工具。
  • 添加的tags最好是source code的索引,對於include頭文件索引沒有效果

首次使用Cscope時,他會根據源文件生成符號數據庫。而後在之後的使用中,cscope只是在源文件有改動或源文件列表不一樣時纔會重建數據庫。當在重建數據庫時,未改動過的文件對應的數據庫信息會從舊的數據庫中拷貝過來,因此會使重建數據庫快於一開始的新建數據庫。

當你在命令行下調用cscope時,你會得到一個全屏選擇窗口,可以使你查詢特定的內容。然而,一旦你查詢的有匹配,那麼就會用你默認的編輯器來編輯該源文件,可是你不可以簡單的使用Ctrl+]或者:tag命令來從一個標籤跳轉到另外一個標籤。(由於這是ctags的用法)

Cscope相關參數

  • -R: 在生成索引文件時,搜索子目錄樹中的代碼
  • -b: 只生成索引文件,不進入cscope的界面
  • -q: 生成cscope.in.out和cscope.po.out文件,加快cscope的索引速度
  • -k: 在生成索引文件時,不搜索/usr/include目錄
  • -i: 若是保存文件列表的文件名不是cscope.files時,須要加此選項告訴cscope到哪兒去找源文件列表。可使用」-「,表示由標準輸入得到文件列表。
  • -Idir: 在-I選項指出的目錄中查找頭文件
  • -u: 掃描全部文件,從新生成交叉索引文件
  • -C: 在搜索時忽略大小寫
  • -Ppath: 在以相對路徑表示的文件前加上的path,這樣,你不用切換到你數據庫文件所在的目錄也可使用它了。

Cscope相關命令

全部的cscope命令都是經過向主cscope命令」:cscope」傳遞參數選項。她最短的縮寫是」:cs」」:scscope」命令也作一樣的事情而且同時會橫向分隔窗口(簡稱:」scs」)。

add

增長一個新的cscope數據庫/連接庫

使用方法:

:cs add {file|dir} [pre-path] [flags]

其中

  • [pre-path] 就是以-p選項傳遞給cscope的文件路徑,是以相對路徑表示的文件前加上的path,這樣你不要切換到你數據庫文件所在的目錄也可使用它了。

  • [flags] 你想傳遞給cscope的額外旗標

實例:

:cscope add /root/code/vimtest/ftpd

:cscope add /project/vim/cscope.out /usr/local/vim

:cscope add cscope.out /usr/local/vim –C

find

查詢cscope

使用方法:

:cs find {querytype} {name}

其中:

{querytype} 即相對應於實際的cscope行接口數字,同時也相對應於nvi命令:

  • 0或者s —— 查找這個C符號
  • 1或者g —— 查找這個定義
  • 2或者d —— 查找被這個函數調用的函數(們)
  • 3或者c —— 查找調用這個函數的函數(們)
  • 4或者t —— 查找這個字符串
  • 6或者e —— 查找這個egrep匹配模式
  • 7或者f —— 查找這個文件
  • 8或者i —— 查找#include這個文件的文件(們)

實例:

#號後爲註釋

:cscope find c ftpd_send_resp # 查找全部調用這個函數的函數(們)

:cscope find 3 ftpd_send_resp # 和上面結果同樣

help

顯示一個簡短的摘要。

使用方法:

:cs help

kill

殺掉一個cscope連接(或者殺掉全部的cscope連接)

使用方法:

:cs kill {num|partial_name}

爲了殺掉一個cscope連接,那麼連接數字或者一個部分名稱必須被指定。部分名稱能夠簡單的是cscope數據庫文件路徑的一部分。要特別當心使用部分路徑殺死一個cscope連接。

reset

從新初始化全部的cscope連接。

使用方法:

:cs reset

show

顯示cscope的連接

使用方法:

:cs show

vim編輯項目中的任意一個源文件, :cs show 可能會顯示 「no cscope connection"這是由於vim沒有幫你自動加載數據庫文件, 用:cs add cscope.out就能夠了。這個時候命令:cs find s tagname就能夠用了, 但用ctrl + ]的時候不會自動跳轉, 這仍是由於vim沒有把你的cscope數據庫文件當成tag文件, 須要用: set cst 或者:set cscopetag, 這樣就會把cscope的數據庫當成tag文件了

使用

進入vim後,添加cscope數據庫

:cs add /kernelsty/linux-2.6.24/

舉例

:cs add /kernelsty/linux-2.6.24/cscope.out /kernelsty/linux-2.6.24/

cscope查找的結果有多個時,只顯示第一個(在vimrc中設置)。使用cw啓用quickfix。quickfix中條目移動使用Ctrl+j/k上下移動

生成cscope.out和tags的腳本

#!/bin/sh  
find . -name "*.h" -o -name "*.c" -o -name "*.cpp" -o -name "*.java"  >cscope.files       
cscope -bkq -i cscope.files
ctags -R

xhsell配置

xshell用戶名高亮顯示配置

取消.bashrc文件中force_color_prompt=yes的註釋便可:(這和xshell配置無關)

Tmux

什麼是tmux

Tmux 是一個終端複用工具,用於在一個終端窗口中運行多個終端會話,好比咱們能夠實現很是炫酷的效果。

img

若是想要系統學習tmux,能夠參考

img

Ubuntu安裝apt-get install tmux

Tmux 概念

tmux 默認的快捷鍵前綴是 ctrl+b ,固然你也能夠修改它,不過這裏爲了簡化,我都使用默認按鍵。

tmux 中有幾個重要概念:

  • 會話(session): 創建一個 tmux 工做區會話,會話能夠長期駐留,從新鏈接服務器不會丟失,咱們只需從新 tmux attach 到以前的工做區就能夠恢復會話

  • 窗口(window): 容納多個窗格

  • 窗格(pane): 能夠在窗口中分紅多個窗格

img

Tmux使用

查看版本

Tmux -V查看tmux版本

建立session

tnew s_name建立tmux session(注意:我在.bashrc裏面alias tnew='tmux new -s' )

tnew s_name -d建立一個tmux session,並放到後臺

tnew s_name -n w_name建立一個session,並指定session中第一個windows的名字

Ctrl+b+s在session中切換

關閉session

tmux kill-session -t s_name 在terminal時,kill掉session

若是當前session只有一個window,exitCtrl+b+&也是能夠關閉session的。

只有關閉session內部全部window的狀況下,才能夠關閉session

退出session

Ctrl+b+d 從tmux session中detach進入terminal

tmux attach -t s_name進入指定tmux session

建立window

Ctrl+b+c在session中打開一個window。新打開的window名字取執行的命令。若是沒有執行任何命令,就是bash。若是運行htop,window的名字就是top。這也就意味着若是你不在建立window時候指定名字,或者更改window名字,他的名字時隨執行命令動態變化的。

Ctrl+b+,底部status bar會提示更改window名字

Ctrl+b+w文件UI界面中選擇你要的window

Ctrl+b:進入commad line模式,new-window -n w_name建立一個命名window。舉例new-window -n processes "top"command line模式下,建立一個名爲processes的window,而且運行top命令。這種建立window的同時指定命令的作法更像是一種臨時window,一旦你退出命令,window也被銷燬了。

關閉window

exit不提示直接關閉window

Ctrl+b+&帶提示關閉window

建立pane

Ctrl+b+%垂直分割

Ctrl+b+"水平分割

Ctrl+b+o遍歷pane

Ctrl+b+←↑↓→移動pane。後面經過修改.tmux.conf能夠映射爲hjkl

Ctrl+b+space切換不一樣pane佈局

關閉pane

exit不提示直接關閉pane

Ctrl+b+x帶提示關閉pane。若是window只有一個pane,也會關閉window

.tmux.conf文件

tmux會查找兩處配置文件:

系統級/etc/tmux.conf

用戶級~/.tmux.conf

使用現成的.tmux.conf文件,github

Screenshot

該版本有以下特色

Ctrl+b+hjkl代替Ctrl+b+←↓↑→

Ctrl+b+HJKL調整pane尺寸

Ctrl+b Ctrl+h/l在一個session中切換上一個/下一個window. 我更喜歡使用Ctrl+b+w

when-changed

功能

github

監視文件改動

依賴

Python 2.6+
watchdog

使用

when-changed [OPTION] FILE COMMAND...
when-changed [OPTION] FILE [FILE ...] -c COMMAND

FILE can be a directory. Use %f to pass the filename to the command.

Options:
      -r Watch recursively
      -v Verbose output. Multiple -v options increase the verbosity.
         The maximum is 3: -vvv.
      -1 Don't re-run command if files changed while command was running
      -s Run command immediately at start
      -q Run command quietly

Linux內核代碼開發

實驗環境

Ubuntu 18.04

配置ssh登錄

sudo apt install openssh-server

修改/etc/ssh/sshd_config

安裝軟件

vim tree psmisc pstree htop net-tools curl git make python-pip python3-pip python3 clang-format silversearcher-ag highlight

pip2 install --user pynvim
pip3 install --user pynvim

pip2 install --user neovim
pip3 install --user neovim

修改root密碼

sudo passwd

修改sources.list

# https://opsx.alibaba.com/mirror deb https://mirrors.aliyun.com/ubuntu/ bionic main restricted universe multiverse deb https://mirrors.aliyun.com/ubuntu/ bionic-security main restricted universe multiverse deb https://mirrors.aliyun.com/ubuntu/ bionic-updates main restricted universe multiverse deb https://mirrors.aliyun.com/ubuntu/ bionic-proposed main restricted universe multiverse deb https://mirrors.aliyun.com/ubuntu/ bionic-backports main restricted universe multiverse

更新系統

apt update只檢查,不更新(已安裝的軟件包是否有可用的更新,給出彙總報告)

apt upgrade更新已安裝的軟件包

安裝插件

見上邊vim插件

常見問題

Ubuntu中Could not get lock /var/lib/dpkg/lock

博客園

vim查看代碼時有些代碼被摺疊了

博客園

img

我在vimrc裏面設置代碼摺疊方式爲indent

在摺疊處使用命令

za,打開或關閉當前摺疊;zM,關閉全部摺疊;zR,打開全部摺疊

ctags: tag not found

vim下查找代碼定義時ctags: tag not found

Yes, you should tell Vim where to find your tags file with something like:

:set tags=/path/to/tags

This is not very optimal, though. This line in your ~/.vimrc should help:

set tags=./tags,tags;$HOME

It tells Vim to look for a tags file in the directory of the current file, in the current directory and up and up until your $HOME (that's the meaning of the semicolon), stopping on the first hit.

相關文章
相關標籤/搜索