Cat Blog / zh-CN 猫粮的博客 Fri, 09 Apr 2021 14:42:36 +0800 Fri, 09 Apr 2021 14:42:36 +0800 Handsome 7.X 修改记录 /index.php/archives/146/ /index.php/archives/146/ Mon, 19 Oct 2020 12:40:00 +0800 猫粮d 前言

Handsome主题又更新了,改动挺大的,还好之前有记录,摸索着又加了个性化内容。

[scode type="yellow"]修改前务必先备份[/scode]

超链接特效

超链接特效

修改 /usr/themes/handsome/assets/css/handsome.min.css , 删除这两节:

.comment-content-true a:hover,.wrapper-lg .entry-content a:hover{
color:#222;border-bottom-color:#222
}
.comment-content-true a,.wrapper-lg .entry-content a{
color:#58666e;border-bottom-color:#222;border-bottom:1px solid #999;word-wrap:break-word;word-break:break-all
}

自定义CSS:

/*超链接特效*/
.comment-content-true a:not(.light-link):not(.post_inser_a),.wrapper-lg .entry-content a:not(.light-link):not(.post_inser_a){position:relative;margin:auto 4px;color:#23b7e5;-webkit-transition:color .3s;transition:color .3s;-webkit-perspective:600px;perspective:600px;-webkit-perspective-origin:50% 100%;perspective-origin:50% 100%;word-wrap:break-word;word-break:break-all;white-space:nowrap;text-overflow:ellipsis;overflow:hidden;max-width:inherit;width:inherit}
.comment-content-true a:not(.light-link):not(.post_inser_a):focus,.comment-content-true a:not(.light-link):not(.post_inser_a):hover,.wrapper-lg .entry-content a:not(.light-link):not(.post_inser_a):focus,.wrapper-lg .entry-content a:not(.light-link):not(.post_inser_a):hover{color:#fff}
.comment-content-true a:not(.light-link):not(.post_inser_a)::after,.comment-content-true a:not(.light-link):not(.post_inser_a)::before,.wrapper-lg .entry-content a:not(.light-link):not(.post_inser_a)::after,.wrapper-lg .entry-content a:not(.light-link):not(.post_inser_a)::before{position:absolute;top:0;left:-4px;z-index:-1;box-sizing:content-box;padding:0 4px;width:100%;height:100%;content:''}
.comment-content-true a:not(.light-link):not(.post_inser_a)::before,.wrapper-lg .entry-content a:not(.light-link):not(.post_inser_a)::before{background-color:#23b7e5;-webkit-transition:-webkit-transform .2s;transition:transform .2s;-webkit-transition-timing-function:cubic-bezier(.7,0,.3,1);transition-timing-function:cubic-bezier(.7,0,.3,1);-webkit-transform:rotateX(90deg);transform:rotateX(90deg);-webkit-transform-origin:50% 100%;transform-origin:50% 100%}
.comment-content-true a:not(.light-link):not(.post_inser_a):focus::before,.comment-content-true a:not(.light-link):not(.post_inser_a):hover::before,.wrapper-lg .entry-content a:not(.light-link):not(.post_inser_a):focus::before,.wrapper-lg .entry-content a:not(.light-link):not(.post_inser_a):hover::before{-webkit-transform:rotateX(0);transform:rotateX(0)}
.comment-content-true a:not(.light-link):not(.post_inser_a)::after,.wrapper-lg .entry-content a:not(.light-link):not(.post_inser_a)::after{border-bottom:1px solid #23b7e5}

如果使用版权提示插件,链接有可能会超出提示框,添加以下css解决:

.content-copyright {overflow: hidden}

自定义左侧栏

左侧栏导航

[scode type="yellow"]有一定风险,修改前一定要先备份[/scode]

文件路径 /usr/themes/handsome/component/aside.php,大概在85行~212行,替换 <div class="line dk hidden-folded"></div><?php endif; ?>之间的内容:

<div class="line dk hidden-folded"></div>
<li class="hidden-folded padder m-t m-b-sm text-muted text-xs">
    <span><?php _me("导航") ?></span>
</li>
<?php
$hideHomeItem = false;
if (!empty(Typecho_Widget::widget('Widget_Options')->asideItems)) {
    $json = '[' . Utils::remove_last_comma(Typecho_Widget::widget('Widget_Options')->asideItems) . ']';
    $asideItems = json_decode($json);
    $asideItemsOutput = "";
    foreach ($asideItems as $asideItem) {
        @$itemName = $asideItem->name;
        @$itemStatus = $asideItem->status;
        @$itemSub = $asideItem->sub;
        if ($itemName === 'home' && strtoupper($itemStatus) === 'HIDE') {
            $hideHomeItem = true;
            continue; //本次循环结束,不再执行下面内容
        }
        $haveSub = false;
        $subListHtml = "";
        //                      print_r($itemSub);
        if (is_array($itemSub)) {
            $haveSub = true;
            $subListHtml .= '<ul class="nav nav-sub dk">';
            foreach ($itemSub as $subItem) {
                $subListHtml .= Content::returnLeftItem($subItem, false, "");
            }
            $subListHtml .= '</ul>';
        }
        $asideItemsOutput .= Content::returnLeftItem($asideItem, $haveSub, $subListHtml);
    }
}
?>
<?php if (!$hideHomeItem) : ?>
    <!--主页-->
    <li>
        <a href="<?php $this->options->rootUrl(); ?>/" class="auto">
            <span class="nav-icon"><i data-feather="home"></i></span>
            <span><?php _me("博客首页") ?></span>
        </a>
    </li>
    <!-- /主页 -->
<?php endif; ?>
<?php echo @$asideItemsOutput ?>
<?php if (@!in_array('component', $this->options->asideSetting)) : ?>
    <!--分类category-->
    <li>
        <a href="https://chrxw.com" class="auto">
            <span class="nav-icon"><i data-feather="gift"></i></span>
            <span><?php _me("一级分类") ?></span>
        </a>
    </li>
    <li <?php echo $class; ?>>
        <a class="auto">
            <span class="pull-right text-muted">
                <i class="fontello icon-fw fontello-angle-right text"></i>
                <i class="fontello icon-fw fontello-angle-down text-active"></i>
            </span>
            <span class="nav-icon"><i data-feather="grid"></i></span>
            <span><?php _me("更多分类") ?></span>
        </a>
        <ul class="nav nav-sub dk">
            <li class="nav-sub-header">
                <a>
                    <span><?php _me("分类") ?></span>
                </a>
            </li>
            <!--二级分类-->
            <li>
                <a href="https://chrxw.com/" class="auto">
                    <span class="nav-icon"><i data-feather="gift"></i></span>
                    <span><?php _me("二级分类") ?></span>
                </a>
            </li>
        </ul>
    </li>
    <!--独立页面pages-->
    <li class="hidden-folded padder m-t m-b-sm text-muted text-xs">
        <span><?php _me("页面") ?></span>
    </li>
    <li class="nav-sub-header">
        <a data-no-instant>
            <span><?php _me("页面") ?></span>
        </a>
    </li>
    <!--友情链接-->
    <li>
        <a class="auto">
            <span class="pull-right text-muted">
                <i class="fontello icon-fw fontello-angle-right text"></i>
                <i class="fontello icon-fw fontello-angle-down text-active"></i>
            </span>
            <span class="nav-icon"><i data-feather="link"></i></span>
            <span><?php _me("友链墙") ?></span>
        </a>
        <ul class="nav nav-sub dk">
            <li class="nav-sub-header">
                <a data-no-instant>
                    <span><?php _me("友链") ?></span>
                </a>
            </li>
            <!--使用links插件,输出全站友链-->
            <?php $mypattern1 = "<li data-original-title=\"\" data-toggle=\"tooltip\" 
data-placement=\"top\"><a href=\"{url}\" target=\"_blank\"><span>{name}</span></a></li>";
            Handsome_Plugin::output($mypattern1, 0, "ten"); ?>
        </ul>
    </li>
    <li>
        <a href="https://chrxw.com/" class="auto">
            <span class="nav-icon"><i data-feather="gift"></i></span>
            <span><?php _me("独立页面") ?></span>
        </a>
    </li>
<?php endif; ?>

导航模板:

<li>
    <a href="链接" class="auto">
        <span class="nav-icon"><i data-feather="图标"></i></span>
        <span><?php _me("名称") ?></span>
    </a>
</li>

自定义光标

自定义光标

[scode type="green"]图标素材下载:链接[/scode]

解压后上传服务器,nomral.cur是默认光标,link.cur是手掌光标。

以下内容放进自定义CSS里,路径自行修改。

/*自定义光标*/
*{
cursor:url(?usr/customize/normal.cur),auto!important
}
a,a *,button,button *,div.OwO-logo,div.OwO-logo *,div.panel-collapse,div.panel-collapse *,li.OwO-item,ul.OwO-packages *{
cursor:url(?usr/customize/link.cur),auto!important
}

增加滑稽表情,微调表情栏

表情栏效果

[scode type="green"]这里编辑标下载链接:改版滑稽表情包.zip[/scode]

食用方法:

  • 下载表情包以后先解压
  • huaji文件夹丢进/usr/themes/handsome/assets/img/emotion/
  • OwO.json替换掉/usr/themes/handsome/usr/OwO.json
  • 如果嫌表情太大,可以在自定义CSS里加上这些:
img[class^="emotion-"] {max-height: 3em !important}
  • 去除烦人的OwO标题:

打开 /usr/themes/handsome/assets/js/features/OwO.min.js,删除这句:

<div class="OwO-title"><span>OwO</span></div

404页面添加返回按钮

修改后的404页

打开 /usr/themes/handsome/404.php
在第 95行左右,把 <div class="list-group bg-info auto m-b-sm m-b-lg">后面插入:

  <div class="list-group bg-info auto m-b-sm m-b-lg">
  <!--返回按钮-->
    <a href="#" onclick="javascript:history.go(-1);" class="list-group-item">
      <i class="fontello fontello-chevron-right text-muted"></i>
      <i class="fontello fontello-fw fontello-angle-double-left m-r-xs"></i>?<?php _me("返回") ?>
    </a>
  <!--原来的按钮-->
    <a href="<?php $this->options->rootUrl(); ?>" class="list-group-item">
      <i class="fontello fontello-chevron-right text-muted"></i>
      <i class="fontello fontello-fw fontello-home m-r-xs"></i>?<?php _me("首页") ?>
    </a>
  <!--后续省略-->
  </div

Mac风格代码框

[scode type="green"]插件下载&食用方法:链接[/scode]

稍微改了下BlackMac的主题,去除了阴影,然后让复制按钮和代码类型一直显示。

文件路径:/usr/plugins/CodePrettify/static/styles/BlackMac.css

code[class*=language-],pre[class*=language-]{color:#f8f8f2;text-shadow:0 1px rgba(0,0,0,.3);font-family:Consolas,Monaco,'Andale Mono','Ubuntu Mono',monospace;text-align:left;white-space:pre;word-spacing:normal;word-break:normal;word-wrap:normal;line-height:2;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-hyphens:none;-moz-hyphens:none;-ms-hyphens:none;hyphens:none;font-size:13px}pre[class*=language-]{padding:.5em;margin:.5em 0;overflow:auto}:not(pre)>code[class*=language-],pre[class*=language-]{background:#21252a}:not(pre)>code[class*=language-]{padding:.1em;border-radius:.3em;white-space:normal}.token.cdata,.token.comment,.token.doctype,.token.prolog{color:#997f66}.token.punctuation{opacity:.7}.namespace{opacity:.7}.token.boolean,.token.constant,.token.number,.token.property,.token.symbol,.token.tag{color:#d1939e}.token.attr-name,.token.builtin,.token.char,.token.inserted,.token.selector,.token.string{color:#bce051}.language-css .token.string,.style .token.string,.token.entity,.token.operator,.token.url,.token.variable{color:#f4b73d}.token.atrule,.token.attr-value,.token.keyword{color:#d1939e}.token.important,.token.regex{color:#e90}.token.bold,.token.important{font-weight:700}.token.italic{font-style:italic}.token.entity{cursor:help}.token.deleted{color:red}pre.line-numbers{padding-left:3.3em;counter-reset:linenumber}pre.line-numbers>code{white-space:inherit font-size: 15px}.line-numbers .line-numbers-rows{position:absolute;pointer-events:none;top:0;font-size:100%;left:0;width:3em;letter-spacing:-1px;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.line-numbers-rows>span{pointer-events:none;display:block;counter-increment:linenumber}.line-numbers-rows>span:before{content:counter(linenumber);color:#999;display:block;padding-right:.9em;text-align:right;background:#272c33}div.code-toolbar{font-size:100%;border-radius:4px;position:relative;padding-top:30px;background-color:#161616;margin:20px 0 20px 0}.code-toolbar:before{content:" ";position:absolute;-webkit-border-radius:50%;border-radius:50%;background:#fc625d;width:11px;height:11px;left:10px;top:10px;z-index:2}div.code-toolbar>.toolbar{padding-right:.4em;position:absolute;top:.09em;right:.2em;width:100%;text-align:center}div.code-toolbar>.toolbar .toolbar-item{padding:0 1px 1px 3px;display:inline-block}div.code-toolbar>.toolbar button{cursor:pointer;position:absolute;background-color:transparent;right:2px;top:4px;font-size:12px;line-height:12px;padding:3px 5px;border:none;color:#fff}div.code-toolbar>.toolbar:hover{text-decoration:none!important}div.code-toolbar>.div.code-toolbar>.toolbar button,div.code-toolbar>.toolbar span{font-family:Ubuntu,sans-serif;font-weight:700;font-size:.9em;color:#fff}#post-content .code-block-fullscreen{padding-top:32px;position:fixed;width:80vw;height:80vh;min-height:80vh;top:0;left:0;right:0;bottom:0;margin:auto;z-index:9999999;animation:elastic 1s;overflow:hidden;background:#21252a}.code-block-fullscreen code{--widthA:100%;--widthB:calc(var(--widthA) - 30px);height:var(--widthB);min-height:99%;overflow-y:scroll;height:100%}.code-block-fullscreen-html-scroll{overflow:hidden}.shelter{width:6.5px;height:6.5px;z-index:100;background:#313238;position:absolute;bottom:0;right:0}.max-img::-webkit-scrollbar-track-piece{background:#eee}.max-img::-webkit-scrollbar{width:8px;height:6px}.max-img::-webkit-scrollbar-thumb{border-radius:6px;background-color:#777}.max-img::-webkit-scrollbar-thumb:hover{background-color:#bbb}pre::-webkit-scrollbar{width:8px;height:6px}pre::-webkit-scrollbar-thumb{border-radius:4px;background-color:#cbcbcb}pre::-webkit-scrollbar-thumb:hover{background-color:#bbb}code::-webkit-scrollbar{width:6px;height:6px}code::-webkit-scrollbar-thumb{border-radius:6px;background-color:#777}code::-webkit-scrollbar-thumb:hover{background-color:#bbb}html::-webkit-scrollbar-track-piece{background:#eee}html::-webkit-scrollbar{width:8px;height:6px}html::-webkit-scrollbar-thumb{border-radius:4px;background-color:#cbcbcb}html::-webkit-scrollbar-thumb:hover{background-color:#bbb}

复制后提示 (与5.3.1相同)

[scode type="green"]layer下载地址:链接[/scode]

  1. 解压后把layer文件夹丢进/usr/customize/
  2. 添加自定义javascript

    document.body.oncopy = function() {layer.msg('复制成功,转载请保留原文链接!');};
  3. 添加尾部HTML代码:
<script src="/usr/customize/layer/layer.js"></script>

其他微调

添加到自定义CSS里:

/* 右侧栏气泡颜色加深 */
div.post-tags>a,aside.asideBar .badge{background-color:#777}
/* 时光机圆形头像 */
.img-square {border-radius: 50%;}
.list-group-item .thumb-sm .img-square {border-radius: 5px;}
]]>
0 /index.php/archives/146/#comments /index.php/feed/archives/146/
C语言格式输出函数printf()详解 /index.php/archives/313/ /index.php/archives/313/ Fri, 09 Apr 2021 14:42:36 +0800 猫粮d printf函数称为格式输出函数,其关键字最末一个字母f即为“格式”(format)之意。其功能是按用户指定的格式,把指定的数据显示到显示器屏幕上。在前面的例题中我们已多次使用过这个函数。## printf函数调用的一般形式

printf函数是一个标准库函数,它的函数原型在头文件“stdio.h”中。但作为一个特例,不要求在使用 printf 函数之前必须包含stdio.h文件。printf函数调用的一般形式为:
printf(“格式控制字符串”, 输出表列)
其中格式控制字符串用于指定输出格式。格式控制串可由格式字符串和非格式字符串两种组成。格式字符串是以%开头的字符串,在%后面跟有各种格式字符,以说明输出数据的类型、形式、长度、小数位数等。如:* “%d”表示按十进制整型输出;

  • “%ld”表示按十进制长整型输出;
  • “%c”表示按字符型输出等。

非格式字符串原样输出,在显示中起提示作用。输出表列中给出了各个输出项,要求格式字符串和各输出项在数量和类型上应该一一对应。

【例4-3】printf函数举例

  1. #include

  2. int main(void)

    {

  3. int a=88,b=89

    ;

  4. printf("%d %d\n",a,b

    );

  5. printf("%d,%d\n",a,b

    );

  6. printf("%c,%c\n",a,b

    );

  7. printf("a=%d,b=%d",a,b

    );

  8. return 0

    ;

  9. }

本例中四次输出了a、b的值,但由于格式控制串不同,输出的结果也不相同。第3行的输出语句格式控制串中,两格式串%d 之间加了一个空格(非格式字符),所以输出的a、b值之间有一个空格。第4行的printf语句格式控制串中加入的是非格式字符逗号,因此输出的a、b值之间加了一个逗号。第5行的格式串要求按字符型输出a、b值。第6行中为了提示输出结果又增加了非格式字符串。## 格式字符串

在Turbo C中格式字符串的一般形式为:
标志.精度类型。
其中方括号[]中的项为可选项。

各项的意义介绍如下。

1) 类型

类型字符用以表示输出数据的类型,其格式符和意义如下表所示:格式字符意义
d以十进制形式输出带符号整数(正数不输出符号)
o以八进制形式输出无符号整数(不输出前缀0)
x,X以十六进制形式输出无符号整数(不输出前缀Ox)
u以十进制形式输出无符号整数
f以小数形式输出单、双精度实数
e,E以指数形式输出单、双精度实数
g,G以%f或%e中较短的输出宽度输出单、双精度实数
c输出单个字符
s输出字符串

2) 标志

标志字符为 -、+、# 和空格四种,其意义下表所示:标 志意义
-结果左对齐,右边填空格
+输出符号(正号或负号)
空格输出值为正时冠以空格,为负时冠以负号
#对c、s、d、u类无影响;<br/>对o类,在输出时加前缀o;<br/>对x类,在输出时加前缀0x;<br/>对e、g、f 类当结果有小数时才给出小数点。

3) 输出最小宽度
用十进制整数来表示输出的最少位数。若实际位数多于定义的宽度,则按实际位数输出,若实际位数少于定义的宽度则补以空格或0。

4) 精度
精度格式符以“.”开头,后跟十进制整数。本项的意义是:如果输出数字,则表示小数的位数;如果输出的是字符,则表示输出字符的个数;若实际位数大于所定义的精度数,则截去超过的部分。

5) 长度
长度格式符为h、l两种,h表示按短整型量输出,l表示按长整型量输出。

【例4-4】

  1. #include

  2. int main(void)

    {

  3. ?? int a=15

    ;

  4. ?? long float b=123.1234567

    ;

  5. ???

    // 原来b的定义为 float b=123.1234567;

  6. ??? // 经读者@邓小良

    反馈,笔者发现会溢出,在前面加了long

  7. ?? double c=12345678.1234567

    ;

  8. ?? char d='p'

    ;

  9. ?? printf("a=%d\n", a

    );

  10. ?? printf("a(%%d)=%d, a(%%5d)=%5d, a(%%o)=%o, a(%%x)=%x\n\n",a,a,a,a);?

    // %% 可以输出 %

  11. ?? printf("a=%f\n", b

    );

  12. ?? printf("b(%%f)=%f, b(%%lf)=%lf, b(%%5.4lf)=%5.4lf, b(%%e)=%e\n\n",b,b,b,b

    );

  13. ?? printf("c=%f\n", c

    );

  14. ?? printf("c(%%lf)=%lf, c(%%f)=%f, c(%%8.4lf)=%8.4lf\n\n",c,c,c

    );

  15. ?? printf("d=%c\n", d

    );

  16. ?? printf("d(%%c)=%c, d(%%8c)=%8c\n",d,d

    );

  17. ?? return 0

    ;

  18. }

运行结果:

本例中:* 第11行以四种格式输出整型变量a的值,其中“%5d ”要求输出宽度为5,而a值为15只有两位故补三个空格。

  • 第14行以四种格式输出实型量b的值。其中“%f”和“%lf ”格式的输出相同,说明“l”符对“f”类型无影响。“%5.4lf”指定输出宽度为5,精度为4,由于实际长度超过5故应该按实际位数输出,小数位数超过4位部分被截去。
  • 第17行输出双精度实数,“%8.4lf ”由于指定精度为4位故截去了超过4位的部分。
  • 第20行输出字符量d,其中“%8c ”指定输出宽度为8故在输出字符p之前补加7个空格。

使用printf函数时还要注意一个问题,那就是输出表列中的求值顺序。不同的编译系统不一定相同,可以从左到右,也可从右到左。Turbo C是按从右到左进行的。请看下面两个例子。

【例4-5】在一个printf()里输出

  1. #include

  2. int main(void)

    {

  3. int i=8

    ;

  4. printf("The raw value: i=%d\n", i

    );

  5. printf("++i=%d \n++i=%d \n--i=%d \n--i=%d\n",++i,++i,--i,--i

    );

  6. return 0

    ;

  7. }

运行结果:
The raw value: i=8
++i=8
++i=7
--i=6
--i=7

【例4-6】在多个printf()里输出

  1. #include

  2. int main(void)

    {

  3. int i=8

    ;

  4. printf("The raw value: i=%d\n", i

    );

  5. printf("++i=%d\n", ++i

    );

  6. printf("++i=%d\n", ++i

    );

  7. printf("--i=%d\n", --i

    );

  8. printf("--i=%d\n", --i

    );

  9. return 0

    ;

  10. }

运行结果:
The raw value: i=8
++i=9
++i=10
--i=9
--i=8

这两个程序的区别是用一个printf语句和多个printf 语句输出。但从结果可以看出是不同的。为什么结果会不同呢?就是因为printf函数对输出表中各量求值的顺序是自右至左进行的。

但是必须注意,求值顺序虽是自右至左,但是输出顺序还是从左至右,因此得到的结果是上述输出结果。

注意:经读者@龍騰浩少反馈,我们发现原来的例子在VC6.0下计算过程比较复杂,不能直观的说明自右向左的求值顺序。上面的代码是修改后的,修改日期为 2014-07-05。

下面是老代码及分析:> 【例4-5】

main(){
int i=8;
printf("%dn%dn%dn%dn%dn%dn",++i,--i,i++,i--,-i++,-i--);
}

【例4-6】
main(){
int i=8;
printf("%dn",++i);
printf("%dn",--i);
printf("%dn",i++);
printf("%dn",i--);
printf("%dn",-i++);
printf("%dn",-i--);
}

这两个程序的区别是用一个printf语句和多个printf 语句输出。但从结果可以看出是不同的。为什么结果会不同呢?就是因为printf函数对输出表中各量求值的顺序是自右至左进行的。在第一例中,先对最后一项“-i--”求值,结果为-8,然后i自减1后为7。 再对“-i++”项求值得-7,然后i自增1后为8。再对“i--”项求值得8,然后i再自减1后为7。再求“i++”项得7,然后i再自增1后为8。 再求“--i”项,i先自减1后输出,输出值为7。 最后才求输出表列中的第一项“++i”,此时i自增1后输出8。

]]>
0 /index.php/archives/313/#comments /index.php/feed/archives/313/
七种排序方法(稳定性、空间复杂度、时间复杂度)分析总结 /index.php/archives/311/ /index.php/archives/311/ Mon, 29 Mar 2021 18:23:00 +0800 猫粮d 这里写图片描述

]]>
0 /index.php/archives/311/#comments /index.php/feed/archives/311/
完全二叉树求其叶子结点(学习笔记) /index.php/archives/309/ /index.php/archives/309/ Sat, 27 Mar 2021 20:21:33 +0800 猫粮d 一颗完全二叉树共有101个结点,他有( )叶子结点。
解析: 由2^6-1<101<2^7-1
所以该完全二叉树有7层,前6层满的有63个结点
第6层有2^5=32个结点
所以第七层有101-63=38个叶子结点
由于第7层是第六层的延伸,则应该去掉第六层有子树的结点→ 38/2=19个
故推出第六层有叶子结点32-19=13个
再加上第七层的38个
一共13+38=51个

]]>
0 /index.php/archives/309/#comments /index.php/feed/archives/309/
C语言运算符的优先级和结合性一览表 /index.php/archives/308/ /index.php/archives/308/ Mon, 15 Mar 2021 16:03:09 +0800 猫粮d 优先级运算符名称或含义使用形式结合方向说明1[]数组下标数组名[常量表达式]左到右 ()圆括号(表达式)/函数名(形参表) .成员选择(对象)对象.成员名 ->成员选择(指针)对象指针->成员名 2-负号运算符-表达式右到左单目运算符(类型)强制类型转换(数据类型)表达式 ++自增运算符++变量名/变量名++单目运算符 --自减运算符--变量名/变量名--单目运算符 *取值运算符*指针变量单目运算符 &取地址运算符&变量名单目运算符 !逻辑非运算符!表达式单目运算符 ~按位取反运算符~表达式单目运算符 sizeof长度运算符sizeof(表达式) 3/除表达式/表达式左到右双目运算符*乘表达式*表达式双目运算符 %余数(取模)整型表达式/整型表达式双目运算符 4+加表达式+表达式左到右双目运算符-减表达式-表达式双目运算符 5<<左移变量<<表达式左到右双目运算符>>右移变量>>表达式双目运算符 6>大于表达式>表达式左到右双目运算符>=大于等于表达式>=表达式双目运算符 <小于表达式<表达式双目运算符 <=小于等于表达式<=表达式双目运算符 7==等于表达式==表达式左到右双目运算符!=不等于表达式!= 表达式双目运算符 8&按位与表达式&表达式左到右双目运算符9^按位异或表达式^表达式左到右双目运算符10 按位或表达式表达式11&&逻辑与表达式&&表达式左到右双目运算符12 逻辑或表达式13?:条件运算符表达式1? 表达式2: 表达式3右到左三目运算符14=赋值运算符变量=表达式右到左 /=除后赋值变量/=表达式 *=乘后赋值变量*=表达式 %=取模后赋值变量%=表达式 +=加后赋值变量+=表达式 -=减后赋值变量-=表达式 <<=左移后赋值变量<<=表达式 >>=右移后赋值变量>>=表达式 &=按位与后赋值变量&=表达式 ^=按位异或后赋值变量^=表达式 =按位或后赋值变量=表达式 15,逗号运算符表达式,表达式,…左到右从左向右顺序运算 ]]> 0 /index.php/archives/308/#comments /index.php/feed/archives/308/ Win10 CMD命令大全与超好用的快捷键 /index.php/archives/307/ /index.php/archives/307/ Tue, 09 Mar 2021 12:18:12 +0800 猫粮d 一、Windows CMD 命令大全

按组合键 Win(Windows图标键)+R 键打开运行窗口,输入“cmd”按回车即可打开cmd命令提示符

  1.calc:启动计算器

  2.appwiz.cpl:程序和功能

  3.certmgr.msc:证书管理实用程序

  4.charmap:启动字符映射表

  5.chkdsk.exe:Chkdsk磁盘检查(管理员身份运行命令提示符)

  6.cleanmgr: 打开磁盘清理工具

  7.cliconfg:SQL SERVER 客户端网络实用工具

  8.cmstp:连接管理器配置文件安装程序

  9.cmd.exe:CMD命令提示符

  10.自动关机命令

  Shutdown -s -t 600:表示600秒后自动关机

  shutdown -a :可取消定时关机

  Shutdown -r -t 600:表示600秒后自动重启

  rundll32 user32.dll,LockWorkStation:表示锁定计算机

  11.colorcpl:颜色管理,配置显示器和打印机等中的色彩

  12.CompMgmtLauncher:计算机管理

  13.compmgmt.msc:计算机管理

  14.credwiz:备份或还原储存的用户名和密码

  15.comexp.msc:打开系统组件服务

  16.control:控制面版

  17.dcomcnfg:打开系统组件服务

  18.Dccw:显示颜色校准

  19.devmgmt.msc:设备管理器

  20.desk.cpl:屏幕分辨率

  21.dfrgui:优化驱动器 Windows 7→dfrg.msc:磁盘碎片整理程序

  22.dialer:电话拨号程序

  23.diskmgmt.msc:磁盘管理

  24.dvdplay:DVD播放器

  25.dxdiag:检查DirectX信息

  26.eudcedit:造字程序

  27.eventvwr:事件查看器

  28.explorer:打开资源管理器

  29.Firewall.cpl:Windows防火墙

  30.FXSCOVER:传真封面编辑器

  31.fsmgmt.msc:共享文件夹管理器

  32.gpedit.msc:组策略

  33.hdwwiz.cpl:设备管理器

  34.inetcpl.cpl:Internet属性

  35.intl.cpl:区域

  36.iexpress:木马捆绑工具,系统自带

  37.joy.cpl:游戏控制器

  38.logoff:注销命令

  39.lusrmgr.msc:本地用户和组

  40.lpksetup:语言包安装/删除向导,安装向导会提示下载语言包

  41.lusrmgr.msc:本机用户和组

  42.main.cpl:鼠标属性

  43.mmsys.cpl:声音

  44.magnify:放大镜实用程序

  45.mem.exe:显示内存使用情况(如果直接运行无效,可以先管理员身份运行命令提示符,在命令提示符里输入mem.exe>d:a.txt
即可打开d盘查看a.txt,里面的就是内存使用情况了。当然什么盘什么文件名可自己决定。)

  46.MdSched:Windows内存诊断程序

  47.mmc:打开控制台

  48.mobsync:同步命令

  49.mplayer2:简易widnows media player

  50.Msconfig.exe:系统配置实用程序

  51.msdt:微软支持诊断工具

  52.msinfo32:系统信息

  53.mspaint:画图

  54.Msra:Windows远程协助

  55.mstsc:远程桌面连接

  56.NAPCLCFG.MSC:客户端配置

  57.ncpa.cpl:网络连接

  58.narrator:屏幕“讲述人”

  59.Netplwiz:高级用户帐户控制面板,设置登陆安全相关的选项

  60.netstat : an(TC)命令检查接口

  61.notepad:打开记事本

  62.Nslookup:IP地址侦测器

  63.odbcad32:ODBC数据源管理器

  64.OptionalFeatures:打开“打开或关闭Windows功能”对话框

  65.osk:打开屏幕键盘

  66.perfmon.msc:计算机性能监测器

  67.perfmon:计算机性能监测器

  68.PowerShell:提供强大远程处理能力

  69.printmanagement.msc:打印管理

  70.powercfg.cpl:电源选项

  71.psr:问题步骤记录器

  72.Rasphone:网络连接

  73.Recdisc:创建系统修复光盘

  74.Resmon:资源监视器

  75.Rstrui:系统还原

  76.regedit.exe:注册表

  77.regedt32:注册表编辑器

  78.rsop.msc:组策略结果集

  79.sdclt:备份状态与配置,就是查看系统是否已备份

  80.secpol.msc:本地安全策略

  81.services.msc:本地服务设置

  82.sfc /scannow:扫描错误并复原/windows文件保护

  83.sfc.exe:系统文件检查器

  84.shrpubw:创建共享文件夹

  85.sigverif:文件签名验证程序

  86.slui:Windows激活,查看系统激活信息

  87.slmgr.vbs -dlv :显示详细的许可证信息

  88.snippingtool:截图工具,支持无规则截图

  89.soundrecorder:录音机,没有录音时间的限制

  90.StikyNot:便笺

  91.sysdm.cpl:系统属性

  92.sysedit:系统配置编辑器

  93.syskey:系统加密,一旦加密就不能解开,保护系统的双重密码

  94.taskmgr:任务管理器(旧版)

  95.TM任务管理器(新版)

  96.taskschd.msc:任务计划程序

  97.timedate.cpl:日期和时间

  98.UserAccountControlSettings用户账户控制设置

  99.utilman:辅助工具管理器

  100.wf.msc:高级安全Windows防火墙

  101.WFS:Windows传真和扫描

  102.wiaacmgr:扫描仪和照相机向导

  103.winver:关于Windows

  104.wmimgmt.msc:打开windows管理体系结构(WMI)

  105.write:写字板

  106.wscui.cpl:操作中心

  107.wuapp:Windows更新

  108.wscript:windows脚本宿主设置
?以上就是windows 10系统中运行命令大全,有需要可复制粘贴即可使用。? Windows 不区分大小写

二、Windows cmd窗口中cd指令切换路径

? 通用的格式为输入 cd /d ?? // 可以是你要切换的任意盘符

  1. Windows cmd窗口中cd指令无法转换盘符目录怎么办?
  2. 按下WIN+R键 输入cmd,打开cmd窗口。
  3. 默认路径为用户文档路径,如果想切换到D盘 ,输入 cd d:是不行的。
  4. 如果要切换盘符的目录,正确的用法是在cd 和路径中间 增加一个'/d',输入?cd /d d:
  5. 当我们要切换盘符时,可以不用cd指令直接可用盘符,输入?d:
  6. cd命令有什么用呢?

cmd中输入 cd /? ,就得到其对应的帮助文件。其主要功能是显示当前目录的名称,或更改当前的目录。

?

  1. Windows cmd窗口中cd指令切换盘符和盘符目录:
  2. 显示当前目录的所有文件,输入 dir
  3. 进入当前目录下的子目录,输入 cd 目录名
  4. 返回上一层目录,输入 cd ..
  5. 切换到根目录,输入 cd /

? ? ? ? ? ??

三、WIN10 超好用的快捷键

  1. 以管理员身份打开

? ? ? ? Win10中的UAC(用户账号控制)虽然已经很智能,但并不完美,不少程序我们在执行的时候需要手工指定“以管理员身份运行”。

方式一:搜索cmd,右击选择以管理员身份运行

方式二:在目录C:WindowsSystem32下,搜索cmd.exe,右击选择以管理员身份运行

  1. 打开“任务管理器”-- Ctrl+Shift+Esc

? ? ? ? 在Win10中之前,要打开“任务管理器”,按下那个众所周知的“Ctrl+Alt+Del”三指禅即可,

在Win10中,按下这个组合键,打开的却 是“锁定计算机”、“启动任务管理器” 、“切换用户”等一系列任务列表,虽然也可以间接打开“任务管理器”,但更直接的方法是按下“Ctrl+shift+Esc”组合键。

  1. Win + D 显示桌面
  2. Win + E 打开文件资源管理器(计算机)
  3. Win + I 打开设置
  4. Win + L? 锁屏
  5. Win + R? 打开运行窗口
  6. Ctrl + P?? 打开打印视图
  7. Ait + Tab 任务切换

10、Ctrl + Z?? 撤销

11、Ctrl + F?? 查找。可以查找文字,浏览器里面也可以用。写论文的时候很熟练。

12、Ctrl+Shift+N 打开想要新建文件夹的分区或者目录,一个“新建文件夹”就出现了

13、Win +P?? 打开“投影”,用投影仪以及玩双屏的老铁,自然知道。很方便的快捷键。

14、Win +左/右> Win +上/下>??? 贴靠窗口,窗口可以变为1/4大小放置在屏幕4个角落(个人比较喜欢常用)

15、Win + Tab? 时间轴(1803版本)、查看任务视图,时间轴可以看到几天执行过的任务,查找起来真的方便。

16、Win +“=”键(就是在backspace旁边的有加号有等号的那个键),打开放大镜的快捷键,适合眼神不好的人使用。

17、Win + F4键? 在浏览器中按下,则全选中链接,不需要使用鼠标点选链接栏,可快速打网址。

18、Win + S 打开搜索 小娜

19、Win + X??? 等于在左下角开始图标上面点击右键。

20、Win+K 打开「连接」设备

? ?? 这相对是一个冷门快捷键,主要是用来快速连接无线和蓝牙设备,比如一些蓝牙鼠标、蓝牙音箱、蓝牙键盘或者无线显示器。只要用Win+K 呼出这个菜单,我们就能快速的进行蓝牙配置。不必每次去点击右下角的蓝牙图标再连接蓝牙这么麻烦了。

21、Win+A 打开操作中心

? ? 通知中心和常用的设置选项都会出现在操作中心里,可以快速调整电脑的联网状态和夜间模式等选项,用起来还是十分方便的。

22、Win + Shift + S? 召唤Windows截图

? ? ?? 换到win10之后,它自带的截图功能非常好用,快捷键 Win + Shift + S呼出,可以选择截屏幕的任意区域,任意形状,以及全面屏幕截图。截图之后可以马上进入编辑模式,不必每次开电脑的还去登陆QQ。

?

23、虚拟桌面(可以自己尝试)

? ? ? ? win10中加入了对虚拟桌面的支持。虚拟桌面简单得说:就是保留现有桌面全部设置的情况下。打开一个全新的空白桌面供用户使用。适合在做现有工作的间中临时插入一套新工作进行。

? ? ? ? 比如说你打开一堆表格和文档时,突然接到老板的加急任务。就可以打开一个新的虚拟桌面处理,完事以后还可以切换到原先打开的那堆表格中。又或者接了“私活”不想让老板发现,就可以创建一个虚拟桌面“藏在电脑中”随时可以切换出来。

下边是一组关于虚拟桌面的快捷键:?????

Win + Ctrl + D 创建虚拟桌面

Win + Ctrl + F4 关闭当前虚拟桌面

Win + Ctrl + ← 向左切换虚拟桌面

Win + Ctrl + → 向右切换虚拟桌面

? ?

三、Windows cmd窗口常用命令

cmd中输入 命令名 /? ,就可查看其对应的帮助文件。

  1. ping 命令:用来验证与远程计算机的连接。

ping 是Windows自带的一个DOS命令。利用它可以检查网络是否能够连通和分析网络速度,用好它可以很好地帮助我们分析判定网络故障。

输入ping按回车即可看到详细说明。默认响应4下结束

语法:ping ? [选项] ?[主机名称或IP地址]

D:>ping 127.0.0.1

正在 Ping 127.0.0.1 具有 32 字节的数据:
来自 127.0.0.1 的回复: 字节=32 时间<1ms TTL=64
来自 127.0.0.1 的回复: 字节=32 时间<1ms TTL=64
来自 127.0.0.1 的回复: 字节=32 时间<1ms TTL=64
来自 127.0.0.1 的回复: 字节=32 时间<1ms TTL=64

127.0.0.1 的 Ping 统计信息:
数据包: 已发送 = 4,已接收 = 4,丢失 = 0 (0% 丢失),
往返行程的估计时间(以毫秒为单位):
最短 = 0ms,最长 = 0ms,平均 = 0ms

  1. 用命令查看和终止进程

netstat命令:显示协议统计信息和当前 TCP/IP 网络连接

语法:netstat ? [选项]?

常用参数:

-a ? ? ? ? ? ?显示所有连接和侦听端口。
-n ? ? ? ? ? ?以数字形式显示地址和端口号。
-o ? ? ? ? ? ?显示拥有的与每个连接关联的进程 ID。
比如:

查看监听端口以及监听对应的进程(PID)>netstat -ano | findstr 端口号

D:>netstat -ano | findstr 8000
TCP 0.0.0.0:8000 0.0.0.0:0 LISTENING 29296
TCP [::]:8000 [::]:0 LISTENING 29296
taskkill命令:按照进程 ID (PID) 或映像名称终止任务。

语法:taskkill ? [选项]?

常用参数:

?/F ? ? ? ? ? ?指定要强行终止 ?
?/T ? ? ? ? ? ?Tree kill: 终止指定的进程和任何由此启动的子进程。
/IM ? ?? ?image name ?指定要终止的进程的名称。
/PID ?process id ? ? ? 指定要终止的进程的PID。 ?
比如:

终止 idea进程及子进程> taskkill /f /im ?idea64.exe??/t

根据pid强制终止进程> taskkill? /pid ?进程的PID? /f?

D:>taskkill /pid 29296 /f
成功: 已终止 PID 为 29296 的进程。
?

ends ~

]]>
0 /index.php/archives/307/#comments /index.php/feed/archives/307/
VS 2019 离线下载地址和正版 Key 注册码 /index.php/archives/306/ /index.php/archives/306/ Wed, 24 Feb 2021 11:14:15 +0800 猫粮d Visual Studio 2019 Enterprise
BF8Y8-GN2QH-T84XB-QVY3B-RC4DF

Visual Studio 2019 Professional
NYWVH-HT4XC-R2WYW-9Y3CM-X4V3Y

下载地址:
https://download.csdn.net/album/detail/4642

]]>
0 /index.php/archives/306/#comments /index.php/feed/archives/306/
史上最全的Vim命令 /index.php/archives/305/ /index.php/archives/305/ Sun, 07 Feb 2021 18:28:49 +0800 猫粮d 1. 关于Vim

vim是我最喜欢的编辑器,也是linux下第二强大的编辑器。 虽然emacs是公认的世界第一,我认为使用emacs并没有使用vi进行编辑来得高效。 如果是初学vi,运行一下vimtutor是个聪明的决定。 (如果你的系统环境不是中文,而你想使用中文的vimtutor,就运行vimtutor zh)
](https://link.zhihu.com/?target=http%3A//www.cnblogs.com/jiqingwu/archive/2012/06/14/vim_notes.html%23id59)1.1 Vim的几种模式**

  • 正常模式:可以使用快捷键命令,或按:输入命令行。
  • 插入模式:可以输入文本,在正常模式下,按i、a、o等都可以进入插入模式。
  • 可视模式:正常模式下按v可以进入可视模式, 在可视模式下,移动光标可以选择文本。按V进入可视行模式, 总是整行整行的选中。ctrl+v进入可视块模式。
  • 替换模式:正常模式下,按R进入。

2. 启动Vim

  • vim -c cmd file: 在打开文件前,先执行指定的命令;
  • vim -r file: 恢复上次异常退出的文件;
  • vim -R file: 以只读的方式打开文件,但可以强制保存;
  • vim -M file: 以只读的方式打开文件,不可以强制保存;
  • vim -y num file: 将编辑窗口的大小设为num行;
  • vim + file: 从文件的末尾开始;
  • vim +num file: 从第num行开始;
  • vim +/string file: 打开file,并将光标停留在第一个找到的string上。
  • vim --remote file: 用已有的vim进程打开指定的文件。 如果你不想启用多个vim会话,这个很有用。但要注意, 如果你用vim,会寻找名叫VIM的服务器;如果你已经有一个gvim在运行了, 你可以用gvim --remote file在已有的gvim中打开文件。

3. 文档操作

  • :e file --关闭当前编辑的文件,并开启新的文件。 如果对当前文件的修改未保存,vi会警告。
  • :e! file --放弃对当前文件的修改,编辑新的文件。
  • :e+file -- 开始新的文件,并从文件尾开始编辑。
  • :e+n file -- 开始新的文件,并从第n行开始编辑。
  • :enew --编译一个未命名的新文档。(CTRL-W n)
  • :e -- 重新加载当前文档。
  • :e! -- 重新加载当前文档,并丢弃已做的改动。
  • :e#或ctrl+^ -- 回到刚才编辑的文件,很实用。
  • :f或ctrl+g -- 显示文档名,是否修改,和光标位置。
  • :f filename -- 改变编辑的文件名,这时再保存相当于另存为。
  • gf -- 打开以光标所在字符串为文件名的文件。
  • :w -- 保存修改。
  • :n1,n2w filename -- 选择性保存从某n1行到另n2行的内容。
  • :wq -- 保存并退出。
  • ZZ -- 保存并退出。
  • :x -- 保存并退出。
  • :q[uit] ——退出当前窗口。(CTRL-W q或CTRL-W CTRL-Q)
  • :saveas newfilename -- 另存为
  • :browse e -- 会打开一个文件浏览器让你选择要编辑的文件。 如果是终端中,则会打开netrw的文件浏览窗口; 如果是gvim,则会打开一个图形界面的浏览窗口。 实际上:browse后可以跟任何编辑文档的命令,如sp等。 用browse打开的起始目录可以由browsedir来设置:

    • :set browsedir=last -- 用上次访问过的目录(默认);
    • :set browsedir=buffer -- 用当前文件所在目录;
    • :set browsedir=current -- 用当前工作目录;
  • :Sex -- 水平分割一个窗口,浏览文件系统;
  • :Vex -- 垂直分割一个窗口,浏览文件系统;

4. 光标的移动
4.1 基本移动

以下移动都是在normal模式下。

  • h或退格: 左移一个字符;
  • l或空格: 右移一个字符;
  • j: 下移一行;
  • k: 上移一行;
  • gj: 移动到一段内的下一行;
  • gk: 移动到一段内的上一行;
  • +或Enter: 把光标移至下一行第一个非空白字符。
  • -: 把光标移至上一行第一个非空白字符。
  • w: 前移一个单词,光标停在下一个单词开头;
  • W: 移动下一个单词开头,但忽略一些标点;
  • e: 前移一个单词,光标停在下一个单词末尾;
  • E: 移动到下一个单词末尾,如果词尾有标点,则移动到标点;
  • b: 后移一个单词,光标停在上一个单词开头;
  • B: 移动到上一个单词开头,忽略一些标点;
  • ge: 后移一个单词,光标停在上一个单词末尾;
  • gE: 同ge ,不过‘单词’包含单词相邻的标点。
  • (: 前移1句。
  • ): 后移1句。
  • {: 前移1段。
  • }: 后移1段。
  • fc: 把光标移到同一行的下一个c字符处
  • Fc: 把光标移到同一行的上一个c字符处
  • tc: 把光标移到同一行的下一个c字符前
  • Tc: 把光标移到同一行的上一个c字符后
  • ;: 配合f & t使用,重复一次
  • ,: 配合f & t使用,反向重复一次

上面的操作都可以配合n使用,比如在正常模式(下面会讲到)下输入3h, 则光标向左移动3个字符。

  • 0: 移动到行首。
  • g0: 移到光标所在屏幕行行首。
  • ^: 移动到本行第一个非空白字符。
  • g^: 同^ ,但是移动到当前屏幕行第一个非空字符处。
  • $: 移动到行尾。
  • g$: 移动光标所在屏幕行行尾。
  • n|: 把光标移到递n列上。
  • nG: 到文件第n行。
  • :n 移动到第n行。
  • :$ 移动到最后一行。
  • H: 把光标移到屏幕最顶端一行。
  • M: 把光标移到屏幕中间一行。
  • L: 把光标移到屏幕最底端一行。
  • gg: 到文件头部。
  • G: 到文件尾部。

4.2 翻屏

  • ctrl+f: 下翻一屏。
  • ctrl+b: 上翻一屏。
  • ctrl+d: 下翻半屏。
  • ctrl+u: 上翻半屏。
  • ctrl+e: 向下滚动一行。
  • ctrl+y: 向上滚动一行。
  • n%: 到文件n%的位置。
  • zz: 将当前行移动到屏幕中央。
  • zt: 将当前行移动到屏幕顶端。
  • zb: 将当前行移动到屏幕底端。

4.3 标记
使用标记可以快速移动。到达标记后,可以用Ctrl+o返回原来的位置。 Ctrl+o和Ctrl+i 很像浏览器上的 后退前进

  • m{a-z}: 标记光标所在位置,局部标记,只用于当前文件。
  • m{A-Z}: 标记光标所在位置,全局标记。标记之后,退出Vim, 重新启动,标记仍然有效。
  • `{a-z}: 移动到标记位置。
  • '{a-z}: 移动到标记行的行首。
  • `{0-9}:回到上[2-10]次关闭vim时最后离开的位置。
  • : 移动到上次编辑的位置。''也可以,不过精确到列,而''精确到行 。如果想跳转到更老的位置,可以按C-o,跳转到更新的位置用C-i。
  • `": 移动到上次离开的地方。
  • `.: 移动到最后改动的地方。
  • :marks 显示所有标记。
  • :delmarks a b -- 删除标记a和b。
  • :delmarks a-c -- 删除标记a、b和c。
  • :delmarks a c-f -- 删除标记a、c、d、e、f。
  • :delmarks! -- 删除当前缓冲区的所有标记。
  • :help mark-motions 查看更多关于mark的知识。

5. 插入文本
5.1 基本插入

  • i: 在光标前插入;一个小技巧:按8,再按i,进入插入模式,输入=, 按esc进入命令模式,就会出现8个=。 这在插入分割线时非常有用,如30i+就插入了36个+组成的分割线。
  • I: 在当前行第一个非空字符前插入;
  • gI: 在当前行第一列插入;
  • a: 在光标后插入;
  • A: 在当前行最后插入;
  • o: 在下面新建一行插入;
  • O: 在上面新建一行插入;
  • :r filename在当前位置插入另一个文件的内容。
  • :[n]r filename在第n行插入另一个文件的内容。
  • :r !date 在光标处插入当前日期与时间。同理,:r !command可以将其它shell命令的输出插入当前文档。

5.2 改写插入

  • c[n]w: 改写光标后1(n)个词。
  • c[n]l: 改写光标后n个字母。
  • c[n]h: 改写光标前n个字母。
  • [n]cc: 修改当前[n]行。
  • [n]s: 以输入的文本替代光标之后1(n)个字符,相当于c[n]l。
  • [n]S: 删除指定数目的行,并以所输入文本代替之。

注意,类似cnw,dnw,ynw的形式同样可以写为ncw,ndw,nyw。

6. 剪切复制和寄存器
6.1 剪切和复制、粘贴

  • [n]x: 剪切光标右边n个字符,相当于d[n]l。
  • [n]X: 剪切光标左边n个字符,相当于d[n]h。
  • y: 复制在可视模式下选中的文本。
  • yy or Y: 复制整行文本。
  • y[n]w: 复制一(n)个词。
  • y[n]l: 复制光标右边1(n)个字符。
  • y[n]h: 复制光标左边1(n)个字符。
  • y$: 从光标当前位置复制到行尾。
  • y0: 从光标当前位置复制到行首。
  • :m,ny 复制m行到n行的内容。
  • y1G或ygg: 复制光标以上的所有行。
  • yG: 复制光标以下的所有行。
  • yaw和yas:复制一个词和复制一个句子,即使光标不在词首和句首也没关系。
  • d: 删除(剪切)在可视模式下选中的文本。
  • d$ or D: 删除(剪切)当前位置到行尾的内容。
  • d[n]w: 删除(剪切)1(n)个单词
  • d[n]l: 删除(剪切)光标右边1(n)个字符。
  • d[n]h: 删除(剪切)光标左边1(n)个字符。
  • d0: 删除(剪切)当前位置到行首的内容
  • [n] dd: 删除(剪切)1(n)行。
  • :m,nd 剪切m行到n行的内容。
  • d1G或dgg: 剪切光标以上的所有行。
  • dG: 剪切光标以下的所有行。
  • daw和das:剪切一个词和剪切一个句子,即使光标不在词首和句首也没关系。
  • d/f:这是一个比较高级的组合命令,它将删除当前位置 到下一个f之间的内容。
  • p: 在光标之后粘贴。
  • P: 在光标之前粘贴。

6.2 文本对象

  • aw:一个词
  • as:一句。
  • ap:一段。
  • ab:一块(包含在圆括号中的)。

y, d, c, v都可以跟文本对象。
6.3 寄存器

  • a-z:都可以用作寄存器名。"ayy把当前行的内容放入a寄存器。
  • A-Z:用大写字母索引寄存器,可以在寄存器中追加内容。 如"Ayy把当前行的内容追加到a寄存器中。
  • :reg 显示所有寄存器的内容。
  • "":不加寄存器索引时,默认使用的寄存器。
  • ":当前选择缓冲区,"yy把当前行的内容放入当前选择缓冲区。
  • "+:系统剪贴板。"+yy把当前行的内容放入系统剪贴板。

7. 查找与替换
7.1 查找

  • /something: 在后面的文本中查找something。
  • ?something: 在前面的文本中查找something。
  • /pattern/+number: 将光标停在包含pattern的行后面第number行上。
  • /pattern/-number: 将光标停在包含pattern的行前面第number行上。
  • n: 向后查找下一个。
  • N: 向前查找下一个。

可以用grep或vimgrep查找一个模式都在哪些地方出现过,
其中:grep是调用外部的grep程序,而:vimgrep是vim自己的查找算法。
用法为: :vim[grep]/pattern/[g] [j] files
g的含义是如果一个模式在一行中多次出现,则这一行也在结果中多次出现。
j的含义是grep结束后,结果停在第j项,默认是停在第一项。
vimgrep前面可以加数字限定搜索结果的上限,如
:1vim/pattern/ % 只查找那个模式在本文件中的第一个出现。

其实vimgrep在读纯文本电子书时特别有用,可以生成导航的目录。
比如电子书中每一节的标题形式为:n. xxxx。你就可以这样:
:vim/^d{1,}./ %
然后用:cw或:copen查看结果,可以用C-w H把quickfix窗口移到左侧,
就更像个目录了。
7.2 替换

  • :s/old/new - 用new替换当前行第一个old。
  • :s/old/new/g - 用new替换当前行所有的old。
  • :n1,n2s/old/new/g - 用new替换文件n1行到n2行所有的old。
  • :%s/old/new/g - 用new替换文件中所有的old。
  • :%s/^/xxx/g - 在每一行的行首插入xxx,^表示行首。
  • :%s/$/xxx/g - 在每一行的行尾插入xxx,$表示行尾。
  • 所有替换命令末尾加上c,每个替换都将需要用户确认。 如:%s/old/new/gc,加上i则忽略大小写(ignore)。

还有一种比替换更灵活的方式,它是匹配到某个模式后执行某种命令,
语法为 :[range]g/pattern/command
例如 :%g/^ xyz/normal dd。
表示对于以一个空格和xyz开头的行执行normal模式下的dd命令。
关于range的规定为:

  • 如果不指定range,则表示当前行。
  • m,n: 从m行到n行。
  • 0: 最开始一行(可能是这样)。
  • $: 最后一行
  • .: 当前行
  • %: 所有行

7.3 正则表达式
高级的查找替换就要用到正则表达式。

  • d: 表示十进制数(我猜的)
  • s: 表示空格
  • S: 非空字符
  • a: 英文字母
  • |: 表示 或
  • .: 表示.
  • {m,n}: 表示m到n个字符。这要和 s与a等连用,如 a{m,n} 表示m 到n个英文字母。
  • {m,}: 表示m到无限多个字符。
  • **: 当前目录下的所有子目录。

:help pattern得到更多帮助。


8. 排版
8.1 基本排版

  • << 向左缩进一个shiftwidth
  • 向右缩进一个shiftwidth
  • :ce(nter) 本行文字居中
  • :le(ft) 本行文字靠左
  • :ri(ght) 本行文字靠右
  • gq 对选中的文字重排,即对过长的文字进行断行
  • gqq 重排当前行
  • gqnq 重排n行
  • gqap 重排当前段
  • gqnap 重排n段
  • gqnj 重排当前行和下面n行
  • gqQ 重排当前段对文章末尾
  • J 拼接当前行和下一行
  • gJ 同J ,不过合并后不留空格。

8.2 拼写检查

  • :set spell-开启拼写检查功能
  • :set nospell-关闭拼写检查功能
  • ]s-移到下一个拼写错误的单词
  • [s-作用与上一命令类似,但它是从相反方向进行搜索
  • z=-显示一个有关拼写错误单词的列表,可从中选择
  • zg-告诉拼写检查器该单词是拼写正确的
  • zw-与上一命令相反,告诉拼写检查器该单词是拼写错误的

8.3 统计字数
g ^g可以统计文档字符数,行数。 将光标放在最后一个字符上,用字符数减去行数可以粗略统计中文文档的字数。 以上对 Mac 或 Unix 的文件格式适用。 如果是 Windows 文件格式(即换行符有两个字节),字数的统计方法为: 字符数 - 行数 * 2。


9. 编辑多个文件
9.1 一次编辑多个文件
我们可以一次打开多个文件,如
vi a.txt b.txt c.txt

  • 使用:next(:n)编辑下一个文件。
  • :2n 编辑下2个文件。
  • 使用:previous或:N编辑上一个文件。
  • 使用:wnext,保存当前文件,并编辑下一个文件。
  • 使用:wprevious,保存当前文件,并编辑上一个文件。
  • 使用:args 显示文件列表。
  • :n filenames或:args filenames 指定新的文件列表。
  • vi -o filenames 在水平分割的多个窗口中编辑多个文件。
  • vi -O filenames 在垂直分割的多个窗口中编辑多个文件。

9.2 多标签编辑

  • vim -p files: 打开多个文件,每个文件占用一个标签页。
  • :tabe, tabnew -- 如果加文件名,就在新的标签中打开这个文件, 否则打开一个空缓冲区。
  • ^w gf -- 在新的标签页里打开光标下路径指定的文件。
  • :tabn -- 切换到下一个标签。Control + PageDown,也可以。
  • :tabp -- 切换到上一个标签。Control + PageUp,也可以。
  • [n] gt -- 切换到下一个标签。如果前面加了n , 就切换到第n个标签。第一个标签的序号就是1。
  • :tab split -- 将当前缓冲区的内容在新页签中打开。
  • :tabc[lose] -- 关闭当前的标签页。
  • :tabo[nly] -- 关闭其它的标签页。
  • :tabs -- 列出所有的标签页和它们包含的窗口。
  • :tabm[ove] [N] -- 移动标签页,移动到第N个标签页之后。 如tabm 0 当前标签页,就会变成第一个标签页。

9.3 缓冲区

  • :buffers或:ls或:files 显示缓冲区列表。
  • ctrl+^:在最近两个缓冲区间切换。
  • :bn -- 下一个缓冲区。
  • :bp -- 上一个缓冲区。
  • :bl -- 最后一个缓冲区。
  • :b[n]或:[n]b -- 切换到第n个缓冲区。
  • :nbw(ipeout) -- 彻底删除第n个缓冲区。
  • :nbd(elete) -- 删除第n个缓冲区,并未真正删除,还在unlisted列表中。
  • :ba[ll] -- 把所有的缓冲区在当前页中打开,每个缓冲区占一个窗口。

10. 分屏编辑

  • vim -o file1 file2:水平分割窗口,同时打开file1和file2
  • vim -O file1 file2:垂直分割窗口,同时打开file1和file2

10.1 水平分割

  • :split(:sp) -- 把当前窗水平分割成两个窗口。(CTRL-W s 或 CTRL-W CTRL-S) 注意如果在终端下,CTRL-S可能会冻结终端,请按CTRL-Q继续。
  • :split filename -- 水平分割窗口,并在新窗口中显示另一个文件。
  • :nsplit(:nsp) -- 水平分割出一个n行高的窗口。
  • :[N]new -- 水平分割出一个N行高的窗口,并编辑一个新文件。 (CTRL-W n或 CTRL-W CTRL-N)
  • ctrl+w f --水平分割出一个窗口,并在新窗口打开名称为光标所在词的文件 。
  • C-w C-^ -- 水平分割一个窗口,打开刚才编辑的文件。

10.2 垂直分割

  • :vsplit(:vsp) -- 把当前窗口分割成水平分布的两个窗口。 (CTRL-W v或CTRL CTRL-V)
  • :[N]vne[w] -- 垂直分割出一个新窗口。
  • :vertical 水平分割的命令: 相应的垂直分割。

10.3 关闭子窗口

  • :qall -- 关闭所有窗口,退出vim。
  • :wall -- 保存所有修改过的窗口。
  • :only -- 只保留当前窗口,关闭其它窗口。(CTRL-W o)
  • :close -- 关闭当前窗口,CTRL-W c能实现同样的功能。 (象 :q :x同样工作 )

10.4 调整窗口大小

  • ctrl+w + --当前窗口增高一行。也可以用n增高n行。
  • ctrl+w - --当前窗口减小一行。也可以用n减小n行。
  • ctrl+w _ --当前窗口扩展到尽可能的大。也可以用n设定行数。
  • :resize n -- 当前窗口n行高。
  • ctrl+w = -- 所有窗口同样高度。
  • n ctrl+w _ -- 当前窗口的高度设定为n行。
  • ctrl+w < --当前窗口减少一列。也可以用n减少n列。
  • ctrl+w > --当前窗口增宽一列。也可以用n增宽n列。
  • ctrl+w | --当前窗口尽可能的宽。也可以用n设定列数。

10.5 切换和移动窗口
如果支持鼠标,切换和调整子窗口的大小就简单了。

  • ctrl+w ctrl+w: 切换到下一个窗口。或者是ctrl+w w。
  • ctrl+w p: 切换到前一个窗口。
  • ctrl+w h(l,j,k):切换到左(右,下,上)的窗口。
  • ctrl+w t(b):切换到最上(下)面的窗口。
  • ctrl+w H(L,K,J): 将当前窗口移动到最左(右、上、下)面。
  • ctrl+w r:旋转窗口的位置。
  • ctrl+w T: 将当前的窗口移动到新的标签页上。

11. 快速编辑
11.1 改变大小写

  • ~: 反转光标所在字符的大小写。
  • 可视模式下的U或u:把选中的文本变为大写或小写。
  • gu(U)接范围(如$,或G),可以把从光标当前位置到指定位置之间字母全部 转换成小写或大写。如ggguG,就是把开头到最后一行之间的字母全部变为小 写。再如gu5j,把当前行和下面四行全部变成小写。

11.2 替换(normal模式)

  • r: 替换光标处的字符,同样支持汉字。
  • R: 进入替换模式,按esc回到正常模式。

11.3 撤消与重做(normal模式)

  • [n] u: 取消一(n)个改动。
  • :undo 5 -- 撤销5个改变。
  • :undolist -- 你的撤销历史。
  • ctrl + r: 重做最后的改动。
  • U: 取消当前行中所有的改动。
  • :earlier 4m -- 回到4分钟前
  • :later 55s -- 前进55秒

11.4 宏

  • . --重复上一个编辑动作
  • qa:开始录制宏a(键盘操作记录)
  • q:停止录制
  • @a:播放宏a

12. 编辑特殊文件
12.1 文件加解密

  • vim -x file: 开始编辑一个加密的文件。
  • :X -- 为当前文件设置密码。
  • :set key= -- 去除文件的密码。

这里是 滇狐总结的比较高级的vi技巧。
12.2 文件的编码

  • :e ++enc=utf8 filename, 让vim用utf-8的编码打开这个文件。
  • :w ++enc=gbk,不管当前文件什么编码,把它转存成gbk编码。
  • :set fenc或:set fileencoding,查看当前文件的编码。
  • 在vimrc中添加set fileencoding=ucs-bom,utf-8,cp936,vim会根据要打开的文件选择合适的编码。 注意:编码之间不要留空格。 cp936对应于gbk编码。 ucs-bom对应于windows下的文件格式。

让vim 正确处理文件格式和文件编码,有赖于 ~/.vimrc的正确配置
12.3 文件格式
大致有三种文件格式:unix, dos, mac. 三种格式的区别主要在于回车键的编码:dos 下是回车加换行,unix 下只有 换行符,mac 下只有回车符。

  • :e ++ff=dos filename, 让vim用dos格式打开这个文件。
  • :w ++ff=mac filename, 以mac格式存储这个文件。
  • :set ff,显示当前文件的格式。
  • 在vimrc中添加set fileformats=unix,dos,mac,让vim自动识别文件格式。

13. 编程辅助
13.1 一些按键

  • gd: 跳转到局部变量的定义处;
  • gD: 跳转到全局变量的定义处,从当前文件开头开始搜索;
  • g;: 上一个修改过的地方;
  • g,: 下一个修改过的地方;
  • [[: 跳转到上一个函数块开始,需要有单独一行的{。
  • ]]: 跳转到下一个函数块开始,需要有单独一行的{。
  • []: 跳转到上一个函数块结束,需要有单独一行的}。
  • ][: 跳转到下一个函数块结束,需要有单独一行的}。
  • [{: 跳转到当前块开始处;
  • ]}: 跳转到当前块结束处;
  • [/: 跳转到当前注释块开始处;
  • ]/: 跳转到当前注释块结束处;
  • %: 不仅能移动到匹配的(),{}或[]上,而且能在#if,#else, #endif之间跳跃。

下面的括号匹配对编程很实用的。

  • ci', di', yi':修改、剪切或复制'之间的内容。
  • ca', da', ya':修改、剪切或复制'之间的内容,包含'。
  • ci", di", yi":修改、剪切或复制"之间的内容。
  • ca", da", ya":修改、剪切或复制"之间的内容,包含"。
  • ci(, di(, yi(:修改、剪切或复制()之间的内容。
  • ca(, da(, ya(:修改、剪切或复制()之间的内容,包含()。
  • ci[, di[, yi[:修改、剪切或复制[]之间的内容。
  • ca[, da[, ya[:修改、剪切或复制[]之间的内容,包含[]。
  • ci{, di{, yi{:修改、剪切或复制{}之间的内容。
  • ca{, da{, ya{:修改、剪切或复制{}之间的内容,包含{}。
  • ci<, di<, yi<:修改、剪切或复制<>之间的内容。
  • ca<, da<, ya<:修改、剪切或复制<>之间的内容,包含<>。

13.2 ctags

  • ctags -R: 生成tag文件,-R表示也为子目录中的文件生成tags
  • :set tags=path/tags -- 告诉ctags使用哪个tag文件
  • :tag xyz -- 跳到xyz的定义处,或者将光标放在xyz上按C-],返回用C-t
  • :stag xyz -- 用分割的窗口显示xyz的定义,或者C-w ], 如果用C-w n ],就会打开一个n行高的窗口
  • :ptag xyz -- 在预览窗口中打开xyz的定义,热键是C-w }。
  • :pclose -- 关闭预览窗口。热键是C-w z。
  • :pedit abc.h -- 在预览窗口中编辑abc.h
  • :psearch abc -- 搜索当前文件和当前文件include的文件,显示包含abc的行。

有时一个tag可能有多个匹配,如函数重载,一个函数名就会有多个匹配。 这种情况会先跳转到第一个匹配处。

  • :[n]tnext -- 下一[n]个匹配。
  • :[n]tprev -- 上一[n]个匹配。
  • :tfirst -- 第一个匹配
  • :tlast -- 最后一个匹配
  • :tselect tagname -- 打开选择列表

tab键补齐

  • :tag xyz -- 补齐以xyz开头的tag名,继续按tab键,会显示其他的。
  • :tag /xyz -- 会用名字中含有xyz的tag名补全。

13.3 cscope

  • cscope -Rbq: 生成cscope.out文件
  • :cs add /path/to/cscope.out /your/work/dir
  • :cs find c func -- 查找func在哪些地方被调用
  • :cw -- 打开quickfix窗口查看结果

13.4 gtags
Gtags综合了ctags和cscope的功能。 使用Gtags之前,你需要安装GNU Gtags。 然后在工程目录运行 gtags

  • :Gtags funcname 定位到 funcname 的定义处。
  • :Gtags -r funcname 查询 funcname被引用的地方。
  • :Gtags -s symbol 定位 symbol 出现的地方。
  • :Gtags -g string Goto string 出现的地方。 :Gtags -gi string 忽略大小写。
  • :Gtags -f filename 显示 filename 中的函数列表。 你可以用 :Gtags -f % 显示当前文件。
  • :Gtags -P pattern 显示路径中包含特定模式的文件。 如 :Gtags -P .h$ 显示所有头文件, :Gtags -P /vm/ 显示vm目录下的文件。

13.5 编译
vim提供了:make来编译程序,默认调用的是make, 如果你当前目录下有makefile,简单地:make即可。
如果你没有make程序,你可以通过配置makeprg选项来更改make调用的程序。 如果你只有一个abc.java文件,你可以这样设置:
set makeprg=javac abc.java
然后:make即可。如果程序有错,可以通过quickfix窗口查看错误。 不过如果要正确定位错误,需要设置好errorformat,让vim识别错误信息。 如:
:setl efm=%A%f:%l: %m,%-Z%p^,%-C%.%#
%f表示文件名,%l表示行号, %m表示错误信息,其它的还不能理解。 请参考 :help errorformat。
13.6 快速修改窗口
其实是quickfix插件提供的功能, 对编译调试程序非常有用 :)

  • :copen -- 打开快速修改窗口。
  • :cclose -- 关闭快速修改窗口。

快速修改窗口在make程序时非常有用,当make之后:

  • :cl -- 在快速修改窗口中列出错误。
  • :cn -- 定位到下一个错误。
  • :cp -- 定位到上一个错误。
  • :cr -- 定位到第一个错误。

13.7 自动补全

  • C-x C-s -- 拼写建议。
  • C-x C-v -- 补全vim选项和命令。
  • C-x C-l -- 整行补全。
  • C-x C-f -- 自动补全文件路径。弹出菜单后,按C-f循环选择,当然也可以按 C-n和C-p。
  • C-x C-p 和C-x C-n -- 用文档中出现过的单词补全当前的词。 直接按C-p和C-n也可以。
  • C-x C-o -- 编程时可以补全关键字和函数名啊。
  • C-x C-i -- 根据头文件内关键字补全。
  • C-x C-d -- 补全宏定义。
  • C-x C-n -- 按缓冲区中出现过的关键字补全。 直接按C-n或C-p即可。

当弹出补全菜单后:

  • C-p 向前切换成员;
  • C-n 向后切换成员;
  • C-e 退出下拉菜单,并退回到原来录入的文字;
  • C-y 退出下拉菜单,并接受当前选项。

13.8 多行缩进缩出

  • 正常模式下,按两下>;光标所在行会缩进。
  • 如果先按了n,再按两下>;,光标以下的n行会缩进。
  • 对应的,按两下<;,光标所在行会缩出。
  • 如果在编辑代码文件,可以用=进行调整。
  • 在可视模式下,选择要调整的代码块,按=,代码会按书写规则缩排好。
  • 或者n =,调整n行代码的缩排。

13.9 折叠

  • zf -- 创建折叠的命令,可以在一个可视区域上使用该命令;
  • zd -- 删除当前行的折叠;
  • zD -- 删除当前行的折叠;
  • zfap -- 折叠光标所在的段;
  • zo -- 打开折叠的文本;
  • zc -- 收起折叠;
  • za -- 打开/关闭当前折叠;
  • zr -- 打开嵌套的折行;
  • zm -- 收起嵌套的折行;
  • zR (zO) -- 打开所有折行;
  • zM (zC) -- 收起所有折行;
  • zj -- 跳到下一个折叠处;
  • zk -- 跳到上一个折叠处;
  • zi -- enable/disable fold;

14. 命令行
normal模式下按:进入命令行模式
14.1 命令行模式下的快捷键:

  • 上下方向键:上一条或者下一条命令。如果已经输入了部分命令,则找上一 条或者下一条匹配的命令。
  • 左右方向键:左/右移一个字符。
  • C-w: 向前删除一个单词。
  • C-h: 向前删除一个字符,等同于Backspace。
  • C-u: 从当前位置移动到命令行开头。
  • C-b: 移动到命令行开头。
  • C-e: 移动到命令行末尾。
  • Shift-Left: 左移一个单词。
  • Shift-Right: 右移一个单词。
  • @: 重复上一次的冒号命令。
  • q: 正常模式下,q然后按':',打开命令行历史缓冲区, 可以像编辑文件一样编辑命令。
  • q/和q? 可以打开查找历史记录。

14.2 执行外部命令

  • :! cmd 执行外部命令。
  • :!! 执行上一次的外部命令。
  • :sh 调用shell,用exit返回vim。
  • :r !cmd 将命令的返回结果插入文件当前位置。
  • :m,nw !cmd 将文件的m行到n行之间的内容做为命令输入执行命令。

15. 其它
15.1 工作目录

  • :pwd 显示vim的工作目录。
  • :cd path 改变vim的工作目录。
  • :set autochdir 可以让vim 根据编辑的文件自动切换工作目录。

15.2 一些快捷键(收集中)

  • K: 打开光标所在词的manpage。
  • *: 向下搜索光标所在词。
  • g*: 同上,但部分符合即可。
  • : 向上搜索光标所在词。

  • g#: 同上,但部分符合即可。
  • g C-g: 统计全文或统计部分的字数。

15.3 在线帮助

  • :h(elp)或F1 打开总的帮助。
  • :help user-manual 打开用户手册。
  • 命令帮助的格式为:第一行指明怎么使用那个命令; 然后是缩进的一段解释这个命令的作用,然后是进一步的信息。
  • :helptags somepath 为somepath中的文档生成索引。
  • :helpgrep 可以搜索整个帮助文档,匹配的列表显示在quickfix窗口中。
  • Ctrl+] 跳转到tag主题,Ctrl+t 跳回。
  • :ver 显示版本信息。

15.4 一些小功能

  • 简单计算器: 在插入模式下,输入C-r =,然后输入表达式,就能在 光标处得到计算结果。
]]>
0 /index.php/archives/305/#comments /index.php/feed/archives/305/
VIM快捷键 /index.php/archives/304/ /index.php/archives/304/ Sun, 07 Feb 2021 18:03:54 +0800 猫粮d
  • 全部删除:按esc键后,先按gg(到达顶部),然后dG
  • 全部复制:按esc键后,先按gg,然后ggyG
  • 全选高亮显示:按esc键后,先按gg,然后ggvG或者ggVG
  • 单行复制:按esc键后,然后yy
  • 单行删除:按esc键后,然后dd
  • 粘贴:按esc键后,然后p
  • ]]>
    0 /index.php/archives/304/#comments /index.php/feed/archives/304/
    vimplus快捷键 /index.php/archives/303/ /index.php/archives/303/ Sat, 06 Feb 2021 21:27:36 +0800 猫粮d 快捷键说明,Leader Key<leader>n打开/关闭代码资源管理器<leader>t打开/关闭函数列表<leader>a.h .cpp 文件切换<leader>u转到函数声明<leader>U转到函数实现<leader>u转到变量声明<leader>o打开include文件<leader>y拷贝函数声明<leader>p生成函数实现<leader>w单词跳转<leader>f搜索~目录下的文件<leader>F搜索当前目录下的文本<leader>g显示git仓库提交记录<leader>G显示当前文件提交记录<leader>gg显示当前文件在某个commit下的完整内容<leader>ff语法错误自动修复(FixIt)<c-p>切换到上一个buffer<c-n>切换到下一个buffer<leader>d删除当前buffer<leader>D删除当前buffer外的所有buffervim运行vim编辑器时,默认启动开始页面<F5>显示语法错误提示窗口<F9>显示上一主题<F10>显示下一主题<leader>l按竖线对齐<leader>=按等号对齐Ya复制行文本到字母aDa剪切行文本到字母aCa改写行文本到字母arr替换文本<leader>r全局替换,目前只支持单个文件rev翻转当前光标下的单词或使用V模式选择的文本gcc注释代码gcap注释段落vif选中函数内容dif删除函数内容cif改写函数内容vaf选中函数内容(包括函数名 花括号)daf删除函数内容(包括函数名 花括号)caf改写函数内容(包括函数名 花括号)fa查找字母a,然后再按f键查找下一个<leader>e快速编辑~/.vimrc文件<leader>s重新加载~/.vimrc文件<leader>vp快速编辑~/.vimrc.custom.plugins文件<leader>vc快速编辑~/.vimrc.custom.config文件<leader>h打开vimplus帮助文档<leader>H打开当前光标所在单词的vim帮助文档<leader><leader>t生成try-catch代码块<leader><leader>y复制当前选中到系统剪切板<leader><leader>i安装插件<leader><leader>u更新插件<leader><leader>c删除插件

    插入模式

    快捷键说明
    i在光标处进入插入模式
    I在行首进入插入模式
    a在光标后进入插入模式
    A在行尾进入插入模式
    o在下一行插入新行并进入插入模式
    O在上一行插入新行并进入插入模式
    gi进入到上一次插入模式的位置
    <esc>退出插入模式

    缓存操作

    快捷键说明
    :e <filename>新建buffer打开文件
    :bp切换到上一个buffer
    :bn切换到下一个buffer
    :bd删除当前buffer

    窗口操作

    快捷键说明
    :sp <filename>横向切分窗口并打开文件
    :vsp <filename>竖向切分窗口并打开文件
    <c-w>h跳到左边的窗口
    <c-w>j跳到下边的窗口
    <c-w>k跳到上边的窗口
    <c-w>l跳到右边的窗口
    <c-w>c关闭当前窗口
    <c-w>o关闭其他窗口
    :only关闭其他窗口

    光标移动

    快捷键说明
    h上下左右移动
    j上下左右移动
    k上下左右移动
    l上下左右移动
    0光标移动到行首
    ^跳到从行首开始第一个非空白字符
    $光标移动到行尾
    <c-o>跳到上一个位置
    <c-i>跳到下一个位置
    <c-b>上一页
    <c-f>下一页
    <c-u>上移半屏
    <c-d>下移半屏
    H调到屏幕顶上
    M调到屏幕中间
    L调到屏幕下方
    :n跳到第n行
    w跳到下一个单词开头(标点或空格分隔的单词)
    W跳到下一个单词开头(空格分隔的单词)
    e跳到下一个单词尾部(标点或空格分隔的单词)
    E跳到下一个单词尾部(空格分隔的单词)
    b上一个单词头(标点或空格分隔的单词)
    B上一个单词头(空格分隔的单词)
    ge上一个单词尾
    %在配对符间移动, 可用于()、{}、[]
    gg到文件首
    G到文件尾
    fx跳转到下一个为x的字符
    Fx跳转到上一个为x的字符
    tx跳转到下一个为x的字符前
    Tx跳转到上一个为x的字符前
    ;跳到下一个搜索的结果
    [[跳转到函数开头
    ]]跳转到函数结尾

    文本编辑

    快捷键说明
    r替换当前字符
    R进入替换模式,直至 ESC 离开
    s替换字符(删除光标处字符,并进入插入模式,前可接数量)
    S替换行(删除当前行,并进入插入模式,前可接数量)
    cc改写当前行(删除当前行并进入插入模式),同 S
    cw改写光标开始处的当前单词
    ciw改写光标所处的单词
    caw改写光标所处的单词,并且包括前后空格(如果有的话)
    ct,改写到逗号
    c0改写到行首
    c^改写到行首(第一个非零字符)
    c$改写到行末
    C改写到行末(同 c$)
    ci"改写双引号中的内容
    ci'改写单引号中的内容
    ci)改写小括号中的内容
    ci]改写中括号中内容
    ci}改写大括号中内容
    cit改写 xml tag 中的内容
    cis改写当前句子
    ciB改写'{}'中的内容
    c2w改写下两个单词
    ct(改写到小括号前
    x删除当前字符,前面可以接数字,3x代表删除三个字符
    X向前删除字符
    dd删除当前行
    d0删除到行首
    d^删除到行首(第一个非零字符)
    d$删除到行末
    D删除到行末(同 d$)
    dw删除当前单词
    dt,删除到逗号
    diw删除光标所处的单词
    daw删除光标所处的单词,并包含前后空格(如果有的话)
    di"删除双引号中的内容
    di'删除单引号中的内容
    di)删除小括号中的内容
    di]删除中括号中内容
    di}删除大括号中内容
    diB删除'{}'中的内容
    dit删除 xml tag 中的内容
    dis删除当前句子
    d2w删除下两个单词
    dt(删除到小括号前
    dgg删除到文件头部
    dG删除到文件尾部
    d}删除下一段
    d{删除上一段
    u撤销
    U撤销整行操作
    CTRL-R撤销上一次 u 命令
    J连接若干行
    gJ连接若干行,删除空白字符
    .重复上一次操作
    ~交换大小写
    g~iw替换当前单词的大小写
    gUiw将单词转成大写
    guiw将当前单词转成小写
    guu全行转为小写
    gUU全行转为大写
    gg=G缩进整个文件
    =a{缩进光标所在代码块
    =i{缩进光标所在代码块,不缩进"{"
    <<减少缩进
    >>增加缩进
    ==自动缩进
    CTRL-A增加数字
    CTRL-X减少数字
    p粘贴到光标后
    P粘贴到光标前
    v开始标记
    y复制标记内容
    V开始按行标记
    CTRL-V开始列标记
    y$复制当前位置到本行结束的内容
    yy复制当前行
    Y复制当前行,同 yy
    yt,复制到逗号
    yiw复制当前单词
    "+y复制当前选中到系统剪切板
    3yy复制光标下三行内容
    v0选中当前位置到行首
    v$选中当前位置到行末
    vt,选中到逗号
    viw选中当前单词
    vi)选中小括号内的东西
    vi]选中中括号内的东西
    viB选中'{}'中的内容
    vis选中句子中的东西
    gv重新选择上一次选中的文字
    :set paste允许粘贴模式(避免粘贴时自动缩进影响格式)
    :set nopaste禁止粘贴模式
    "?yy复制当前行到寄存器 ? ,问号代表 0-9 的寄存器名称
    "?p将寄存器 ? 的内容粘贴到光标后
    "?P将寄存器 ? 的内容粘贴到光标前
    :registers显示所有寄存器内容
    :[range]y复制范围,比如 :20,30y 是复制20到30行,:10y 是复制第十行
    :[range]d删除范围,比如 :20,30d 是删除20到30行,:10d 是删除第十行
    ddp交换两行内容:先删除当前行复制到寄存器,并粘贴

    文件操作

    快捷键说明
    :w保存文件
    :w <filename>按名称保存文件
    ZZ保存文件(如果有改动的话),并关闭窗口
    :e <filename>打开文件并编辑
    :saveas <filename>另存为文件
    :r <filename>读取文件并将内容插入到光标后
    :r !dir将dir命令的输出捕获并插入到光标后
    :close关闭文件
    :q退出
    :q!强制退出
    :wa保存所有文件
    :cd <path>切换Vim当前路径
    :new打开一个新的窗口编辑新文件
    :enew在当前窗口创建新文件
    :vnew在左右切分的新窗口中编辑新文件
    :tabnew在新的标签页中编辑新文件

    使用外部程序

    快捷键说明
    !告诉vim正在执行一个过滤操作
    !5Gsort<Enter>使用外部sort命令对1-5行文本排序
    !!对当前行执行过滤命令
    !!date<Enter>用"date"的输出代替当前行

    宏录制

    快捷键说明
    qa开始录制名字为a的宏
    q结束录制宏
    @a播放名字为a的宏
    100@a播放名字为a的宏100次
    :normal@a播放名字为a的宏直到自动结束

    实用命令

    快捷键说明
    /pattern从光标处向文件尾搜索 pattern
    ?pattern从光标处向文件头搜索 pattern
    n向同一方向执行上一次搜索
    N向相反方向执行上一次搜索
    *向前搜索光标下的单词
    #向后搜索光标下的单词
    :s/p1/p2/g替换当前行的p1为p2
    :%s/p1/p2/g替换当前文件中的p1为p2
    :%s/<p1>/p2/g替换当前文件中的p1单词为p2
    :%s/p1/p2/gc替换当前文件中的p1为p2,并且每处询问你是否替换
    :10,20s/p1/p2/g将第10到20行中所有p1替换为p2
    :%s/1\\2\/3/123/g将“12/3” 替换为 “123”(特殊字符使用反斜杠标注)
    :%s/\r//g删除 DOS 换行符 ^M
    :g/^\s*$/d删除空行
    :g/test/d删除所有包含 test 的行
    :v/test/d删除所有不包含 test 的行
    :%s/^/test/在行首加入特定字符(也可以用宏录制来添加)
    :%s/$/test/在行尾加入特定字符(也可以用宏录制来添加)
    :sort排序
    :g/^\(.\+\)$\n\1/d去除重复行(先排序)
    :%s/^.\{10\}//删除每行前10个字符
    :%s/.\{10\}$//删除每行尾10个字符

    帮助

    快捷键说明
    h tutor入门文档
    h quickref快速帮助
    h index查询Vim所有键盘命令定义
    h summary帮助你更好的使用内置帮助系统
    h pattern.txt正则表达式帮助
    h eval脚本编写帮助
    h function-list查看VimScript的函数列表
    h windows.txt窗口使用帮助
    h tabpage.txt标签页使用帮助
    h tips查看Vim内置的常用技巧文档
    h quote寄存器
    h autocommand-events所有可能事件
    h write-plugin编写插件

    其他

    快捷键说明
    vim -u NONE -N开启vim时不加载vimrc文件
    vimdiff file1 file2显示文件差异
    vim -R filename以只读方式打开(阅读模式)
    ]]>
    0 /index.php/archives/303/#comments /index.php/feed/archives/303/
    如何在Linux中创建文件 /index.php/archives/302/ /index.php/archives/302/ Wed, 03 Feb 2021 19:08:15 +0800 猫粮d 如何在Linux中创建文件在Linux中,我们可以从命令行或桌面文件管理器创建一个新文件。

    对于定期使用Linux的任何人来说,知道如何创建新文件都是一项重要技能。

    在本教程中,我们将向您展示使用命令行在Linux中快速创建新文件的各种方法。

    在你开始之前

    要创建一个新文件,您需要对父目录具有写权限。否则,您将收到一个权限被拒绝的错误。

    如果要显示目录的内容,请使用ls命令

    使用touch命令创建文件

    touch命令可以让我们来更新现有的文件和目录以及创建新的空文件的时间戳。

    创建新的空文件的最简单,最难忘的方法是使用touch命令。

    要创建新文件,只需运行touch命令,然后输入要创建的文件名即可:

    touch file1.txt

    Copy

    如果文件 file1.txt不存在,则上面的命令将创建该文件,否则,它将更改其时间戳。

    要一次创建多个文件,请指定文件名,并用空格分隔:

    touch file1.txt file2.txt file3.txt

    Copy

    使用重定向运算符创建文件

    重定向允许您捕获命令的输出,并将其作为输入发送到另一个命令或文件。有两种方法可以将输出重定向到文件。> 操作符将覆盖现有文件,而 >> 操作符将追加输出到文件中。

    要创建一个空的零长度文件,只需在重定向操作符之前指定要创建的文件名即可:

    > file1.txt

    Copy

    这是在Linux中创建新文件的最短命令。

    使用重定向创建文件时,请注意不要覆盖现有的重要文件。

    使用cat命令创建文件

    cat命令主要用于读取和连接文件,但它也可以用于创建新的文件。

    要创建新文件,请运行cat命令,后跟重定向操作符 >和要创建的文件名。按 Enter输入文字,完成后按 CRTL+D保存文件。

    cat > file1.txt

    Copy

    使用echo命令创建文件

    所述echo命令的标准输出,其传递的字符串可以被重定向到文件。

    要创建新文件,请运行echo命令,后跟要打印的文本,然后使用重定向操作符 >将输出写入要创建的文件。

    echo "Some line" > file1.txt

    Copy

    如果要创建一个空文件,只需使用:

    echo > file1.txt

    Copy

    使用Heredoc创建文件

    这里document或Heredoc是一种重定向类型,允许您将多行输入传递给命令。

    当您要从Shell脚本创建包含多行文本的文件时,通常使用此方法。

    例如,要创建一个新文件,file1.txt您将使用以下代码:

    << EOF > file1.txtSome lineSome other lineEOF

    Copy

    Heredoc的正文可以包含变量,特殊字符和命令。

    创建一个大文件

    有时,出于测试目的,您可能需要创建一个大数据文件。当您要测试驱动器的写入速度或测试连接的下载速度时,此功能很有用。

    使用 dd命令

    dd命令主要用于转换和复制文件。

    要创建一个 1G.test大小为1GB 的文件,请运行:

    dd if=/dev/zero of=1G.test bs=1 count=0 seek=1G

    Copy

    使用 fallocate命令

    fallocate 一个命令行实用程序,用于为文件分配实际磁盘空间。

    以下命令将创建一个名为 1G.test1GB 的新文件:

    fallocate -l 1G 1G.test

    Copy

    结论

    在本教程中,您学习了如何使用各种命令和重定向从命令行在Linux中创建新文件。

    如果您不喜欢使用命令行,则可以使用“文件管理器”中的右键菜单轻松创建空白文本文件。

    ]]>
    0 /index.php/archives/302/#comments /index.php/feed/archives/302/