Сделать Vim Keep Mark, когда я удаляю строку, на которой находится метка - PullRequest
2 голосов
/ 25 января 2012

Как получить vim для сохранения меток, когда я удаляю строку, на которой находится метка (то есть, автоматически перемещаю метку на линию сразу над или под помеченной линией)

Ответы [ 2 ]

4 голосов
/ 26 января 2012

Возможно, самый простой способ - использовать заглавные буквы, если вы не хотите, чтобы они были удалены.Если строка, на которой установлена ​​метка, удаляется, она перемещается на следующую строку.

Другой вариант - команда lockmarks.lockmarks принимает команду для запуска и блокирует большинство меток по их текущему номеру строки, пока команда не завершится.Если вы хотите делать это часто, вам, вероятно, потребуется добавить некоторые сопоставления, которые будут lockmarks для вас, например, это превращает dd в сохранение меток:

nnoremap dd :lockmarks normal! dd<cr>

или

nnoremap dd :lockmarks delete<cr>

Проблема в том, что вы теряете возможность указывать счет для dd.Можно обойти это, используя v:count, но тогда нам понадобится execute, чтобы получить интерполированное значение:

nnoremap dd :<c-u>execute 'lockmarks normal! ' . v:count . 'dd'<cr>

И тогда вам нужно будет определять отображение, подобное этому, для каждого удаленияоперация, которую вы используете регулярно.

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

1 голос
/ 26 января 2012

Одно дополнение к ответу @Kurt Hutchinson: есть возможность определить операторскую функцию. В этом случае вам не нужно определять сопоставление для каждой команды удаления, а вместо этого переопределять d:

let s:typetochar={
            \ 'char': 'v',
            \ 'line': 'V',
            \'block': "\<C-v>",
        \}
function! DeleteOperator(type)
    execute 'lockmarks normal! `["'.v:register.'d'.s:typetochar[a:type].'`]'
endfunction
function! s:Delete()
    set opfunc=DeleteOperator
    return 'g@'
endfunction
nnoremap <expr> d  <SID>Delete()
nnoremap <expr> dd <SID>Delete().'g@'
vnoremap d :<C-u>lockmarks normal! gvd<CR>

Обратите внимание на отображение dd: поскольку d фактически использует g@, должно быть dg@ (расширен до g@g@), где вы набираете dd. Таким образом, чтобы использовать очиститель dd, необходимо создать отображение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...