Более эффективные движения, редактирующие файлы 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 будет работать с отступом для таких движений (ну, может быть, не это конкретное движение, а какое-то определенное пользователем действие). Любые мысли о том, как это сделать?
Ответы
Ответ 1
Сделать намного проще для навигации по блокам кода python.
Ярлыки:
-
]t
- Переход к началу блока
-
]e
- Переход к концу блока
-
]v
- выбор (режим визуальной линии)
-
]<
- сдвинуть блок влево
-
]>
- сдвинуть блок вправо
-
]#
- Выбор комментария
-
]u
- Uncomment selection
-
]c
- выберите текущий/предыдущий класс
-
]d
- выберите текущую/предыдущую функцию
-
]<up>
- Переход к предыдущей строке с тем же самым/нижним отступом
-
]<down>
- Переход к следующей строке с тем же самым/нижним отступом
extends %
:
-
%
- цикл через if/elif/else, try/except/catch, для /continue/break
-
g%
- перемещаться напротив %
-
[%
- перейти к началу текущего блока кода
-
]%
- перейти к концу текущего блока кода
Все вышеперечисленные движения работают с режимами Normal, Visual и Operator-pending, поэтому:
-
d]%
- удалить до конца текущего блока
-
v]%d
- должен делать то же самое, проходя через визуальный режим, чтобы
вы можете видеть, что удаляется.
-
v]%d
- выше, но с выбором строки
Ответ 2
Этот плагин 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
Многоязычный 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