代码之家  ›  专栏  ›  技术社区  ›  AJ.

把单词分成几行?

  •  9
  • AJ.  · 技术社区  · 15 年前

    我经常使用 轮班 + J 在视觉模式下 参加 将多个选定行合并为一行,原始行之间用空格分隔。但是我想知道是否有相反的捷径 分裂 将所选单词分成单独的行(每行一个单词)。

    当然我能做到:

    :'<,'>s/ /^M/g

    但是在击键方面更简洁的东西是非常有用的。有没有其他人找到办法做到这一点?

    事先谢谢,

    AJ

    3 回复  |  直到 15 年前
        1
  •  4
  •   michael    15 年前

    如果您经常在~/.vimrc文件或类似文件中使用它,请映射它。

    vnoremap \ll :'<,'>s/ /^M/g<cr>
    nnoremap \ll :s/ /^M/g<cr>
    

    如果您现在只想多次搜索,也可以使用&命令重复上次搜索

    也有gqq,但这是为了文本宽度,例如80个字符

        2
  •  3
  •   chris    12 年前

    最近我偶然发现了同样的问题。我的解决方案是以下VIM功能(将 .vimrc ):

    function SplitToLines() range
      for lnum in range(a:lastline, a:firstline, -1)
        let words = split(getline(lnum))
        execute lnum . "delete"
        call append(lnum-1, words)
      endfor
    endfunction
    

    这可用于行范围,例如如下所示

    :26call SplitToLines()
    

    这将拆分第26行。但是代码也能优雅地处理行的范围(这就是为什么for循环中的范围是按相反的顺序构建的)。

    1,10call SplitToLines()
    

    将行1到10拆分为多行。但是,我主要在视觉模式下使用它,比如

    '<,'>call SplitToLines()
    

    它分割所有可见标记的行。当然,您可以为这个函数调用定义一些单字母缩写(自动完成于 标签 我觉得没有必要)。另外请注意,通过添加一个附加的参数(也将由“split”使用),您可以拥有一个在特定模式下拆分行的函数(而不仅仅是空白)。

        3
  •  1
  •   arkod    12 年前

    我在配置中使用此命令取消连接/拆分当前行的最后一个单词:

    nnoremap <C-J> g_F<Space><Space>i<CR><Esc>k
    

    它映射ctrl-j来执行join的相反操作,我认为它是counter join:)我主要使用它在k&r样式和…另一种花括号位置之间转换。

    g_       : search for the last non-whitespace on current line
    F<Space> : reverse-find first space
    <Space>  : go one character forward
    i        : enter insert mode
    <CR>     : insert a line break
    <Esc>    : return to normal mode
    k        : go up one line to where we begun