gpt4 book ai didi

regex - 在 vim 脚本中替换零宽度匹配

转载 作者:行者123 更新时间:2023-12-01 10:15:27 25 4
gpt4 key购买 nike

我编写了这个脚本,用一个空格替换光标周围的许多空格。但是,当我在光标周围没有空格的情况下使用它时,这不起作用。在我看来,Vim 不会替换零宽度匹配项。

function JustOneSpace()
let save_cursor = getpos(".")
let pos = searchpos(' \+', 'bc')
s/\s*\%#\s*/ /e
let save_cursor[2] = pos[1] + 1
call setpos('.', save_cursor)
endfunction

nmap <space> :call JustOneSpace()<cr>

这里有几个例子(管道 | 是光标):

这一行

hello     |      world

成为

hello |world

但是这一行

hello wo|rld

不会变成

hello wo |rld

更新:通过将函数更改为以下它适用于上面的示例。

function JustOneSpace()
let save_cursor = getpos(".")
let pos = searchpos(' *', 'bc')
s/\s*\%#\s*/ /e
let save_cursor[2] = pos[1] + 1
call setpos('.', save_cursor)
endfunction

这一行

hello |world

成为

hello w|orld

问题是光标移动到下一个字符。它应该留在同一个地方。

有任何指示和/或提示吗?

最佳答案

我认为您的脚本唯一的问题是位置保存似乎不正确。你基本上可以做你想做的事情:

:s/\s*\%#\s*/ /e

这与您问题中的(正确)代码相同。您可以简单地将其映射为:

:nmap <space> :s/\s*\%#\s*/ /e<CR>

如果要保存位置,那就有点复杂了。可能最好的选择是使用这样的东西:

function! JustOneSpace()
" Get the current contents of the current line
let current_line = getline(".")
" Get the current cursor position
let cursor_position = getpos(".")
" Generate a match using the column number of the current cursor position
let matchRE = '\(\s*\)\%' . cursor_position[2] . 'c\s*'
" Find the number of spaces that precede the cursor
let isolate_preceding_spacesRE = '^.\{-}' . matchRE . '.*$'
let preceding_spaces = substitute(current_line, isolate_preceding_spacesRE, '\1', "")
" Modify the line by replacing with one space
let modified_line = substitute(current_line, matchRE, " ", "")
" Modify the cursor position to handle the change in string length
let cursor_position[2] -= len(preceding_spaces) - 1
" Set the line in the window
call setline(".", modified_line)
" Reset the cursor position
call setpos(".", cursor_position)
endfunction

其中大部分是注释,但关键是您查看替换前后的行的长度,并相应地决定新的光标位置。如果您愿意,可以通过比较前后的 len(getline(".")) 来使用您的方法执行此操作。

编辑

如果希望光标在空格字符后结束,修改行:

    let cursor_position[2] -= len(current_line) - len(modified_line)

看起来像这样:

    let cursor_position[2] -= (len(current_line) - len(modified_line)) - 1

编辑(2)

我已经更改了上面的脚本以考虑您的意见,以便光标位置仅根据光标位置之前的空格数进行调整。这是通过创建第二个正则表达式来完成的,该正则表达式从行中提取光标前的空格(没有其他任何内容),然后根据空格数调整光标位置。

关于regex - 在 vim 脚本中替换零宽度匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1228100/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com