Изменить слово под курсором из функции vim - PullRequest
2 голосов
/ 13 апреля 2011

Я хочу написать функцию, которая увеличивает / уменьшает размер текста LaTeX.Например, когда курсор находится над словом \ footnotesize , я хочу позвонить Tex_ChangeSize(-1), чтобы изменить его на \ small и Tex_ChangeSize(1), чтобы изменить его на \ normalsize .

У меня есть следующее:

function! Tex_ChangeSize(direction)
    let sizes = ["tiny", "scriptsize", "footnotesize", "small", "normalsize", "large", "Large", "LARGE", "huge", "Huge"]
    let cursize = index(sizes,expand("<cword>"))
    if cursize != -1
        "FIXME: replace current word under cursor with the following
        echo sizes[cursize + a:direction]
    endif
endfunction
imap <C-h> <C-o>:call Tex_ChangeSize(-1)<Enter>
imap <C-g> <C-o>:call Tex_ChangeSize(1)<Enter>

Чего я не знаю, так это как заменить слово под курсором (см. FIXME).Чтобы быть более точным: есть ли лучший способ, чем синтаксический анализ getline(line('.')) и восстановление его с помощью setline()?

1 Ответ

1 голос
/ 13 апреля 2011

getline + setline - лучший выбор, так как он не испортит ни один регистр (ни @", ни @/), однако найти границы текущего слова немного сложно в мире utf-8, где tab символы (\ t) также могут быть использованы. (col('.') + match() сделает это; см. https://github.com/LucHermitte/lh-misc/blob/master/plugin/vim-tip-swap-word.vim для примеров)

У вас также может быть nnoremapping, который делает простое cw<c-r>=<sid>ChangeSize(1)<cr> с s:ChangeSize(), которое проверяет @", чтобы увидеть, какой символ следующий для его возврата - не путать @" просто, хотя в этом случае.

Вы также можете поиграть с :exe 'normal! "_cw'.new_word из функции, если вы не хотите, чтобы она возвращала что-либо.

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