程序员的 Mac 高效手册

环境相关

右键开启 Terminal

 系统偏好设置 > 键盘 > 快捷键 > 服务,勾选 “新建位于文件夹位置的终端窗口”

右键创建新文件

 安装 “New File Menu

管理员权限打开 APP

1
2
3
# 以 Intellij IDEA 为例
$ cd /Applications
$ sudo open -a 'IntelliJ IDEA.app'

在命令行中用 Finder 打开当前目录

1
$ open .

配置 PATH 环境变量

1
2
3
4
5
6
# 环境变量的加载顺序是 /etc/profile /etc/paths ~/.bash_profile ~/.bash_login ~/.profile ~/.bashrc

$ vim /etc/profile
export PATH=$PATH:<PATH>

$ source /etc/profile

查看本机信息

IP

1
$ ifconfig | grep "inet " | grep -v 127.0.0.1
1
inet 8.8.8.8 netmask 0xfffff800 broadcast 8.8.8.8

DNS

1
2
$ nslookup store.chanjet.com
$ cat /etc/resolv.conf

轻点触摸板

Soft click on mac touch board

(对 Mac™ 的截图)

Java 相关

查看 JDK 安装目录

1
$ /usr/libexec/java_home -V
1
2
3
Matching Java Virtual Machines (1):
1.8.0_231, x86_64: "Java SE 8"
/Library/Java/JavaVirtualMachines/jdk1.8.0_231.jdk/Contents/Home

多 JDK 版本

1
$ vim ~/.bashrc
1
2
3
4
5
6
7
8
9
10
11
12
13
alias /usr/libexec/java_home='echo $JAVA_HOME'
unalias /usr/libexec/java_home

export JAVA_8_HOME=$(/usr/libexec/java_home -v1.8)
export JAVA_12_HOME=$(/usr/libexec/java_home -v12)

alias java8='export JAVA_HOME=$JAVA_8_HOME'
alias java12='export JAVA_HOME=$JAVA_12_HOME'

alias /usr/libexec/java_home='echo $JAVA_HOME'

export JAVA_HOME=$JAVA_8_HOME
export PATH=$PATH:$JAVA_HOME/bin
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
$ source ~/.bashrc
# 默认 JDK8
$ java -version
java version "1.8.0_231"
Java(TM) SE Runtime Environment (build 1.8.0_231-b11)
Java HotSpot(TM) 64-Bit Server VM (build 25.231-b11, mixed mode)
$ /usr/libexec/java_home
/Library/Java/JavaVirtualMachines/jdk1.8.0_231.jdk/Contents/Home

# 切换到 JDK12
$ java12
$ java -version
java version "12.0.2" 2019-07-16
Java(TM) SE Runtime Environment (build 12.0.2+10)
Java HotSpot(TM) 64-Bit Server VM (build 12.0.2+10, mixed mode, sharing)
$ /usr/libexec/java_home
/Library/Java/JavaVirtualMachines/jdk-12.0.2.jdk/Contents/Home

Tips: 更多 Java 实用技巧,详见《那些绕不过去的 Java 知识点

Maven 相关

权限不足导致下载失败

描述

 报错无法解析依赖,找不到 xxx.lock 文件

解决

 对 Maven 的依赖文件存放目录赋权即可

1
$ sudo chown -R benedictjin:wheel /data/maven/repo

补充

 另外,还可以通过以下一系列命令,统一对目录下的所有文件和文件夹进行权限修改

1
2
3
4
$ sudo chown -R benedictjin:wheel *
$ sudo chmod -R g+rwX .
$ sudo find . -type d -exec chmod 755 {} \;
$ sudo find . -type f -exec chmod 644 {} \;

 同理,还可以利用这个方法,删除 .DS_Store 文件

1
2
3
4
5
6
# 查看过滤出来的文件
$ find . -name '.DS_Store'
# 删除
$ find . -name '.DS_Store' -type f -exec rm -f {} \;
# 再次检查
$ find . -name '.DS_Store'

 而如果需要执行多个命令的话,可以指定多个 -exec 参数

1
2
3
4
5
# 找到后缀为 .md 的文件,执行 grep 命令,如果命中规则,则执行后续的 echo 命令
$ find . -name '*.md' -type f -exec grep '##' {} \; -exec echo {} \;

# 也可以不用关心第一个命令是否执行成功,具体写法如下:
$ find . -name '*.md' -type f \( -exec grep '##' {} \; -o -exec true \; \) -exec echo {} \;

Tips: 更多 Maven 实用技巧,详见《Maven 高级玩法

命令相关

brew

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# 使用国内的镜像
$ cd "$(brew --repo)"
$ git remote set-url origin git://mirrors.ustc.edu.cn/brew.git

$ cd "$(brew --repo)/Library/Taps/homebrew/homebrew-core"
$ git remote set-url origin git://mirrors.ustc.edu.cn/homebrew-core.git

$ brew update

$ echo 'export HOMEBREW_BOTTLE_DOMAIN=https://mirrors.ustc.edu.cn/homebrew-bottles' >> ~/.bash_profile
$ source ~/.bash_profile

# 重置恢复
$ cd "$(brew --repo)"
$ git remote set-url origin https://github.com/Homebrew/brew.git

$ cd "$(brew --repo)/Library/Taps/homebrew/homebrew-core"
$ git remote set-url origin https://github.com/Homebrew/homebrew-core.git

ccat

 操作类似 cat 命令,但是高亮了输出

1
2
3
4
5
# 使用 brew 安装
$ brew install ccat

# 查看最后一次的代码修改
$ git diff HEAD^ | ccat

diskutil

 通过命令行格式化 U 盘

1
2
3
4
5
6
# 查看磁盘列表
$ diskutil list
# 分区 /dev/disk2 为 U 盘,将其卸载
$ diskutil unmountDisk /dev/disk2
# 执行格式化命令
$ diskutil eraseDisk JHFS+ raspberry disk2

fd

 简化了 find 命令,使用起来更加简单高效,还会自动忽略隐藏目录(如 .git/.deploy_git/ 等)

1
2
$ brew install fd
$ fd xml
1
2
3
4
5
pom.xml
processing/pom.xml
server/pom.xml
services/pom.xml
sql/pom.xml

ggrep

 自带的 grep 命令不支持前缀匹配等操作,而 ggrep 命令可以有效地支持高阶正则表达式

1
2
3
4
$ brew install grep

# 匹配 + 加号左右两边没有空格的情况
$ find . -name '*.md' -type f -exec ggrep -Pio '(?! )\+(?! )| \+(?! )|(?<! )\+ ' {} \; -exec echo {} \;

htop

 增强了 top 命令,展示页面更加丰富

1
2
$ brew install htop
$ htop

tldr

 强化 man 命令,对展示的文档进行了简化,并展示了对应的例子

1
2
3
4
5
# 使用 npm 安装
$ npm install -g tldr

# 查看 cd 命令的使用文档
$ tldr cd
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
✔ Page not found. Updating cache...
✔ Creating index...

cd

Change the current working directory.

- Go to the given directory:
cd path/to/directory

- Go to home directory of current user:
cd

- Go up to the parent of the current directory:
cd ..

- Go to the previously chosen directory:
cd -

tree

1
2
3
4
5
6
# 使用 brew 安装
$ brew install tree

# 展示目录结构,这里我们以 Elasticsearch 的数据目录为例
$ cd $ES_HOME/data
$ tree -L 5
1
2
3
4
5
6
7
8
9
10
.
└── nodes
└── 0
├── _state
│   ├── global-20.st
│   ├── manifest-35.st
│   └── node-3.st
└── node.lock

3 directories, 4 files

工具相关

Sublime

展示空格和制表符

 使用 ⌘, 组合快捷键后,增加 "draw_white_space": "all" 配置项

1
2
3
4
5
6
7
8
9
{
"color_scheme": "Packages/Color Scheme - Default/Mariana.sublime-color-scheme",
"font_size": 14,
"ignored_packages": [
"Vintage"
],
"word_wrap": "true",
"draw_white_space": "all"
}

删除重复行

1
2
# ⌥+⌘+F 打开替换模式,并打开正则表达式的开关
^(.+)$[\r\n](^\1$[\r\n]{0, 1})+

常用插件

JSON 格式化

 使用 ⌘⇧P 组合快捷键后,输入 Pretty JSON: Validate 再回车,对文件中的 JSON 进行校验;输入 Pretty JSON: Format and Sort JSON 再回车,对文件中的 JSON 进行格式化;输入 Pretty JSON: Minify (compress) JSON 再回车,将文件中的 JSON 压缩成一行

二进制文件可视化

 使用 ⌘⇧P 组合快捷键后,输入 HexViewer: Toggle Hex View 再回车,开启二进制可视化功能

iTerm2

安装 zsh

1
$ sh -c "$(curl -fsSL https://raw.github.com/robbyrussell/oh-my-zsh/master/tools/install.sh)"

配置主题

1
$ vim ~/.zshrc
1
ZSH_THEME="agnoster"

高亮

语法高亮
1
2
$ brew install zsh-syntax-highlighting
$ vim ~/.zshrc
1
source /usr/local/Cellar/zsh-syntax-highlighting/0.6.0/share/zsh-syntax-highlighting/zsh-syntax-highlighting.zsh
vim 高亮
1
2
3
4
5
6
$ wget http://ethanschoonover.com/solarized/files/solarized.zip
$ unzip solarized.zip
$ cd solarized/vim-colors-solarized/colors
$ mkdir -p ~/.vim/colors
$ cp solarized.vim ~/.vim/colors/
$ vi ~/.vimrc
1
2
3
syntax enable
set background=dark
colorscheme solarized
ls 高亮
1
2
3
$ brew install coreutils
$ gdircolors --print-database > ~/.dir_colors
$ vim ~/.zshrc
1
if brew list | grep coreutils > /dev/null ; then PATH="$(brew --prefix coreutils)/libexec/gnubin:$PATH" alias ls='ls -F --show-control-chars --color=auto' eval `gdircolors -b $HOME/.dir_colors` fi

加载环境变量

1
$ vim ~/.zshrc
1
2
# .zshrc 的最后一行加入
source ~/.bashrc

自动补齐

1
2
3
$ cd ~/.oh-my-zsh/custom/plugins
$ git clone https://github.com/zsh-users/zsh-autosuggestions.git $ZSH_CUSTOM/plugins/zsh-autosuggestions
$ vim ~/.zshrc
1
2
3
# plugins=(git)
# 修改为:
plugins=(zsh-autosuggestions git)

自动补全只能看到一个字符

 如果发现自动提示的命令只能展示出一个字符,则说明 ANSI Colors 里面第一行的 Normal 和 Bright 颜色过于相近

scp 报错 cannot change locale (UTF-8)

 使用 zsh 替代了 Mac 上原生的 bash 之后,本地化的设置默认是没有配置的,可以通过 locale 命令来检查。解决方法也很简单,具体操作如下:

1
$ vim ~/.zshrc
1
2
export LC_ALL=en_US.UTF-8
export LANG=en_US.UTF-8
1
2
$ source ~/.zshrc
$ locale
1
2
3
4
5
6
7
8
LANG="en_US.UTF-8"
LC_COLLATE="en_US.UTF-8"
LC_CTYPE="en_US.UTF-8"
LC_MESSAGES="en_US.UTF-8"
LC_MONETARY="en_US.UTF-8"
LC_NUMERIC="en_US.UTF-8"
LC_TIME="en_US.UTF-8"
LC_ALL="en_US.UTF-8"

删除 zsh 历史记录

1
$ echo "" > ~/.zsh_history & exec $SHELL -l

卸载 zsh

1
$ uninstall_oh_my_zsh

Intellij IDEA

不停顿地 Debug

Debug without pause in Intellij IDEA

(对 IntelliJ IDEA™ 的截图)

Debug 启动的时候,卡在了 Finished, saving caches

1
2
3
4
5
6
7
# 获取 Mac 的 hostname
$ hostname
BenedictJin.local

# 添加到 hosts 文件,即可解决
$ sudo vim /etc/hosts
127.0.0.1 localhost BenedictJin.local

只格式化自己修改的代码

 通过 ⌘⌥⇧L 组合快捷键打开配置面板,选择 Only VCS changed text 后,再次使用 ⌘⌥L 组合快捷键格式化代码,便只会影响本次修改的、尚未 commit 的代码了

Only VCS changed text in Intellij IDEA

(对 IntelliJ IDEA™ 的截图)

生成 SerialVersionUID

 安装 GenerateSerialVersionUID 插件后,在类文件中,使用 ⌘N 组合快捷键,并选择 SerialVersionUID 菜单,即可生成类似如下的一行代码:

1
private static final long serialVersionUID = -90000066L;

Typroa

支持 callout

 首先通过 ⌘, 快速打开 Typroa 的控制面板,依次点击 General - Open Theme Folder 按钮,打开 theme 目录,并在该目录下新建 base.user.css 文件,填写如下内容:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
div[style^='callout:'] {
padding: 20px;
margin: 20px 0;
border: 1px solid #eee;
border-left-width: 6px !important;
border-radius: 3px;
}
div[style^='callout:'] h4 {
margin-top: 0;
margin-bottom: 1em;
}
div[style^='callout:'] p:last-child {
margin-bottom: 0;
}
div[style^='callout:'] code {
border-radius: 3px;
}
div[style^='callout:']+div[style^='callout:'] {
margin-top: -5px;
}
div[style='callout:default'] {
border-left-color: #777 !important;
}
div[style='callout:default'] h4 {
color: #777 !important;
}
div[style='callout:primary'] {
border-left-color: #428bca !important;
}
div[style='callout:primary'] h4 {
color: #428bca !important;
}
div[style='callout:success'] {
border-left-color: #5cb85c !important;
}
div[style='callout:success'] h4 {
color: #5cb85c !important;
}
div[style='callout:danger'] {
border-left-color: #d9534f !important;
}
div[style='callout:danger'] h4 {
color: #d9534f !important;
}
div[style='callout:warning'] {
border-left-color: #f0ad4e !important;
}
div[style^='callout:warning'] h4 {
color: #f0ad4e !important;
}
div[style^='callout:info'] {
border-left-color: #5bc0de !important;
}
div[style^='callout:info'] h4 {
color: #5bc0de !important;
}

 重启 Typroa 之后,即可使用 callout 功能:

1
2
3
4
5
<div style="callout:default">default</div>
<div style="callout:primary">primary</div>
<div style="callout:success">success</div>
<div style="callout:warning">warning</div>
<div style="callout:info">info</div>

 效果如下:

Markdown Callout in Typroa

(对 Typroa™ 的截图)

Chrome

Octotree 代码大纲

Octotree

(对 Github™ 的截图)

Isometric Contributions 可视化

asdf2014 on Isometric Contributions

(对 Github™ 的截图)

Your Connection is not private

 输入 thisisunsafe 便可绕过 Chrome 的安全检查

asciinema

Quick Start

1
2
3
4
$ brew install asciinema
$ asciinema rec
# 录制成功后,exit 退出即可
# 支持保存在本地,或发布在 asciinema.org 网站上

鉴权

 如果你担心发布在网上,存在隐私问题。你可以注册 ascinema 的账号,并设置录制内容是否公开(默认为 private)

示例

1
2
3
4
5
6
$ asciinema rec
$ cd /tmp
$ vim open.sh
open 'https://yuzhouwan.com/'
$ sh open.sh
$ exit

转 gif

1
2
3
4
$ brew install imagemagick
$ brew install gifsicle
$ npm install --global asciicast2gif
$ asciicast2gif https://asciinema.org/a/246879.json 246879.gif

效果

Asciinema Example

(利用 Asciinema™ 录制而成)

Alfred

使用 iTerm2 作为 Alfred 的默认命令行

 使用 ⌘, 组合快捷键后,进入 Features - Terminal - Application,选择 Custom 后,填入以下脚本:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
-- For the latest version:
-- https://github.com/vitorgalvao/custom-alfred-iterm-scripts

-- Set this property to true to always open in a new window
property open_in_new_window : false

-- Handlers
on new_window()
tell application "iTerm" to create window with default profile
end new_window

on new_tab()
tell application "iTerm" to tell the first window to create tab with default profile
end new_tab

on call_forward()
tell application "iTerm" to activate
end call_forward

on is_running()
application "iTerm" is running
end is_running

on has_windows()
if not is_running() then return false
if windows of application "iTerm" is {} then return false
true
end has_windows

on send_text(custom_text)
tell application "iTerm" to tell the first window to tell current session to write text custom_text
end send_text

-- Main
on alfred_script(query)
if has_windows() then
if open_in_new_window then
new_window()
else
new_tab()
end if
else
-- If iTerm is not running and we tell it to create a new window, we get two
-- One from opening the application, and the other from the command
if is_running() then
new_window()
else
call_forward()
end if
end if

-- Make sure a window exists before we continue, or the write may fail
repeat until has_windows()
delay 0.01
end repeat

send_text(query)
call_forward()
end alfred_script
1
2
# 通过如下命令,可以下载最新的 Custom Alfred iTerm Scripts 脚本,输出到粘贴板,详见:https://github.com/vitorgalvao/custom-alfred-iterm-scripts
$ curl --silent 'https://raw.githubusercontent.com/vitorgalvao/custom-alfred-iterm-scripts/master/custom_iterm_script.applescript' | pbcopy

配合 iTerm2 完成免密登录

1
2
3
4
5
6
# 生成秘钥
$ ssh-keygen
# 拷贝至目标机器
$ ssh-copy-id -i yuzhouwan@10.10.10.10
# 尝试免密登录
$ ssh yuzhouwan@10.10.10.10
1
2
# 配置机器相关信息
$ vim ~/.ssh/config
1
2
3
Host dev
HostName 10.10.10.10
User yuzhouwan
1
2
# 在 Release 页面 https://github.com/deanishe/alfred-ssh/releases/tag/v0.8.0 下载最新的 alfred-ssh 并双击安装
$ wget https://github.com/deanishe/alfred-ssh/releases/download/v0.8.0/Secure-SHell-0.8.0.alfredworkflow

 在 iTerm2 中,使用 ⌘, 组合快捷键后,进入 Preferences - Profiles - Profile Name - default - General - URL Schemes - Schemes handled,随后选中 ssh 即可。实际效果,如下图所示:

Alfred SSH with iTerm2

(对 Alfred™ 的截图)

快捷键

Mac 键盘符号

键盘符号 含义
Command
Shift
Option
Control
↩︎ Return / Enter
Delete
向前删除键(Fn + Delete)
上箭头
下箭头
左箭头
右箭头
Page Up(Fn + ↑)
Page Down(Fn + ↓)
Fn + ← Home
Fn + → End
右制表符(Tab 键)
左制表符(Shift + Tab)
Escape(Esc)

Mac 本身相关

访问隐藏目录

 在 Finder 里面同时按 Command + Shift + G 即可输入隐藏目录,如 /usr/bin/java

Vim 相关

快捷键 含义
⌃F 下翻页
⌃B 上翻页
⌃F 下翻页
⌃B 上翻页
⇧M 将光标移动的该页中部
GG 回到文件顶部
⇧G 回到文件底部
HJKL 移动光标(HL: 左右;JK: 上下)

Tips: 更多 Vim 实用技巧 和 完整快捷键 详见《Linux 实战技巧》的 vimcheat sheet 部分

Alfred 相关

快捷键 含义
⌥⌘C 展示粘贴板上历史命令、图片和文件列表

iTerm2 相关

快捷键 含义
⌘⇧I 开启同时向多窗口输入命令的功能

Intellij Idea 相关

Editing(编辑)

快捷键 含义
⌃Space 基本的代码补全(补全任何类、方法、变量)
⌃⇧Space 智能代码补全(过滤器方法列表和变量的预期类型)
⌘⇧↩ 自动结束代码,行末自动添加分号
⌘P 显示方法的参数信息
⌃J 快速查看文档
⇧F1 查看外部文档(在某些代码上会触发打开浏览器显示相关文档)
⌘+鼠标 显示简要信息
⌘F1 在错误或警告处显示具体描述信息
⌘N, ⌃↩ 生成代码gettersetter、构造函数、hashCode / equals / toString
⌃O 覆盖方法(重写父类方法)
⌃I 实现方法(实现接口中的方法)
⌘⌥T 包围代码(使用 if..else, try..catch, for, synchronized 等包围选中的代码)
⌘/ 注释 / 取消注释与行注释
⌘⌥/ 注释 / 取消注释与块注释
⌥↑ 连续选中代码块
⌥↓ 减少当前选中的代码块
⌃⇧Q 显示上下文信息
⌥↩ 显示意向动作和快速修复代码
⌘⌥L 格式化代码
⌃⌥O 优化 import
⌃⌥I 自动缩进线
⇥ / ⇧⇥ 缩进代码 / 反缩进代码
⌘X 剪切当前行或选定的块到剪贴板
⌘C 复制当前行或选定的块到剪贴板
⌘V 从剪贴板粘贴
⌘⇧V 从最近的缓冲区粘贴
⌘D 复制当前行或选定的块
⌘⌫ 删除当前行或选定的块的行
⌃⇧J 智能的将代码拼接成一行
⌘↩ 智能的拆分拼接的行
⇧↩ 开始新的一行
⌘⇧U 大小写切换
⌘⇧] / ⌘⇧[ 选择直到代码块结束 / 开始
⌥⌦ 删除到单词的末尾
⌥⌫ 删除到单词的开头
⌘+ / ⌘- 展开 / 折叠代码块
⌘⇧+ 展开所以代码块
⌘⇧- 折叠所有代码块
⌘W 关闭活动的编辑器选项卡

Search / Replace(查询 / 替换)

快捷键 含义
Double ⇧ 查询任何东西
⌘F 文件内查找
⌘G 查找模式下,向下查找
⌘⇧G 查找模式下,向上查找
⌘R 文件内替换
⌘⇧F 全局查找(根据路径)
⌘⇧R 全局替换(根据路径)
⌘⇧S 查询结构(Ultimate Edition 版专用,需要在 Keymap 中设置)
⌘⇧M 替换结构(Ultimate Edition 版专用,需要在 Keymap 中设置)

Usage Search(使用查询)

快捷键 含义
⌥F7 / ⌘F7 在文件中查找用法 / 在类中查找用法
⌘⇧F7 在文件中突出显示的用法
⌘⌥F7 显示用法

Compile and Run(编译和运行)

快捷键 含义
⌘F9 编译 Project
⌘⇧F9 编译选择的文件、包或模块
⌃⌥R 弹出 Run 的可选择菜单
⌃⌥D 弹出 Debug 的可选择菜单
⌃R 运行
⌃D 调试
⌃⇧R, ⌃⇧D 从编辑器运行上下文环境配置

Debugging(调试)

快捷键 含义
F8 进入下一步,如果当前行断点是一个方法,则不进入当前方法体内
F7 进入下一步,如果当前行断点是一个方法,则进入当前方法体内,如果该方法体还有方法,则不会进入该内嵌的方法中
⇧F7 智能步入,断点所在行上有多个方法调用,会弹出进入哪个方法
⇧F8 跳出
⌥F9 运行到光标处,如果光标前有其他断点会进入到该断点
⌥F8 计算表达式(可以更改变量值使其生效)
⌘⌥R 恢复程序运行,如果该断点下面代码还有断点则停在下一个断点上
⌘F8 切换断点(若光标当前行有断点则取消断点,没有则加上断点)
⌘⇧F8 查看断点信息
快捷键 含义
⌘O 查找类文件
⌘F12 弹出当前文件结构层,可以在弹出的层上直接输入进行筛选(可用于搜索类中的方法)
⌘⇧O 查找所有类型文件、打开文件、打开目录,打开目录需要在输入的内容前面或后面加一个反斜杠 /
⌘⌥O 前往指定的变量 / 方法
⌃← / ⌃→ 左右切换打开的编辑 tab 页
F12 返回到前一个工具窗口
从工具窗口进入代码文件窗口
⇧⎋ 隐藏当前或最后一个活动的窗口,且光标进入代码文件窗口
⌘⇧F4 关闭活动 run / messages / find / … 的 tab 页
⌘L 在当前文件跳转到某一行的指定处
⌘E 显示最近打开的文件记录列表
⌘⌥← / ⌘⌥→ 退回 / 前进到上一个操作的地方
⌘⇧⌫ 跳转到最后一个编辑的地方
⌥F1 显示当前文件选择目标弹出层,弹出层中有很多目标可以进行选择(如在代码编辑窗口可以选择显示该文件的 Finder)
⌘B / ⌘ 鼠标点击 进入光标所在的方法 / 变量的接口或是定义处
⌘⌥B 跳转到实现处,在某个调用的方法名上使用会跳到具体的实现处,可以跳过接口
⌥ Space, ⌘Y 快速打开光标所在方法、类的定义
⌃⇧B 跳转到类型声明处
⌘U 前往当前光标所在方法的父类的方法 / 接口定义
⌃↓ / ⌃↑ 当前光标跳转到当前文件的前一个 / 后一个方法名位置
⌘] / ⌘[ 移动光标到当前所在代码的花括号开始/结束位置
⌃H 显示当前类的层次结构
⌘⇧H 显示方法层次结构
⌃⌥H 显示调用层次结构
F2 / ⇧F2 跳转到下一个 / 上一个突出错误或警告的位置
F4 / ⌘↓ 编辑 / 查看代码源
⌥ Home 显示到当前文件的导航条
F3 选中文件 / 文件夹 / 代码行,添加 / 取消书签
⌥F3 选中文件 / 文件夹 / 代码行,使用助记符添加 / 取消书签
⌃0…⌃9 定位到对应数值的书签位置
⌘F3 显示所有书签

Refactoring(重构)

快捷键 含义
F5 复制文件到指定目录
F6 移动文件到指定目录
⌘⌫ 在文件上为安全删除文件,弹出确认框
⇧F6 重命名文件
⌘F6 更改签名
⌘⌥N 一致性
⌘⌥M 将选中的代码提取为方法
⌘⌥V 提取变量
⌘⌥F 提取字段
⌘⌥C 提取常量
⌘⌥P 提取参数

VCS(版本控制)

快捷键 含义
⌘K 提交代码到版本控制器
⌘T 从版本控制器更新代码
⌥⇧C 查看最近的变更记录
⌃C 快速弹出版本控制器操作面板

Live Templates(动态代码模板)

快捷键 含义
⌘⌥J 弹出模板选择窗口,将选定的代码使用动态模板包住
⌘J 插入自定义动态代码模板

General(通用)

快捷键 含义
⌘1…⌘9 打开相应编号的工具窗口
⌘S 保存所有
⌘⌥Y 同步、刷新
⌃⌘F 切换全屏模式
⌘⇧F12 切换最大化编辑器
⌥⇧F 添加到收藏夹
⌥⇧I 检查当前文件与当前的配置文件
§⌃, ⌃` 快速切换当前的 scheme(切换主题、代码样式等)
⌘, 打开 IDEA 系统设置
⌘; 打开项目结构对话框
⇧⌘A 查找动作(可设置相关选项)
⌃⇥ 编辑窗口标签和工具窗口之间切换(如果在切换的过程加按上 delete,则是关闭对应选中的窗口)

Other

快捷键 含义
⌘` 项目之间的切换
⌥⇧U 装上 CamelCase 插件之后,切换变量的驼峰法命名
⌃⌘U 装上 Translation 插件之后,可以快速翻译
⌃⌘O 装上 Translation 插件之后,可以翻译并替换
⌥S 装上 OnlineSearch 插件之后,可以配置为该快捷键
⌘⌥⇧/ 使用 2018.3 EAP 版本时候,开启 JVM Profile 功能

踩过的坑

Error: Unknown command: services

描述

1
$ brew services start grafana
1
Error: Unknown command: services

解决

1
$ brew tap homebrew/services

升级 Catalina 系统后根目录下文件消失

解决

 已经被移动到 /Users/Shared/Relocated Items/Security 目录下了

升级 Catalina 系统后根目录无法创建文件夹

描述

1
2
$ cd /
$ sudo mkdir yuzhouwan
1
mkdir: yuzhouwan: Read-only file system

解决

 确保 SIPSystem Integrity Protection)关闭的情况下,给更目录赋予写入的权限即可

1
$ csrutil status
1
System Integrity Protection status: disabled.
1
2
$ sudo mount -uw /
$ sudo mkdir /yuzhouwan

删除雷蛇应用后,仍然显示雷蛇图标

解决

1
2
3
4
$ launchctl remove com.razer.rzupdater
$ launchctl remove com.razerzone.rzdeviceengine
$ sudo rm /Library/LaunchAgents/com.razer.rzupdater.plist
$ sudo rm -rf /Library/Application\ Support/Razer

自带的 grep 不支持 -P 参数

解决

1
2
$ brew install grep
$ vim tmp
1
2
宇宙湾
yuzhouwan.com
1
$ /usr/local/opt/grep/libexec/gnubin/grep -P '[\p{Han}]' tmp
1
宇宙湾

Version value must be a string

描述

1
$ brew doctor
1
2
3
4
5
6
7
8
9
10
11
12
13
Traceback (most recent call last):
11: from /usr/local/Homebrew/Library/Homebrew/brew.rb:23:in `<main>'
10: from /usr/local/Homebrew/Library/Homebrew/brew.rb:23:in `require_relative'
9: from /usr/local/Homebrew/Library/Homebrew/global.rb:37:in `<top (required)>'
8: from /usr/local/Homebrew/Library/Homebrew/vendor/portable-ruby/2.6.3/lib/ruby/2.6.0/rubygems/core_ext/kernel_require.rb:54:in `require'
7: from /usr/local/Homebrew/Library/Homebrew/vendor/portable-ruby/2.6.3/lib/ruby/2.6.0/rubygems/core_ext/kernel_require.rb:54:in `require'
6: from /usr/local/Homebrew/Library/Homebrew/os.rb:3:in `<top (required)>'
5: from /usr/local/Homebrew/Library/Homebrew/os.rb:21:in `<module:OS>'
4: from /usr/local/Homebrew/Library/Homebrew/os/mac.rb:58:in `prerelease?'
3: from /usr/local/Homebrew/Library/Homebrew/os/mac.rb:24:in `version'
2: from /usr/local/Homebrew/Library/Homebrew/os/mac.rb:24:in `new'
1: from /usr/local/Homebrew/Library/Homebrew/os/mac/version.rb:26:in `initialize'
/usr/local/Homebrew/Library/Homebrew/version.rb:368:in `initialize': Version value must be a string; got a NilClass () (TypeError)

解决

1
$ brew upgrade

关闭系统升级提醒

解决

1
2
3
4
# 关闭
$ defaults write com.apple.systempreferences AttentionPrefBundleIDs 0 && killall Dock
# 恢复
$ defaults write com.apple.systempreferences AttentionPrefBundleIDs 1 && killall Dock

Typora 不识别内联公式

问题

 Typora 识别不了 $O(n)$ 这样的内联公式

解决

 使用 ⌘ + , 组合快捷键打开 Typora 的配置页面,点击 Markdown 菜单,勾选上“内联公式”即可

资源

理论

软件

通用

钉钉

iTerm2

Jump Desktop

Sublime

Chrome

硬件

工具网站

图像

素材

图标

纹理背景

地图图表

欢迎加入我们的技术群,一起交流学习

群名称 群号
人工智能(高级)
人工智能(进阶)
BigData
算法