2011-12-16 2 views
0

Я определил несколько карт, которые охватывают выбранный фрагмент текста, например. для преобразования «text» в «\ texttt {text}». Это один пример такой карты:Команда Vim ведет себя по-разному в конце строки

vmap <buffer> ,t xi\texttt{<Esc>pa}<Esc> 

Однако, эта карта не работает, как ожидается, когда выбранный текст в конце строки. Возьмем, например, такую ​​строку:

word1 word2 word3 

, когда я выполняю нормальную команду viw,t для каждого слова в строке, это результат, который я получаю:

\texttt{word1} \texttt{word2}\texttt{word3} 

с завершающими пробелами, т.е. вставка последнего texttt{ произошла в неправильном месте.

Как я могу изменить свою карту для работы независимо от того, где она выполнена?

+2

Проблема заключается в позиции курсора после x, которая отличается от EOL, потому что нет конечного символа, на который указывает курсор. Использование s, как было предложено, может помочь. – Nikodemus

ответ

5

Попробуйте использовать s вместо xi. Это удаляет выбор и переходит прямо в режим вставки, избегая неопределенной позиции курсора после удаления с x.

vmap <buffer> ,t s\texttt{<Esc>pa}<Esc>

+0

Это то, что я искал. Благодаря! –

1

Попробуйте

:nnoremap <buffer> ,t ciw\texttt{<C-R>"}<Esc> 

Вам не нужно, чтобы выбрать слово первой, просто убедитесь, что курсор находится на ней где-то. См. :help text-objects и :help i_CTRL-R. Также: nmap будет работать так же, как и :nnoremap, но в этом случае :nnoremap - хорошая практика, поскольку он предотвращает RHS отображения, запускающего любые вложенные или рекурсивные сопоставления.

+0

Обычно я выбираю больше текста, чем просто одно слово. Но это отличное дополнение к моему существующему vmap! –

+1

Затем используйте ': vnoremap , ts \ texttt {"} '. Другой ответ не будет работать, если ваш выбор охватывает более одной строки. – 1983

+0

С выбором, охватывающим более одной строки, пространство сразу после моего выбора –

Смежные вопросы