在 :r 之后恢复光标位置
Restore cursor position after :r
我做了一个自定义命令,我试着用mark
来保存光标位置。但是标记设置在第6行插入文件的位置(使用r
命令)。
vim.cmd [[ command! -nargs=1 Include call feedkeys("mx") | 6r <args> | call feedkeys("`x")]]
我认为 6r <args>
在 feedkeys("mx")
之前被执行。我们有什么办法可以解决这个问题吗?或者如果有其他方法可以恢复光标位置
我在 lua (neovim) 中有一个“保留光标位置”功能,它在我的 utils.lua 文件中,它是这样的:
M.preserve = function(arguments)
local arguments = string.format("keepjumps keeppatterns execute %q", arguments)
-- local original_cursor = vim.fn.winsaveview()
local line, col = unpack(vim.api.nvim_win_get_cursor(0))
vim.api.nvim_command(arguments)
local lastline = vim.fn.line("$")
-- vim.fn.winrestview(original_cursor)
if line > lastline then
line = lastline
end
vim.api.nvim_win_set_cursor({ 0 }, { line, col })
end
上面的函数封装了任何给定命令,例如,如果我想重新缩进整个文件,我创建一个重新缩进命令:
vim.cmd([[command! Reindent lua require('utils').preserve("sil keepj normal! gg=G")]])
和运行:
:Reindent
要删除任何行末尾的空格:
vim.cmd([[cnoreab cls Cls]])
vim.cmd([[command! Cls lua require("utils").preserve('%s/\s\+$//ge')]])
它的 Vimscript 版本:
" preserve function
if !exists('*Preserve')
function! Preserve(command)
try
let l:win_view = winsaveview()
"silent! keepjumps keeppatterns execute a:command
silent! execute 'keeppatterns keepjumps ' . a:command
finally
call winrestview(l:win_view)
endtry
endfunction
endif
在我的例子中,我有另一个压缩空白行的功能(如果我有多个连续的空白,就像它们变成一个一样),所以,我有这个功能:
M.squeeze_blank_lines = function()
-- references: https://vi.stackexchange.com/posts/26304/revisions
if vim.bo.binary == false and vim.opt.filetype:get() ~= "diff" then
local old_query = vim.fn.getreg("/") -- save search register
M.preserve("sil! 1,.s/^\n\{2,}/\r/gn") -- set current search count number
local result = vim.fn.searchcount({ maxcount = 1000, timeout = 500 }).current
local line, col = unpack(vim.api.nvim_win_get_cursor(0))
M.preserve("sil! keepp keepj %s/^\n\{2,}/\r/ge")
M.preserve("sil! keepp keepj %s/\v($\n\s*)+%$/\r/e")
if result > 0 then
vim.api.nvim_win_set_cursor({ 0 }, { (line - result), col })
end
vim.fn.setreg("/", old_query) -- restore search register
end
end
然后我删除了连续的空白行,但光标仍留在原处:
:nnoremap <leader>d :lua require('utils').squeeze_blank_lines()<cr>
或者,如果您是,请使用 init.lua
-- map helper
local function map(mode, lhs, rhs, opts)
local options = { noremap = true }
if opts then
options = vim.tbl_extend("force", options, opts)
end
vim.api.nvim_set_keymap(mode, lhs, rhs, options)
end
map("n", "<leader>d", '<cmd>lua require("utils").squeeze_blank_lines()<cr>')
我希望这些想法可以帮助您找到解决问题的方法
最后提示:如果您使用建议的 utils.lua,则必须在其开头插入:
local M = {}
最后:
return M
我做了一个自定义命令,我试着用mark
来保存光标位置。但是标记设置在第6行插入文件的位置(使用r
命令)。
vim.cmd [[ command! -nargs=1 Include call feedkeys("mx") | 6r <args> | call feedkeys("`x")]]
我认为 6r <args>
在 feedkeys("mx")
之前被执行。我们有什么办法可以解决这个问题吗?或者如果有其他方法可以恢复光标位置
我在 lua (neovim) 中有一个“保留光标位置”功能,它在我的 utils.lua 文件中,它是这样的:
M.preserve = function(arguments)
local arguments = string.format("keepjumps keeppatterns execute %q", arguments)
-- local original_cursor = vim.fn.winsaveview()
local line, col = unpack(vim.api.nvim_win_get_cursor(0))
vim.api.nvim_command(arguments)
local lastline = vim.fn.line("$")
-- vim.fn.winrestview(original_cursor)
if line > lastline then
line = lastline
end
vim.api.nvim_win_set_cursor({ 0 }, { line, col })
end
上面的函数封装了任何给定命令,例如,如果我想重新缩进整个文件,我创建一个重新缩进命令:
vim.cmd([[command! Reindent lua require('utils').preserve("sil keepj normal! gg=G")]])
和运行:
:Reindent
要删除任何行末尾的空格:
vim.cmd([[cnoreab cls Cls]])
vim.cmd([[command! Cls lua require("utils").preserve('%s/\s\+$//ge')]])
它的 Vimscript 版本:
" preserve function
if !exists('*Preserve')
function! Preserve(command)
try
let l:win_view = winsaveview()
"silent! keepjumps keeppatterns execute a:command
silent! execute 'keeppatterns keepjumps ' . a:command
finally
call winrestview(l:win_view)
endtry
endfunction
endif
在我的例子中,我有另一个压缩空白行的功能(如果我有多个连续的空白,就像它们变成一个一样),所以,我有这个功能:
M.squeeze_blank_lines = function()
-- references: https://vi.stackexchange.com/posts/26304/revisions
if vim.bo.binary == false and vim.opt.filetype:get() ~= "diff" then
local old_query = vim.fn.getreg("/") -- save search register
M.preserve("sil! 1,.s/^\n\{2,}/\r/gn") -- set current search count number
local result = vim.fn.searchcount({ maxcount = 1000, timeout = 500 }).current
local line, col = unpack(vim.api.nvim_win_get_cursor(0))
M.preserve("sil! keepp keepj %s/^\n\{2,}/\r/ge")
M.preserve("sil! keepp keepj %s/\v($\n\s*)+%$/\r/e")
if result > 0 then
vim.api.nvim_win_set_cursor({ 0 }, { (line - result), col })
end
vim.fn.setreg("/", old_query) -- restore search register
end
end
然后我删除了连续的空白行,但光标仍留在原处:
:nnoremap <leader>d :lua require('utils').squeeze_blank_lines()<cr>
或者,如果您是,请使用 init.lua
-- map helper
local function map(mode, lhs, rhs, opts)
local options = { noremap = true }
if opts then
options = vim.tbl_extend("force", options, opts)
end
vim.api.nvim_set_keymap(mode, lhs, rhs, options)
end
map("n", "<leader>d", '<cmd>lua require("utils").squeeze_blank_lines()<cr>')
我希望这些想法可以帮助您找到解决问题的方法
最后提示:如果您使用建议的 utils.lua,则必须在其开头插入:
local M = {}
最后:
return M