【问题标题】:Create virtualedit block around selection围绕选择创建虚拟编辑块
【发布时间】:2012-04-07 19:20:11
【问题描述】:

我正在尝试创建一个允许我选择几行并围绕它创建一个虚拟编辑块的脚本;最长行之后的 1 列。

这是我的代码

function! VirtualEdit()
  let EndLine = line("'>")

  set virtualedit = all

  let maxlength = max(map(range(line("'<"), line("'>")), "virtcol([v:val, '$'])"))-1
  call cursor(1,maxlength+1)  
  normal "^Q".EndLine."jc<space><ESC>"

  set virtualedit = ''
endfunction

它必须做的是
1) 控制我的选择中最长的线 (maxlength)。
2)将光标放在选择中的第一行最长行+1列的列。
3) 比激活可视块选择(在我的 Windows 电脑上,命令是 C-Q)
4) 将可视块扩展到选择的最后一行(我的电脑上用于向下移动的命令 = "j")。
5)然后使用“c”键插入“空格”字符并使用ESC退出插入模式,以便用空格填充虚拟块列。

但是我不知道如何在普通命令中使用变量(Endline)。
我还注意到,在我上面的示例中,键作为并且不起作用。
我做错了什么?

【问题讨论】:

    标签: virtual block vim


    【解决方案1】:

    这里有很多错误:

    1. :set 不允许您在 = 周围有空格
    2. :set 不接受表达式,因此 set ve=''let &amp;ve="''",而不是 let &amp;ve='':set ve=
    3. :normal 命令也不接受表达式,它接受刚刚执行的字符串。因此:normal "^ 尝试使用寄存器^,失败(没有这样的寄存器)并停止处理该行的其余部分。使用:execute 将表达式传递给:normal
    4. :normal 命令不接受 &lt;Key&gt; 语法。 viml 表达式也没有,它们有 "\&lt;Key&gt;" 代替(注意:只有双引号和反斜杠)。 ^Q 语法不被任何人接受,并且在文本文件中包含原始控制代码(vim 显示为 ^Q)并不是最好的主意。
    5. 不要随便使用:normal。大多数时候您不需要它(在这种情况下,您需要将 ^Q 替换为 \&lt;C-v&gt;,因为它是一个映射)。
    6. 不要硬编码virtualedit 值。而不是

      set ve=all
      <...>
      set ve=
      

      使用

      let savedve=&ve
      set ve=all
      try
          <...>
      finally
          let &ve=savedve
      endtry
      
    7. {N}j 表示“向下 N 行”,而不是“转到第 N 行”。 “转到第 N 行”是 {N}gg{N}G
    8. 您拥有let maxlen=&lt;...&gt;-1,而在使用maxlen 的唯一行中,您拥有maxlen+1。很奇怪。

    如果你解决了这个问题,你可以继续,但你根本不需要调整 virtualedit 和使用:normal

    function AddSpaces()
        let [lstart, lend]=[line("'<"), line("'>")]
        if lstart>lend
            let [lstart, lend]=[lend, lstart]
        endif
        let maxcol=max(map(range(lstart, lend), "virtcol([v:val, '$'])"))
        let newlines=map(range(lstart, lend), 'printf("%-'.maxcol.'s", getline(v:val))')
        call setline(lstart, newlines)
    endfunction
    

    【讨论】:

    • 谢谢 ZyX!我每天都在学习,但还有很多东西要学。我会更多地研究你的信息。目前它给出了这个错误;未知函数设置线。
    • @Remonn。是的,应该是setline。忘记从我编写代码的文件中粘贴更改以进行测试,抱歉。
    • 是的,它有效!只有一件事:我必须更改什么才能在上述函数中包含选定的空行?
    • @Remonn 你是什么意思?它适用于空行,就像其他行一样。 // 顺便说一句,你如何从视觉选择中调用它?如果你只做vnoremap {lhs} :call AddSpaces()&lt;CR&gt; 会有一个小问题,即使是我也经常没有提到:在这种情况下,它将被启动的次数与选择的行数一样多。幸运的是后续运行不会改变任何东西。
    • 是的,你是对的。昨天空行仍然是空的,但今天(不知道我改变了什么)包括空行。谢谢 ZyX。顺便说一句..你使用 (g)vim 多少年了? ;)
    猜你喜欢
    • 1970-01-01
    • 2014-08-19
    • 1970-01-01
    • 1970-01-01
    • 2014-06-18
    • 2014-05-31
    • 1970-01-01
    • 2014-04-07
    相关资源
    最近更新 更多