Автоматическое закрытие фигурных кавычек в Vim

Я хочу настроить Vim на автоматическое закрытие пары «и» (фигурные кавычки).

Я пытался настроить все пять плагинов, которые смог найти (два автозакрытия, объемный звук, близкие пары и разделитель), но безуспешно. Кажется, я даже не могу переназначить ‘ вообще (с :imap ‘ ‘’<left> или подобным).

Я использую Vim 7.3 в Arch Linux и метод ввода uim 1.7.0; Я вставляю «и» через ярлык, определенный в .XCompose. Переназначение отлично работает для других моих сочетаний клавиш, таких как ¡! или ?.


person Kamil S.    schedule 07.06.2011    source источник
comment
Какую кодировку вы используете? (:echo &enc)   -  person sidyll    schedule 08.06.2011
comment
Это utf-8, а мой $LANG — en_US.UTF-8.   -  person Kamil S.    schedule 08.06.2011


Ответы (3)


Это очень похоже на ошибку vim, в частности, на ошибку с внутренними escape-последовательностями vim, которые начинаются с \x80 (второй байт рассматриваемого символа — \x80) и кодируют различные вещи, такие как NULL, функциональные клавиши или сам \x80 байт. Я думаю, вы можете покопаться в исходном коде vim и найти там, как этот байт экранируется, и попытаться заменить последний байт этим escape-кодом или подождать, пока это не будет исправлено (хотя я не ожидаю, что исправление появится в ближайшее время: вот цитата из todo.txt

UTF-8: сопоставление многобайтового ключа, где второй байт равен 0x80, не работает. (Тони Мечелинк, 2 марта 2007 г.)

Итак, видите, проблема известна четыре года и до сих пор не устранена.)

person ZyX    schedule 08.06.2011
comment
О... Вот оно что. О, Боже. О, спасибо большое за разъяснение! Это почти все, что мне нужно было знать, даже если бы я надеялся на другое решение. - person Kamil S.; 09.06.2011
comment
@caminoix Ведутся дискуссии о замене очень ограниченных собственных экранов \x80 vim последовательностями CSI, поскольку с текущей реализацией гораздо больше проблем: по сравнению с абсолютным значением возможных модификаторов + какие-то ярлыки, такие как <C-Tab>, <C-S-a>, <C-»>, ... vim не поддерживает почти ни один из них, в то время как CSI может поддерживать все. Когда этот код, наконец, будет переработан, я думаю, ваша проблема исчезнет, ​​хотя это может произойти только до vim-7.4 или даже vim-8.0. - person ZyX; 09.06.2011

Избегайте рекурсии с

inoremap ' ''<left>
person Fritz G. Mehner    schedule 08.06.2011
comment
Это не проблема. imap a ab<left> и inoremap a ab<left> работают одинаково хорошо, но ни один из них не работает с ‘. Очевидно, проблема заключается в переназначении, поскольку imap a ‘’ работает как положено. - person Kamil S.; 08.06.2011

Вы можете добиться этого с помощью небольшой функции:

function! CloseQuotes()
    normal! i'' 
    startinsert
endfunction

а затем сопоставьте его с ' следующим образом:

inoremap ' <ESC>:call CloseQuotes()<CR>

Важным моментом является восклицательный знак в normal!, который предотвращает рекурсивное сопоставление.

person Prince Goulash    schedule 08.06.2011
comment
Спасибо за попытку, но это не работает. Рекурсия не проблема; imap a ab<left> работает нормально. Проблема заключается в переназначении фигурной цитаты: ‘(U+2018). imap ‘ a не содержит рекурсии и не работает точно так же. - person Kamil S.; 08.06.2011
comment
@caminoix Тот факт, что imap something работает нормально, не должен заставлять вас писать imap something. Используйте inoremap, если вы не можете ответить на вопрос «Почему я не могу использовать nore здесь?», это сэкономит ваше время, так как количество сопоставлений, которые могут мешать друг другу, увеличивается. - person ZyX; 08.06.2011
comment
Понял. Думаю, я был слишком сосредоточен на своей текущей проблеме, чтобы оценить общий, если не совсем уместный, совет. - person Kamil S.; 08.06.2011