LINUX.ORG.RU

Сохранение фолдинга

 ,


0

1

Приветствую. Я осознал, что мне крайне необходим фолдинг. Хочу такое: если в текущей директории (та что :pwd) находится ./vimview, то при закрытии/открытии окна в нее сохраняется/загружается выхлоп :mkview для сохранении инфы о фолдинге. Если по пунктам, то:

  1. Проверяем существование ./vimview
  2. Получаем полный путь к файлу, заменяем в нем все ‘/’ на ‘_’ например.
  3. Сохраняем/загружаем образ.
    В теории все понятно, но всем же надо обязательно придумать свой особенный язык вместо заюзывания всем понятного си подобного, в общем застрял. Пока такая заготовка:
function Load_fold()
	if isdirectory("./vimview")
	endif
endfunction

function Save_fold()
	if isdirectory("./vimview")
		let name = expand('%:t')
		let qq = "kjkjk" . "kjjjjk"
		mkview! expand(qq)
	endif
endfunction

augroup Remember_folds
  autocmd!
  autocmd BufWinLeave * call Save_fold()
  autocmd BufWinEnter * call Load_fold()
augroup END

Я там по всякому пытался раскрыть значение qq для mkview!, никак не выходит. В общем надо взять выхлоп expand(‘%:e’), заменить / на _, слепить «./vimview» с этим выхлопом, отдать это mkview. Очевидно, что там какая-нибудь subst() + немного магии, и вообще это нубвопрос, но хочется сделать быстро, а не к вечеру.

★★

Последнее исправление: pavlick (всего исправлений: 1)

Основное вроде сделал

function Load_fold()
	if isdirectory("./vimview")
		let l:name = substitute(expand('%:p'), "/", "_", "g") . ".vimview"
		"execute "loadview" "./vimview/" . name
		loadview qqqqqqqqq   "для теста
	endif
endfunction

но столкнулся с какой-то тупостью - loadview не принимает имя фалйла! Что? Ерунда какая-то, makeview сохраняет с любым именем, а загрузить с любым нельзя?

pavlick ★★
() автор топика
Последнее исправление: pavlick (всего исправлений: 1)

Получилось такое:

function Load_fold()
	if isdirectory("./vimview")
		let l:name = substitute(expand('%:p'), "/", "_", "g") . ".vimview"
		silent! execute "source" "./vimview/" . name
	endif
endfunction

function Save_fold()
	if isdirectory("./vimview")
		let l:name = substitute(expand('%:p'), "/", "_", "g") . ".vimview"
		execute 'mkview!' "./vimview/" . name
	endif
endfunction

augroup Remember_folds
  autocmd!
  autocmd BufWinLeave * call Save_fold()
  autocmd BufWinEnter * call Load_fold()
augroup END

В общем работает как хотел. Есть проект, в корне создаю vimview директорию и в нее начинают автоматом сохранятся/загружаться образы (с фолдингом в том числе). Фолдинг создаю руками в нужных местах. Единственное - наверное надо не сохранять фолдинг, если буфер не сохранен, надо подумать как сделать.

pavlick ★★
() автор топика

Ну, я использую startify :SSave blabla в любое время и всё. Снова открывая новый вим у меня перед глазами предложение открыть blabla то есть всю сессию. Удобно, а не просто расположение чего то там.


                   /\/\,\,\ ,
                   /        ` ..\,
                  /                /|_
                 /                   /
                /                   /
               /                   ;
               ;-""-.  ____       ,
              /      ).    `.      
             (    o |        )   ;
              ),". "\    o   ;  :
              ;\___  `._____/ ,-:
             ;                 @ 
            /                `;-
         ,. `-.______________,|
    ,(`._||         \__\__\__)|
   ,`.`-   \       ...        |
   
    `._  ) :          )______,;\_
       \    \_   _,--/       ,   `.
        \     `--\   :      /      `.
         \        \  ;     |         \
          `-._____ ;|      |       _,
      -hrr-       \//      `-.----. \
                                      
   ╔════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════╗
   ║ Будешь с женщиной долго разговаривать - она посчитает тебя бессильным, а\00полезешь к ней без разговоров - посчитает нахалом. Надо вовремя\00переходить от слов к телу.\00-- Константин Мелихан\00 ║
   ╚════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════════╝

   Сессии

   [0]  YOULUSE
   [1]  image_table_wip
   [2]  image_tables
   [3]  thread
   [4]  ui_line

   Последние файлы

   [5]  Рабочий-Стол/pack/pack.c
   [6]  egnaroc/demos/section/sec.c
   [7]  egnaroc/demos/game/assets/materials/material_0/material.mat
   [8]  egnaroc/demos/game/graphics.cfg
   [9]  egnaroc/demos/game/main.c
   [10] Рабочий-Стол/pack/proto.lua
   [11] egnaroc/src/rendering/renderer.c
...
anonymous
()
Ответ на: комментарий от anonymous

Про сессии знаю, но в них не сохраняется фолдинг (по крайней мере для тех окон, которые не активны, но показываются через :ls). Покрутил я их, да мимо прошел. Хз может какую настройку надо включить?

pavlick ★★
() автор топика

Подумаля я, да решил фолдить ручными метками в файле вместо всего этого сохранения в файлах.

set foldmethod=marker
set foldmarker=/\*fb\*/,/\*fe\*/

//whatever.cc
struct S
/*fb*/
{
    ...
};
/*fe*/

Просто, надежно и видно границы фолдинга, когда он развернут. Во время написания кода удобно свернуть отдельные части, чтобы воспринимать код целиком не терясь в каше шаблонных реализаций и инлайнов. Потом можно и sed’ом пройтись оставив код девственно чистым.

pavlick ★★
() автор топика

Последнее (если кто будет гуглить, может полезно будет) - на этом остановился (без меток)

setlocal foldmethod=manual

function Load_fold()
	if &filetype=="cpp" || &filetype=="c"
		silent! loadview
	endif
endfunction

function Save_fold()
	if &filetype=="cpp" || &filetype=="c"
		mkview
	endif
endfunction

augroup Remember_folds
	autocmd!
	autocmd BufWinLeave,BufLeave * call Save_fold()
	autocmd BufWinEnter * call Load_fold()
augroup END

по дефолту образы сохраняются в ~/.local/share/nvim/view. Сохраняются лишь от C и CPP не создавая тем самым помойку.

ПС: прикольную штуку еще узнал:

set number
nnoremap <Leader>r :set relativenumber!<CR>

Байндитие как угодно (у меня ,r), показывает номера строк относительно текущей (удобно прыгать на нужную строку, например 5k)

pavlick ★★
() автор топика
Ответ на: комментарий от wandrien

только там таймаут какой-то очень долгий для ожидания дальнейшего ввода == 1сек, я сократил до 0.25 сек

set timeoutlen=250
pavlick ★★
() автор топика
Ответ на: комментарий от pavlick

У меня уже тыщу лет стоит set nu rnu, и я не вижу смысла переключаться между rnu/nornu.

удобно прыгать на нужную строку, например 5k

Гораздо удобнее прыгать не «на N строк вверх/вниз» (5k, 5j), а «на Nth строку файла» (15G), потому что в первом случае у тебя количество строк в поле зрения (для чего нужен rnu), а работать чаще приходится с макросами (сишка) и классами (плюсы), которые находятся в первой половине файла, а не плюс-минус десяток строк внутри функции.

таймаут какой-то очень долгий

set timeoutlen=250

У меня вообще стоит 0.

mord0d ★★★★★
()
Последнее исправление: mord0d (всего исправлений: 1)
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.