2013-12-05 3 views
1

В моем плагине vim я получаю текущую позицию курсора, используя Ruby's w.cursor.Получить позицию курсора, учитывая вкладки

Номер столбца, который он дает мне, основан на табулине 1. Например. если текущая строка равна \t\tfoo, а курсор находится на f, ее позиция будет отображаться как 3.

То, что мне нужно, - это позиция курсора, основанная на табуляции 8 (поскольку это указывает стандарт Haskell). Итак, в приведенном выше примере мне нужно, чтобы номер столбца f был равен 17, независимо от ts.

Как это получить?

ответ

2

Внимание! В Vim parlance, столбец относится к индексу байта. Символ <Tab> представлен одним байтом (0x09), который дает вам 1. Символы, отличные от ASCII (например, умлауты или кандзи), будут занимать 2, 3 и более (в зависимости от кодировки) столбцы, но визуально представленной одной/двойной ячейкой.

Судя по всему, вы заинтересованы в ширину экрана (где <Tab> может занимать между 1..8 клеток), что документация Vim, как относится к виртуальной колонке, и могут быть доступны через функции, как virtcol() и последнее время strdisplaywidth().

+0

IIUC, чтобы получить то, что я хочу (позиция, основанная на 'ts = 8'), мне нужно будет установить, а затем сбросить' ts'. Я беспокоюсь, что это может привести к мерцанию экрана, потому что vim переформатирует код, когда я меняю 'ts'. Есть ли способ обойти это? –

+0

Нет! Ruby 'w.cursor [1]' соответствует 'col ('.')' В Vimscript. Вместо этого вам нужно использовать 'virtcol ('.')'. –

+0

Да, я понимаю, что 'virtcol' намного ближе к тому, что мне нужно, чем' w.cursor' или 'col'. Моя проблема заключается в том, что результат «virtcol» зависит от настройки 'ts'. Мне нужен результат, рассчитанный для 'ts = 8' независимо от того, что пользователь действительно установил' ts'. Но изменение этого приведет к мерцанию. –

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