代码之家  ›  专栏  ›  技术社区  ›  StackedCrooked

Vim:在带有垂直对齐引号的文本块周围创建一个C字符串文字?

vim
  •  1
  • StackedCrooked  · 技术社区  · 14 年前

    我想在Vim中创建一个宏或脚本来执行以下操作:

    1. 转义文本本身中出现的任何引号

    例如:

    <html>
    <head></head>
    <body>
    <h1>High Score Server</h1>
    <table>
    ROWS
    </table>
    </body>
    </html>
    

    将变成:

    "<html>                    "
    "<head></head>             "
    "<body>                    "
    "<h1>High Score Server</h1>"
    "<table>                   "
    "ROWS                      "
    "</table>                  "
    "</body>                   "
    "</html>                   ";
    

    我可以用一个宏来实现这一点,但是没有右边引号的垂直对齐。有人能帮我做这个吗?

    7 回复  |  直到 14 年前
        1
  •  5
  •   Drasill    14 年前

    我要做的是:

    使用“环绕”和“对齐”插件:

    1) 光标位于第一行(0,0)时,键入 <C-V>)$s" <S-V>):Align " <Enter> .

    另一个没有插件的解决方案:

    :set ve=all
    

    2) <C-V> 按块选择,光标在0,0位置

    3) 那就下到课文的底部 Shift-I " Esc

    5) <C-V> ,下到底部,键入 r"

        2
  •  2
  •   ZyX    14 年前
    function Enquote()
        let [startline, endline]=sort([line("'<"), line("'>")])
        let lines=getline(startline, endline)
        let lengths=map(copy(lines), 'len(split(v:val, ''\zs''))')
        let maxlen=max(lengths)
        call map(lines, '''"''.v:val.repeat(" ", maxlen-lengths[v:key]).''"''')
        return setline(startline, lines)
    endfunction
    

    说明:

    line("'<") line("'>") 获取上次视觉选择的开始和结束行号。

    sort([...]) 对行号进行排序,因为您可能已经开始从所选内容的末尾选择行。

    let [a, b]=[c, d] 是平行作业: sort 将生成两个项目的排序列表,其中第一个项目小于或等于第二个项目。显然,lesser是第一个被选中的行。

    len(split(v:val, '\zs')) 是一个先进的 strlen()

    max(list)

    所以, map(copy(lines), 'len(split(v:val, ''\zs''))') 应用此 strlen 添加到列表中的所有项目。 copy()

    map(lines, '''"''.v:val.repeat(" ", maxlen-lengths[v:key]).''"''') 以所需的方式修改线。我从 printf repeat 因为printf不能正确处理多字节字符(正确的意思是一个字符长,而printf认为它有两个字节长)。

    setlines(linenumber, listoflines) 实际上修改缓冲区。

        4
  •  0
  •   Michael Kristofik    14 年前

    是否可以对vim脚本中的行列表进行两次遍历?然后可以这样做(伪代码):

    let N = length of longest line
    for each line L:
        insert a " character at the beginning
        append N - len(L) spaces
        append a " character
    
        5
  •  0
  •   sleepynate    14 年前

    我得到的最好的是一个三通正则表达式。

    在视觉模式下选择“块”,然后使用:

    :'<,'>s#^#"#
    :'<,'>s#$#                                                #
    :'<,'>s#\(.\{28\}\).*#\1"
    

        6
  •  0
  •   dsign    11 年前

    http://www.vim.org/scripts/script.php?script_id=4727

    从插件的页面:

    反向转换,取消对某些字符的转义。不太可能 暂时完成,但如果有需要的话,总有一天会完成的。

    如果需要进行更改,请使用源代码存储库:

    https://bitbucket.org/dsign/stringliteral.vim

        7
  •  -1
  •   Luc Hermitte    8 年前

    在两个过程中:

    let l = max(map(getline("'<", "'>"), 'strwidth(v:val)'))
    '<,'>s/.*/\=('"'.submatch(0).repeat(' ', l-strwidth(submatch(0)) )).'"'