Как сделать & lt; escape & gt; войти в нормальный режим без изменения положения курсора в vim? [Дубликат]

В дополнение к настройке default_charset в php.ini вы можете отправить правильную кодировку с помощью header() из вашего кода перед любым выходом:

header('Content-Type: text/html; charset=utf-8');

Работа с Unicode в PHP легко, если вы понимаете, что большинство строковых функций не работают с Unicode, а некоторые могут полностью блокировать строки. PHP считает, что «символы» имеют длину 1 байт. Иногда это нормально (например, explode() ищет только последовательность байтов и использует его как разделитель - так что неважно, какие фактические персонажи вы ищете). Но в других случаях, когда функция фактически предназначена для работы с символами , PHP не знает, что ваш текст имеет многобайтовые символы, которые находятся в Unicode.

Хорошая библиотека для проверки есть phputf8 . Это перезаписывает все «плохие» функции, чтобы вы могли безопасно работать с строками UTF8. Существуют расширения, такие как расширение mbstring, которые тоже пытаются это сделать для вас, но я предпочитаю использовать библиотеку, потому что она более переносимая (но я пишу продукты массового рынка, так что это важно для меня). Но phputf8 может использовать mbstring за кулисами, во всяком случае, для повышения производительности.

28
задан mtk 4 June 2013 в 11:28
поделиться

5 ответов

Хотя я бы не рекомендовал менять механику курсора по умолчанию, одним из способов достижения такого поведения является использование следующего отображения вставки в режиме Insert.

:inoremap <silent> <Esc> <Esc>`^

Здесь клавиша Esc перегружена в режиме вставки дополнительно запустить команду `` ^ `, которая перемещает курсор в позицию, где он был последним, когда режим Вставки был остановлен. Так как в этом отображении он выполняется сразу же после выхода из режима вставки с помощью Esc, курсор остается на один символ справа по сравнению с его положением с поведением по умолчанию.

В отличие от некоторых других обходных решений, этого не требуется Vim будет скомпилирован с функцией +ex_extra.

20
ответ дан ib. 26 August 2018 в 16:44
поделиться

Хотя есть уловки для решения этой проблемы (например, сопоставления ESC, упомянутые в предыдущих двух сообщениях), нет последовательного способа сделать это. Причина в том, что нет способа определить метод, который использовался для входа в режим вставки. В частности, с учетом строки abcDefg с помощью курсора на D:

  • Если вы нажмете i, расположение режима вставки будет находиться между c и D. Обычный ESC поместит курсор на c; <C-O>:stopinsert<CR> (или метод обратного хода) поместит курсор на D.
  • Если вы нажмете a, расположение режима вставки будет находиться между D и e. Обычный ESC поместит курсор на D; <C-O>:stopinsert<CR> поместит курсор на e.

Если вы действительно хотите это сделать, вы можете выманить его примерно так:

let insert_command = "inoremap <ESC> <C-O>:stopinsert<CR>"
let append_command = "iunmap <ESC>"
nnoremap i :exe insert_command<CR>i
nnoremap a :exe append_command<CR>a

НО: помните, что это будет иметь дело только с i и a как методы ввода: если вы используете режим визуального блока, I или A или что-то еще, вам нужно будет придумать новые команды для (и их много). Поэтому я настоятельно рекомендую вам не делать этого.

Лично я бы рекомендовал привыкнуть к поведению по умолчанию. Вы можете легко сделать это логичным для i ИЛИ логичным для a. Если вы измените значение по умолчанию на логическое для i за счет логического для a, вы просто смутитесь, когда будете использовать стандартную установку vi / vim.

17
ответ дан mtk 26 August 2018 в 16:44
поделиться

Как насчет:

:imap <Esc> <Esc><Right>
-1
ответ дан Paolo Tedesco 26 August 2018 в 16:44
поделиться

Я верю, что правильный способ сделать это

au InsertLeave * call cursor([getpos('.')[1], getpos('.')[2]+1])
3
ответ дан Steven Lu 26 August 2018 в 16:44
поделиться
inoremap <silent> <Esc> <C-O>:stopinsert<CR>

в вашем .vimrc

7
ответ дан tur1ng 26 August 2018 в 16:44
поделиться
Другие вопросы по тегам:

Похожие вопросы: