代码之家  ›  专栏  ›  技术社区  ›  Mark A. Nicolosi

如何在Vim中不进入插入模式的情况下在光标所在的位置插入换行符?

  •  102
  • Mark A. Nicolosi  · 技术社区  · 16 年前

    是否可以在Vim中光标所在的位置插入换行符,而无需进入插入模式?这里有一个例子( [x] 表示光标已打开 x ):

    if (some_condition) {[ ]return; }
    

    偶尔,我可能想输入更多代码。所以我会按 要进入插入模式,请按 进入 插入换行符,然后删除多余的空格。接下来,我将进入正常模式,将光标定位在右括号之前,然后做同样的事情,使其位于自己的行上。

    我已经做了一段时间了,但肯定有更好的方法吗?

    16 回复  |  直到 11 年前
        1
  •  92
  •   Alex Paul Becotte    12 年前

    对于您给出的示例,您可以使用 r 进入 用Enter替换单个字符(空格)。然后, f 空间 . 前进到下一个空格并重复上一个命令。

    根据您的自动缩进设置,上述内容可能会也可能不会正确缩进return语句。如果没有,则使用 s 进入 标签 Esc 相反,用换行符替换空格,缩进行,然后退出插入模式。您必须用不同的命令替换第二个空格,这样您就无法使用'。“在这种情况下。

        2
  •  11
  •   Adam Liss    16 年前

    通过按Ctrl+Enter键在光标处打断线条的简单映射:

    :nmap <c-cr> i<cr><Esc>

    基本上进入“插入”模式,插入换行符并返回正常模式。

    把它放在.vimrc文件中以备将来使用。

        3
  •  8
  •   community wiki Yariv    16 年前

    以下是如何创建一个宏,每当您按下'g'时,该宏都会在光标处插入换行符,同时 在插入模式下:

    在vim中键入:

    :map g i[Ctrl+V][Enter][Ctrl+V][Esc][Enter]
    

    哪里:

    • [Ctrl+V]表示 按住Ctrl键并按“v”
    • [Enter]表示 按Enter键
    • [Esc]表示 按Esc键

    在按下最后一个Enter键之前,您将在vim窗口底部看到以下内容:

    :map g i^M^[
    

    说明:

    [Ctrl+V]表示“引用以下字符”——它允许您在命令中嵌入换行符和转义符。

    因此,您将'g'键映射到序列:

    i [Enter] [Escape]

    这是vim 在光标前插入换行符,然后退出插入模式 .

    调整:

    • 您可以用任何尚未链接到您使用的命令的字符替换“g”。
    • 在命令中添加更多内容, 例如 f}i^M^[O --这将 f ind the } 插入另一个换行符,然后退出插入模式 英语字母表的第15个字母 画一个空行让你输入更多代码。
    • 您可以将该命令添加到.vimrc或.exrc文件中,使其永久化。只需从一开始就省略冒号,因此命令以“map”开头

    享受!

        4
  •  4
  •   slothbear    10 年前

    如果你通常将一行块扩展为三行,请尝试替换。将开口支架改为支架/回位,将闭合支架改为回位/支架。

    将括号/return替换为括号的命令如下:

    :s/{/{\r/
    

    由于你想经常使用它,你可以将整个序列映射到一个未使用的按键,如下所示:

    :map <F7> :s/{/{\r/ ^M :s/}/\r}/ ^M
    

    你看到的地方 M 在序列中,键入 [Ctrl-V] ,然后按 进入 .

    现在,将光标放在采样线上的任何位置,按映射键,将添加回车符。

    检查 :help map-which-keys 获取有关选择未使用的按键进行映射的建议。

        5
  •  2
  •   mondaugen    8 年前

    假设你对地图没问题 K 切换到其他键(选择您喜欢的其他键),并使用标记 ' 作为临时标记是可以的,为什么不这样做呢?

    :nmap K m'a<CR><Esc>`'
    

    现在,在正常模式下在字符上按K键,之后您希望发生换行,这将分割线条并将光标留在原来的位置。

        6
  •  1
  •   Aristotle Pagaltzis    16 年前

    基本上,当你拆分一行时,你要么只想插入回车符,要么在空格上,用回车符替换它。那么,为什么要满足于其中之一呢?这是我对K的映射:

    "Have K split lines the way J joins lines
    nnoremap <expr>K getline('.')[col('.')-1]==' ' ? "r<CR>" : "i<CR><Esc>"
    

    我使用三元运算符将两个动作压缩到一个键映射中。分解它, <expr> 意味着密钥映射的输出是动态的,在这种情况下取决于条件 getline('.')[col('.')-1]==' ' 这是询问vim光标下的字符是否为空格的冗长方式。最后,熟悉的三元算子 ? : 要么用换行符替换空格( r<CR> )或插入一个新的( i<CR><Esc> )

    现在你有一个可爱的妹妹钥匙地图 J 命令。

        7
  •  0
  •   Kiddo    13 年前

    如果你将一行一分为二,Vim会自动删除光标右侧的任何空白 autoindent (或任何其他压痕辅助工具)已启用。

    如果您不想使用这些设置中的任何一个,请使用 s 而不是 i 为了 s 用你的新文本替换空白,而不仅仅是插入。(如果有多个空格,请将光标放在最左侧并使用 cw 相反)

        8
  •  0
  •   Hotschke    10 年前

    事实上,您需要以下组合操作:

    1. v 进入视觉模式
    2. 选择要分割的线
    3. : 进入命令模式
    4. s/\s/\r/g
    5. 结束
        9
  •  0
  •   Janac Meena    9 年前

    如果您有输入:

    aaa bbb ccc ddd
    

    并希望输出

    aaa
    bbb
    ccc
    ddd
    

    您可以使用以下命令

    f r<ENTER>;.;.
    
        10
  •  0
  •   ctrl    9 年前

    o ESC 命令会为你做的。

        11
  •  0
  •   Unheilig Adonis González    8 年前

    在vimrc中设置此键映射

    :map <C-m> i<CR><Esc>h
    

    如果你想在vim中使用它,请按Ctrl+m。

        12
  •  0
  •   Yarden Akin    8 年前

    IMHO,内置映射 gs 这不是一个有用的映射(将vim置于睡眠状态),可以使用它进行拆分:

    nmap gs i<CR><ESC>
    
        13
  •  0
  •   JaredMcAteer    6 年前

    在……里面 Vrapper 您可以使用gql,它将在不进入插入模式的情况下拆分一行,但可能并不总是保持缩进。

        14
  •  -1
  •   Lucas Oman    16 年前

    我发现这是我所期望的相反行为的最忠实的实现 J

    nnoremap S i<cr><esc>^mwgk:silent! s/\v +$//<cr>:noh<cr>`w
    

    它在游标处执行简单的新行,处理前一行中的任何尾随空格(如果存在),然后将游标返回到正确的位置。

    <cr> <esc> -这是建议的最常见的解决方案之一,它不会删除光标下的非空白字符,但也会留下尾随的空白

    ^mw -转到新行的开头,并在下面创建一个标记 w

    gk公司 -往上走一条线

    :安静!s/\v+$// <cr> -正则表达式替换行尾的任何空格

    :不 <cr> -清除正则表达式可能已打开的任何突出显示的搜索

    w -返回下面的标记 w

    本质上结合了两者的优点 r <esc> <cr> <cr> <esc>

    注意:我已将此绑定到 S 这可能会覆盖一个有用的密钥,但它是 立方厘米 由于我不像拆分那样经常使用它,所以我可以覆盖它。