Vim: Получить содержимое элемента синтаксиса под курсором - PullRequest
7 голосов
/ 28 апреля 2011

Я нахожусь на выделенном элементе сложного синтаксиса и хотел бы получить его содержимое.Можете ли вы придумать какой-нибудь способ сделать это?

Может быть, есть какой-то способ поиска регулярного выражения, чтобы оно содержало курсор ?

EDIT

Хорошо, пример.Курсор находится внутри строки, и я хочу получить текст, содержимое этого синтаксического элемента.Рассмотрим следующую строку:

String myString = "Foobar, [CURSOR]cool \"string\""; // And some other "rubbish"

Я хочу написать функцию, которая возвращает

"Foobar, cool \"string\""

Ответы [ 4 ]

7 голосов
/ 29 апреля 2011

если я понял вопрос. Я нашел этот драгоценный камень некоторое время назад и не помню где, но раньше я понимал, как работает подсветка синтаксиса в vim:

" Show syntax highlighting groups for word under cursor
nmap <leader>z :call <SID>SynStack()<CR>
function! <SID>SynStack()
  if !exists("*synstack")
    return
  endif
  echo map(synstack(line('.'), col('.')), 'synIDattr(v:val, "name")')
endfunc
3 голосов
/ 02 мая 2011

Плагин textobj-syntax может помочь. Он создает пользовательский текстовый объект, так что вы можете запустить viy, чтобы визуально выбрать текущий синтаксис выделенного элемента. Плагин зависит от плагина textobj-user , который является основой для создания пользовательских текстовых объектов.

1 голос
/ 19 ноября 2011

Это хорошее использование для текстовых объектов (:help text-objects). Чтобы получить контент, который вы ищете (Foobar, cool \"string\"), вы можете просто сделать:

yi"

y = yank
i" = the text object "inner quoted string"

Команда yank по умолчанию использует безымянный регистр ("", см. :help registers), поэтому вы можете получить доступ к янкированному содержимому программным способом, используя функцию getreg() или сокращение @{register-name}:

:echo 'String last yanked was:' getreg('"')
:echo 'String last yanked was:' @"

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

"qyi"

возвращает внутреннюю строку в кавычках в регистр "q, поэтому она не конфликтует со стандартным использованием регистра (и может быть доступна как переменная @q).

0 голосов
/ 28 апреля 2011

РЕДАКТИРОВАТЬ: Видя, что плагин, упомянутый nelstrom, работает аналогично моему первоначальному подходу, я остановился на этом несколько более элегантном решении:

fu s:OnLink()
    let stack = synstack(line("."), col("."))
    return !empty(stack)
endf

normal mc 

normal $
let lineLength = col(".")
normal `c

while col(".") > 1
    normal h
    if !s:OnLink()
        normal l
        break
    endif
endwhile
normal ma`c

while col(".") < lineLength
    normal l
    if !s:OnLink()
        normal h
        break
    endif
endwhile
normal mb`av`by
...