代码之家  ›  专栏  ›  技术社区  ›  Rian Rizvi

向后删除连续空格或连续非空格直到行首

  •  0
  • Rian Rizvi  · 技术社区  · 6 年前

    Vim经常创建带有大量连续空格的行,所以我很惊讶,在前一个单词结束之前,没有一种简单的方法可以向后删除。我是不是漏掉了什么明显的东西?

    hello this is a line       |
    

    回到这里:

    hello this is a line|
    

    或光标前有非空白:

    你好这是电话|
    

    回到这里:

    hello this is a |
    

    这样我就可以在插入模式下映射一个键,然后返回删除单词或不删除单词。

    2 回复  |  直到 6 年前
        1
  •  0
  •   Community Egal    4 年前

    虽然vim不附带这样的命令,但它附带的命令与您想要的非常接近: ge gE ,在“帮助”中查找。幸运的是,这意味着用以下普通的、可视的和运算符挂起的映射来包装它们是很简单的:

    noremap <expr> <leader>e 'h'.v:count1.'gel'
    noremap <expr> <leader>E 'h'.v:count1.'gEl'
    onoremap <expr> <silent> <leader>e ':<c-u>normal! vh'.v:count1.'gel<cr>'
    onoremap <expr> <silent> <leader>E ':<c-u>normal! vh'.v:count1.'gEl<cr>'
    

    显然,把它们映射到你想要的任何地方,我个人有第一个映射到的 <BS> .e和e的区别在于它们调用 通用电气 (路过 word )及 通用电气 (路过 WORD )分别。看见 :h word :h WORD 了解这意味着什么。

    这些并不是您所要求的:它们不会根据我们开始时的位置进行调整,因此,例如,使用此运算符进行删除会发生变化

    this is a line|
    

    this is a|
    

    而不是

    this is a |
    

    如果你想写一个更复杂的vimscript,你当然可以解决这个问题,但如果只写一个空格,那就不值得了。

    操作员挂起的地图移动的内容也会根据 'selection' 如果这让你不安的话。

    编辑:这就是我如何创建所需的精确解决方案的方法

    function! s:Backup(mode)
      let str  = a:mode == 2 ? 'g' : ''
      let str .= a:mode ? 'v' : ''
    
      let at_end = col('.') >= col('$') - 1
      let str .= getline('.') =~ '\%'.(col('.') - !at_end).'c\S' ? 'b' : 'gel'
      let str .= !at_end && a:mode == 1 ? 'oho' : ''
    
      execute 'normal!' str
    endfunction
    

    这不会自行删除,而是与任何vim命令(如 d , y , c 运算符,并在所有模式下工作,只要传递正确的参数。要复制askers答案中使用的映射:

    inoremap <silent> <c-b> <c-o>d:<c-u>call <SID>Backup(1)<cr>
    

    以下是正常、可视和操作员挂起模式的绑定 <leader>e

    nnoremap <silent> <leader>e :<c-u>call <SID>Backup(0)<cr>
    onoremap <silent> <leader>e :<c-u>call <SID>Backup(1)<cr>
    xnoremap <silent> <leader>e :<c-u>call <SID>Backup(2)<cr>
    

    注意:映射必须在与要使用的函数相同的脚本中定义 s: <SID> ,否则将其移除。

    编辑2:修复了函数名:/
    编辑3:调整为不在行尾时修复操作。显然,vim认为光标在行尾追加时与插入时位于不同的位置。

        2
  •  0
  •   Rian Rizvi    6 年前

    好的,这个函数满足我的需要:

    function! BackspaceContiguousInsertMode()
    python << EOF
    import vim  
    try:
        line = vim.current.line
        row, deleteto = vim.current.window.cursor
        if deleteto==0:
            vim.current.line = ""
            vim.command("startinsert")
        elif line[deleteto] == " ":
            deletefrom=deleteto
            while deletefrom-1>0 and vim.current.line[deletefrom-1] == " ":
                deletefrom=deletefrom-1
            vim.current.line=line[:deletefrom] + line[deleteto+1:]
            if len(line)-1 == deleteto:
                vim.current.window.cursor = (row,deletefrom+1)
                vim.command("startinsert!")
            else:
                vim.current.window.cursor = (row,deletefrom)
                vim.command("startinsert")
        else:
            eol=deleteto+1 >= len(line)
            if not eol and line[deleteto+1] != " ":
                trailingline = line[deleteto+1:]
                vim.current.line=line[:deleteto+1] + " " + trailingline
                vim.command("normal diw")
                leadingto=len(vim.current.line)-len(trailingline)-1
                vim.current.line=vim.current.line[:leadingto] + trailingline
                vim.command("startinsert")
            elif eol:    
                vim.command("normal diw")
                vim.command("startinsert!")
            else: 
                vim.command("normal diw")
                vim.command("startinsert")
    
    except Exception as e:
        print("Error: {}".format(e))
    EOF
    endfunction
    inoremap <C-b> <Esc>:call BackspaceContiguousInsertMode()<CR>
    

    从插入模式(我想从中调用它)我可以按 <C-b> 将每个单词块或空格块向后删除到行首。给出下面的一行,每次我按下 <C-b> 事情就是这样:

    alskdjf       a;sjdf a kjkdjd        |kja sdf
    alskdjf       a;sjdf a kjkdjd|kja sdf
    alskdjf       a;sjdf a |kja sdf
    alskdjf       a;sjdf a|kja sdf
    alskdjf       a;sjdf |kja sdf
    alskdjf       a;sjdf|kja sdf
    alskdjf       a;|kja sdf
    alskdjf       a|kja sdf
    alskdjf       |kja sdf
    alskdjf|kja sdf
    |kja sdf
    |... (stays on the same line)