Vim: изменить форматирование переменных в скрипте - PullRequest
3 голосов
/ 22 апреля 2010

Я использую vim для редактирования скрипта оболочки (не использовал правильный стандарт кодирования). Мне нужно поменять все мои переменные с верблюжьей нотации startTime на прописные и подчеркивания нотации START_TIME

Я не хочу менять способ представления имен методов.

Я думал, что один из способов сделать это - написать функцию и сопоставить ее с ключом. Функция может сделать что-то вроде генерации этого в командной строке:

s/<word under cursor>/<leave cursor here to type what to replace with>

Я думаю, что эта функция может быть применима к другим ситуациям, которые будут полезны. Два вопроса:

Вопрос 1: Как бы я занялся созданием этой функции.

  • Я создал функции в vim прежде, чем самая большая вещь, о которой я не представляю, - это как фиксировать движение. Т.е. если вы нажмете dw в vim, он удалит оставшуюся часть слова. Как вы это поймаете?
  • Также можете ли вы оставить незавершенную команду в командной строке vim?

Вопрос 2: Есть лучшее решение для меня? Как бы вы подошли к этой задаче?

Ответы [ 2 ]

2 голосов
/ 23 апреля 2010
  1. Использовать плагин

    Проверьте секцию COERCION внизу страницы:

    http://www.vim.org/scripts/script.php?script_id=1545

  2. Получить команду: s для командной строки

    :nnoremap \c :%s/<C-r><C-w>/

    возвращает слово под курсором в командной строке

  3. Изменить слово под курсором с помощью: s

    :nnoremap \c lb:s/\%#<C-r><C-w>/\=toupper(substitute(submatch(0), '\<\@!\u', '_&', 'g'))/<Cr>

    фунт двигаться вправо, затем к началу слова. Нам нужно сделать это, чтобы получить курсор перед словом, которое мы хотим изменить, потому что мы хотим изменить только слово под курсором и регулярное выражение привязаны к текущему курсору позиция. Перемещение должно быть сделано, потому что b на начало слова перемещается в начало предыдущего слова.

    \% # соответствует текущей позиции курсора

    \ = Когда замещающая строка начинается с "\ =", остаток интерпретируется как выражение. :h sub-replace-\=

    submatch (0) Полное совпадение для команды: s, с которой мы имеем дело

    \ <</kbd> граница слова

    \ @! не совпадают с предыдущим атомом (это не должно совпадать в начале слово. Без этого FooBar изменится на _FOO_BAR)

    & в выражениях замены, это означает полное совпадение

  4. Изменить слово под курсором, все совпадения в файле

    :nnoremap \a :%s/<C-r><C-w>/\=toupper(substitute(submatch(0), '\<\@!\u', '_&', 'g'))/g<Cr>

    См. 3. для объяснения.

  5. Изменить слово под курсором с помощью команд обычного режима

    / \ u найти следующий заглавный символ

    i_ вставить подчеркивание.

    nn Поиск последней найденной строки дважды (два раза, потому что после выхода из режима вставки вы возвращаетесь на один символ назад).

    . Повторите последнее изменение, в этом случае вставьте подчеркивание.

    Повторяйте nn. до тех пор, пока перед всеми верблюдами не будет добавлено подчеркивание, то есть FooBarBaz стал Foo_Bar_Baz

    gUiw текущее внутреннее слово в верхнем регистре

  6. http://vim.wikia.com/wiki/Converting_variables_to_camelCase

0 голосов
/ 22 апреля 2010

Я не уверен, что вы понимаете под «захватом движений». Тот сказал, что для начала я бы использовал что-то вроде этого для функции:

fu! ChangeWord()

  let l:the_word = expand('<cword>')

  " Modify according to your rules
  let l:new_var_name = toupper(l:the_word)

  normal b
  let l:col_b = col(".")

  normal e
  let l:col_e = col(".")

  let l:line = getline(".")

  let l:line = substitute(
  \ l:line, 
  \ '^\(' . repeat('.',  l:col_b-1) . '\)' . repeat('.', l:col_e - l:col_b+1), 
  \ '\1' . l:new_var_name, 
  \ '')

  call setline(".", l:line)

endfu

Что касается оставления незавершенной команды в командной строке vim, я думаю, что вы после

:map ,x :call ChangeWord(

, который затем можно вызвать в normal mode, нажав ,x.

Обновление

Подумав об этом, эта следующая функция немного короче:

fu! ChangeWordUnderCursor()

  let l:the_word = expand('<cword>')

  "" Modify according to your rules
  let l:new_var_name = '!' . toupper(l:the_word) . '!'

  normal b
  let l:col_b = col(".")

  normal e
  let l:col_e = col(".")

  let l:line = getline(".")

  exe 's/\%' . l:col_b . 'c.*\%' . (l:col_e+1) .'c/' . l:new_var_name . '/'

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