Vim Script "Я хочу заменить Tnext в Cscope" - PullRequest
1 голос
/ 10 марта 2012

Я хочу заменить команду: tnext для cscope, но она не работает, как я ожидал.

1) ниже на рисунке показан код, который работает как положено. я могу добраться до 2-го экземпляра символов.

function MyCounter()

    if !exists("s:counter")
        let s:counter = 1
        echo "script executed for the first time"
    else
        let s:counter = s:counter + 1
        echo "script executed " . s:counter . " times now"
    endif
endfunction

nmap <space>w :ls<CR>
nmap <space>i :call MyCounter()
nmap <space>n :cs find s <C-R>=expand("<cword>")<CR><CR>2<CR>

2) ниже кода, который не работает

function MyCounter()
    if !exists("s:counter")
        let s:counter = 1
        echo "script executed for the first time"
    else
        let s:counter = s:counter + 1
        echo "script executed " . s:counter . " times now"
    endif
endfunction

nmap <space>w :ls<CR>
nmap <space>i :call MyCounter()
nmap <space>n :cs find s <C-R>=expand("<cword>")<CR><CR><C-R>=str2nr(s:counter)<CR>

Разница между фрагментами кода 1 и 2: = str2nr (s: counter) то есть динамическое вычисление n экземпляров символа при нажатии пользователем n

перед нажатием пробела + n я всегда нажимаю пробел + i

подскажите, пожалуйста, почему не работает второй фрагмент кода.

Ответы [ 2 ]

0 голосов
/ 10 марта 2012

Проблема вызвана попыткой поставить в очередь на обработку символов полученный в результате оценки выражения. Надо сделать выражение будет выражением один (см. :help :map-<expr>) или используйте feedkeys() функция. Для простоты модификации отображения я бы Рекомендую использовать первый подход и изменить отображение следующим образом.

:nnoremap <expr> <space>n ':cs find s '.expand('<cword>')."\r".s:counter."\r\r"
0 голосов
/ 10 марта 2012

Вы можете попробовать

nmap <space>n :exec "cs find s" expand("<cword>") "\| norm" str2nr(s:counter)

Вы, похоже, используете <C-R>=str2nr... в обычном режиме, который не будет работать.

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

Редактировать

Возможно, вы захотите использовать настройку cscopetag:

                        *cscopetag* *cst*
If 'cscopetag' set, the commands ":tag" and CTRL-] as well as "vim -t" will
always use |:cstag| instead of the default :tag behavior.  Effectively, by
setting 'cst', you will always search your cscope databases as well as your
tag files.  The default is off.  Examples: >
    :set cst
    :set nocst

Это должно дать вам богатый набор команд для работы с тегами, которые могут дать вам способы делать то, что вы хотите (:tjump, :tnext и т. Д.)

...