MacBook 最佳實踐

jiacai2050發表於2017-01-02

本文不再更新,最新版在

MacBook 你值得擁有

MacBook 兼具命令列的高效與圖形介面的酷炫,實在是程式設計師必備利器。本文主要介紹我在兩年的使用過程中總結出的一些最佳實踐,供大家參考、借鑑。

Mac OS 簡介

Mac OS可以被分成作業系統的兩個系列:

  • 一個是老舊且已不被支援的“Classic”Mac OS(系統搭載在1984年銷售的首部Mac與其後代上,終極版本是Mac OS 9)。採用Mach作為核心,在Mac OS 7.6.1以前用“System vX.X”來稱呼。
  • 新的OS X結合BSD Unix、OpenStep和Mac OS 9的元素。它的最底層建基於Unix基礎,其程式碼被稱為Darwin,實行的是部分開放原始碼。

關於為什麼Mac系統沒有采用Linux核心,而是採用了BSD還有個小故事,感興趣的大家可以看Mac OS X 背後的故事(二)——Linus Torvalds的短視這篇文章。

儘管 Mac 的檔案系統目錄和 Linux 差不多,但還是有些差距,可參考下面的表格:

Mac-FileSystem

Mac 開發環境部署

包管理器 Homebrew

The missing package manager for macOS

brew相當於Ubuntu下的apt-getCentOS中的yum。非常方便實用,一條命令即可安裝:

ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
複製程式碼
  • brew install <cli-program>,安裝命令列工具
  • brew cask install <gui-program>,安裝圖形介面軟體,這得益於Homebrew-Cask擴充套件

文字編輯器 Atom

# 安裝命令
brew cask install atom
複製程式碼

Atom 新時代的文字編輯器,功能和 Sublime 差不多,但是免費開源,快捷鍵也類似,可以無縫遷移。兩個非常實用的快捷鍵:

  • Multiple Selection Control+Command+G(在 Linux/Windows 下,是Alt+F3
  • 選中多行 Shift+Command+L

神之編輯器 Emacs

# 安裝命令
brew install --with-cocoa --srgb emacs
複製程式碼

其實 Mac 是有自帶 Emacs 的,位置是/usr/bin/emacs,只是版本非常舊,通過brew安裝的位置在/usr/local/bin/emacs,可以通過下面的命令刪除 Mac 自帶的 Emacs:

sudo rm /usr/bin/emacs
sudo rm -rf /usr/share/emacs
複製程式碼

為了能在 git,終端中預設使用 Emacs,需要做以下配置:

# ~/.bashrc
export EDITOR="emacsclient -t -a=\"\""
export ALTERNATE_EDITOR=""

# ~/.gitconfig
[core]
    editor = emacsclient -t -a=\\\"\\\"
複製程式碼

上面的配置會呼叫 emacsclient 去連線 emacs daemon服務,如果服務沒啟,就先啟動服務再去連線。

API 查閱工具Dash

# 安裝命令
brew cask install dash
複製程式碼

Dash gives your Mac instant offline access to 150+ API documentation sets.

安裝 Dash 後,就可以離線查各種語言/框架的 API 文件了。?

MacBook 最佳實踐

抓包工具 Wireshark

# 安裝命令
brew cask install wireshark
複製程式碼

也許是最強大的抓包工具,從其名字上就能體現出:wire(線路)+ shark(鯊魚)。但這個軟體初次使用時有些難度,最重要的是區分兩個概念:

  • capture filter,在抓包開始時指定。
    capture filter
    常見表示式
# Capture only traffic to or from IP address 172.18.5.4:
host 172.18.5.4

# Capture traffic to or from a range of IP addresses:
net 192.168.0.0/24

# Capture non-HTTP and non-SMTP traffic on your server (both are equivalent):
host www.example.com and not (port 80 or port 25)
host www.example.com and not port 80 and not port 25

# Capture traffic within a range of ports  with newer versions of libpcap (0.9.1 and later):
tcp portrange 1501-1549

#Capture only IPv4 traffic - the shortest filter, but sometimes very useful to get rid of lower layer protocols like ARP and STP:
ip

# Capture only unicast traffic - useful to get rid of noise on the network if you only want to see traffic to and from your machine, not, for example, broadcast and multicast announcements:
not broadcast and not multicast
複製程式碼
  • display filter,在抓取一定包後進行過濾。
    display filter
    常見表示式
ip.dst_host == 192.168.30.103 and tcp.dstport == 80

ip.addr == 10.43.54.65
# is equivalent to
ip.src == 10.43.54.65 or ip.dst == 10.43.54.65
複製程式碼

終端 iTerm 2

# 安裝命令
brew cask install iterm2
複製程式碼

Mac自帶的終端不是很強,程式設計師們需要一個強勁的終端來工作,於是有了 iTerm2,這個終端可以很方便的用快捷鍵來達到分屏(CMD+D)、開多個Tab(CMD+T)、在多個Tab之間進行切換(CMD+數字),其中有一點不好的是不能按字移動,如果我們在終端上鍵入"OPTION+向左鍵",會輸入一個特殊字元,我們需要自定義兩個Action為Send Escape Sequence的快捷鍵,效果如下圖:

iTerm2
我這裡把向前按字移動設為了"OPTION+CMD+向左鍵",向後按字移動設為了"OPTION+CMD+向右鍵"。

當然,說到了 iTerm2,不得不提到終端複用軟體 tmux,tmux 預設配置檔案在 Mac 上很彆扭,你可以參考我這裡的配置檔案,這樣 tmux 就可以像 vim 一樣實現各種分屏的效果了。如果你還不知道 tmux 為何物,強烈推薦你看這個13分鐘的視訊,絕對物超所值,感謝 happypeter 的分享。

終端中輸入命令時,移動游標有兩種方式,一個是 emacs,一個 vi,可以通過 set 命令來設定,預設的是 emacs 模式,也可以通過set -o emacs來顯式設定,有如下快捷鍵:

  • ctrl + a Move cursor to beginning of line
  • ctrl + e Move cursor to end of line
  • meta + b Move cursor back one word
  • meta + f Move cursor forward one word
  • ctrl + w Cut the last word
  • ctrl + u Cut everything before the cursor
  • ctrl + k Cut everything after the cursor
  • ctrl + y Paste the last thing to be cut
  • ctrl + _ Undo

如果想使用 vi 模式,可以使用如下命令set -o vi開啟。 開啟vi 模式後,預設是 insert 模式,按下esc鍵進入命令模式。

  • h Move cursor left
  • l Move cursor right
  • A Move cursor to end of line and put in insert mode
  • 0 (zero) Move cursor to beginning of line (doesn't put in insert mode)
  • i Put into insert mode at current position
  • a Put into insert mode after current position
  • dd Delete line (saved for pasting)
  • D Delete text after current cursor position (saved for pasting)
  • p Paste text that was deleted
  • j Move up through history commands
  • k Move down through history commands
  • u Undo

參考:

其他一些有用的快捷鍵:

~/.bashrc

Linux 一般通過~/.bashrc進行環境變數的配置,但是在 Mac 下配置後,發現根本沒有效果,這是為什麼呢? 其實這是個比較基礎的問題,shell有兩種:登入式shell與非登入式shell,直觀理解,登入(login)式shell就是在你開啟shell要求你輸入使用者名稱與密碼的shell,我們在使用桌面Linux時一般只在登入時接觸到這種shell,等我們進入系統後,再開啟的Terminal就是非登入式shell了。這兩種 shell 讀取配置的檔案是不同的:

  • 登入式Shell啟動時會去讀取~/.profile檔案(Redhat、Mac上為 ~/.bash_profile
  • 非登入式Shell會去讀取~/.bashrc檔案

這也就解釋了為什麼在 Linux 系統上只需要修改 ~/.bashrc 後即可生效的原因。但在 Mac 上有些不同,開機後再通過 Terminal.app(或iTerm.app) 開啟終端時,這時的 shell 是登入式shell,因為Terminal.app(或iTerm.app)這個應用程式是通過/usr/bin/login這個命令開啟終端的,所以不會去source ~/.bashrc了。 解決方法也很簡單,在~/.bash_profile加上下面一句程式碼就ok了

[ -r ~/.bashrc ] && source ~/.bashrc
複製程式碼

Mac下ls命令預設是沒有顏色的,不是很直觀,可以自己設定一個alias,參考連結

export LSCOLORS=gxBxhxDxfxhxhxhxhxcxcx
alias ls='ls -FG'
alias ll='ls -l'
複製程式碼

為了在命令列提示符中顯示時間,可以設定PS1變數

export PS1="\n\e[1;37m[\e[m\e[1;35m\u\e[m\e[1;36m@\e[m\e[1;37m\h\e[m \e[1;33m\t\e[m \w\e[m\e[1;37m]\e[m\e[1;36m\e[m\n\$ "

# 效果如下
[liujiacai@macbook 22:02:13 ~]
複製程式碼

系統快捷鍵

  • 檢視桌面F11
  • HOME Command + <-
  • END Command + ->
  • 鎖屏 Shift + Control + 電源鍵 (Windows 下為Win+L
  • 強制關閉程式 Command + Option + esc(Windows 下為Ctrl+Alt+Delete

Finder

Finder是Mac上的檔案瀏覽器,其中有個比較嚴重的問題時,沒有“剪貼(cut)”功能,當我們選中一個檔案後,選單中的“Edit”->“Cut”是灰色的,也就是無法使用,這是因為Finder中的“Cut”只適用於文字,對於檔案就無能為力了。 我們當然可以通過開啟兩個Finder視窗,然後“拖”過去。但是這樣未免太麻煩了,其實我們可以這麼做:

  1. 首先Cmd + C複製檔案
  2. 然後找到你想要放到資料夾
  3. 最後Cmd + Option + V就能實現“剪貼”的效果了。

參考:Why is it not possible to use the “cut” command to manipulate a file in the Finder?

JDK

# 安裝命令
brew cask install java
複製程式碼

通過brew cask安裝後,可以通過執行/usr/libexec/java_home這個命令來獲取JAVA_HOME

export JAVA_HOME="$(/usr/libexec/java_home)"
複製程式碼

實用命令

# 修改hostname
sudo scutil --set HostName <name>
# 檢視USB裝置
system_profiler SPUSBDataType
複製程式碼

下面的命令需要通過brew進行安裝後在使用

# 檢視網路請求
brew install httpstat
$ httpstat baidu.com
Connected to 180.149.132.47:80 from 172.17.10.80:54727

HTTP/1.1 200 OK
Date: Sat, 14 Jan 2017 13:49:16 GMT
Server: Apache
Last-Modified: Tue, 12 Jan 2010 13:48:00 GMT
ETag: "51-47cf7e6ee8400"
Accept-Ranges: bytes
Content-Length: 81
Cache-Control: max-age=86400
Expires: Sun, 15 Jan 2017 13:49:16 GMT
Connection: Keep-Alive
Content-Type: text/html

Body stored in: /var/folders/2g/fxz_98ks0lgc79sjp5vn5cxc0000gn/T/tmpsawHq4

  DNS Lookup   TCP Connection   Server Processing   Content Transfer
[    69ms    |      37ms      |       33ms        |        0ms       ]
             |                |                   |                  |
    namelookup:69ms           |                   |                  |
                        connect:106ms             |                  |
                                      starttransfer:139ms            |
                                                                 total:139ms

# Swiss Army Knife for macOS !
brew install m-cli
$ m trash status
Size:  51G
Number of files: 252172

複製程式碼

常用軟體

日常使用的軟體首選通過App Store進行安裝,預設安裝在/Applications下,個人從網際網路上單獨下載的軟體放在這裡面即可出現在Launchpad中找到。 對於通過App Store安裝的軟體,在Launchpad介面,按住Option鍵可進行刪除。但是需要注意一點的時,應用程式一般都會有些歷史檔案,存放的位置有如下三處

  • ~/Library/Application Support/<Application name>
  • ~/Library/Cache/<Application name>
  • ~/Library/Preferences/<Application name>.plist

使用find + grep的方式就能輕鬆找出來了。網上也有諸如AppCleanerAppZapper的小軟體,大家可以根據需要自取之。

下面介紹下我日常使用的一些免費軟體,供大家參考。

PS: Mac 下有很多非常實用的收費軟體,我個人用的並不多,這裡就不在列舉了。 大家可以參考知乎上的 macOS (OS X) 平臺上有哪些值得推薦的常用軟體?

瀏覽器

Mac 上自帶的 Safari 比較輕量,雖然比較省電,但擴充套件性遠不如 Chrome、Firefox,所以這兩個是必須的。

brew cask install firefox
brew cask install google-chrome
複製程式碼

圖片截圖、合併

Mac上的截圖工具已經很好了,Cmd + Shift + 3/4就夠用了,但是如果想在圖片上寫些文字,馬賽克某部分,就不行了,推薦用 Snip,才 2M 大小,雖說是騰訊開發的,但是不流氓。可以設定快捷鍵,我設定的是Cmd + Shift + 6。 更重要的一點是,Snip 可以解決Retina下截圖2x問題(就是截出來的圖超大),就光這個特點就足以讓你使用snip。

我的snip配置
Mac自帶的 Preview 可以對圖片進行旋轉、調整大小、新增文字,不需要在額外安裝軟體。
Preview工具欄

此外,如果要對兩張圖片進行合併,需要通過安裝 ImageMagick,並且通過以下命令操作:出處

brew install ImageMagick

# 下面兩條命令都會把 left.png right.png 合併到 merged.png 裡面
convert +append left.png right.png merged.png

montage -geometry 100% left.jpg right.jpg merged.jpg
複製程式碼

如果你依賴於Evernote,可以試試圈點,洋名skitch,同樣很好很強大。

錄屏 gif

# 安裝命令
brew cask install licecap
複製程式碼

很多時候我們需要把自己的操作展示給別人看,比較好的做法是通過錄屏軟體將自己的操作儲存成 gif 格式的圖片。 開源免費licecap 很好的解決了這個問題。

使用 licecap 製作的例子

流程圖製作工具

對於程式設計師來說,流程圖應該是再親切不過的了,一張圖勝過千言萬語。之前我都是用 Keynote 來畫,但是實在是不好用,後來在知乎上發現了線上版的ProcessOn,大大減少了我畫流程圖的時間,上手也比較快。

視訊播放器

# 安裝命令
brew cask install vlc
複製程式碼

Mac下的自帶的播放器QuickTime,功能實在是太弱了,支援的格式既少又難用,快進什麼的貌似都沒快捷鍵,只能手動點選進度條,試用了一段時間的Mplayer,發現效果也不好,會有視訊卡頓的現象,最終選擇了 VLC,一直用的還不錯。

此外, 有網友補充道 mpv 才是程式設計師最佳播放器,大家也可以嘗試下。

音樂頻播放器

# 安裝命令
brew cask install vox
複製程式碼

官方的 iTunes 實在是不適應,喜歡簡潔清爽的朋友可以試試 VOX

*.webarchive

在windows下儲存網頁時,如果想把網頁上的資源,比如css、js、image等一起下載下來,會單獨生成個資料夾,但是用 Mac 上的 Safari 儲存整個網頁時,是以webarchive為字尾名的檔案進行儲存的,如何把開啟這種檔案呢?推薦:

http://sourceforge.net/projects/webarchivext/

虛擬機器 Virtualbox

# 安裝命令
brew cask install virtualbox
複製程式碼

在天朝,很多網站是隻支援 IE 的,Mac 下的 Firefox, Chrome, Safari 這時候都顯得心有力而不足了,而且很多軟體也只有 Windows 版,所以裝個虛擬機器是非常有必要的。 Virtualbox 是我自用 Ubuntu 以來一直用的虛擬機器,開源免費。

Virtualbox

常見問題

不能寫 NTFS

用慣了 Windows 的大家都習慣用 NTFS 檔案系統格式,但是很遺憾,這個檔案系統是微軟自己搞得,不是開放的,所以 Mac 是不支援的,如果你以前的 NTFS 格式的硬碟放到 Mac 上,會發現只能進行讀操作,不能寫入,這屬於正常現象,不要驚慌。

解決的方法也很簡單,把行動硬碟格式化成FAT32(單個檔案大小不能超過4G)或FAText 格式都可以,Mac 自帶的磁碟工具就可以進行格式轉化,當然你需要先把行動硬碟上的資料拷貝出來。

Wi-Fi 時常中斷

Mac 生於喬幫主之手時,為了凸顯尊貴,介面與一般的電腦有很大不同。常見的網線沒辦法直接連線 Mac 電腦,需要單獨購買一個乙太網轉接器,所以大部分同學都是使用無線連線,但 Mac 這裡應該是有個 bug,而且是很久的 bug,我用 Mac 兩年了,偶爾會遇到幾次,網上解決的方法有如下幾種:

  1. 修改網路位置,不是其預設的“自動”就好
  2. 修改路由器,把無線通道改為6或9
  3. 關閉藍芽,Mac 中,同時開啟藍芽與 Wi-Fi 會衝突。詳情

如果你的 Mac 也遇到了 Wi-Fi 問題,可以試試上面三個解決方法。

總結

Once you get Mac, you never come back!

參考

KeepWritingCodes 微信公眾號

PS: 微信公眾號,頭條,掘金等平臺均有我文章的分享,但我的文章會隨著我理解的加深不定期更新,建議大家最好去我的部落格 liujiacai.net 閱讀最新版。