在vim的使用过程中,会发现一些比较冷门但是也非常有用的命令,整理备忘一下。
修改一行开始和结尾都有比较方便的命令,但是当行比较长的时候,如果想移动到中间某个为止就比较麻烦,此时可以通过gm来首先移动到行的中间,然后再使用w/b甚至f/u来进行小范围移动。
在手动缩进一块代码的时候,通常会发现一次缩进不够,需要再次/多次缩进(当然也可以提前算好次数,使用次数前置)。对于大块文本的选择其实也不方便,所以希望可以重复上次选中的内容,这个时候就有这个宝藏命令了。
这些可以识别句子,段落,配对的大括弧等,对于经常使用C/C++语言开发极为方便。
在使用四个移动按键移动屏幕时速度非常慢,此时使用这几个命令可以快速的把鼠标移动到屏幕的最高、中间、最低位置。和ctrl + U/D比较,这个只是移动鼠标,不滚动屏幕,所以看起来更连续。而且这三个按键难得和动作匹配,也很容易记忆和使用。
还有通过ctrl + e 和 ctrl - y来直接将屏幕滚动。
文档说明了这个操作就是:s
的同义词,也就是重复上次替换,只是这次替换时不带替换flags的;如果需要保留上次替换的标志位,可以使用g&命令。
& Synonym for `:s` (repeat last substitute). Note that the flags are not remembered, thus it might
actually work differently. You can use `:&&` to keep
the flags.
*g&* g& Synonym for `:%s//~/&` (repeat last substitute with last search pattern on all lines with the same flags).
For example, when you first do a substitution with
`:s/pattern/repl/flags` and then `/search` for
something else, `g&` will do `:%s/search/repl/flags`.
Mnemonic: global substitute. {not in Vi}
在代码实现中,就是把这些单字符的操作替换换双字符操作。这种替换从程序实现的角度来看微不足道,但是作为使用者来说,少敲击一次键盘就是一次胜利。
static void
nv_optrans(cmdarg_T *cap)
{
static char_u *(ar[8]) = {(char_u *)"dl", (char_u *)"dh",
(char_u *)"d$", (char_u *)"c$",
(char_u *)"cl", (char_u *)"cc",
(char_u *)"yy", (char_u *)":s\r"};
static char_u *str = (char_u *)"xXDCsSY&";
///...
}
black hole "_ 比方说已经把一个内容拷贝到了寄存器中,光标移动到目标之后想把光标位置内容先删除掉,但是此时删除就会覆盖常用的默认寄存器,此时可以明确指定把操作结果放在黑洞寄存器中,从而避免覆盖已经存在的寄存器。当然也可以使用数字寄存器0,该值始终表存最近一次yank的内容;对应的数字1表示最近一次delete/change的内容(虽然两个数字相邻,但是它们在键盘上的位置是真远啊~)。
当前文件名 "% 在编辑源文件的时候,希望打开/创建相同文件名(不同后缀)的头文件,此时可以通过该寄存器获得文件名。
last search pattern"/ 一般会首先通过search确认可能修改的内容,然后再执行substitute命令,此时通过该寄存器可以获得上次搜索pattern字符串。
在代码中可能会用到一些自动生成的代码,此时就需要执行一个外部工具,将工具的输出直接插入到特定为止,此时就可以使用这个read命令,直接将脚本生成的命令插入到正在编辑的文本为止。
这个更方便的是可以内置识别C语言中的注释和宏定义的内容,这样在语法级别特定范围的选择就比较方便。
这个操作看起来是专门为C语言准备的:可以识别C语言的注释(早期C语言标准只支持这种注释)和宏指令,并且对于宏指示更加友好,即使光标不在指示引导符前面,只要光标后面没有括弧,还是会尝试搜索宏指示(毕竟,宏指示只可能在一行的开始)。
% Find the next item in this line after or under the
cursor and jump to its match. inclusive motion.
Items can be:
([{}]) parenthesis or (curly/square) brackets
(this can be changed with the
'matchpairs' option)
/* */ start or end of C-style comment
#if, #ifdef, #else, #elif, #endif
C preprocessor conditionals (when the
cursor is on the # or no ([{
following)
从代码的流程来看,在没有指定起始字符的时候,
/*
* findmatchlimit -- find the matching paren or brace, if it exists within
* maxtravel lines of the cursor. A maxtravel of 0 means search until falling
* off the edge of the file.
*
* "initc" is the character to find a match for. NUL means to find the
* character at or after the cursor. Special values:
* '*' look for C-style comment / *
* '/' look for C-style comment / *, ignoring comment-end
* '#' look for preprocessor directives
* 'R' look for raw string start: R"delim(text)delim" (only backwards)
*
* flags: FM_BACKWARD search backwards (when initc is '/', '*' or '#')
* FM_FORWARD search forwards (when initc is '/', '*' or '#')
* FM_BLOCKSTOP stop at start/end of block ({ or } in column 0)
* FM_SKIPCOMM skip comments (not implemented yet!)
*
* "oap" is only used to set oap->motion_type for a linewise motion, it can be
* NULL
*/
pos_T *
findmatchlimit(
oparg_T *oap,
int initc,
int flags,
int maxtravel)
{
///...
/*
* initc was not given, must look for something to match under
* or near the cursor.
* Only check for special things when 'cpo' doesn't have '%'.
*/
if (!cpo_match)
{
/* Are we before or at #if, #else etc.? */
ptr = skipwhite(linep);
if (*ptr == '#' && pos.col <= (colnr_T)(ptr - linep))
{
ptr = skipwhite(ptr + 1);
if ( STRNCMP(ptr, "if", 2) == 0
|| STRNCMP(ptr, "endif", 5) == 0
|| STRNCMP(ptr, "el", 2) == 0)
hash_dir = 1;
}
/* Are we on a comment? */
else if (linep[pos.col] == '/')
{
if (linep[pos.col + 1] == '*')
{
comment_dir = FORWARD;
backwards = FALSE;
pos.col++;
}
else if (pos.col > 0 && linep[pos.col - 1] == '*')
{
comment_dir = BACKWARD;
backwards = TRUE;
pos.col--;
}
}
else if (linep[pos.col] == '*')
{
if (linep[pos.col + 1] == '/')
{
comment_dir = BACKWARD;
backwards = TRUE;
}
else if (pos.col > 0 && linep[pos.col - 1] == '/')
{
comment_dir = FORWARD;
backwards = FALSE;
}
}
}
/*
* If we are not on a comment or the # at the start of a line, then
* look for brace anywhere on this line after the cursor.
*/
if (!hash_dir && !comment_dir)
{
/*
* Find the brace under or after the cursor.
* If beyond the end of the line, use the last character in
* the line.
*/
if (linep[pos.col] == NUL && pos.col)
--pos.col;
for (;;)
{
initc = PTR2CHAR(linep + pos.col);
if (initc == NUL)
break;
find_mps_values(&initc, &findc, &backwards, FALSE);
if (findc)
break;
pos.col += MB_PTR2LEN(linep + pos.col);
}
if (!findc)
{
/* no brace in the line, maybe use " #if" then */
if (!cpo_match && *skipwhite(linep) == '#')
hash_dir = 1;
else
return NULL;
}
///...
}
自觉不自觉、主动或被动的打开了很多窗口,最后想让整个世界清净起来,可以使用该命令让当前窗口成为only窗口。
vim的在线文档简洁、高效、详细、全面,却是是学习vim的最佳文档。vim的命令都是在使用过程中迭代的经验,也只有在使用过程中才能体会到这些它们的作用和命令的强大。
“人类的本质是复读机”,在文件编辑中有大量的重复,好的工具就是如何减少这些重复。进一步说,和所有的压缩算法一样,只要高效的处理了重复,就实现了效率的提升。
大家好,又见面了,我是你们的朋友全栈君。Java中的递归算法虽然简单,但想要精通也是有着一定的难度的,本篇文章我们就来详细了解下递归算法。什么是递归?一般的说,递归算法是一种直接或间接地调用自身的算法。在程序中,递归算法能够使算法的描述简洁而且易于理解。递归分几类?递归通常分为两类,直接递归和间接递归:1、直接递归称为方法自身调用自己。2、间接递归可以A方法调用B方法,B方法调用C方法,C方法调用A方法。递归怎么实现实现?例://递归实现九九乘法表publicclassdiguidemo{ publicstaticvoidmain(String[]args){ digui(9);}privatestaticvoiddigui(inti){ if(i==1){ System.out.println(“1*1=1”);}else{ digui(i–1);for(intj=1;j<=1;j++){ System.out.print(j+“*”+i+“=”+j*i+”“);}}}}//递归求和publicclassdiguiqiuhe{ publicstaticvoidmain(Stri
二.配置server{listen80;#动态访问转向tomcat处理location~\.(jsp|page|do)?${#以这些文件结尾的proxy_set_headerHost$host;proxy_set_headerX-Real-IP$remote_addr;proxy_passhttp://tomcat地址;}#设定访问静态文件直接读取不经过tomcatlocation~.*\.(htm|html|gif|jpg|jpeg|png|bmp|swf|ioc|rar|zip|txt|flv|mid|doc|ppt|pdf|xls|mp3|wma)${#以这些文件结尾的expires30d;#从硬盘读取root/usr/local/nginx/html;}}
1.return的作用 在Java中的return语句和方法有密切的关系,return语句用在方法中,有两个作用,一个是返回方法指定类型的值(这个值总是确定的),一个是结束方法的执行(仅仅一个return语句)。就像下边这样:packagecom.albertyy.other; /* *公众号:AlbertYang */ publicclassReturn{ publicstaticvoidmain(String[]args){ System.out.println(method1()); System.out.println(method2()); } //返回方法指定类型的值 publicstaticintmethod1(){ return1; } //在循环中使用,帮助你跳出或中止循环 publicstaticintmethod2(){ intcount=0; for(inti=0;i<10;i++){ count++; if(count==5){ returncount; } } returncount; } } 复制运行结果: 1 5return有一个特性就是一旦调用
序本文主要研究一下debezium的SnapshotChangeRecordEmitterSnapshotChangeRecordEmitterdebezium-v1.1.1.Final/debezium-core/src/main/java/io/debezium/relational/SnapshotChangeRecordEmitter.javapublicclassSnapshotChangeRecordEmitterextendsRelationalChangeRecordEmitter{ privatefinalObject[]row; publicSnapshotChangeRecordEmitter(OffsetContextoffset,Object[]row,Clockclock){ super(offset,clock); this.row=row; } @Override protectedOperationgetOperation(){ returnOperation.READ; } @Override protectedObject[]g
作者:FelDev 译者:前端小智 来源:medium1.模拟慢速网络和慢速设备我们可能习惯了在城市的网速,那是杠杠的,并不意味网速在中国哪个都一样的,在一些偏远地方,网速依然慢的可怜,所以有时候我们所做的产品是需要考虑网速慢的情况的,那怎么模拟呢?打开谷个浏览器的performance选项卡,然后单击右上角的齿轮图标就可以看到Newwork和CPU的模拟情况。2.颜色选择器单击表示颜色的小方块,弹出颜色选择器。启用颜色选择器后,可以将网页悬停并使用颜色选择器来获取该像素的颜色。弹出颜色选择器的小方块还有快捷键按住Shift并单击以更改颜色格式。3.AuditsAudits(审计),这个功能其实一直存在,只不过在chrome60之后,发生了翻天覆地的变化:引入了Google开源的另外一个项目:LightHouse。Audits主要从5个方面来给网页打分,最终会生成一个report:4.PrettyPrint(显示可读代码)我们知道许多网站都对Javascript代码进行了压缩,但这对开发者和学习者来说,读起来很费劲,谷歌提供一个功能给我们,可以更好查看压缩文件。我们点击下方的大括号{}
生活就是一系列下定决心的努力 ·正·文·来·啦·近来有朋友问我说,如何将windows上的文件上传到Linux服务器上?上传到VMware安装的虚拟机上?第一种仅限于安装桌面环境的虚拟服务器安装VMware-Tools,具体如何安装请点击VMware-Tools。第二种yum安装lrzszcentos服务器,可直接yum-yinstalllrzsz程序会自动安装好,然后如你要下载则sz[找到你要下载的文件]如果你要上传,则rz浏览找到你本机要上传的文件。需要注意的事这个命令无法在putty界面使用哦!在Linux系统中,可代替FTP上传和下载。(速度会慢一点)大概速度如下图:第三种上传利器来了FileZilla下载直通车:https://filezilla-project.org/FileZilla客户端是一个快速可靠的、跨平台的FTP,FTPS和SFTP客户端。具有图形用户界面(GUI)和很多有用的特性。 相比较于其它FTP客户端,FileZilla包含如下特性:易于使用支持FTP,FTP并支持SSL/TLS(FTPS)协议,支持SSH文件传输协议(SFTP)跨平台。在Windows
BasicStructureofPDAApushdownautomatonisawaytoimplementacontext-freegrammarinasimilarwaywedesignDFAforaregulargrammar.ADFAcanrememberafiniteamountofinformation,butaPDAcanrememberaninfiniteamountofinformation.Basicallyapushdownautomatonis−"Finitestatemachine"+"astack"Apushdownautomatonhasthreecomponents−aninputtape, acontrolunit,and astackwithinfinitesize. Thestackheadscansthetopsymbolofthestack.Astackdoestwooperations−Push−anewsymbolisaddedatthetop. Pop−thetopsymbolisreadandre
很早就用过Wireshark进行抓包分析,但当时写过滤表达式很是一知半解,多半是从网上抄来的,根本没理解过滤表达式的含义。今天有幸看到一篇tcpdump入门使用技巧,看了下感觉挺好,终于知道到底怎么写过滤表达式了,这里转载过来备忘一下。以下内容转载自这里http://linuxwiki.github.io/NetTools/tcpdump.html基本语法过滤主机抓取所有经过eth1,目的或源地址是192.168.1.1的网络数据tcpdump-ieth1host192.168.1.1复制指定源地址tcpdump-ieth1srchost192.168.1.1复制指定目的地址tcpdump-ieth1dsthost192.168.1.1复制过滤端口抓取所有经过eth1,目的或源端口是25的网络数据tcpdump-ieth1port25复制指定源端口tcpdump-ieth1srcport25复制指定目的端口tcpdump-ieth1dstport25复制网络过滤tcpdump-ieth1net192.168 tcpdump-ieth1srcnet192.168 tcpdump-ieth
前言: [本文属于原创分享文章,转载请注明出处,谢谢.] 前面已经有文章说了DBUtils的一些特性,这里再来详细说下QueryRunner的一些内部实现,写的有错误的地方还恳请大家指出. QueryRunner类QueryRunner中提供对sql语句操作的API 它主要有三个方法 query()用于执行select update()用于执行insert/update/delete batch()批处理 1,Query语句 先来看下query的两种形式,我们这里主要讲第一个方法,因为我们用C3P0来统一管理connection.(QueryRunnerqr=newQueryRunner(C3P0Utils.getDataSource())) query(sql,ResultSetHandler,Object...params); query(conn,sql,ResultSetHandler,Object...params);第一种:不需要params//查询所有图书 publicList<Book>selectAllBooks()throwsSQLExcept
总结了几种css居中实现的方式,注:*为常用方式,“wrap”为容器,“div”为要居中的元素。 *1.绝对定位,宽高都已知的情况下如下代码可实现,或者可以使用negativemargins; .div{ width:200px; height:200px; margin:auto; position:absolute; top:0;left:0;bottom:0;right:0; }复制 2.不知道元素的宽高,仅仅实现某个div是其父的1/2,水平垂直居中,随着父元素的大小等比例放大或者缩小。 .div{ position:absolute; left:30%; right:30%; top:25%; bottom:25%; } 复制 *3.translate,宽度已知,高度未知的情况下 .wrap{ width:200px;//也可以不写,默认占总宽度的50% position:absolute; top:50%; left:50%; transform:translate(-50%,-50%); -webkit-transform:translate(-50%,-50%
前言 堪称完美的截图工具--flameshot,windows上人们习惯性的使用QQ自带的截图工具Ctrl+Alt+A或者WeChat自带的截图工具Alt+A,若您是一位使用聊天工具截图多年的"老司机",那么flameshot用起来将会得心应手,相信我,你会爱上它的!(废话不多说,安装使用方法如下) 1、下载与安装 1.1、下载flameshot 有两种方式可以安装flameshot软件: <1>通过apt下载 #Ubuntu18.04以上版本 sudoapt-getinstallflameshot 复制 <2>通过git下载源码安装最新版本 gitclonehttps://github.com/flameshot-org/flameshot.git cdflameshot #由于flameshot是由Qt开发的图形界面软件,编译需要安装qmake以及相关依赖 sudoaptinstall-ygitg++build-essentialqt5-qmakeqt5-defaultqttools5-dev-tools qmake sudomakeinstall 复制
前面介绍了SpringBoot中的整合Redis缓存已经如何实现数据缓存功能。不清楚的朋友可以看看之前的文章:https://www.cnblogs.com/zhangweizhong/category/1657780.html。 今天主要讲解Springboot整合定时任务。在SpringMvc中也会用到很多的定时任务,主要是通过Quartz实现。但是在SpringMVC中使用这些插件相对还是比较麻烦的:要增加一些依赖包,然后加入各种配置等等。SpringBoot相对就简单很多了,现在就来说说SpringBoot是怎么实现定时任务的。 一、使用注解@EnableScheduling 在application启动类忠,加上@EnableScheduling注解,SpringBoot会会自动扫描任务类,开启定时任务。 packagecom.weiz; importorg.springframework.boot.SpringApplication; importorg.springframework.boot.autoconfigure.SpringBootAp
1.连接电脑,打开xcode 2.查看log 3.导出log。然后进行解析 4. 找到Xcode自带的symbolicatecrash工具(我的是/Applications/Xcode.app/Contents/SharedFrameworks/DVTFoundation.framework/Versions/A/Resources/symbolicatecrash) 复制symbolicatecrash工具至crash文件夹中; 下载被测应用符号集文件【以fawkes出包为例】 4.1.下载被测包内容中 archive文件:https://macross-jks.bilibili.co/archive/fawkes/pack/iphone/3584423/enter/bili-universal.app.dSYM.zip文件; 4.2.解压到crash文件中; 使用symbolicatecrash工具解析崩溃日志  
1.命令模式与编辑模式切换a:光标向后移动一位进入编辑模式i:光标和内容没有变化进入编辑模式o:新起一行进入编辑模式s:删除光标所在字符进入编辑模式 2.尾行模式操作:w//对编辑后的文档进行保存:q//退出vi编辑器:wq//保存并退出编辑器:q!//强制退出(不保存):w!//强制保存:wq!//强制保存退出 :setnumber或nu//给编辑器设置行号:setnonumber或nonu//取消行号设置:n(数字)//光标定位到第n行:/内容/或/内容//内容查找(n下一个N上一个) 内容替换(cont1替换为cont2):s/cont1/cont2///替换光标所在行的第一个目标:s/cont1/cont2/g//替换光标所在行的全部目标:%s/cont1/cont2/g//替换整个文档的全部目标 3.命令模式操作1)光标移动①字符级上(k)下(j)左(h)右(l)键②单词级w:word下个单词首字母b:before上(本)个单词首字母e:end下(本)个单词尾字母③行级$:定位到行尾0:定位到行首④段落级(翻屏){:上(本)个段落首部}:下(本)个段落尾部⑤屏幕
库名称简介 Chardet字符编码探测器,可以自动检测文本、网页、xml的编码。 colorama主要用来给文本添加各种颜色,并且非常简单易用。 Prettytable主要用于在终端或浏览器端构建格式化的输出。 difflib,[Python]标准库,计算文本差异Levenshtein,快速计算字符串相似度。 fuzzywuzzy字符串模糊匹配。 esmre正则表达式的加速器。 shortuuid一组简洁URL/UUID函数库。 ftfy,Unicode文本工具7 unidecode,ascii和Unicode文本转换函数。 xpinyin,将汉字转换为拼音的函数库 pangu.py,调整对中日韩文字当中的字母、数字间距。 pyfiglet,Python写的figlet程序,使用字符组成ASCII艺术图片 uniout,提取字符串中可读写的字符 awesomeslugify,一个Pythonslugify库,用于处理Unicode。 python-slugify,转换Unicode为ASCII内码的slugify函数库。 unicode-slugify,生成unicode内码,Djan
软件测试·为什么需要软件测试 一个事物的出现是服务于另一个事物的存在的,软件测试的出现就是服务于软件开发的存在。 对于软件产品本身而言,软件测试可以限制产品以事先约定的“正常操作”完成既定正确范围的要求,保证软件以正确的方式完成了甲方所期望的事情。 对于软件开发流程而言,如果一个软件产品在测试阶段检查出很多缺陷,根据“蟑螂理论”,我们有很大的把握断定整个开发团队在这个产品的开发过程中存在较大问题,需要进行反思和完善。 对于软件开发团队而言,由于团队成员存在需求理解、技术掌握程度程度、编程风格上的差异(西雅图Microsoft的很多印度老哥就喜欢使用语言黑魔法疯狂炫技)和人的情绪化、疲惫等因素,常常会产出很多bug。软件测试可以提供给开发团队很多反馈信息来进行软件优化。 对于管理层而言,软件测试还可以提供一些反馈信息(如哪一个Java后端工程师老是写bug,代码也不优雅),从而进行风险评估、整个团队的优化性调整等工作。
前言 啦啦啦~(博主每次开篇都要卖个萌,大家是不是都厌倦了呢~) 本篇博文希望帮助大家掌握Broadcast编程基础,实现动态注册Broadcast和静态注册Broadcast的方式以及学会使用Notification。 基础知识 BraodcastReceiver(广播接收器)是为了实现系统广播(Notification)而提供的一种组件,它和事件处理机制类似,但是事件处理机制是程序组件级别的,而广播事件处理机制是系统级别的。比如,我们可以发出一种广播来测试手机电量的变化,这时候就可以定义一个BraodcastReceiver来接受广播,当手机电量较低时提示用户。它是一个系统全局的监听器,用于监听系统全局的Broadcast消息,所以它可以很方便的进行系统组件之间的通信。 BroadcastReceiver虽然是一个监听器,但是它和之前用到的OnXxxListener不同,那些只是程序级别的监听器,运行在指定程序的所在进程中,当程序退出的时候,OnXxxListener监听器也就随之关闭了,但是BroadcastReceiver属于系统级的监听器,它拥有自己的进程,只