zoukankan      html  css  js  c++  java
  • 学习使用Vim(二)——User Manuals, Getting Started

    Vim的用户手册主要包含以下三个部分:

        Getting Started;
        Editing Effectively;
        Tuning Vim;
        分别代表基本编辑技巧,更优化的编辑技巧和优化Vim编辑器本身。

        先当然从Getting Started开始学习。

        About the manuals.
        这一节主要是对用户手册的基本介绍。其中说了,可以“从头到尾像读一本书那样来读用户手册”。这也是我准备要做的事。

        最有用的是两点,一是用“CTRL-]” 和“CTRL-o”跳来跳去;二是vimtutor的使用。


        The first steps in vim
        这一节提供了编辑文件的基本信息。是以后章节的基础。除去和vimtutor重复的内容,基本知识如下:
        vim中~代表不存在此行。
        普通模式和插入模式。(当不知道在哪个模式时,就多按几次esc回到插入 模式)
        vim中方向键的选择是出于按键最快捷的考虑。
        J可以将两行合行(join?).
        第二次U命令会取消前一次U命令的结果。
        多种插入方式:i, a, o, O。
        ZZ命令可以推出vim。
        :e!命令可以不保存修改,继续编辑。
        :help :help 关于如何获取帮助的帮助。但这个帮助比较复杂,我觉得这一节中Finding help的内容就完全足够了。


        Moving around.
        这一节主要讲怎样移动光标。移动光标是编辑文本时最频繁的操作,所以移动光标的速度很大程度上决定了编辑效率。
        跨单词移动:w,b,e,ge。
        用w和b跨段落移动比用l和k快得多。
        跨句子移动:$, ^, 0 。
        重要:单字符搜索命令,f,F,t, T。
        %用于括号匹配(形象地理解为两个0通过斜杠匹配起来)。
        gg回到文件第一行。
        当前页面的移动:H(home),M(middle),L(last)。
        打开行标号:set number。
        有用的命令zz,将光标行置于页面中间。
        使用*和#快捷搜索。
        使用<和>来搜索完整单词。
        使用:scriptnames命令来找到配置脚本的实际位置。
        用于搜索匹配的简单正则表达式:
            ^表示句首,$表示句尾。
            .用于匹配任意字符。
            想搜索. 要使用转义符。
        使用''跳回,或者使用CTRL-O,CTRL-I跳转。(O代表older,I只是因为在O旁边)
        mark(m):使用自己的标记。
        特殊标记:', ", [, ]。


        Making small changes.
        此节主要讲修改和移动文本的基本方法。包含三个重要概念:操作符和运动符,可视模式和文本对象。
        exclusive和inclusive的区别。
        operator-motion模式。
        c:change, 与d类似,但会进入插入模式。
        cw的例外:There is a saying that for every problem there is an answer that is simple, clear and wrong.
        单字母命令:x--dl, X--dh, D--d$, C--c$, s--cl, S--cc 。
        最简单但有力的vim命令 . 。
        使用v和V进入可视模式。
        使用CTRL-v进入可视块模式。
        可视模式下的o和O命令: o for other end。
        P 命令,粘贴在光标前或光标上。
        xp快速修改“teh”这一类的问题。
        y命令,用yank代替copy。
        剪切板:用"*yy 和"*p来实现全局的 复制和粘贴。
        文本对象 :aw(A Word), is(Inner Sentence), as(A Sentence)。
        R进入替换模式。
        用~来改变大小写。
        I 和 A, 句首插入和句尾插入。


        Set your settings.
        这一节介绍了最基本的优化vim和自定义偏好的方法,包括修改vimrc文件,增加插件和定义自己的宏。
        :version命令可以查看vimrc文件的基本信息。
        $VIMRUNTIME/vimrc_example.vim提供了一个简单的vimrc文件样版。
        filetype plugin indent on : 自动辨别文件类型,插件和缩进。
        映射可以将一系列的vim命令绑定到一个按键上。
        一个简单的映射:map<F5> i{<Esc>ea}<Esc> 。
        常用反斜杠来定义映射 。
        vim插件只是一个启动时自动加载的vim脚本。
        使用:helptags 命令将一个脚本的帮助文档加入到本地帮助文档中。
        :set iskeyword& 可以将选项置回为默认值。
        :set cmdheight=3 可以控制命令行高度。


        Using syntax highlighting.
        这一节主要将怎样使用色彩来使文本更生动,并且提高工作速度。
        使用:syntax enable来开启色彩功能,例如注释是蓝色,关键字是褐色,字符串红色等。
        可用的文件类型参见$VIMRUNTIME/syntax。
        使用:syntax reset来让颜色恢复到默认值。
        使用:colorsheme evening来选择其他颜色策略,所有颜色策略参见$VIMRUNTIME/colors。
        使用:runtime syntax/colortest.vim来检测常用颜色组合的效果。
        使用:TOhtml来将文件转换成HTML格式。
        关于颜色的更多内容参见usr_44.txt 和syntax的帮助内容。


        Editing more than one file.
        这一节主要讲如何同时在一系列文件上工作,并做跳转和复制。
        使用:edit filename, vim会关闭当前文件开启一个新的。
        使用vim fileone filetwo filethree来编辑多个文件。
        使用:next,:next!,:wnext来在文件间跳转。
        使用:args来看文件列表。
        使用:set autowrite和:set noautowrite。
        使用:args filefour filefive filesix来重定义文件列表。
        使用CTRL-^在两个文件间切换。
        ‘“可以回到上次光标停留的地方。
        ’.可以回到上次修改过的地方。
        小写字母是文件局部话的标签,大写字母则是全局标签。
        使用:marks M来查看M标签的位置。
        :set patchmode=.orig 来保存原文件。(对写代码很有用)
        寄存器是vim存储文本的地方,常使用a-z编号的寄存器。
        "fyas代表向f寄存器中存储一个句子。
        使用"fp来粘贴。
        使用:write >> logfile 将文本加入到另一个文件后面。
        vim -R file 可以用只读模式打开文件。
        vim -M file 可以用更严格的只读模式打开文件。
        使用:saveas命令和:file命令。 

     

        Splitting windows.
        这一节将的是分割窗口来同时编辑不同文件或同一文件的不同位置。
        最简单的分割窗口命令:split。
        CTRL-W w 命令用来在窗口间跳转,:close命令关闭窗口。
        特殊的,使用:only来关闭除当前窗口外的所有窗口。
        使用:split filename或者:new来分割窗口并编辑其它文件。
        在vim中,调整窗口大小是一个特殊动作:使用鼠标比使用键盘方便得多。
        使用:vsplit可以垂直分割窗口。(类似的:vnew也可用)
        在窗口间移动和在文本中移动类似,只是要加上CTRL-W。
        使用CTRL-W K可以将窗口移动到顶部(其它三个方向也类似)。
        使用:qall或者:wall等对所有窗口进行操作。
        vim -o one.txt two.txt three.txt或者:all命令的使用。
        vimdiff main.c~ main.c 用来比较不同的文件。
        使用:edit main.c 和:vertical diffsplit main.c~ 可以实现同样的效果。
        使用:edit main.c 和:vertical diffpatch main.c.diff来开启比较模式。
        使用]c 和[c在changes之间跳转。
        :diffupdate , dp(diff put)和do(diff obtain)。
        :tabedit filename和:tab split。
     
        Using the GUI
        这一节主要介绍vim的图形界面可以提供的额外功能。
        标题栏符号的意义:-不可修改,+包含变化,=只读,=+只读并包含变化。
        移除Toolbar,在vimrc文件中添加 :set guioptions-=T。
        使用:behave xterm 或者:behave mswin 来修改鼠标的工作方式。
        可优化的鼠标项: mouse, mousemodel, mousetime, mousehide, selectmode。
        同时使用"current selection"和"real clipboard"来优化编辑效率。
        "*寄存器代表current selection。
        "+寄存器代表real clipboard。
        Select mode:类似Visual mode,区别是选择模式下输入字符会替换已选字符。
        使用:set selectmode+=mouse来开启选择模式, 此时可用SHIFT+方向键移动光标。
     
        Making big changes.
        这一节讲大规模更改文本的方法,主要是在可视模式下的操作和使用外部程序完成复杂操作。
        录制命令的三个步骤:start recording-q{register},type your commands,finish recording-press q。
        使用命令@{register}执行录制好的宏。
        使用命令回放和使用.的区别:可重复多命令,有a-z这26个寄存器可用。
        修改寄存器n中错误命令的技巧:
            G        Go to the end of the file.
            o<Esc>        Create an empty line.
            "np        Put the text from the n register.
            {edits}         Change the commands that were wrong.
            0        Go to the start of the line.
            "ny$        Yank the corrected commands into the n register.
            dd        Delete the scratch line.
        使用q+大写字母,代表在寄存器中增加命令。
        替换命令 :[range]substitute/from/to/[flags], 例如:%s/old/new/g (g for global and c for confirm)。
        使用:.write otherfile写入单行文本。(. for current line and $ for the last line)
        替换单个章节 :?^Chapter?,/^Chapter/s=grey=gray=g。
        使用标记来描述范围,mt,mb,:'t,'b。

        更有力的命令:global, 形式如下:[range]g/{pattern}/{command}。

        块可视模式下,使用I和A插入。
        块可视模式下,使用c和C删除块同时插入字符串。
        块可视模式下,使用~,U和u进行大小写转换。
        块左右移动,使用>和<, 用:set shiftwidth=4进行设置。
        使用:0read patch,将patch文件写入文件首行。
        使用:.,$write tempo,将光标到文件结束的内容写入tempo中。
        使用>>来增加文件内容而不是擦除重写。
        gqap调整当前段落显示格式。
        全行大写gUU(gugu的简化形式)。
        使用外部程序,使用命令"!{motion}{program}"。
        例如!5Gsort<Enter>, !!date<Enter>。
        使用:read !dir读取dir命令的输出。
        使用:write !wc将单词数量写入文件中(Unix命令 count words)。
        CTRL-L, redraw the screen。

     

        Recovering from a crash.
        这一节主要介绍在电脑崩溃的情况下如何恢复以前的工作。
        最基本的恢复手段:vim -r help.txt。
        此时可以用Vimdiff来比较恢复后的文件和恢复前的文件:
           :write help.txt.recovered
           :edit #
           :diffsp help.txt
        在没有文件名的情况下编辑时,在正确目录下执行vim -r ""。
        在合适的目录下使用vim -r查找swap文件。
        使用特定的swap文件 vim -r .help.txt.swp。
        swap文件的命名规则:*.s[uvw][a-z]。

        swap文件存在的情况下的提醒:O,E,R,Q, A, D。


        Clever tricks.
        这一节主要介绍如何将多个命令结合起来使用。
        命令:%s/<four>/4/gc, 全文精准替换单词four,并每次提示。
        C++文件的方法名重构:
            vim *.cpp
            qq
            :%s/<oldFunctionName>/newFunctionName/g
            :wnext
            q
           
    999@q
        为避免不含有oldFunctionName的文件造成错误,使用
            :%s/<oldFunctionName>/newFunctionName/ge
        使用:%s/([^,]*),(.*)/2 1/来将Doe, John替换成John。

        举例,Makefile排序:
            /^OBJS    (找到以OBJS开头的一句话)
            j    (移到下一行)
            :.,/^$/-1!sort    (从当前行到下方第一个空行之前,排序)
        反转所有行序 :g/^/m 0。
        反转从标签t到当前行的行序 "mt", :'t+1,.g/^/m 't。
        计算文件字数 g CTRL-G。
        删除每行末尾的空格和制表符 :%s/s+$//。
        编辑所有带有"frame_counter"单词的c文件 vim 'grep -l frame_counter *.c'。
        使用:grep frame_counter *.c,加上:cnext, :cprev, :clist。


        vim编辑器的用户手册的第一部分终于看完一遍了,虽然只是beginner级别的,但对我来说,内容已经不少,需要花一段时间好好的消化一下了。所以,接下来,不准备立刻开始学习用户手册的第二和第三部分,而是在实践中逐渐熟练掌握学过的vim编辑方法,并积累更多有用的vim编辑技巧。
        近期来讲,并不准备用vim来代替IDE的功能,一方面我的掌握程度还远远不够。另一方面,每一个工具都有其最高效的作用域,我认为如果将vim和eclipse结合起来使用,工作效率会更高。
        就我这样半吊子的英语水平,看vim用户手册居然非常流利,几乎没有什么生僻的单词和难以理解的句子。这充分说明了作者将复杂的事情变简单的能力。在我们平时工作中,也要有这种能力,毕竟,不能将一件事向60岁的文盲老太太解释清楚,就不能说你充分理解了这件事。


     

  • 相关阅读:
    BEM(Block–Element-Modifier)
    http://element.eleme.io/#/zh-CN/component/quickstart
    Commit message 的写法规范。本文介绍Angular 规范(
    好的commit应该长啥样 https://github.com/torvalds/linux/pull/17#issuecomment-5654674
    代码管理
    if you have content fetched asynchronously on pages where SEO is important, SSR might be necessary
    Martin Fowler’s Active Record design pattern.
    The Zen of Python
    Introspection in Python How to spy on your Python objects Guide to Python introspection
    Object-Oriented Metrics: LCOM 内聚性的度量
  • 原文地址:https://www.cnblogs.com/yuanchongjie/p/4448382.html
Copyright © 2011-2022 走看看