立帝货 發表於 2023-8-21 00:00:00

Vim如何使用相对行号实现一切操作详解

<p>
        <span><strong>前言</strong></span></p>
<p>
        大家都知道,我们使用vim的一点好处就是,可定制性非常高,如果遇到任何让自己感到不适的痛点,都可以通过配置甚至开发一款插件来解决。开始使用vim一段时间之后,我发现一个非常“反人类”的地方:vim的很多命令都是需要查行数的。比如“删除一个函数体”,你就要数数这个函数占了几行(比如5行),然后按5dd。如果是使用鼠标的话就不用数了,可以直接拖过去,但是鼠标效率太低,既然学了vim就不要让手离开键盘了。</p>
<p>
        我总结了一套方案,几乎所有的操作都可以不用数数来完成。</p>
<p>
        vim支持两种行号,相对行号和绝对行号。相对行号是显示每一行距离光标所在行相隔多少行,绝对行号就是顺序显示每一行的序号。</p>
<p>
        <span><strong>vim使用相对</strong></span></p>
<p>
        set nu打开行号显示, set rnu打开相对行号显示(更多信息可以查看<code>:help nu </code>和 <code>:help rnu</code>。</p>
<p>
        <strong>效果如下:</strong></p>
<p>
        <img title="Vim如何使用相对行号实现一切操作详解" alt="Vim如何使用相对行号实现一切操作详解" src="https://zhuji.jb51.net/uploads/img/202305/4b90004c18af0173b9a57842047b762c.jpg"><br>
        打开行号显示</p>
<p>
        <img title="Vim如何使用相对行号实现一切操作详解" alt="Vim如何使用相对行号实现一切操作详解" src="https://zhuji.jb51.net/uploads/img/202305/fa4fcd4e2b337809f5ae9d9f2b8a162e.jpg"><br>
        打开相对行号的显示</p>
<p>
        <img title="Vim如何使用相对行号实现一切操作详解" alt="Vim如何使用相对行号实现一切操作详解" src="https://zhuji.jb51.net/uploads/img/202305/d8e2223a5b2d8951969bb0b03915d50a.jpg"><br>
        同时打开相对行号和绝对行号</p>
<p>
        可以看到,如果同时打开二者,就会在当前行显示绝对行号,其他显示距离当前行的距离。</p>
<p>
        使用一段时间我发现,在normal模式时,经常进行对多行的操作,这时候如果使用绝对行号,那么必然是要做减法,或者去数数来确定行的数量的。所以在normal模式应该使用相对行号。0对我们来说是没有任何作用的,所以当前行还是显示行号吧。</p>
<p>
        <strong>然后一些常用的操作习惯都要相应换一下:</strong></p>
<ul>
<li>
                删除n行。3dd是删除包括当前行一共3行,但是因为显示的是相对行号,我们要“删除直到目标行”的时候,要不自觉的+1,比如在上面最后一幅图,要删除直到“终端配色安装”的内容,就要按4dd。有没有办法不用计算,所见即所得呢?有的,d3j即可。command+直到目标行号+方向。例如删除直到上面“我对……”的内容,就是d4k。</li>
        <li>
                其余的操作也是类似,例如移动到下面4行,可以用4gg,也可以用g4j。其他还有yank操作等。</li>
        <li>
                替换范围本来是使用绝对行号就可以,例如替换10-20行,就是:10,20s/xxx/yyy/g,但是由于我们normal模式显示了相对行号,那么就要根据相对行号操作了: :.+2,.+12s/xxx/yyy/g (假设当前在第8行)。.在vim中表示当前行,要善于利用。由于我们显示的是相对行号,所以基本上和行号有关的操作都需要计算完成,用.加上/减去显示的相对行号(所见即所得)</li>
</ul>
<p>
        在insert模式时,我们一般都是编辑操作,不会对多行进行判断,此时可能对绝对行号更关心(写到多少行了等)。所以可以监听一下事件,进入编辑模式时使用绝对行号,退出编辑模式进入normal模式时使用相对行号。</p>
<p>
        <strong>设置如下:</strong></p>
<div class="jb51code">
        <div>
                <div class="syntaxhighlighterbash" id="highlighter_13908">
                        <div class="toolbar">
                                <span>?</span>
</div>
                        <table border="0" cellpadding="0" cellspacing="0"><tbody><tr>
<td class="gutter">
                                                        <div class="line number1 index0 alt2">
                                                                1</div>
                                                        <div class="line number2 index1 alt1">
                                                                2</div>
                                                        <div class="line number3 index2 alt2">
                                                                3</div>
                                                        <div class="line number4 index3 alt1">
                                                                4</div>
                                                        <div class="line number5 index4 alt2">
                                                                5</div>
                                                        <div class="line number6 index5 alt1">
                                                                6</div>
                                                </td>
                                                <td class="code">
                                                        <div class="container">
                                                                <div class="line number1 index0 alt2">
                                                                        <code class="bash functions">set</code> <code class="bash plain">nu</code>
</div>
                                                                <div class="line number2 index1 alt1">
                                                                        <code class="bash plain">augroup relative_numbser</code>
</div>
                                                                <div class="line number3 index2 alt2">
                                                                        <code class="bash spaces"> </code><code class="bash plain">autocmd!</code>
</div>
                                                                <div class="line number4 index3 alt1">
                                                                        <code class="bash spaces"> </code><code class="bash plain">autocmd insertenter * :</code><code class="bash functions">set</code> <code class="bash plain">norelativenumber</code>
</div>
                                                                <div class="line number5 index4 alt2">
                                                                        <code class="bash spaces"> </code><code class="bash plain">autocmd insertleave * :</code><code class="bash functions">set</code> <code class="bash plain">relativenumber</code>
</div>
                                                                <div class="line number6 index5 alt1">
                                                                        <code class="bash plain">augroup end</code>
</div>
                                                        </div>
                                                </td>
                                        </tr></tbody></table>
</div>
        </div>
</div>
<p>
        set nu是因为我一般打开一个文件不一定是编辑目的,浏览的话绝对行号更方便。这样设置可以让第一次进入文件的时候使用绝对行号,进入编辑模式再退出到normal模式时再显示相对行号。</p>
<p>
        这样用了一段时间,感觉按下的键多了,但是脑子里需要的计算少了很多,还不容易出错,挺好的。</p>
<p>
        最后附上,供参考使用,不推荐盲目复制。</p>
<p>
        <span><strong>相关问题</strong></span></p>
<p>
        在 vim 7.4 之前的版本, 启用相对行号当前行号将变为0, 无法显示正常的行号, 在 vim 7.4 中则可以正常的显示当前行号的同时来显示相对行号, 下面有两张图可以对比</p>
<p>
        <strong>vim 7.3</strong></p>
<p>
        <img title="Vim如何使用相对行号实现一切操作详解" alt="Vim如何使用相对行号实现一切操作详解" src="https://zhuji.jb51.net/uploads/img/202305/dfd33363a2ba94549f0c7a3a56804a39.jpg"></p>
<p>
        <strong>vim 7.4</strong></p>
<p>
        <img title="Vim如何使用相对行号实现一切操作详解" alt="Vim如何使用相对行号实现一切操作详解" src="https://zhuji.jb51.net/uploads/img/202305/c558c3e6e980474ed731bbcd3eafaf1f.jpg"></p>
<p>
        从上面的图片看来, 启用相对行号后可以很直观的看到当前行距离上面/下面某行的行数</p>
<p>
        <strong>可以使用以下指令启用这个特性</strong></p>
<div class="jb51code">
        <div>
                <div class="syntaxhighlighterplain" id="highlighter_274147">
                        <div class="toolbar">
                                <span>?</span>
</div>
                        <table border="0" cellpadding="0" cellspacing="0"><tbody><tr>
<td class="gutter">
                                                        <div class="line number1 index0 alt2">
                                                                1</div>
                                                </td>
                                                <td class="code">
                                                        <div class="container">
                                                                <div class="line number1 index0 alt2">
                                                                        <code class="plain plain">set relativenumber</code>
</div>
                                                        </div>
                                                </td>
                                        </tr></tbody></table>
</div>
        </div>
</div>
<p>
        启用相对行号后再也不用为了复制多行费力气的去数了</p>
<p>
        <span><strong>总结</strong></span></p>
<p>
        以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对的支持。</p>
<p>
        原文链接:https://www.kawabangga.com/posts/2287</p>
頁: [1]
查看完整版本: Vim如何使用相对行号实现一切操作详解