Vim scripting "Мне нужна замена для tnext в cscope"

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

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

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></cr></cword></c-r></space></space></cr></space>

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)</c-r></cr></cr></cword></c-r></space></space></cr></space>

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

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

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

2 ответа

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

:nnoremap <expr> <space>n ':cs find s '.expand('<cword>')."\r".s:counter."\r\r"
</cword></space></expr>


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

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

Кажется, вы используете <cr>=str2nr...</cr> в нормальном режиме, который не будет работать.

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

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

Вы можете использовать настройку 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 т.д.),

licensed under cc by-sa 3.0 with attribution.