2

Мне интересно, возможно ли автоматически сворачивать только определенные разделы кода в vim (особенно для файлов python).

В настоящее время я использую метод отступа. И я хотел бы сложить блок с отступом, только если заголовок соответствует шаблону.

Например, если я нахожусь в файле с этой функцией, я бы хотел, чтобы все блоки, начинающиеся с Example: или References:, были автоматически свернуты, но я не хочу, чтобы что-то еще было свернуто.

Есть ли простой способ сделать это?

def spawn_background_process(func, *args, **kwargs):
    """
    Run a function in the background
    (like rebuilding some costly data structure)

    References:
        http://stackoverflow.com/questions/2046603/is-it-possible-to-run-function-in-a-subprocess-without-threading-or-writing-a-se
        http://stackoverflow.com/questions/1196074/starting-a-background-process-in-python
        http://stackoverflow.com/questions/15063963/python-is-thread-still-running

    Args:
        func (function):

    CommandLine:
        python -m utool.util_parallel --test-spawn_background_process

    Example:
        >>> # DISABLE_DOCTEST
        >>> from utool.util_parallel import *  # NOQA
        >>> import utool as ut
        >>> import time
        >>> from os.path import join
        >>> # build test data
        >>> fname = 'test_bgfunc_output.txt'
        >>> dpath = ut.get_app_resource_dir('utool')
        >>> ut.ensuredir(dpath)
        >>> fpath = join(dpath, fname)
        >>> # ensure file is not around
        >>> sleep_time = 1
        >>> ut.delete(fpath)
        >>> assert not ut.checkpath(fpath, verbose=True)
        >>> def backgrond_func(fpath, sleep_time):
        ...     import utool as ut
        ...     import time
        ...     print('[BG] Background Process has started')
        ...     time.sleep(sleep_time)
        ...     print('[BG] Background Process is writing')
        ...     ut.write_to(fpath, 'background process')
        ...     print('[BG] Background Process has finished')
        ...     #raise AssertionError('test exception')
        >>> # execute function
        >>> func = backgrond_func
        >>> args = (fpath, sleep_time)
        >>> kwargs = {}
        >>> print('[FG] Spawning process')
        >>> threadid = ut.spawn_background_process(func, *args, **kwargs)
        >>> assert threadid.is_alive() is True, 'thread should be active'
        >>> print('[FG] Spawned process. threadid=%r' % (threadid,))
        >>> # background process should not have finished yet
        >>> assert not ut.checkpath(fpath, verbose=True)
        >>> print('[FG] Waiting to check')
        >>> time.sleep(sleep_time + .1)
        >>> print('[FG] Finished waiting')
        >>> # Now the file should be there
        >>> assert ut.checkpath(fpath, verbose=True)
        >>> assert threadid.is_alive() is False, 'process should have died'
    """
    import utool as ut
    func_name = ut.get_funcname(func)
    name = 'mp.Progress-' + func_name
    proc_obj = multiprocessing.Process(target=func, name=name, args=args, kwargs=kwargs)
    #proc_obj.isAlive = proc_obj.is_alive
    proc_obj.start()
    return proc_obj

1 ответ1

4

Есть способ сделать это, вам просто нужно написать собственную функцию сворачивания.

Поместите следующий код в .vim/after/ftplugin/python/folding.vim (создание каталогов и файлов, если их нет):

function! ExampleFolds(lnum)
  let s:thisline = getline(a:lnum)
  if match(s:thisline, '^\s*Example:$') >= 0
    return '>1'
  elseif match(s:thisline, '^\s*$') >= 0
    return '0'
  else
    return '='
endfunction

setlocal foldmethod=expr
setlocal foldexpr=ExampleFolds(v:lnum)

Вам все равно придется немного адаптировать эту функцию под свои нужды. То, что он делает сейчас, - это начинает фолд с фолд-уровнем 1, когда он встречает блок Example: . Сгиб включает в себя все следующие строки до тех пор, пока не появится новый примерный блок (начиная с нового сгиба) или пустая строка не закроет его.

Помимо ссылки, проверьте :h foldexpr и :h foldlevel .

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .