Я написал это, которое я считаю, что вы просите:
function! VisualMark()
call inputsave()
let registers = input("m")
call inputrestore()
exec "normal! `<m" . registers[0]
exec "normal! `>m" . registers[1]
endfun
function! GetVisualMark()
call inputsave()
let registers = input("`")
call inputrestore()
exec "normal! `" . registers[0]
if strlen(registers) > 1
exec "normal! v`" . registers[1]
endif
endfun
vnoremap m <esc>:call VisualMark()<cr>
nnoremap ` :call GetVisualMark()<cr>
они должны вести себя так же, как обычные метки, за исключение только в визуальном режиме, и они оба нужны два аргумента.
Прежде всего, чтобы получить визуально выбранную область, сохраненную в визуальном режиме с выбранным блоком, нажмите клавишу m, как обычно. Затем он позволит вам ввести еще какой-нибудь текст ... здесь функция будет ожидать, что два символа, которые являются двумя регистрами, будут сохранены в начале и конце метки ... так, например, введите mab в визуальном режиме, а затем нажмите enter (Я не мог понять, как заставить его работать без ввода), создаст отметку в регистре a для начала блока, а b будет концом блока.
Чтобы повторно выбрать блок визуально, перейдите в визуальном режиме и сделать `, который так же, как обычный марки ... это тоже будет ожидать два символа
EDIT:
Я сделал реализация лучше, на мой взгляд. До того, как я получил его, чтобы вернуть визуально выбранный блок, вы должны быть в визуальном режиме, а затем нажмите кнопку возврата (ту же кнопку, что и для обычной метки), а затем 2 регистра. Теперь вы делаете это в обычном режиме ...Это означает, что использование по умолчанию использования backtick теперь использует эту функцию, но теперь функция проверяет, сколько регистров вы предоставляете ... поэтому, если вы используете только один регистр, он вернет вас только к этому. если вы предоставите 2 регистра, тогда они будут визуально выбирать их ... если вы предоставите более 2, то они будут использовать только первые 2.
Ключ ввода по-прежнему требуется для ввода в ваш выбор. В любом случае, вероятно, это будет лучше с новой реализацией.
Для тех, кто хочет видеть, или использовать старую реализацию этого он:
function! VisualMark()
call inputsave()
let registers = input("m")
call inputrestore()
exec "normal! `<m" . registers[0]
exec "normal! `>m" . registers[1]
endfun
function! GetVisualMark()
call inputsave()
let registers = input("`")
call inputrestore()
exec "normal! `" . registers[0]
exec "normal! v`" . registers[1]
endfun
vnoremap m <esc>:call VisualMark()<cr>
vnoremap ` <esc>:call GetVisualMark()<cr>
Да, я знаю этот. Но это совершенно уникально и быстро перезаписывается. Хотелось бы, чтобы там было что-то более настойчивое. Как вы думаете, стоит что-то придумать? Не должно быть так сложно с несколькими отметками и некоторыми координатами, которые будут храниться в памяти (по крайней мере) для каждого из них. –
@ Iago-lito Я только что обновил свой ответ. Я также поддержал ваш вопрос, так как считаю, что он хороший, и мне бы хотелось узнать другие ответы. –