声明:博文未经授权一律不允转载
update log
- 20170721
- +Esc取消选中
- 20170819
- +选中方法的更加快捷的方式,Ctrl + W,搜索[方法选中]
- +用键盘键盘新建一个文件的更加快捷方式,Alt + insert,搜索[用键盘键盘新建一个文件的更加快捷方式]
##
将需要精确点击的事情,变得不需要精确,甚至是随机(有规则的随机,但是遵守这个规则是人的轻易就能做到的),让计算机来处理这种随机,那你的效率将会提高很多很多。
————来自 卖牙膏霸气侧漏农村有文化的芖口钉(Halohoop)语录
(Yeah,I said that.😄)
举个例子,一个界面窗口需要点击一个叉叉才能关闭,然后如果你能够使用一个手势,比如左滑或者右滑(有规律的随机,随便一个地方左/右滑动)来关闭这个窗口,那么效率就得到了提升,随之而来的也会是更好的用户体验,而快捷键和手势都是一种提效方式,废话不多说,接下来就来看我在AS中漂亮的回旋踢吧。
文章可能是“关公面前耍大刀,包公面前晒太阳,老干妈面前吃辣条”,不是大佬的都共勉,是大佬的话就当笑话看吧,哇哈哈哈哈哈刀哈哈哈哈哈哈!!!
另外,快捷键只有当你真正体会到它的方便之处,并且熟练操作了之后才能真正提高你的效率,如果觉得自己现在挺好的没什么必要的知道,可以跳过这个文章了哦,节省时间哇。.
再另外,为了让读者有环环相扣的情景感,下文使用顶针的方式来写。并且涉及到代码的部分全都使用Kotlin。
(顶针的修辞手法:每段末尾和下一段开头呼应)
本文快捷键基于windows版本AS,如果你已经修改过一些快捷键,本文的一些快捷键可能会失效。
前面略显拖沓,故事现在从这里开始。
1.“Alt + F1,1(Alt + F1,直接再按1)”
相信我们都会使用到这个按钮,“Scroll from Source”
可以帮我们找到正在编辑的文件所在项目的位置,在项目越来越复杂文件越来越多的时候是非常有用的,可是那么小的按钮,我真的不想再用鼠标去缓慢的精确定位再点击,显然这个问题巨人也遇到了,于是巨人给我们了一个“Alt + F1,1”。鼠标焦点在代码编辑界面的时候,“Alt + F1,1(Alt + F1,直接再按1)”。
可以发现这个Alt + F1之后弹出的窗口里面可不止这一个快捷键,比如,第8和第0都非常好用的咧。
[用键盘键盘新建一个文件的更加快捷方式]
当我们焦点处于[1.Project]方法的时候,可以使用上下左右键将选中的项目定位在一个文件夹,然后按键盘“Alt + Insert”按键,就会有“Alt + F”的效果,但是弹出的菜单会更容易新建一个文件,去体会一下吧。
好了,现在窗口的焦点到了[1.Project]这个模块中了,我们定位到了源文件的位置了,现在想要回到刚才代码焦点编辑的地方,显然我又想拒绝鼠标了,于是巨人给我们了一个“Esc”。
鉴于下文也会用到“于是巨人给了我们一个”,因此定义如下:
val 于巨给个 = “于是巨人给了我们一个”//上帝说有光,那就有光了,哈哈哈
2.“Esc”
移动鼠标+点击的速度当然比不上我按一个Esc的速度,按下Esc,于是我们又回到了最初代码编辑的地方。
这个快捷键不仅在[1.Project]这个模块中是有用的,在很多界面你按Esc都是可以回到编辑窗口区域的,但是有些就不行,我知道的就是Terminal终端窗口中按Esc是回不去的,这个Terminal终端窗口下文也会提到。
另外一个就是当你选中一堆代码的时候,你按“Esc”也会有取消选中的作用,这个稍微提一下就可以了。
好了,既然回到代码区域,现在我们开始畅游代码世界,突然间,偶遇这一个代码段:
//来自android.view.ViewGroup#dispatchTouchEvent
@Override
public boolean dispatchTouchEvent(MotionEvent ev) {
//此处省略200+行代码..
return handled;
}
相信只要不是竖屏的显示器都显示不全这个方法,必须要手动滚动鼠标才能看完,一般我们看源码想要加注释的话会将其拷贝出来到一个同名类中进行,拷贝这个动作则又是一个耗时操作,因为方法有200+行,需按着鼠标不松开,然后滚轮,于巨给个“Ctrl + Shift + ]”等。
3.“Ctrl + 左或右”、“Ctrl + [ 或 ]” 和 “Shift + 上下左右“ 以及它们的合体 “Ctrl + Shift + [ 或 ]“和“Ctrl + Shift + 左或右”
说明这些个快捷键之前,我先定义几个点:
首先我们来解决上一小节的问题,快速复制整个方法,假设我们光标已经在第k行了,
- 那么现在按home键,去到开头,也就是public的左边
- 然后现在按Ctrl + Shift + ],会发现从public到点b撇的位置都被选中了,然后我们再使用Shift + →,把最后的花括号选中,然后Ctrl + C那就大功告成了,别看这一段文字挺多的,熟练操作之后这个复制的操作应该只需要1秒。
- 但是,这里要说明的是,并不是说鼠标就不好,只是知道键盘的操作可能会提高我们的效率罢了,单单看这个需求,可能鼠标会比我们更快也说不定,因为如果你在点a或者点a撇双击左键的话,点a到点a撇之间的内容就能够被选中了(点b和点b撇也是)。
- 当然光标在点a或者点b的时候按“Ctrl + W”也是能够将方法选中的[方法选中]。
但是如果要把上面的“@Override”也复制上,那就还是需要使用组合的快捷键比较好了。
- 首先定位到k-1行;
- home到开头第一个字母;
- Shift + ↓选中k-1行,这时候光标在public开头;
- 然后重复上文提到的步骤即可;
- 文字虽长,但操作是瞬时的,重在体会快捷键设计的艺术;
“Ctrl + 左或右”:按词移动光标
- “Ctrl + [ 或 ]”:寻找花括号及花括号的兄弟
- “Shift + 上下左右”:左右上下选中
- “Ctrl + Shift + [ 或 ]”:寻找花括号及花括号的兄弟 + 选中
- “Ctrl + Shift + 左右”:按词移动光标 + 选中
很容易发现,加了Shift就有了选中功能,没加就是移动光标功能。
好了,现在我们继续畅游ViewGroup#dispatchTouchEvent方法,使用“↑/↓方向键”一行行的过,使用“Ctrl + ↑/↓”一行行的滚动屏幕,突然间我们发现我们找到了onInterceptTouchEvent方法:
想要进去看看,然后想必我们下意识的操作肯定是,按住Ctrl,另一只手点击鼠标左键,虽然这个操作也很6,但是如果没有鼠标咧?于巨给个“F4”。
4.“F4”
焦点在方法或者变量上的时候,按“F4”能够找到它们定义的位置。
按“F4”,于是我们咻的一下去到了onInterceptTouchEvent的定义处:
说到这里,我要重新提一下我开头的那句话儿了,上面包括下面会提到的快捷键无不例外的都遵循了我说的规律,那就是将需要手指精确定位或者人眼去找的部分去除掉,利用计算机的高速运算能力,比如说,“Ctrl + [”帮我们找到“}”的同组“{”在哪里,或者“Ctrl + F12”,匹配有相同关键字的方法,缩小肉眼观察的范围……等等.
好了回来,我们暂且不考虑onInterceptTouchEvent的if条件中更深的方法调用,所以这里就一个判断一眼扫过,onInterceptTouchEvent执行完就出栈了,这时候我们想要回到dispatchTouchEvent方法中继续看其下面的流程,dispatchTouchEvent和onInterceptTouchEvent隔了好几百行代码,我们可以通过“Ctrl + F12”然后输入dispatchTouchEvent前面几个字符,快速找回dispatchTouchEvent,但是还是太慢,因为还要肉眼去定位dispatchTouchEvent中调用onInterceptTouchEvent的位置,于巨给个“Ctrl + Alt + ←/→”。
5.“Ctrl + Alt + ←/→”,光标位置的历史列表预览器
我们按“Ctrl + Alt + ←”一下或者多下,按多下因为可能在找到onInterceptTouchEvent之后又按了鼠标好几下,如果每次点击位置都不一样,那么每次都会生成一个新历史位置数据,我想这个历史列表的Bean的数据结构很有可能是酱的:
data class CursorBean(var 什么文件: File, var 第几行: Int, var 第几列: Int)
当然这个快捷键的按钮位置就在菜单工具栏,如下图:
当我们悬停在按钮上面的时候,就会发现它的快捷键被提示出来了,所以悬停肯定可以是我们获取快捷键的一条有效路径。
现在为了更加直观的看到dispatchTouchEvent和onInterceptTouchEvent以及onTouchEvent三个方法的执行顺序或者情况,我们想要在其中加log,因此我们需要新建一个ViewGroup类来进行,首选FrameLayout,用鼠标在对应包名右键新建或者是用鼠标点击File - New - Kotlin File/Class,都显得比较迟缓,或许你知道快捷键是“Alt + F,打开File菜单,然后使用上下左右键选择”,但是这个还是需要手动区定位,略显拖沓,于巨给个“Ctrl + Shift + A”。
6.“Ctrl + Shift + A”,通往全世界的任意门
想要新建一个Kotlin源代码文件MyFrameLayout.kt,只需按下“Ctrl + Shift + A”,然后输入模糊匹配的英文单词即可,比如说“new class”、“kotlinclass”等,然后你只需要在匹配出来的列表中选中“Kotlin File/Class”即可快速新建一个kt源代码文件了。
实际情况中可能你还需要将这个新建的源代码文件放到新的包下,于是看我下面这一波操作:
- 用上面讲过的“Scroll from Source”快捷键,“Alt + F1,1(Alt + F1然后再按1)”,定位到源代码文件;
- 使用上下左右方向键定位到需要新建新包的包位置;
- 上下是切换到上下行,左右则是关闭和打开目录(如果是目录的话);
- 这个时候按“Ctrl + Shift + A”,再输入“new packa”,这时候你可以看到“Directory/Package”出现了,直接回车,如果不是出现再第一个那就上下调整一下选中再回车。这时候输入想要新建的包名再回车即可。
- 这时候会自动选中新建的包,这个时候再来“Ctrl + Shift + A”,输入“new class”或者“kotlinclass”随你便,接下去的事就和刚才新建包一样了。
- 新建完MyFrameLayout.kt源文件,也会自动帮我们定位到编辑区的。
- 敲入“class myfram”,根据提示完成补全即可,继承“FrameLayout”实现构造函数什么的我就不过多赘述了,都是“Alt + Enter”的事儿。
“Ctrl + Shift + A”是通往全世界的任意门,除了上述的功能,输入任意的快捷键名字、菜单名字、窗口名字等,都能帮你列出来当成一条捷径。
好现在我们的代码到了这一步:
class MyFrameLayout(context: Context?, attrs: AttributeSet?, defStyleAttr: Int) : FrameLayout(context, attrs, defStyleAttr)
这个时候很有可能我们的光标不在末尾,而是在这一行的某一个位置,如果你是用“Alt + Enter”辅助完成构造的编写的话,光标会在“FrameLayout”的位置,我们需要在末尾添加花括号对,于是我们先按“end”,然后…好麻烦哦。于巨给个“Ctrl + Shift + 回车”。
7.“Ctrl + Shift + 回车”,自动补全代码
按下“Ctrl + Shift + 回车”之后会发现代码自动加上花括号了,并且光标定位到我们需要的位置了:
class MyFrameLayout(context: Context?, attrs: AttributeSet?, defStyleAttr: Int) : FrameLayout(context, attrs, defStyleAttr) {
|←光标位置
}
不仅是这里的花括号,如果我们写的是java代码,这个快捷键还会帮我们补全补全末尾的分号,然后将光标自动移动到下一行的对齐的位置。
然后现在我们挨个输入方法名的前几个字母根据提示重写上文中提到的dispatchTouchEvent和onInterceptTouchEvent以及onTouchEvent三个方法:
class MyFrameLayout(context: Context?, attrs: AttributeSet?, defStyleAttr: Int) : FrameLayout(context, attrs, defStyleAttr) {
override fun onInterceptTouchEvent(ev: MotionEvent?): Boolean {
return super.onInterceptTouchEvent(ev)
}
override fun onTouchEvent(event: MotionEvent?): Boolean {
return super.onTouchEvent(event)
}
override fun dispatchTouchEvent(ev: MotionEvent?): Boolean {
return super.dispatchTouchEvent(ev)//这一行是被选中的状态,并且光标是在开头
}
}
这时候dispatchTouchEvent中的return语句整行应该是被选中状态的,并且光标处在开头,我们按一下“home”取消选中,让光标停留在“return”前面,现在我们想要直接往上面插入一行,于巨给个“Ctrl + 回车”。
8.“Ctrl + 回车”,将光标处以后的代码移到下一行去,“Ctrl + Alt + 回车”
现在单看dispatchTouchEvent方法,应该是这个样子的:
override fun dispatchTouchEvent(ev: MotionEvent?): Boolean {
|←光标位置
return super.dispatchTouchEvent(ev)
}
另外我们还可以使用“Shift + 回车”,往下面插入一行,“Shift + 回车”支持光标不在行末尾就能够快速向下插入新的一行,这个我相信很多人知道啦。
当然有下必有上,为了能够快速向上插入新的一行,于巨给个“Ctrl + Alt + 回车”,那么我们其实从开头就可以使用这个快捷键,而不需要按一下“home”取消选中了。
现在我们将log打印代码加好,现在得到如下:
Commons.kt:
val TAG = "Halohoop"
inline fun String.logMe(filter: String = "") {
Log.i(TAG, TAG + "--" + filter + toString())
}
MyFrameLayout.kt:
class MyFrameLayout(context: Context?, attrs: AttributeSet?, defStyleAttr: Int) : FrameLayout(context, attrs, defStyleAttr) {
override fun onInterceptTouchEvent(ev: MotionEvent?): Boolean {
"onInterceptTouchEvent".logMe()
return super.onInterceptTouchEvent(ev)
}
override fun onTouchEvent(event: MotionEvent?): Boolean {
"onTouchEvent".logMe()
return super.onTouchEvent(event)
}
override fun dispatchTouchEvent(ev: MotionEvent?): Boolean {
"dispatchTouchEvent".logMe()
return super.dispatchTouchEvent(ev)
}
}
现在突然我发现我想要加个过滤字符串“–Road1–”,好让我们在monitor中看的更清楚,当然我们可以打好,然后复制挨个粘贴过去。但是这里我要介绍一个比较好用的功能,IntelliJ IDEA的多光标功能功能,鼠标点击第一个光标需要去到的位置,然后现在按着“Alt + Shift”不放开,用鼠标点击其他的光标位置:
现在我们想要研究一下onInterceptTouchEvent的相关流程,于是我们又覆盖这个方法:
override fun requestDisallowInterceptTouchEvent(disallowIntercept: Boolean) {
"requestDisallowInterceptTouchEvent".logMe()
super.requestDisallowInterceptTouchEvent(disallowIntercept)
}
当我们写的方法越来越多的时候,不考虑使用鼠标的情况下,想在类中肆意的穿梭,我们使用键盘的上下所有键一行行一个个字母,略显笨拙,于巨给个“好几个快捷键呢,请看下节”。
9.“Alt + 上下”:成员变量之间穿梭,“Ctrl + F12”:模糊匹配查找成员,“Ctrl + F11、F11、Shift + F11”:书签功能
一般这些快捷键都是穿插着使用的,这里不好用语言描述,读者可以去试试,“Ctrl + F12”相信大家都知道,就像Eclipse中的“Ctrl + O”。
不过我要特别说一下这个书签功能,“F11”是给当前行加一个书签,按下之后你会看到在平时你打断点的位置旁边会出现一个对勾;那么除了对勾之外还可以使用“Ctrl + F11”选择“0-9和A-Z”其中一个标记作为当前标签,按键盘对应英文字母即可,这个时候对勾被换成了对应的字母。然后我们可以使用“Shift + F11”将打开书签列表,可以进行书签的更改,当然直接在当前行按“F11”取消书签也是可以的。
书签这个功能很实用,提供“0-9和A-Z”的书签目的是什么,读者可以站在IDE设计者的角度揣摩一下,为了方便开发者看代码,这个书签设计很棒棒,我个人常常使用这个作为标记以及跟踪源码的这个调用链,在单单就某一块知识(比如说事件分发)进行研究的时候,10+26个书签应该是非常非常够用的了。
好了现在再回到我们的场景中,假设现在我们已经为我们的MyFrameLayout类加了非常多的log信息了,我们定义的String的内联方法“logMe()”在太多地方调用到了,我们需要删除一些,我们通常的做法可能是这样,在logMe的定义处,按着“Ctrl”然后点击鼠标左键就会出现调用“logMe()”的代码行列表了,不用鼠标怎么操作,于巨给个“Ctrl + Alt + F7”。
10.“Ctrl + Alt + F7”、“Alt + F7”
使用“Shift,Shift”找到我们的“Commons.kt”文件,我们用“Ctrl + F12”,把光标移动到“logMe”这个方法名字上,然后“Ctrl + Alt + F7”,就能得到和“Ctrl+点击鼠标左键”一样的功能咯。当然还有一个快捷键就是“Alt + F7”,不过这个不是以弹出窗的形式,而是打开[3:Find]模块窗口,这个窗口在我们使用“Ctrl + Shift + R”全局字符串替换 或者“Ctrl + Shift + F”全局字符串搜索的时候也会使用到。
假设现在我们已经从源码中的得到了我们想要的知识了,正式进入开发阶段,为了开发方便,我现在想引入一个Kotlin官方提供的anko裤,于是使用“Shift,Shift”找到我们module的“build.gradle”文件,拷贝对应的字符串:
compile "org.jetbrains.anko:anko:$anko_version"
使用“Ctrl + F”,输入“depende”定位到dependencies的DSL块(在gradle中还不支持“Ctrl + F12”),使用上文提过的“Ctrl + ]”定位到末尾的花括号“}”,在使用上文提过的“Ctrl + Alt + 回车”向上插入一行,然后粘贴即可。还是那句话,描述虽长,熟练操作后是瞬间的事,这里不去比较使用鼠标是否更好,本文只专注介绍快捷键。
因为我们修改了gradle文件,所以“Sync Now”那条黄色背景的提示会出现tabs的下面,我们可以移动鼠标去点击,然而我这里又告诉你,没有快捷键,当然成熟的IDE怎么可能就此妥协,于巨给个“定制快捷键功能”。
11.定制“Gradle Sync”快捷键,个人推荐“Alt + C,Alt + C”
打开设置,直接上图,一目了然。
个人推荐设置成连续按两次“Alt + C”,也就是“Alt + C,Alt + C”。按“Esc”关闭设置,然后“Alt + C,Alt + C”,发现“Gradle Sync”执行了。
这时候我们想要将这个gralde的tab关闭,我们可能会点击tab的×,或者之间在tab上点击中键,但是其实我们可以省略了手从键盘移动到鼠标上的步骤,而直接在键盘上操作。
12.关闭tab,关闭其他tabs
因为默认的关闭tab的快捷键还涉及到要按“F4”的组合,我觉得操作起来不太方便,而且开关tab是个很常用的操作,因此我个人推荐设置成“Ctrl + Shift + Q”,原因如下:原来我还以为这个关闭tab的快捷键会和Chrome浏览器一样是“Ctrl + W”,结果发现AS的“Ctrl + W”是另一个很好用的功能,那就是扩展选中,为了避免冲突,再三考虑之后“close tab”就设置成“Ctrl + Shift + Q”了,于是“close others”就设置成“Alt + Shift + Q”了。和在Settings的keymap中搜索“tab”,还能找到其他的快捷键,读者可自行查看。
上面提到了“Ctrl + W”,用法的例子如下:
比如现在有一个字符串“Halohoop”,光标停在了“Ha”之后“lohoop”之前,“Ha↑lohoop”,如果我们要选中这个单词可以直接按“Ctrl + W”,读者实操一下就能上手了,还可以试一下多按几次“Ctrl + W”看看有什么效果。
好了,回到场景中,现在我想要挨个过一下打开的tabs,以决定要不要关闭它,于巨给个“Alt + 左或右”。
13.“Alt + 左或右”
我们切换tab不需要鼠标去点,“Alt + 左或右”即可。这个快捷键不仅在Editoer窗口中可以使用,在[1:Project](“Alt + 1”)或者[6:Android Monitor](“Alt + 6”)也可以使用。
文章到尾声了,还有一些有用的快捷键我就不套用情景去说了,在这里直接提一下。
14.“Ctrl + 上或下”,“Ctrl + Alt + Shift + 左或右”,滚动编辑区域的单行或者单字母
有时候我们使用鼠标滚轮可能不能很好的精确控制滚到某一行,所以可以使用滚轮,滚到附近的时候再使用“Ctrl + 上或下”。
左右的滚动也是,拖动可能不能很好的精确控制滚到某一列,使用“Ctrl + Alt + Shift + 左或右”。
15.Shift + F6,关联重命名,不用解释。
16.Alt + F12 打开/关闭终端Terminal
17.知道快捷键,但是想查找功能的名字
18.鼠标中键滚轮按着不放可以垂直选中
这个功能“Sublime”也有。其实和第8节中上中提到的多光标功能应该属于一套。
19.导出设置
换电脑或者重装系统的时候记得导出设置,这样自定义的快捷键就不会丢失了。
总结
因为AS基于IntelliJ IDAE,所以以上快捷键也基本适用于IntelliJ IDAE的其他变种,如WebStorm、PyCharm等。
当然鼠标也是很重要很重要的,我们的眼神已经习惯跟着鼠标来回移动,鼠标能够帮我们更加集中我们的目光和注意力,也是必不可少的,毕竟不可能只用到IDE而已,IDE以外的软件不可能全部离开鼠标,而且IDE中所有功能也并非使用键盘就能全部完成了,比如说精确调整[6:Android Monitor](“Alt + 6”)的高度,虽然也有快捷键,但是是按单位高度调整的。
记录这篇文章的目的,一是希望真的能够帮助到彼此提高效率,二是想好好玩味一下IDE的设计者为开发者到底能考虑到多么方便的程度,我想现在我内心应该已经有了答案了。
如果以后还有什么更好用的快捷键功能我也会更新到这篇博文的。
1.文章提到的快捷键预览表
这里我不写作用,看看用以回顾,看看能反应出来多少个.
- 1.Alt + F1,1
- 2.Alt + F1,0
- 3.Alt + F1,8
- 4.Esc
- 5.Ctrl + 左或右
- 6.Ctrl + [ 或 ]
- 7.Shift + 上下左右
- 8.Ctrl + Shift + [ 或 ]
- 9.Ctrl + Shift + 左或右
- 10.F4
- 11.Ctrl + Alt + 左或右
- 12.Ctrl + Shift + A
- 13.Alt + Enter
- 14.Ctrl + Shift + 回车
- 15.Ctrl + 回车
- 16.Ctrl + Alt + 回车
- 17.Shift + 回车
- 18.Alt + Shift不放开,鼠标点击其他位置
- 19.Alt + 上下
- 20.Ctrl + F12
- 21.Ctrl + F11
- 22.F11
- 23.Shift + F11
- 24.Ctrl + Alt + F7
- 25.Alt + F7
- 26.Ctrl + Shift + R
- 27.Ctrl + Shift + F
- 28.Ctrl + F
- 29.Gradle Sync
- 30.关闭tab,关闭其他tabs
- 31.Ctrl + W
- 32.Alt + 左或右
- 33.Ctrl + 上或下
- 34.Ctrl + Alt + Shift + 左或右
- 35.Shift + F6
- 36.鼠标中键滚轮按着不放
2.找快捷键:
- 1.Settings的Keymap中搜索关键字;
- 2.“Ctrl + Shift + A”搜索关键字;
- 2.鼠标悬停的提示中;
- 3.右键菜单中;
3.其他的提效方式——手势
如开头提到的,快捷键和手势都是一种提效方式,接下来也提一下手势。
其实,不仅仅是手机,在MAC,PC,浏览器,无不例外的出现了Gesture插件。
因为这不是本文重点,所以这里我只列举一些我自己平常在PC端用到软件或插件:
3.1.PC 端:StrokeIt。
这个真的很好用,还是开源的软件,一年前,为了表示支持,我还把我PayPal赚到的10多美元全部Donate给他了。
地址:http://www.tcbmi.com/strokeit/
3.2.热键小工具(myhotkey)
* [热键助手 v4.6.0 正式版](http://www.crsky.com/soft/2159.html)
* 支持设置热键打开各种软件、文件、文件夹,告别混乱的桌面快捷方式。
3.3.FireFox:
3.4.Chrome:
3.5.MAC
MAC显然是天生自带这些插件的功能的,天生丽质,对于我这种一个月只有几十毛捡破烂钱收入的人来说只能是一笑而过,诶。
最后,总而言之,言而总之(知难而退,退避三舍,舍近求远,远走高飞,飞檐走壁去去就来…突然很想成语接龙),快捷键就像女友,一直都在那里,只是你不去找而已,当然,像我这种颜值负数的人来说就另当别论了。
最最后,自强,共勉,卖牙膏霸气侧漏农村有文化的芖口钉 敬上。