gpt4 book ai didi

vim - 从函数获取可视模式下的当前行

转载 作者:行者123 更新时间:2023-12-01 13:03:40 25 4
gpt4 key购买 nike

我有一个简单的 vim 脚本,它接受一个可视文本 block 并将其存储为一个列表。函数 VtoList() 的问题在于,它在光标返回到可视 block 的开头后执行,而不是在它之前执行。因此,我无法获取可视 block 结束的行。

nn <F2> :call VtoList()<CR>

func! VtoList()
firstline = line('v') " Gets the line where the visual block begins
lastline = line('.') " Gets the current line, but not the one I want.
mylist = getline(firstline, lastline)
echo mylist
endfunc

问题出在 line('.') 上。它应该返回光标的当前行,但在调用该函数之前,光标已经返回到可视 block 的开头。因此,我只得到一行而不是一系列行。

我整理了一个解决方案,在每次用户点击 V 时设置一个标记,并在调用该函数之前设置另一个标记。

nnoremap V mV
nnoremap <F2> mZ:call VtoList()<CR>

如果我将 line('v')line('.') 替换为 line("'V")line("'Z"),但我想尽可能避免使用此解决方案,因为它可能与用户的映射冲突。

有没有办法在光标返回到可视 block 的开头之前获取函数内可视 block 的当前行?

最佳答案

不要使用 : , 使用 <expr> :

function! s:NumSort(a, b)
return a:a>a:b ? 1 : a:a==a:b ? 0 : -1
endfunction
func! VtoList()
let [firstline, lastline]=sort([line('v'), line('.')], 's:NumSort')
let mylist = getline(firstline, lastline)
echo mylist
return ""
endfunc
vnoremap <expr> <F2> VtoList()

注意其他变化:let (你忘记了),sort (选择开始的行可能在选择结束的行之后),vnoremap (line("v") 仅适用于视觉模式),return (执行了 expr 映射返回值,但您不需要它,您只需要副作用)。您可以将第二行替换为

    if mode()=~#"^[vV\<C-v>]"
let [firstline, lastline]=sort([line('v'), line('.')], 's:NumSort')
else
let [firstline, lastline]=sort([line("'<"), line("'>")], 's:NumSort')
endif

您的解决方案不起作用的原因是当 :在映射中发生,您立即退出可视模式并进入命令模式。 line("v")仅在可视模式下工作。

其他说明:vnoremap {lhs} :将生成已经充满 '<,'> 的命令行.您可能已经添加了 range函数定义和使用 let [firstline, lastline]=sort([a:firstline, a:lastline], 's:NumSort') .但是您仍然会使用 : 退出可视模式.

关于vim - 从函数获取可视模式下的当前行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4338223/

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