Vim: сделать что-то в функции, основанной на символе под курсором? - PullRequest
6 голосов
/ 27 сентября 2011

Я пишу функцию, которая редактирует определенную среду в LaTeX.

Среда в основном выглядит следующим образом:

\begin{quicktikz}
    ...some stuff...
\end{quicktikz}

или примерно так:

\begin*{quicktikz}
    ...some stuff...
\end{quicktikz}

Я хочу написать функцию, которая переключается между ними при вызове из среды.Поскольку мои знания Vim - это еще не все, я придумаю простое решение:

  1. Получить позицию курсора с помощью let save_cursor=getpos(".")
  2. Обратный поиск для \begin{quicktikz}, используя:?\\begin{quicktikz}\|\\begin\*{quicktikz}
  3. Найдите { и переместите влево, используя: normal 0f{h
  4. Проверьте, равен ли элемент под курсором *
    • , если это так normal x
    • если это не так normal a*<esc>
  5. Восстановить положение курсора с помощью call setpos('.',save_cursor)

Я знаю, как это сделатьвсе это, за исключением шага 3. Как я могу проверить, равен ли символ под курсором * или нет?

Если вы знаете лучший способ сделать это, разделение этого было бы приветствоваться.

Ответы [ 2 ]

7 голосов
/ 27 сентября 2011

Я думаю, что самый простой способ получить символ под курсором:

getline(".")[col(".")-1]

В качестве альтернативы, вы можете сделать это с помощью strpart()

strpart(getline("."), col(".")-1, 1)

Первое выражениесначала вызывает функцию getline(), передавая "." в качестве аргумента, что означает, что будет возвращена строка, в которой находится курсор.Затем мы используем так называемые expr8 или expr - [] (см. help ) для получения одного символа.Переданное число поступает из другой функции, col(), которая возвращает текущий столбец курсора.Поскольку индексы начинаются с 0, один вычитается.

Вы можете использовать его как

if getline(".")[col(".")-1] == '*'
        ...
3 голосов
/ 27 сентября 2011

Позвольте мне предложить альтернативную реализацию описанной вами методики.

:?\\begin\>\zs\*\=?s//\='*'[submatch(0)!='']/|norm!``

Вышеприведенная команда состоит из двух отдельных команд, связанных | (см. :help :bar) в одну строку. Первый является заменой (см. :help :s) выполняется для каждой строки в указанном диапазоне,

?\\begin\>\zs\*\=?

В соответствии с синтаксисом диапазона (см. :help :range), этот диапазон определяет единственная строка, то есть предыдущая строка, где шаблон \\begin\>\zs\*\= соответствует слову begin, которому предшествует обратная косая черта, за которым следует необязательный символ звезды. 1 Атом \zs между частями узора соответствие \begin и * устанавливает начало матча там. Итак, матч всего шаблона либо пустой, либо содержит один символ звезды. это нет необходимости указывать строку в диапазоне, это полезно для повторного использования тот же шаблон позже в команде :substitute, где только эта звезда персонаж или его пустое место должны быть заменены. Для получения подробной информации о синтаксис шаблона см. :help /\>, :help /\=, :help /\zs.

Сама замена,

s//\='*'[submatch(0)!='']/

заменяет первое вхождение последнего шаблона поиска (который устанавливается обратный поиск в диапазоне) со строкой, к которой относится выражение '*'[submatch(0)!=''] оценивает (см. :help sub-replace-\=). Как образец соответствует только пустой строке или символу звезды, подвыражение submatch(0)!='' оценивается как ноль, если после \begin нет звезды, или один иначе. Нулевой индекс из строки '*' приводит к подстроке содержащий первый символ этой односимвольной строки. Индекс один равна длине строки, поэтому нижний индекс приводит к пустому строка. Таким образом, когда после \begin появляется звезда, она заменяется на пустая строка, когда звезды нет, интервал нулевой ширины сразу после \begin заменяется *.

Вторая команда,

:norm!``

использует тот факт, что команда :substitute сохраняет текущий положение курсора до того, как он фактически начнет замену. Движение `` команда переходит обратно в положение до последнего прыжка (который происходит в вышеупомянутая команда замещения) восстановление положения курсор. 2


1 Будьте осторожны с поиском, поскольку в диапазонах, как обычно, он переносится в конце файла, когда опция wrapscan включена (включена по умолчанию).

2 Не путайте `` с командой '', которая перемещает курсор на первый непустой символ в строке местоположения перед последний прыжок.

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