2015-07-08 4 views
2

Я иногда мечтаю о функции наценка выбора в Vim, так же, как при вводе:Все выборы в Vim

ma 

в нормальном режиме, вы можете попасть, откуда угодно:

`a 

, чтобы вернуться в это место a. Хотелось бы, чтобы было что-то вроде:

ma 

в визуальном режиме. Это сохранит вашу визуально выбранную область. И вы просто напечатать, то из любого места в обычном режиме:

<someHeader>a 

ввести визуальный режим обратно с этим a выбора.

Есть ли такая возможность в Vim? Или расширение, которое выглядит? Или простой способ его реализовать?

ответ

1

Вот вид решение Steven Hall, наряду с некоторыми изменениями, мне нужно для визуальных знаков, чтобы не перезаписать регулярные регистры ,

https://github.com/iago-lito/vim-visualMarks

Это небольшой vimScript позволяющий пометить визуально выделенную область, введя, в визуальной режиме:

ma 

(для отметки a)

затем извлечь его позже из любого места, набрав, в нормальный режим:

<a 

Он по-прежнему нуждается в некоторых базовых усовершенствованиях, но теперь каждый может попробовать, улучшить и поделиться. Спасибо Стивен за то, что запустили этот процесс :)

2

Я уверен, что нет никакого способа назвать выбор, похожий на то, как можно ссылаться на метки или регистры.

Ближайшая функция, которую я могу придумать, - это команда gv, которая входит в визуальный режим с последним ранее выбранным блоком, который был повторно выбран. Я считаю, что это намного удобнее, чем вручную переустанавливать один и тот же блок текста более одного раза.


Должна быть обеспечена возможность написать функцию с помощью Vimscript, сохраняющего начало и концы визуального блока в качестве меток, которые могут быть повторно использованы для повторного выбора визуального блока. Я посмотрел, можно ли использовать Vimscript, чтобы сохранить отметки < и > как другие (менее эфемерные) метки, но я ничего не видел.

+1

Да, я знаю этот. Но это совершенно уникально и быстро перезаписывается. Хотелось бы, чтобы там было что-то более настойчивое. Как вы думаете, стоит что-то придумать? Не должно быть так сложно с несколькими отметками и некоторыми координатами, которые будут храниться в памяти (по крайней мере) для каждого из них. –

+0

@ Iago-lito Я только что обновил свой ответ. Я также поддержал ваш вопрос, так как считаю, что он хороший, и мне бы хотелось узнать другие ответы. –

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] 
    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> 
+0

Ничего себе! Я просто тестировал это, и он работает. Какой впечатляющий первый пост! Добро пожаловать в переполнение стека! –

+0

Спасибо, сэр :) –

+0

И спасибо за эту идею ... Я сделал эту реализацию только для этого поста. Никогда не думал о том, чтобы иметь это раньше, но теперь я это делаю, поэтому кажется, что у нас есть кое-что, что мы можем использовать из этого :) –

Смежные вопросы