首頁 > 軟體

打造自己的 Python 編碼環境

2020-06-16 17:46:12

前言

重新設定了一下自己的Mac的程式設計環境,畢竟新年新氣象嘛,主要是iTerm2、Zsh、Vim優化、Consolas字型、NoisyTyper,這些的相關設定。工欲利其事必先利其器,好的編碼環境可以提升我們的打碼的幸福感。好的編碼環境包括美觀(視覺),聲音(聽覺),流暢度(觸覺),工作環境(嗅覺,味覺)等多個方面。後面有幾張設定後的圖片感受一下,主要看字型和配色(有些人可能覺得比較醜,個人喜歡黑紫,配色和字型有很多選擇,各有所好,求別噴 XD)

 

此處輸入圖片的描述

此處輸入圖片的描述

 

準備階段:器

iTerm2:是os系統中的一個替代終端。主要優點:螢幕分割(可以水平分割和垂直分割),選中即複製,快速查詢(command+f),配色字型自定義化,自定義快捷鍵等。

Consolas:微軟下最好看的字型之一,個人認為很適合程式設計師,除開字型好看外,主要原因是它的數位“0”字加入了一斜撇,以方便與字母“o”分辨。這也是我和它結緣的主要緣由,當年在某次acm比賽中,就是因為肉眼無法分辨是0還是o,遺憾至今。

Zsh:zsh和bash一樣是Shell的一種。相比bash:更高效、更好的自動補全、更好的檔名展開(萬用字元展開)、更好的陣列處理、可客製化性高。mac下自帶了zsh,無需再安裝。

Vim:是一個類似於Vi的著名的功能強大、高度可客製化的文字編輯器,在Vi的基礎上改進和增加了很多特性。和Emacs並列成為類Unix系統使用者最喜歡的編輯器。估計大家都很熟悉,不做累述。

NoisyTyper:一款提升你打字逼格的軟體,可以讓你打字的時候發出打字機的聲音,喀喀喀這樣。

上面幾個安裝都比較簡單,教學也比較多。這裡主要講一下mac下consolas字型的安裝。

  1. $ brew install cabextract
  2. $ cd~/Downloads
  3. $ mkdir consolas
  4. $ cd consolas
  5. $ curl -O http://download.microsoft.com/download/f/5/a/f5a3df76-d856-4a61-a6bd-722f52a5be26/PowerPointViewer.exe
  6. $ cabextract PowerPointViewer.exe
  7. $ cabextract ppviewer.cab
  8. $ open CONSOLA*.TTF

最後按下彈出視窗的安裝鍵就ok了。

 

打磨階段:利器

上面的工具準備好了後,就可以開始設定這些工具了。

 

Zsh設定

oh-my-zsh:一套強大的開源zsh組態檔。安裝如下:

  1. // 使用curl安裝
  2. $ sh -c "$(curl -fsSL https://raw.github.com/robbyrussell/oh-my-zsh/master/tools/install.sh)"
  3. // 或者使用wget安裝
  4. $ sh -c "$(wget https://raw.github.com/robbyrussell/oh-my-zsh/master/tools/install.sh -O -)"
  5. // 安裝後重新載入設定
  6. $ source .zshrc

oh-my-zsh主題: oh-my-zsh有多款配套主題,點選前面的主題連結可以看到所有主題。這裡主要介紹下agnoster主題。修改zsh組態檔(~/.zshrc)中的主題屬性為agnoster即可。官方圖如下:

此處輸入圖片的描述

安裝這個主題需要額外安裝powerline字型,不然會顯示亂碼。如果你想隱藏自己的使用者名稱資訊,需要在zsh組態檔中設定預設使用者。具體安裝設定如下:

  1. // 修改zsh組態檔
  2. $ vim~/.zshrc
  3. ZSH_THEME="agnoster"//在.zshrc中修改ZSH_THEME
  4. DEFAULT_USER=username // 在.zshrc中新增或者修改預設使用者為自己,開啟終端後就不會顯示自己的使用者名稱資訊
  5. $ source ~/.zshrc //重新載入組態檔
  6. // poweline font 安裝
  7. $ gitclone https://github.com/powerline/fonts.git
  8. $ cd powerline
  9. $ ./install.sh

 

iTerm2設定

字型:接著要在iterm2的Perferences中Text中選擇常規字型 為consolas字型或者其他你喜歡的字型,非ASCII碼字型為powerline字型(一定要是名字中帶powerline的字型,不然還是亂碼)。如下:

此處輸入圖片的描述

iTerm2配色:從這裡可以獲取很多別人的配色主題,把整個專案git clone下來,然後在iterm2的Perferences中的Colors最下面的Load Presets中import git下來的terminal檔案,自己可以根據自己喜歡調整自己喜歡的顏色,我選的是Fish Tank,我自己微調了一些配色。如下:

此處輸入圖片的描述

 

Vim設定

之前一直用spf13,但是開啟大檔案太卡了,所以自己重新設定了一份。實測開啟8000+行程式碼的檔案,因為語法檢測,所以大概延時1s左右,之後操作很順暢。在設定過程中會遇到很多蛋疼的地方。需要比較系統的學習一下vim指令碼的語法和相關設定方法,vim網上很多設定好文,如《像 IDE 一樣使用 vim》,還有《vim 指令碼學習文件》,我就不累述了,組態檔的註釋寫的比較詳細。我的設定主要針對Python開發,另外需要額外安裝python包flake8。

更多Vim相關教學見以下內容

Vim學習指南 http://www.linuxidc.com/Linux/2013-08/89096.htm

快速學會 Vi編輯器 http://www.linuxidc.com/Linux/2013-08/88586.htm

強大的Vim 編輯器 http://www.linuxidc.com/Linux/2013-07/87544.htm

CentOS 6.2上搭建Vim開發環境 http://www.linuxidc.com/Linux/2013-07/87363.htm

CentOS 5.4 安裝高亮Vim編輯工具 http://www.linuxidc.com/Linux/2013-06/86508.htm

Vim技巧分享:C語言設定 http://www.linuxidc.com/Linux/2012-12/77124.htm

Ubuntu中設定Vim的行號 http://www.linuxidc.com/Linux/2012-12/75485.htm

Vim編輯器使用基礎教學 http://www.linuxidc.com/Linux/2013-05/84031.htm

具體如下:

vimrc檔案,主要是vim基礎設定。(highlight.js不支援vim script,有點蛋疼)

  1. " .vimrc
  2. "相關vim指令碼文件 http://vimdoc.sourceforge.net
  3. " 相關好文 https://github.com/yangyangwithgnu/use_vim_as_ide
  4. "基本設定
  5. set nocompatible "不要vim模仿vi模式,建議設定,否則會有很多不相容的問題
  6. set mouse=a "啟動滑鼠所有模式,但是右鍵功能不可用,可以保證滑鼠滾屏在當前螢幕內
  7. set mousehide " 輸入檔案時隱藏滑鼠
  8. set backspace=indent,eol,start "退格鍵分別可刪除縮排,上一行結束,insert之前的字
  9. set showmatch " 設定匹配模式
  10. set nobackup "不備份
  11. set nowritebackup " 不寫入備份檔案
  12. set noswapfile "關閉交換檔案
  13. set history=500" history儲存長
  14. set ruler "顯示標尺
  15. set showcmd " 顯示輸入命令
  16. set incsearch "搜尋時自動匹配
  17. set hlsearch " 高亮搜尋項
  18. set ignorecase "無視大小寫
  19. set smartcase " 如果有大寫就區別大小寫匹配
  20. set laststatus=2 "總是顯示狀態列
  21. " set autowrite "切換檔案自動儲存
  22. set shortmess=atI" "關閉歡迎頁面
  23. set viewoptions=folds,options,cursor,unix,slash " Better Unix / Windows compatibility
  24. set virtualedit=onemore "游標可以移到當行最後一個字元之後
  25. set hidden " 切換檔案不儲存,隱藏
  26. "set confirm " 退出前驗證
  27. "set spell " 拼寫檢查
  28. set linespace=0 "行之間沒有多餘的空格
  29. set wildmenu " 自動補全時的檔案選單
  30. set wildmode=list:longest,full "自動補全時,匹配最長子串,列出檔案
  31. set whichwrap=b,s,h,l,<,>,[,]" 行尾可右移到下行,行首左移到上行,b:退格,s:空格,hl:左右,<>:n/v模式下的左右,[]:i/r模式下的左右
  32. set scrolljump=5 "游標離開螢幕範圍
  33. set scrolloff=3" 游標移動至少保留行數
  34. "格式
  35. set nowrap " 取消自動折行
  36. set autoindent "自動縮排
  37. set shiftwidth=4" 縮排位寬=4個空格位
  38. set expandtab " tab由空格表示
  39. set tabstop=4" tab=4空格
  40. set softtabstop=4 "回退可以刪除縮排
  41. set nojoinspaces " 用J合併兩行用一個空格隔開
  42. set splitright "vsplit新建視窗,讓新的放右邊
  43. set splitbelow " 用split新建視窗,讓新的放下面
  44. set pastetoggle=<F12> "指定F12進入黏貼模式,可以正常複製縮排
  45. set iskeyword-=." 讓'.' 作為單詞分割符
  46. set iskeyword-=# "'#'作為單詞分割符
  47. set iskeyword-=-" 讓'-' 作為單詞分割符
  48. set listchars=tab:› ,trail:•,extends:#,nbsp:. "空格等無效字元顯示
  49. set textwidth=80" 內容寬度
  50. set fileencodings=utf-8,gb18030,gbk,big5 "檔案編碼
  51. " 檔案儲存時處理首尾空格,^M字元
  52. let g:keep_trailing_whitespace = 1
  53. function! StripTrailingWhitespace()
  54. let _s=@/
  55. let l = line(".")
  56. let c = col(".")
  57. %s/s+$//e
  58. let @/=_s
  59. call cursor(l, c)
  60. endfunction
  61. autocmd FileType c,cpp,java,go,php,javascript,python,twig,xml,yml autocmd BufWritePre <buffer> if exists('g:keep_trailing_whitespace') | call StripTrailingWhitespace() | endif
  62. "開啟新的buffer時,自動轉到對應檔案目錄
  63. let g:autochdir =1
  64. if exists('g:autochdir')
  65. autocmd BufEnter*if bufname("")!~"^[A-Za-z0-9]*://"| lcd %:p:h | endif
  66. endif
  67. " 恢復游標最後編輯位置
  68. au BufWinLeave *.py,*.c,*.cpp,*.css,*.html,*.js,*php mkview
  69. au BufWinEnter *.py,*.c,*.cpp,*.css,*.html,*.js,*php silent loadview
  70. "設定u的返回步數限制
  71. if has('persistent_undo')
  72. set undofile " 開啟u回滾檔案記錄
  73. set undolevels=1000 "最大數量的改變回滾
  74. set undoreload=10000" 最大數量過載可回滾行數
  75. endif
  76. "特殊檔案開啟
  77. autocmd BufNewFile,BufRead*.py,*.pyw set filetype=python
  78. autocmd BufNewFile,BufRead*.html.twig set filetype=html.twig
  79. autocmd FileType haskell setlocal expandtab shiftwidth=2 softtabstop=2
  80. autocmd BufNewFile,BufRead*.coffee set filetype=coffee
  81. autocmd FileType haskell setlocal commentstring=-- %s
  82. autocmd FileType haskell setlocal nospell
  83. " key 對映
  84. let mapleader = ',' "全域性leader設定
  85. let maplocalleader ='_'" 本地leader設定
  86. "設定tagwindow間快速跳轉
  87. let g:easyWindows =1
  88. if exists('g:easyWindows')
  89. " 向上
  90. map <C-J> <C-W>j<C-W>_
  91. "向下
  92. map <C-K><C-W>k<C-W>_
  93. " 向右
  94. map <C-L> <C-W>l<C-W>_
  95. "向左
  96. map <C-H><C-W>h<C-W>_
  97. endif
  98. " 處理折疊行的左右移動
  99. noremap j gj
  100. noremap k gk
  101. "sudo卻想儲存
  102. cmap w!!w!sudotee%>/dev/null
  103. " ,fc查詢衝突的地方
  104. map <leader>fc /v^[<|=>]{7}( .*|$)<CR>
  105. ",ff 查詢游標後的單詞位置,列出選擇項
  106. nmap<Leader>ff [I:let nr = input("Which one: ")<Bar>exe "normal ". nr ."[t"<CR>
  107. " 螢幕左移和右移
  108. map zl zL
  109. map zh zH
  110. "對映vsp這些開啟新的buffer,預設目錄為當前目錄
  111. cnoremap %%<C-R>=fnameescape(expand('%:h')).'/'<cr>
  112. map <leader>ew :e %%
  113. map <leader>es :sp %%
  114. map <leader>ev :vsp %%
  115. map <leader>et :tabe %%
  116. " 黏貼板
  117. if has('clipboard')
  118. if has('unnamedplus')
  119. set clipboard=unnamedplus
  120. else
  121. set clipboard=unnamed
  122. endif
  123. endif
  124. "字型的設定
  125. set guifont=Consolas,Bitstream_Vera_Sans_Mono:h9:cANSI " 設定gui字型
  126. set gfw=幼圓:h10:cGB2312
  127. "語法高亮
  128. syntax on
  129. " 匯入vim外掛管理檔案
  130. if filereadable(expand("~/.vimrc.bundles"))
  131. source ~/.vimrc.bundles
  132. endif
  133. "縮排和md檔案
  134. filetype plugin indent on " 自動根據型別啟動對應外掛,縮排開啟
  135. "設定主題,UI
  136. " solarized 主題
  137. set background=dark
  138. if filereadable(expand("~/.vim/bundle/vim-colors-solarized/colors/solarized.vim"))
  139. let g:solarized_termcolors=256
  140. let g:solarized_termtrans=1
  141. let g:solarized_contrast="normal"
  142. let g:solarized_visibility="normal"
  143. color solarized "Load a colorscheme
  144. endif
  145. set cursorline " 選中行高亮
  146. autocmd BufEnter *.py set cc=81 "開啟py檔案81行高亮
  147. " 之前的高亮線太難看,重新制定顏色,這裡的black和iterm2顏色設定中的black一樣
  148. hi CursorLine cterm=NONE ctermbg=black guibg=black
  149. hi CursorColumn cterm=NONE ctermbg=black guibg=black "
  150. highlight ColorColumn ctermbg=black guibg=black
  151. set number " 設定行號
  152. hi LineNr ctermbg=black
  153. "IndentGuides縮排列對齊線
  154. let g:indent_guides_start_level =2
  155. let g:indent_guides_guide_size =1
  156. let g:indent_guides_enable_on_vim_startup =1
  157. " airline 就是狀態列的箭頭
  158. let g:airline_theme="dark"
  159. let g:airline_powerline_fonts = 1
  160. let g:airline#extensions#tabline#enabled = 1
  161. let g:airline#extensions#tabline#buffer_nr_show = 1
  162. "NerdTree設定 control+e開啟當前檔案目錄樹
  163. map <C-e>:NERDTreeToggle<CR>
  164. map <leader>ee :NERDTreeToggle<CR>
  165. nmap<leader>nt :NERDTreeFind<CR>
  166. let NERDTreeShowBookmarks=1
  167. let NERDTreeIgnore=['.pyc','~$','.swo$','.swp$','.git','.hg','.svn','.bzr']
  168. let NERDTreeChDirMode=0
  169. let NERDTreeQuitOnOpen=1
  170. let NERDTreeMouseMode=2
  171. let NERDTreeShowHidden=1
  172. let NERDTreeKeepTreeInNewTab=1
  173. let g:nerdtree_tabs_open_on_gui_startup=0
  174. " syntastic 設定
  175. "設定每次w儲存後語法檢查
  176. function!ToggleErrors()
  177. Errors
  178. endfunction
  179. let g:syntastic_check_on_open=1
  180. let g:syntastic_always_populate_loc_list =1
  181. let g:syntastic_auto_loc_list =1
  182. let g:syntastic_check_on_wq =0
  183. let syntastic_loc_list_height =5
  184. let g:syntastic_html_tidy_ignore_errors=[" proprietary attribute "ng-"]
  185. autocmd WinEnter*if&buftype ==#'quickfix'&& winnr('$')==1| quit |endif
  186. autocmd WinLeave* lclose
  187. " 自動補全tab觸發
  188. function! InsertTabWrapper()
  189. let col = col('.') - 1
  190. if !col || getline('.')[col - 1] !~ 'k'
  191. return "<tab>"
  192. else
  193. return "<c-p>"
  194. endif
  195. endfunction
  196. inoremap <Tab> <c-r>=InsertTabWrapper()<cr>
  197. inoremap <S-Tab> <c-n>
  198. "CtrlpCtrlp-funky(,fu)
  199. if isdirectory(expand("~/.vim/bundle/ctrlp.vim/"))
  200. let g:ctrlp_working_path_mode ='ra'
  201. nnoremap <silent><D-t>:CtrlP<CR>
  202. nnoremap <silent><D-r>:CtrlPMRU<CR>
  203. let g:ctrlp_custom_ignore ={
  204. 'dir':'.git$|.hg$|.svn$',
  205. 'file':'.exe$|.so$|.dll$|.pyc$'}
  206. if executable('ag')
  207. let s:ctrlp_fallback ='ag %s --nocolor -l -g ""'
  208. elseif executable('ack-grep')
  209. let s:ctrlp_fallback ='ack-grep %s --nocolor -f'
  210. elseif executable('ack')
  211. let s:ctrlp_fallback ='ack %s --nocolor -f'
  212. " On Windows use "dir" as fallback command.
  213. else
  214. let s:ctrlp_fallback = 'find %s -type f'
  215. endif
  216. if exists("g:ctrlp_user_command")
  217. unlet g:ctrlp_user_command
  218. endif
  219. let g:ctrlp_user_command = {
  220. 'types': {
  221. 1: ['.git', 'cd %s && git ls-files . --cached --exclude-standard --others'],
  222. 2: ['.hg', 'hg --cwd %s locate -I .'],
  223. },
  224. 'fallback': s:ctrlp_fallback
  225. }
  226. if isdirectory(expand("~/.vim/bundle/ctrlp-funky/"))
  227. "CtrlP extensions
  228. let g:ctrlp_extensions =['funky']
  229. "funky
  230. nnoremap <Leader>fu :CtrlPFunky<Cr>
  231. endif
  232. endif
  233. " complete
  234. autocmd Filetype*if&omnifunc ==""| setlocal omnifunc=syntaxcomplete#Complete| endif
  235. autocmd FileType css setlocal omnifunc=csscomplete#CompleteCSS
  236. autocmd FileType html,markdown setlocal omnifunc=htmlcomplete#CompleteTags
  237. autocmd FileType javascript setlocal omnifunc=javascriptcomplete#CompleteJS
  238. autocmd FileType python setlocal omnifunc=pythoncomplete#Complete
  239. "進行版權宣告的設定
  240. "新增或更新頭
  241. map <F4>:call TitleDet()<cr>'s
  242. autocmd BufNewFile *.py :call TitleDet()
  243. function AddTitle()
  244. call append(0,"#! /usr/bin/env python")
  245. call append(1,"# -*- coding: utf-8 -*-")
  246. call append(2,"# vim:fenc=utf-8 ")
  247. call append(3,"# Copyright © XYM")
  248. call append(4,"# Last modified: ".strftime("%Y-%m-%d %H:%M:%S"))
  249. call append(5,"")
  250. endf
  251. "更新最近修改時間和檔名
  252. function UpdateTitle()
  253. normal m'
  254. execute '/# *Last modified:/s@:.*$@=strftime(":t%Y-%m-%d %H:%M")@'
  255. normal ''
  256. normal mk
  257. execute '/# *Filename:/s@:.*$@=":tt".expand("%:t")@'
  258. execute "noh"
  259. normal 'k
  260. endfunction
  261. "判斷前10行程式碼裡面,是否有Last modified這個單詞,
  262. "如果沒有的話,代表沒有新增過作者資訊,需要新新增;
  263. "如果有的話,那麼只需要更新即可
  264. function TitleDet()
  265. let n=1
  266. "預設為新增
  267. while n < 10
  268. let line = getline(n)
  269. if line =~ '^#s*S*Lastsmodified:S*.*$'
  270. call UpdateTitle()
  271. return
  272. endif
  273. let n = n + 1
  274. endwhile
  275. call AddTitle()
  276. endfunction

 

vimrc.bundles檔案,主要是vim相關外掛

  1. " .vimrc.bundles
  2. if &compatible
  3. set nocompatible
  4. end
  5. filetype off
  6. set rtp+=~/.vim/bundle/vundle
  7. call vundle#rc()
  8. Bundle "gmarik/vundle"
  9. "星級越多越推薦,5星為必選,4星強烈推薦,3星比較推薦
  10. " 檔案模糊匹配查詢 推薦:****
  11. Bundle "kien/ctrlp.vim"
  12. "函數模糊匹配查詢(,fu)推薦:****
  13. Bundle'tacahiroy/ctrlp-funky'
  14. " 檔案索引樹 推薦:*****
  15. Bundle "scrooloose/nerdtree"
  16. "自動註釋推薦:*****
  17. Bundle'scrooloose/nerdcommenter'
  18. " 語法檢查 推薦:****
  19. Bundle "scrooloose/syntastic"
  20. "括號自動匹配推薦:****
  21. Bundle'jiangmiao/auto-pairs'
  22. " 游標多行編輯 <C-n> <C-x> <C-p> 推薦:****
  23. Bundle 'terryma/vim-multiple-cursors'
  24. "配色主題推薦:****
  25. Bundle"altercation/vim-colors-solarized"
  26. " 縮排引導線 推薦:****
  27. Bundle "nathanaelkane/vim-indent-guides"
  28. "狀態列效果推薦:***
  29. Bundle"bling/vim-airline"
  30. " python 推薦:****
  31. Bundle 'yssource/python.vim'
  32. Bundle 'python_match.vim'
  33. Bundle 'pythoncomplete'
  34. " js 推薦:****
  35. Bundle'elzr/vim-json'
  36. Bundle'groenewege/vim-less'
  37. Bundle'pangloss/vim-javascript'
  38. Bundle'briancollins/vim-jst'
  39. Bundle'kchmck/vim-coffee-script'
  40. " html 推薦:****
  41. Bundle 'amirh/HTML-AutoCloseTag'
  42. Bundle 'hail2u/vim-css3-syntax'
  43. Bundle 'gorodinskiy/vim-coloresque'
  44. Bundle 'tpope/vim-haml'
  45. Bundle 'mattn/emmet-vim'
  46. if filereadable(expand("~/.vimrc.bundles.local"))
  47. source ~/.vimrc.bundles.local
  48. endif
  49. filetype on

 

總結

一個好的程式設計師必須善用各種工具提升自己的開發效率,和提升自己的幸福指數。另外,個人覺得vim還是值得自己重新一配的,我的設定過程基本都是在讀spf13的設定,讀懂,然後選取,可是中間還是出了很多問題,比如因為我沒有用pymode外掛,所以在用括syntastic的local_list在退出或者分屏時的位置,都令我很蛋疼。而且在讀spf13設定時,會發現有很多很好的功能都沒有用上,比如paste模式,查詢衝突快捷鍵,螢幕移動,還有ctrlp-funky,vim-multiple-cursors這些很爽的外掛。大家有好的設定可以推薦給我。

下面關於Python的文章您也可能喜歡,不妨看看:

Linux下Python的安裝以及注意事項  http://www.linuxidc.com/Linux/2015-11/124861.htm

Ubuntu 14.04 下安裝使用Python rq模組  http://www.linuxidc.com/Linux/2015-08/122441.htm

無需作業系統直接執行 Python 程式碼  http://www.linuxidc.com/Linux/2015-05/117357.htm

CentOS上原始碼安裝Python3.4  http://www.linuxidc.com/Linux/2015-01/111870.htm

《Python核心程式設計 第二版》.(Wesley J. Chun ).[高清PDF中文版] http://www.linuxidc.com/Linux/2013-06/85425.htm

《Python開發技術詳解》.( 周偉,宗傑).[高清PDF掃描版+隨書視訊+程式碼] http://www.linuxidc.com/Linux/2013-11/92693.htm

Python指令碼獲取Linux系統資訊 http://www.linuxidc.com/Linux/2013-08/88531.htm

在Ubuntu下用Python搭建桌面演算法交易研究環境 http://www.linuxidc.com/Linux/2013-11/92534.htm

Python 語言的發展簡史 http://www.linuxidc.com/Linux/2014-09/107206.htm


IT145.com E-mail:sddin#qq.com