我正在尝试编写一个函数,该函数用美元符号($)替换当前行第六列中的字符,但是我希望光标保持在调用该函数之前的位置。

所以我尝试存储当前列,执行更改,然后返回以下功能:

function! DollarSplit()
   let col_number=col(".")     "stores the current column number of the cursor
   normal! 6|r$                " replaces the 6th caracter in line with a $
   execute col_number."|" 
endfunction


我可能是对execute命令有误解...或者我应该创建一个包含要执行的命令的字符串?

#1 楼

您应该使用getpos()

要保存在变量中的位置:光标的位置。

并进行恢复:

let save_pos = getpos(".")


这里的第一个参数表示您将移动当前位置的标记光标的位置(因此,当前位置),第二个位置是标记的位置(之前保存的位置)。
call setpos('.', save_pos)


有关更多详细信息,请参见:getpos()"."


有关:h getpos()用法的更多详细信息:该函数将使用字符串并执行它。您的字符串只能是双引号或变量内容之间的硬编码字符。

编写

function! DollarSplit()
   let save_pos = getpos(".")
   normal! 6|r$                " replaces the 6th caracter in line with a $
   call setpos(".", save_pos)
endfunction


如果您在12号列的扩展字符串将为:h setpos()。 Execute会尝试执行此命令,但由于execute不是vimscript函数而是正常模式命令而无法运行。

要从vimscript中执行它,您必须说“执行该命令,就像我在正常模式下键入过的字符,这就是正常使用的语言。要使您的12|呼叫正常工作,您必须将12|关键字添加到扩展字符串中,例如:

execute col_number."|"


评论


感谢您提供此解决方案(这是我将要使用的解决方案),但是还有其他方法可以使用我的“ col_number”变量吗?那将使我更好地了解如何执行/正常工作。

– Feffe
16年5月12日在15:29

@Feffe:我的更新应该澄清这一点:-)

–statox♦
16年5月12日在15:36

#2 楼

此功能还保留您的搜索注册。因此您可以将命令作为参数传递给它。

if !exists('*Preserve')
    function! Preserve(command)
        try
            " Preparation: save last search, and cursor position.
            let l:win_view = winsaveview()
            let l:old_query = getreg('/')
            silent! execute 'keepjumps' . a:command
        finally
            " try restore / reg and cursor position
            call winrestview(l:win_view)
            call setreg('/', l:old_query)
        endtry
    endfunction
endif


一些解释

let .......... used to set a variable
l:somevar .... local variable
winsaveview()  get information about window view
winrestview(lwinview) restores window view to its last status
getreg('/')    used to store the last search in a variable
keepjumps      used to performe any change without change jumplis
. a:command    concatenates any given command with keepjumps


例如:

"Reident file without moving cursor position
:call Preserve('normal! gg=G')

"Reindent command using 'Preserve()'
command! -nargs=0 Reindent :call Preserve('exec "normal! gg=G"')

"If you have any change log at your file header
:call Preserve('1,5s/Last Change: \zs.*/\=strftime("%c")/e')

"Close all buffers but current one
" https://bitbucket.org/snippets/sergio/9nbyGy
command! BufOnly silent! call Preserve("exec '%bd|e#|bd#'")


来源:
https://technotales.wordpress.com/2010/03/31/preserve-a-vim-function-that-keeps -您的州/

评论


欢迎来到我们的网站!回答时,请尝试在回答中给出一些解释,而不仅仅是指向其他页面的链接。链接可能会消失,并且可能有很多不相关的信息需要分类。

– Tumbler41
16-12-21在23:12



正如我在SO副本中所说的那样,恢复应该最终完成。否则,如果a:命令失败,则将无法恢复任何内容。

–卢克·赫米特(Luc Hermitte)
17年9月1日14:32在

我刚刚修复了我提到的@Luc Hermitte的功能

– SergioAraujo
18年1月2日,12:34

很好的例子-非常有用。

–查理·达萨斯(Charlie Dalsass)
18年7月12日在19:45