Как сложить длинные строки документации в исходном коде Python в VIM? - PullRequest
9 голосов
/ 22 июня 2010

Кто-нибудь знает метод или плагин, который будет автоматически складывать длинные строки документов в Python? У меня есть документы код, занимающий несколько страниц, поэтому сложно продолжать пейджинг через них. Другая сложность заключается в том, что есть встроенный питон тестирование кода в строках документации, что может сделать их анализ сложно. Обратите внимание, что мне нужно только автоматически сложить весь Документация, независимо от того, что в нем.

Ответы [ 6 ]

8 голосов
/ 23 июня 2010

Это немного грязный хак, но вы можете просмотреть файл синтаксиса python (:sp $VIMRUNTIME/syntax/python.vim) и найти все области синтаксиса для строк в тройных кавычках (поиск ''' и """) и добавитьключевое слово fold до конца этих операторов.Затем просто установите foldmethod=syntax для файлов Python и комментарии должны быть свернуты.

2 голосов
/ 22 июня 2010

Я не уверен насчет плагина или автоматизации, но если вы наберете zf/, вы сможете найти что-то, и оно свернется до следующего экземпляра.Поэтому в документе, подобном следующему (где [] - курсор):

def foo():
    """[]
    Some long docstring
    that takes up many
    lines
    """
    pass

Сначала посмотрите на edit2 для обновленной строки поиска!

Если вы используетекоманда zf/"""[ENTER], она должна свернуть все от текущей строки (начала строки документации) до следующего вхождения """, которое должно быть концом строки документации.

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

Надеюсь, это поможет.

Редактировать : вследствие, вы можете искать любую строку документации с помощью /"""\_.\{-}""", хотя это также вернет код в пределах строки документа.Для поиска определения функции, за которым следует строка документа, вы можете использовать /def\_.\{-}"""\_.\{-}""", хотя это нарушает определение в строке документа.

Edit2 : На самом деле, еще некоторые игры с регулярными выражениями привелимне это: /def.\{-}):\_s*"""\_.\{-}""", который должен найти любую функцию, за которой следует строка документации.Он ищет def, за которым следуют любые символы, затем ):, за которым следуют символ новой строки и / или пробел, за которым следует """, за которым следует любое количество строк, чем следующие """, но всегда гарантирует, что вторая тройная кавычка являетсяодин сразу после первого.

1 голос
/ 22 июня 2010

В вашем .vimrc добавьте:

" folding
set foldmethod=indent

Это будет автоматически сгибаться при каждом отступе, что в python переводится в строки документации.Это работает очень хорошо.Попробуйте.Приведенный выше ответ является правильным, но требует нескольких нажатий клавиш (бла!)

0 голосов
/ 18 октября 2014

Мое решение включает использование SimpylFold . После установки с помощью Vundle я поместил это в мой vimrc файл:

autocmd FileType python setlocal foldlevel=2

Что делает все строки документов по умолчанию сложенными при открытии файла Python, что очень здорово.

0 голосов
/ 15 августа 2013

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

"
" Fold multi-line Python comments into one line.
"
" Also maps the "-" key to toggle expansion and <C-f> to toggle all folding.
"
setlocal foldmethod=syntax
setlocal foldtext=FoldText()
setlocal fillchars=

map <buffer> - za
map <buffer> <C-f> :call ToggleFold()<CR>

let b:folded = 1

hi Folded     gui=bold cterm=bold guifg=cyan ctermfg=cyan guibg=NONE ctermbg=NONE

function! ToggleFold()
  if b:folded == 0
    exec "normal! zM"
    let b:folded = 1
  else
    exec "normal! zR"
    let b:folded = 0
  endif
endfunction

function! s:Strip(string)
  return substitute(a:string, '^[[:space:][:return:][:cntrl:]]\+\|[[:space:][:return:][:cntrl:]]\+$', '', '')
endfunction

" Extract the first line of a multi-line comment to use as the fold snippet
function! FoldText()
  let l:snippet = getline(v:foldstart)
  if len(s:Strip(l:snippet)) == 3
    let l:snippet = strpart(l:snippet, 1) . s:Strip(getline(v:foldstart + 1))
  endif
  return '+' . l:snippet . ' ...'
endfunction
0 голосов
/ 23 июня 2010

Вы можете сделать это с :set foldmethod=marker foldmarker=""",""", я думаю. Я не проверял это, но это должно сработать. Аргументы для foldmarker являются начальным и конечным маркерами.

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