блокировка отметок в VIM - PullRequest
       2

блокировка отметок в VIM

2 голосов
/ 02 августа 2010

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

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

Обновление

Не присылайте мне сценарий, чтобы сделать это. Я могу сделать это сам, мой вопрос был больше, если есть скрытый способ сделать это в VIM или если мне пришлось самому написать сценарий. Ответ, очевидно, нет.

В любом случае, спасибо людям, которые уже прислали мне сценарий. Я буду использовать их, чтобы написать свой собственный (так как присланные сценарии не совсем то, что я хочу)

Ответы [ 2 ]

5 голосов
/ 04 августа 2010

Вы можете переназначить m с помощью пользовательской функции:

let s:marks={}
function s:SetMark()
    let m=getchar()
    if type(m)==type(0)
        let m=nr2char(m)
    endif
    if m=~#'^[a-zA-Z]$'
        if has_key(s:marks, m)
            throw "Mark ".m."is arleady set"
        endif
        let s:marks[m]=1
    endif
    return "m".m
endfunction
nnoremap <expr> m <SID>SetMark()

Эта функция не позволит вам переназначить метку. Вот как это работает:

  1. Мы определяем словарь, ключи которого содержат уже установленные метки (на самом деле мы могли бы использовать список, но словарь должен быть немного быстрее).
  2. Мы определяем функцию, которая:
    1. Выберите следующий символ. Поскольку getchar может возвращать либо строку, либо символьное число, мы должны преобразовать его обратно в строку.
    2. Проверяет, собираемся ли мы установить отметку (у вас может быть отметка с именем a, но не с именем %). Если вы попытаетесь установить метку %, она будет проигнорирована vim, поэтому нет необходимости оставлять бесполезные ключи. И нет необходимости запрещать вам использовать m', m[ и m], поскольку мы не можем предотвратить их переопределение самим vim.
    3. Проверяет, была ли данная отметка уже установлена ​​этой функцией, выдает ошибку, если она была.
    4. Возвращает текст mC, где C - имя вашей отметки.
  3. Мы определяем отображение, которое использует возвращаемое значение этой функции как {rhs}.

Обратите внимание, что это не помешает кому-либо переопределить эту метку с помощью команды normal! (но не normal без взрыва), nnoremap (но не nmap) сопоставления или чего-то подобного.

ОБНОВЛЕНИЕ : модифицированная версия s: SetMark:

function s:SetMark()
    let m=getchar()
    if type(m)==type(0)
        let m=nr2char(m)
    endif
    if m=~#'^[A-Z]$'
        let pos=getpos("'".m)
        if pos[1]
            echohl Error
            echon "Mark ".m." is arleady set. Overwrite?"
            echohl None
            let c=getchar()
            if type(c)==type(0)
                let c=nr2char(c)
            endif
            echo
            if c!=?'y'
                return "<C-l>"
            endif
        endif
    endif
    return "m".m
endfunction
nnoremap <special><expr> m <SID>SetMark()
3 голосов
/ 02 августа 2010

Вы можете предотвратить изменение меток во время выполнения определенной команды. См. : метки блокировки .


Нет способа предотвратить их переопределение, но вы можете использовать функцию, которая запрашивает использование метки, сообщает, если она уже используется, и запрашивает другую метку.

fun! SetMark()
    let mark = ''
    while mark == ''
        call inputsave()
        let mark = input('Mark to set (Enter to cancel)? ')
        call inputrestore()
        if mark == ''
            return
        endif
        if mark !~# '^[A-Z]$'
            echohl Error
            echo "Invalid mark name.  Must be a capital letter."
            echohl None
            let mark = ''
            continue
        endif
        let pos = getpos("'" . mark)
        if pos[1] != 0 " Used mark
            let fname = fnamemodify(bufname(pos[0]), ':~:.')
            call inputsave()
            let yn = input('Mark already set for ' . fname . '. Overwrite? (y/n) ')
            call inputrestore()
            if yn !~? '^y'
                let mark = ''
            endif
        endif
    endwhile
    exe 'normal m' . mark
endfun
nnoremap <F2> :call SetMark()<CR>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...