old-www/HOWTO/C-editing-with-VIM-HOWTO/moving.html

609 lines
9.1 KiB
HTML

<HTML
><HEAD
><TITLE
> Moving around.
</TITLE
><META
NAME="GENERATOR"
CONTENT="Modular DocBook HTML Stylesheet Version 1.57"><LINK
REL="HOME"
TITLE=" C editing with VIM HOWTO
"
HREF="index.html"><LINK
REL="PREVIOUS"
TITLE=" Introduction
"
HREF="intro.html"><LINK
REL="NEXT"
TITLE=" Jumping to random positions in C files
"
HREF="random.html"></HEAD
><BODY
CLASS="SECT1"
BGCOLOR="#FFFFFF"
TEXT="#000000"
LINK="#0000FF"
VLINK="#840084"
ALINK="#0000FF"
><DIV
CLASS="NAVHEADER"
><TABLE
WIDTH="100%"
BORDER="0"
CELLPADDING="0"
CELLSPACING="0"
><TR
><TH
COLSPAN="3"
ALIGN="center"
>C editing with VIM HOWTO</TH
></TR
><TR
><TD
WIDTH="10%"
ALIGN="left"
VALIGN="bottom"
><A
HREF="intro.html"
>Prev</A
></TD
><TD
WIDTH="80%"
ALIGN="center"
VALIGN="bottom"
></TD
><TD
WIDTH="10%"
ALIGN="right"
VALIGN="bottom"
><A
HREF="random.html"
>Next</A
></TD
></TR
></TABLE
><HR
ALIGN="LEFT"
WIDTH="100%"></DIV
><DIV
CLASS="SECT1"
><H1
CLASS="SECT1"
><A
NAME="MOVING"
>2. Moving around.</A
></H1
><DIV
CLASS="SECT2"
><H2
CLASS="SECT2"
><A
NAME="AEN29"
>2.1. w, e and b keystrokes</A
></H2
><P
>
One can use the <B
CLASS="KEYCAP"
>w</B
>, <B
CLASS="KEYCAP"
>e</B
> and
<B
CLASS="KEYCAP"
>b</B
> keys to move around a file. VIM is
capable of recognizing the different tokens within a C expression.
</P
><P
> Consider the following C code
</P
><DIV
CLASS="FIGURE"
><A
NAME="AEN36"
></A
><P
><B
>Figure 1. A C snippet
</B
></P
><DIV
CLASS="MEDIAOBJECT"
><P
><IMG
SRC="moving1.png"
></IMG
></P
></DIV
><DIV
CLASS="TEXTOBJECT"
><TABLE
BORDER="0"
BGCOLOR="#E0E0E0"
WIDTH="100%"
><TR
><TD
><PRE
CLASS="PROGRAMLISTING"
>
...
if(( NULL == x ) &#38;&#38; y &#62; z )
...
</PRE
></TD
></TR
></TABLE
></DIV
></DIV
><P
>
Assume that the cursor is positioned at the beginning of
the <B
CLASS="KEYCAP"
>if</B
> statement. By pressing w once the
cursor jumps to the first <B
CLASS="KEYCAP"
>(</B
>. By typing
<B
CLASS="KEYCAP"
>w</B
> again the cursor moves to
<B
CLASS="KEYCAP"
>NULL</B
>. Next time the cursor will move to the
<B
CLASS="KEYCAP"
>==</B
> token. Further keystrokes will take
you as follows. <B
CLASS="KEYCAP"
>x.</B
>..
<B
CLASS="KEYCAP"
>)</B
>... <B
CLASS="KEYCAP"
>&#38;&#38;</B
>...
<B
CLASS="KEYCAP"
>y</B
>... <B
CLASS="KEYCAP"
>&#62;</B
>...
<B
CLASS="KEYCAP"
>z</B
>... and finally <B
CLASS="KEYCAP"
>)</B
>...
</P
><P
>
<B
CLASS="KEYCAP"
>e</B
> is similar to <B
CLASS="KEYCAP"
>w</B
> only
that it takes you to the end of the current word and not
to the beginning of the next word.
</P
><P
>
<B
CLASS="KEYCAP"
>b</B
> does the exact opposite of
<B
CLASS="KEYCAP"
>w</B
>. It moves the cursor in the opposite
direction. So you can moving backwards using the
<B
CLASS="KEYCAP"
>b</B
> keystroke.
</P
></DIV
><DIV
CLASS="SECT2"
><H2
CLASS="SECT2"
><A
NAME="AEN63"
>2.2. {, }, [[ and ]] keystrokes</A
></H2
><P
> The <B
CLASS="KEYCAP"
>{</B
> and <B
CLASS="KEYCAP"
>}</B
> keys are
used to move from paragraph to paragraph. When editing C
files these keys have a slightly different meaning. Here a
paragraph is taken as a bunch of lines separated by an
empty line.
</P
><P
> For Example
</P
><DIV
CLASS="FIGURE"
><A
NAME="AEN69"
></A
><P
><B
>Figure 2. Another C snippet
</B
></P
><DIV
CLASS="MEDIAOBJECT"
><P
><IMG
SRC="moving2.png"
></IMG
></P
></DIV
></DIV
><P
>
The above snippet shows two paragraphs. One can easily
move from the beginning of one to the other, by using the
<B
CLASS="KEYCAP"
>{</B
> and <B
CLASS="KEYCAP"
>}</B
>
keys. <B
CLASS="KEYCAP"
>{</B
> will take the cursor to the
paragraph above and <B
CLASS="KEYCAP"
>}</B
> will take the
cursor to the paragraph below.
</P
><P
>
Many people have the coding style where a logical set of
statements are grouped together and separated by
one or more blank lines.
</P
><P
> For Example
</P
><DIV
CLASS="FIGURE"
><A
NAME="AEN83"
></A
><P
><B
>Figure 3. Another C snippet
</B
></P
><DIV
CLASS="MEDIAOBJECT"
><P
><IMG
SRC="moving3.png"
></IMG
></P
></DIV
></DIV
><P
> The <B
CLASS="KEYCAP"
>{</B
> and <B
CLASS="KEYCAP"
>}</B
> keys are
very useful in such situations. One can very easily move
from one "paragraph" to another.
</P
><P
>
Another set of keys which are useful are the
<B
CLASS="KEYCAP"
>[[</B
> and <B
CLASS="KEYCAP"
>]]</B
> keys. These
keys allow you to jump to the previous { or next { in the
first column.
</P
><P
> For Example
</P
><DIV
CLASS="FIGURE"
><A
NAME="AEN97"
></A
><P
><B
>Figure 4. The next snippet of C code
</B
></P
><DIV
CLASS="MEDIAOBJECT"
><P
><IMG
SRC="moving4.png"
></IMG
></P
></DIV
></DIV
><P
> Lets say you were editing foo() and now you want to edit
bar(). Just type <B
CLASS="KEYCAP"
>]]</B
> and the cursor will
take you to the opening { of the bar() function. The
reverse is slightly different. If you were in the middle of bar()
and you type <B
CLASS="KEYCAP"
>[[</B
> the cursor will move to
the first { above i.e. the beginning of bar() itself. One
has to type <B
CLASS="KEYCAP"
>[[</B
> again to move to the
beginning of foo(). The number of keystrokes can be
minimized by typing <B
CLASS="KEYCAP"
>2[[</B
> to take the
cursor to the beginning of the previous function.
</P
><P
>
Another set of similar keystrokes are the <B
CLASS="KEYCAP"
>][</B
> and
<B
CLASS="KEYCAP"
>[]</B
> keystrokes. <B
CLASS="KEYCAP"
>][</B
> takes
the cursor to next } in the first column. If you were
editing foo() and wanted to go to the end of foo() then
<B
CLASS="KEYCAP"
>][</B
> will take you there. Similarly if you were
editing bar() and wanted to go to the end of foo() then
<B
CLASS="KEYCAP"
>[]</B
> would take the cursor there.
</P
><P
>
The way to remember the keystrokes is by breaking them
up. The first keystroke will indicated whether to move up
or down. <B
CLASS="KEYCAP"
>[</B
> will move up and
<B
CLASS="KEYCAP"
>]</B
> will move down. The next keystroke
indicates the type of brace to match. If it same same as
the previous keystroke then the cursor will move to {. If
the keystroke is different then the cursor will move to
}.
</P
><P
>
One caveat of the <B
CLASS="KEYCAP"
>]]</B
>, <B
CLASS="KEYCAP"
>][</B
>,
<B
CLASS="KEYCAP"
>[[</B
> and <B
CLASS="KEYCAP"
>[]</B
> keystrokes is
that they match the braces which are in the
<I
CLASS="EMPHASIS"
>first column</I
>. If one wants to match
all braces upwards and downwards regardless of whether its
in the first column or not is not possible. The VIM
documentation has a workaround. One has to map the
keystrokes to find the braces. Without spending too much
time on mapping, the suggested mappings are
</P
><P
> <B
CLASS="COMMAND"
> :map [[ ?{&#60;CTRL-VCTRL-M&#62;w99[{
</B
>
</P
><P
>
<B
CLASS="COMMAND"
> :map ][ /}&#60;CTRL-VCTRL-M&#62;b99]}
</B
>
</P
><P
>
<B
CLASS="COMMAND"
> :map ]] j0[[%/{&#60;CTRL-VCTRL-M&#62;
</B
>
</P
><P
>
<B
CLASS="COMMAND"
> :map [] k$][%?}&#60;CTRL-VCTRL-M&#62;
</B
>
</P
></DIV
><DIV
CLASS="SECT2"
><H2
CLASS="SECT2"
><A
NAME="AEN132"
>2.3. % keystroke</A
></H2
><P
>
The <B
CLASS="KEYCAP"
>%</B
> is used to match the item under the
cursor. The item under the cursor can be a parenthesis, a
curly bracket or a square bracket. By pressing the % key
the cursor will jump to the corresponding match.
</P
><P
> Amongst other things, the <B
CLASS="KEYCAP"
>%</B
> keystroke
can be used to match #if, #ifdef, #else #elif and #endif
also.
</P
><P
>
This keystroke is very useful in validating code that one
has written. For Example
</P
><DIV
CLASS="FIGURE"
><A
NAME="AEN139"
></A
><P
><B
>Figure 5. The next snippet of C code
</B
></P
><DIV
CLASS="MEDIAOBJECT"
><P
><IMG
SRC="moving5.png"
></IMG
></P
></DIV
></DIV
><P
>
Checking the above code will involve checking the correctness
of the parenthesis. The <B
CLASS="KEYCAP"
>%</B
> can be used to
jump from one ( to its corresponding ) and vice versa.
Thus, one can find which opening parenthesis corresponds to
which closing parenthesis and use the information to
validate the code.
</P
><P
>
Similarly the <B
CLASS="KEYCAP"
>%</B
> can also be used to jump
from a { to its corresponding }.
</P
></DIV
></DIV
><DIV
CLASS="NAVFOOTER"
><HR
ALIGN="LEFT"
WIDTH="100%"><TABLE
WIDTH="100%"
BORDER="0"
CELLPADDING="0"
CELLSPACING="0"
><TR
><TD
WIDTH="33%"
ALIGN="left"
VALIGN="top"
><A
HREF="intro.html"
>Prev</A
></TD
><TD
WIDTH="34%"
ALIGN="center"
VALIGN="top"
><A
HREF="index.html"
>Home</A
></TD
><TD
WIDTH="33%"
ALIGN="right"
VALIGN="top"
><A
HREF="random.html"
>Next</A
></TD
></TR
><TR
><TD
WIDTH="33%"
ALIGN="left"
VALIGN="top"
>Introduction</TD
><TD
WIDTH="34%"
ALIGN="center"
VALIGN="top"
>&nbsp;</TD
><TD
WIDTH="33%"
ALIGN="right"
VALIGN="top"
>Jumping to random positions in C files</TD
></TR
></TABLE
></DIV
></BODY
></HTML
>