Подтвердить что ты не робот

Более эффективные движения, редактирующие файлы python в vim

Учитывая, что файл python повторяется бесконечно:

def myFunction(a, b, c):
    if a:
        print b
    elif c:
        print 'hello'

Я хотел бы перемещаться и редактировать этот файл, используя знакомые движки vim. Например, используя (,), [[,]], {,} или удаляя/yanking/изменяя текст с помощью команд типа di}.

В других языках (например, на С++, Java, С# и т.д.) у вас есть фигурные скобки, поэтому с помощью движения типа di} можно легко найти подходящую фигуру и действовать на этом блоке. И на самом деле, если я нахожусь на символе "b" в приведенном выше тексте и делаю di) в vim, он успешно удаляет текст между двумя паранами.

Проблема в обнаружении блоков кода на Python, я думаю. Используя (,), [[,]], {, или}, как движения все в значительной степени делают то же самое, доводя вас до начала (выше или по линии def) или заканчивая (после последней строки функции) функция. И, насколько я знаю, нет никакого способа легко сказать vim "выбрать все для этого блока отступов". В приведенном выше примере я хотел бы быть включен в "i" строки if, type di} и удалить его весь блок if (до конца этой конкретной функции).

Я уверен, что должно быть возможно сказать, что vim будет работать с отступом для таких движений (ну, может быть, не это конкретное движение, а какое-то определенное пользователем действие). Любые мысли о том, как это сделать?

4b9b3361

Ответ 1

python.vim

Сделать намного проще для навигации по блокам кода python.

Ярлыки:

  • ]t - Переход к началу блока
  • ]e - Переход к концу блока
  • ]v - выбор (режим визуальной линии)
  • ]< - сдвинуть блок влево
  • ]> - сдвинуть блок вправо
  • ]# - Выбор комментария
  • ]u - Uncomment selection
  • ]c - выберите текущий/предыдущий класс
  • ]d - выберите текущую/предыдущую функцию
  • ]<up> - Переход к предыдущей строке с тем же самым/нижним отступом
  • ]<down> - Переход к следующей строке с тем же самым/нижним отступом

python_match.vim

extends %:

  • % - цикл через if/elif/else, try/except/catch, для /continue/break
  • g% - перемещаться напротив %
  • [% - перейти к началу текущего блока кода
  • ]% - перейти к концу текущего блока кода

Все вышеперечисленные движения работают с режимами Normal, Visual и Operator-pending, поэтому:

  • d]% - удалить до конца текущего блока
  • v]%d - должен делать то же самое, проходя через визуальный режим, чтобы вы можете видеть, что удаляется.
  • v]%d - выше, но с выбором строки

Ответ 2

python-mode

Этот плагин vim обеспечивает движения, подобные встроенным:

2.4 Vim motion ~
                                                                *pymode-motion*

Support Vim motion (See |operator|) for python objects (such as functions,
class and methods).

`C` — means class
`M` — means method or function
                                                            *pymode-motion-keys*

==========  ============================
Key         Command (modes)
==========  ============================
[[          Jump to previous class or function (normal, visual, operator)
]]          Jump to next class or function  (normal, visual, operator)
[M          Jump to previous class or method (normal, visual, operator)
]M          Jump to next class or method (normal, visual, operator)
aC          Select a class. Ex: vaC, daC, yaC, caC (normal, operator)
iC          Select inner class. Ex: viC, diC, yiC, ciC (normal, operator)
aM          Select a function or method. Ex: vaM, daM, yaM, caM (normal, operator)
iM          Select inner func. or method. Ex: viM, diM, yiM, ciM (normal, operator)
==========  ============================

Обновить файлы времени выполнения vim8 по 2016-09-08

$VIMRUNTIME/ftplugin/python.vim теперь включает

]] Jump forward to begin of next toplevel
[[ Jump backwards to begin of current toplevel (if already there, previous toplevel)
]m Jump forward to begin of next method/scope
[m Jump backwords to begin of previous method/scope

См. ftplugin/[email protected].

Однако, если вы используете текстовые объекты aC,iC,aM,iM, вам все равно нужен плагин python-mode.

Обновить файлы времени выполнения vim8 на 2017-11-02

Встроенная функциональность была расширена второй раз и теперь соответствует всем встроенным сопоставлениям, зарегистрированным в :h ]] и :h ]m. Новые сопоставления:

][ Jump forward to end of current toplevel
[] Jump backward to end of previous of toplevel
]M Jump forward to end of current method/scope
[M Jump backward to end of previous method/scope

См. ftplugin/[email protected]

Пример, иллюстрирующий различные сопоставления

class Mapping:                              # [[[[
    def __init__(self, iterable):
        pass

    def update(self, iterable):
        pass

    __update = update                       # []

class Reverse:                              # [[ or [m[m
    def __init__(self, data):               # [m
        self.data = data
        self.index = len(data)              # [M

    def __iter__(self):                     # <--- CURSOR
        return self                         # ]M

    def __next__(self):                     # ]m
        if self.index == 0:
            raise StopIteration
        self.index = self.index - 1
        return self.data[self.index]        # ][

class MappingSubclass(Mapping):             # ]] or ]m]m

    def update(self, keys, values):
        pass

Для обсуждения текстовых объектов для python см. какой самый быстрый способ выбрать функцию Python через VIM?.

Ответ 3

Очень легко перемещать отступы, когда у вас есть set foldmethod=indent. Например, если вы находитесь в строке def main(): в следующем фрагменте:

def main():
+-- 35 lines: gps.init()-----------------------------------------------------

if __name__ == "__main__": main()

то dj берет всю основную функцию и может быть вставлен в другое место.

Ответ 4

Чтобы обратиться к вашему заключительному абзацу, следующий script определяет новый текстовый объект "indent", над которым вы можете выполнять действия. Например, d i i удаляет все отступы на том же уровне, что и строка, в которой находится курсор.

Подробнее см. документацию к плагину: http://www.vim.org/scripts/script.php?script_id=3037

Ответ 5

chapa.vim

Многоязычный vim-плагин для перемещения (или визуального выбора) следующего/предыдущего класса, метода или функции; из поддержки ящика для python и javascript.

" Function Movement
nmap <buffer> fnf <Plug>ChapaNextFunction
nmap <buffer> fpf <Plug>ChapaPreviousFunction

" Class Movement
nmap <buffer> fnc <Plug>ChapaNextClass
nmap <buffer> fpc <Plug>ChapaPreviousClass

" Method Movement
nmap <buffer> fnm <Plug>ChapaNextMethod
nmap <buffer> fpm <Plug>ChapaPreviousMethod