Аргументы разделенной функции Vim - PullRequest
0 голосов
/ 12 июня 2018

Я обнаружил, что я часто делаю рефакторинг:

def function(param1, param2, (...), paramK):

до

def function(
    param1,
    param2,
    (...),
    paramK,       
):

И попытался написать сопоставление для него.Я начал с

command! Split normal! qqqf(a<cr><esc>qqf s<cr><esc>@qq@qf)i<cr><esc>

qqq - reset content of macro q.

f(a<cr><esc> - find bracket, make newline and return to normal mode.

qq - start to record macro q.

f s<cr><esc> - change space to newline.

@q - run macro recursively.

q@q - end recording and run.

f)i<cr><esc> - add last newline before closing bracket. 

Моя идея состояла в том, что макрос потерпит неудачу, когда не найдет место, но с этим что-то не так.Это вызвало некоторые вопросы.

1) Как я могу проверить, было ли какое-то движение успешным?Например, как проверить, есть ли пробел в текущей строке?

2) Есть ли лучшая идея для достижения того, чего я хочу?Может быть, какой-нибудь плагин или функция очистки?

3) Что не так с моей идеей?Когда я запускаю эту комбинацию из рук, она работает, но во время вызова: Split - нет.

Ответы [ 2 ]

0 голосов
/ 13 июня 2018

Относительно того, почему это не работает так же, как и при вводе вручную:

Когда вы набираете normal! <esc>, Vim анализирует это как "введите буквы <, e, s, c, > ".Вы можете вставить туда буквальный escape-ключ, набрав <c-v><esc>, но это может показаться странным в конфигурации.Вместо этого лучше использовать команду :exe (:help :exe):

exe "normal! \<esc>"

\<esc> интерполируется строкой длябыть буквальным escape-ключом.Таким образом, exe "normal! ..." преобразуется в вызов normal! с ключами, которые вы ищете.Вам также нужно убежать <cr> таким же образом.Я бы также использовал \<space> вместо , я не совсем уверен, будет ли здесь работать нормальное пространство.После этого, надеюсь, вы получите те же результаты, что и при вводе вручную.


Что касается конкретной проблемы, которую вы пытаетесь решить, у меня есть плагин для этого: splitjoin .По умолчанию он разбивает ваш пример следующим образом:

def function(param1,
        param2,
        (...),
        paramK):
    pass

Но есть параметр , который вы можете изменить, чтобы настроить его по своему вкусу.В качестве альтернативы, по ссылке Jordan Running, вы также можете использовать плагин argwrap , который может быть более надежным для разделения аргументов в частности (splitjoin обрабатывает более широкий спектр случаев, но, возможно, не такхорошо с аргументами? Не уверен.)

0 голосов
/ 12 июня 2018

Ответы:

  1. Я не понимаю вопроса.Вы можете искать пробелы с f или с синтаксисом /.Почему вы хотите это сделать?
  2. Да.См. Ниже.
  3. Синтаксис vimrc сильно отличается от обычного синтаксиса vim.Я не знаю почему и не до конца понимаю.

Код:

nnoremap <C-r> :s/, */,\r    /g<cr>:s/)/\r)<cr>:nohl<cr>

переназначает Ctrl + R для поиска запятой, за которой следует 0 или более пробелови замените его запятой, символом новой строки и табуляцией.затем ищет ) и заменяет его символом новой строки и).затем отменяет выделение, которое он только что сделал.

Чтобы ввести буквенную вкладку вместо 4 пробелов, вам придется набрать Ctrl V tab вместо 4 пробелов, которые высмотрите в команде

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