如何使用Vim填充字符x到y列的行

时间:2010-07-29 15:17:39

标签: vim

如何使用Vim将具有指定字符的行的剩余部分填充到某列?例如,假设光标位于第四列,我想用最后一行填充当前行的其余部分。我将如何做到这一点?

9 个答案:

答案 0 :(得分:56)

您可以80Ax<Esc>d80|进行更简单的解决方案。

答案 1 :(得分:22)

这是一个实现你要求的功能,稍微多一点。

  • 它从当前行的末尾填充行,而不是光标位置
  • 它强制在当前行和重复的字符之间留出一个空格
  • 它允许您使用
  • 指定任何字符串以填充行的其余部分
  • 它使用vim的textwidth设置来决定该行的长度 (而不仅仅是假设80个字符)

该功能定义如下:

" fill rest of line with characters
function! FillLine( str )
    " set tw to the desired total length
    let tw = &textwidth
    if tw==0 | let tw = 80 | endif
    " strip trailing spaces first
    .s/[[:space:]]*$//
    " calculate total number of 'str's to insert
    let reps = (tw - col("$")) / len(a:str)
    " insert them, if there's room, removing trailing spaces (though forcing
    " there to be one)
    if reps > 0
        .s/$/\=(' '.repeat(a:str, reps))/
    endif
endfunction

将其插入.vimrc,并对其进行映射,例如

map <F12> :call FillLine( '-' )

然后,您可以按F12将连字符应用于当前行

注意:这可能很容易扩展到在VISUAL模式下进行选择,但目前仅适用于单行。*

答案 2 :(得分:5)

如果我正确理解了这个问题,可以这样完成:在正常模式下从所需的结束列中减去光标的当前列位置,然后输入结果,然后输入'i'进入插入模式,然后字符你想要填补空间。通过返回正常模式结束。例如,在正常模式下光标位于第四列时,如果要使用短划线填充第80列的其余部分,请键入76i-然后按Esc或Ctrl- [返回正常模式。这应该导致76个破折号从第4列开始到第79列结束。

答案 3 :(得分:3)

如果您将virtualedit选项设置为blockall,则可以创建直观选择(即使在空白处)直到所需的列:
v80|(如果virtualedit=all)或
<c-v>80|(如果virtualedit=block

然后用破折号替换所选区域: r-

通过点击l以避免覆盖行中的最后一个字符,在行中的最后一个字符后启动可视模式可能会有所帮助。如果您没有使用virtualedit=all,则需要设置virtualedit+=onemore,以便在正常模式下将一个字符移出行尾。

答案 4 :(得分:2)

This answer回答了您的问题。只需将len计算替换为您想要的列号(+/- 1可能,我永远不记得),并删除由替换添加的封闭双引号。

答案 5 :(得分:1)

other answers其中一个是:80Ax<Esc>d80|。我最初开始使用它作为这样的键映射:

nnoremap <leader>- 80A-<Esc>d80<bar>

...但我不喜欢它如何将光标留在行尾。此外,对于狭窄的窗口(例如,只比80个单元宽一点),它会导致整个窗口水平滚动,因为光标在被修剪回80之前会短暂跳转到长行的末尾。这部分是通过返回到行的开头来解决:

nnoremap <leader>- 80A-<Esc>d80<bar>0

...但屏幕将会&#34;闪烁&#34;当光标跳出屏幕并向后跳时(因此向右和向后短暂滚动窗口)。为了防止这种情况,我们可以暂时使用反向插入模式(:h revins:h ri)在附加时将光标保持在屏幕上。这里是完整的命令作为键映射:

nnoremap <leader>- :set ri<cr>80A-<esc>81<bar>d$0:set nori<cr>

答案 6 :(得分:1)

没有足够的代表发表评论,但是我只是写我的neovim init.vim,并决定使用@drfrogsplat那些年前发布的内容的稍微扩展的版本。我使用get()以获得更大的灵活性:

function! FillLine(...)
    " Fill line by repeating newest register content until &textwidth.
    let l:str = get(a:, 1, @@) " Optionally provide a string to use instead.
    let l:col = get(a:, 2, &textwidth) " Optionally stop at a given column.
    .s/[[:space:]]*$// " Strip trailing spaces first.
    let l:nstr = (l:col-col('$'))/len(l:str) " Calculate how many str can fit.
    if l:nstr > 0
        .s/$/\=(' '.repeat(l:str, l:nstr))/
    endif
endfunction

@@计算出任何寄存器中的最新文本(我认为?:h @@为您自己阅读)。对于单个字符,我只需vyx在其中一个字符上,然后调用该函数,或者当然可以对其进行映射。我喜欢:

nnoremap <Leader>' :call FillLine()<Cr>

是时候制作一些不必要的漂亮文件头了...

答案 7 :(得分:0)

您可以先插入破折号,然后转到第一个字符,然后在替换模式下输入文字:80i- Esc 0R

如果您不想键入文本,请先删除0D的行,使用80i- Esc 插入短划线,然后使用0R CTRL + r “以替换模式粘贴已命名寄存器的内容。

答案 8 :(得分:0)

我实际上偶然发现了这种想要对齐列的方法。以防万一其他人也这样做,该线程可能会有用:How to insert spaces up to column X to line up things in columns?