рд╣рдо рд╡рд┐рдо рдХреЗ рддрд╣рдд cmake рдкрд░рд┐рдпреЛрдЬрдирд╛рдУрдВ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдкреНрд▓рдЧрдЗрди рд▓рд┐рдЦ рд░рд╣реЗ рд╣реИрдВ

рдЖрдЬ рд╣рдо VIM рдХреЗ рд▓рд┐рдП рдРрдб-рдСрди рдмрдирд╛рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░реЗрдВрдЧреЗред

рд╣рд╛рд▓ рд╣реА рдореЗрдВ, рдореБрдЭреЗ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рдлрд╝рд╛рдЗрд▓ рдиреЗрд╡рд┐рдЧреЗрд╢рди рдХреЗ рд▓рд┐рдП рдЗрд╕рдореЗрдВ cmake рдкрд░рд┐рдпреЛрдЬрдирд╛рдУрдВ рдХреЗ рд▓рд┐рдП рд╕рдорд░реНрдерди рдкреЗрдВрдЪ рдХрд░рдиреЗ рдХрд╛ рд╡рд┐рдЪрд╛рд░ рдерд╛ред рдмреЗрд╢рдХ, рдПрдирдИрдЖрд░рдбреА рдЯреНрд░реА рдЗрд╕ рдХрд╛рд░реНрдп рдХреЗ рд╕рд╛рде рдХрд╛рдлреА рд╕рд╛рдордирд╛ рдХрд░реЗрдЧрд╛, рд▓реЗрдХрд┐рди рдмрд╛рдж рдореЗрдВ рдХреЛрдИ рднреА рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдлрд╛рдЗрд▓реЛрдВ рдкрд░ рдХрд╛рдо рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛ рд╣реИред

рдЕрдЪрддреБрдВрдЧ: рд▓реЗрдЦ рдХреЗ рд▓реЗрдЦрдХ рдкрд╣рд▓реА рдмрд╛рд░ рд╡рд┐рдо рд╕реНрдХреНрд░рд┐рдкреНрдЯ рд╕реЗ рдорд┐рд▓реЗред рдпрд╣ рдЧрд╛рд░рдВрдЯреА рдирд╣реАрдВ рд╣реИ рдХрд┐ рдЖрдк рд▓реЗрдЦ рдкрдврд╝рдиреЗ рдХреЗ рдмрд╛рдж рдмреЗрд╣реЛрд╢ рдирд╣реАрдВ рд╣реЛрдВрдЧреЗред рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдореЗрдВ рдХреЛрдб рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдХреЛрдИ рдЯрд┐рдкреНрдкрдгреА рдЫреЛрдбрд╝ рджреЗрдВред



Cmake рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдореИрдиреЗрдЬрдореЗрдВрдЯ рдкреНрд▓рдЧрдЗрди, cmake рдХрдорд╛рдВрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП, "рдмрд┐рд▓реНрдб" рдлрд╝реЛрд▓реНрдбрд░ рдореЗрдВ рдЕрд╕реЗрдВрдмрд▓реА рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рдлрд╛рдЗрд▓реЗрдВ рдмрдирд╛рдПрдВ рдФрд░ рдлрд╛рдЗрд▓реЛрдВ рдХреЗ рдкреЗрдбрд╝ рдХреЗ рд╕рд╛рде рдПрдХ рдкреИрдирд▓ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░реЗрдВ, рдЬрд┐рд╕рдХреЗ рддрддреНрд╡реЛрдВ рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░рдХреЗ рдЖрд╕рд╛рдиреА рд╕реЗ рд╕реНрд░реЛрдд рдлрд╝рд╛рдЗрд▓реЛрдВ рддрдХ рдкрд╣реБрдВрдЪ рд╕рдХрддреЗ рд╣реИрдВред

рдФрд░ рдЗрд╕рд▓рд┐рдП, рдЪрд▓реЛ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВред

рдпрджрд┐ рдЖрдк cmake рдХреЗ рд╕рд╛рде рдмрдирд╛рдИ рдЧрдИ рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЗ рдЖрдВрддреНрд░ рдореЗрдВ рдЧрд╣рд░реА рдЦреБрджрд╛рдИ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдЖрдк рдпрд╣ рдкрд╛ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рдпрд╣ рдирд┐рд░реНрднрд░ рд╕реНрд░реЛрдд рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреА рд╕реВрдЪреА рдХрд╣рд╛рдБ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рддрд╛ рд╣реИред рдЖрдЗрдП рдЕрд░реНрдз-рдмреБрджреНрдзрд┐рдорд╛рди рддрд░реАрдХреЗ рд╕реЗ cppshniki рдХреЗ рд╕рд╛рде рддрд╛рд░ рдХреА рдЙрдкрд╕реНрдерд┐рддрд┐ рдХреЗ рд▓рд┐рдП рдПрдХ рдЦреЛрдЬ рдХрд░реЗрдВ:

grep ".*\.cpp" -R build/ 


рдореБрдЭреЗ рдЗрд╕ рд╕рд╛рдордЧреНрд░реА рдХреЗ рд╕рд╛рде DependInfo.cmake рдореЗрдВ рдПрдХ рдЪрд░ рдорд┐рд▓рд╛
 SET(CMAKE_DEPENDS_CHECK_CXX "/home/..../brushcombo.cpp" "/home/.../build/CMakeFiles/kdots.dir/brushcombo.o" ... ) 


рд╣рдо рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдореЗрдВ рд╕рднреА DependInfo.cmake рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЛ рдкрд╛рддреЗ рд╣реИрдВ рдФрд░ рдкрд░реНрд▓ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЗ рд▓рд┐рдП рдкреВрд░реНрдг рдкрде рдвреВрдВрдврддреЗ рд╣реИрдВред
 sub cmake_project_files { my $dir = shift; my @dependencies = File::Find::Rule->file() ->name("DependInfo.cmake") ->in($dir); my @accum = (); foreach my $filename(@dependencies) { open(FILE, $filename); my @data = <FILE>; push (@accum, src_files(\@data)); close(FILE); } return @accum; } sub src_files { my @result = (); foreach my $line(@{(shift)}) { if ($line =~ m/\s*\"(([a-zA-Z_\/]+)\/([a-zA-Z_]+\.(cpp|cc))).*/) { push(@result, $1); } } return @result; } 


рдкреВрд░реНрдг рд╕реНрд░реЛрдд рдпрд╣рд╛рдБ

рдЗрди рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдкреНрд▓рдЧрдЗрди рдореЗрдВ рдмрд╛рдБрдзрдиреЗ рд╕реЗ рдкрд╣рд▓реЗ, рд╣рдо ~ / .vim рдореЗрдВ рдбрд╛рдпрд░реЗрдХреНрдЯрд░реА рдкрджрд╛рдиреБрдХреНрд░рдо рдХреА рдЬрд╛рдБрдЪ рдХрд░реЗрдВрдЧреЗред


рдЪреВрдВрдХрд┐ рд╣рдорд╛рд░реЗ рдкреНрд▓рдЧрдЗрди рдХреЛ рд╕рдВрдкрд╛рджрдХ рджреНрд╡рд╛рд░рд╛ рд▓реЙрдиреНрдЪ рдХрд┐рдП рдЬрд╛рдиреЗ рдХреЗ рдмрд╛рдж рд╣рд░ рдмрд╛рд░ рд▓реЛрдб рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП, рдЗрд╕реЗ ~ / .vim / plugin рдореЗрдВ рдбрд╛рд▓реЗрдВред рдлрд╝рд╛рдЗрд▓ рдХреЛ cmake-project.vim рдирд╛рдо рджреЗрдВред

рдПрдХ рдкрд░реНрд▓ рджреБрднрд╛рд╖рд┐рдпрд╛ рдХреА рдЙрдкрд╕реНрдерд┐рддрд┐ рдХреЗ рд▓рд┐рдП рдЬрд╛рдБрдЪ рдХрд░реЗрдВ:
 if !has('perl') echo "Error: perl not found" finish endif 


рдПрдХ рдлрд╝рд╛рдЗрд▓ рдЯреНрд░реА рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдлрдВрдХреНрд╢рди рдмрдирд╛рдПрдВред рдлрд╝рдВрдХреНрд╢рдВрд╕, рд╕рд╛рде рд╣реА рдЪрд░, рд╡рд┐рднрд┐рдиреНрди рд╕реНрдХреЛрдк рдХреЗ рд╕рд╛рде рдмрдирд╛рдП рдЬрд╛ рд╕рдХрддреЗ рд╣реИрдВ (рдЖрдк рдЗрд╕ рдмрд╛рд░реЗ рдореЗрдВ рдпрд╣рд╛рдВ рдкрдврд╝ рд╕рдХрддреЗ рд╣реИрдВ)ред рд╢реБрд░реБрдЖрдд рдореЗрдВ рдпрд╣ рдлрд╝рдВрдХреНрд╢рди "CMakeProject" рдирд╛рдордХ рдПрдХ рдирдИ рд╡рд┐рдВрдбреЛ рдФрд░ рдмрдлрд░ рдмрдирд╛рддрд╛ рд╣реИред
 function! s:cmake_project_window() vnew badd CMakeProject buffer CMakeProject " ,    ,   , VIM     setlocal buftype=nofile ... 


рдпрд╣ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ рд╣рдорд╛рд░рд╛ рд╡рд░реНрддрдорд╛рди рдмрдлрд░ рдПрдХ рдлрд╝рд╛рдЗрд▓ рдЯреНрд░реА рд╡рд╛рд▓рд╛ рдкреИрдирд▓ рд╣реИ, рдмрдлрд░ рдХреЗ рдирд╛рдо рдХреЗ рд╕рд╛рде рдПрдХ рдЪрд░ (рдкреНрд▓рдЧрдЗрди рдХреЗ рдЕрдВрджрд░ рдЧреБрдВрдЬрд╛рдЗрд╢ рдХреЗ рд╕рд╛рде) рдШреЛрд╖рд┐рдд рдХрд░реЗрдВред
  let s:cmake_project_bufname = bufname("%") 


рдЕрдм рдкрд░реНрд▓ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЛ рдкреНрд▓рдЧрдЗрди рдореЗрдВ рдмрд╛рдБрдз рд▓реЗрдВред рд╣рдо рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЛ ~ / .vim / plugin / cmake- рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдбрд╛рдпрд░реЗрдХреНрдЯрд░реА рдореЗрдВ рд░рдЦрддреЗ рд╣реИрдВ рддрд╛рдХрд┐ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рд▓рд┐рдмрд░ рдорд┐рд▓ рд╕рдХреЗрдВред рд╣рдореЗрдВ cmakeproject :: cmake_project_files рдлрд╝рдВрдХреНрд╢рди рд╕реЗ рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреА рд╕реВрдЪреА рдорд┐рд▓рддреА рд╣реИ рдФрд░ рдЗрд╕реЗ Wim рдХреА рд╕реВрдЪреА рдореЗрдВ рд░рдЦрд╛ рдЬрд╛рддрд╛ рд╣реИред

 perl << EOF "     Python   Ruby use lib "$ENV{'HOME'}/.vim/plugin/cmake-project"; use cmakeproject; my $dir = VIM::Eval('g:cmake_project_build_dir'); my @result = cmakeproject::cmake_project_files($dir); VIM::DoCommand("let s:cmake_project_files = []"); foreach $filename(@result) { if (-e $filename) { VIM::DoCommand("call insert(s:cmake_project_files, \'$filename\')"); } } EOF 


рдЕрдЧрд▓рд╛, рдЗрди рдЖрдВрдХрдбрд╝реЛрдВ рдХреЗ рдЖрдзрд╛рд░ рдкрд░, рд╣рдо рдПрдХ рдкреЗрдбрд╝ рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдХрд░рддреЗ рд╣реИрдВред рд╡рд┐рдо рдореЗрдВ рдХрдИ рдбреЗрдЯрд╛ рд╕рдВрд░рдЪрдирд╛рдПрдВ рд╣реИрдВ: рд╣реИрд╢ рдФрд░ рд╕реВрдЪреАред рдЗрд╕рд▓рд┐рдП, рд╣рдо рд╣реИрд╢ рдореЗрдВ рдПрдХ рдХреБрдВрдЬреА рдХреЗ рд░реВрдк рдореЗрдВ рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдХрд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд░рддреЗ рд╣реИрдВред рдпрджрд┐ рд╣реИрд╢ рдХреБрдЫ (1 рдирд╣реАрдВ) рдХреЛ рдЗрдВрдЧрд┐рдд рдХрд░рддрд╛ рд╣реИ, рддреЛ рдпрд╣ рдПрдХ рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рд╣реИ, рдФрд░ рдпрджрд┐ рдпрд╣ 1 рд╣реИ, рддреЛ рдпрд╣ рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдореЗрдВ рдПрдХ рдлрд╝рд╛рдЗрд▓ рд╣реИред

рдиреАрдЪреЗ рджрд┐рдпрд╛ рдЧрдпрд╛ рдХреЛрдб "/home/paranoik/main.cpp" рдлрд╝реЙрд░реНрдо рдХреА рдПрдХ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХреЛ рд░реВрдк рдХреА рд╕рдВрд░рдЪрдирд╛ рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд░рддрд╛ рд╣реИ {'home': {'paranoik': {'main.cpp': 1}}, рдЬрд╣рд╛рдБ {key, value} рдПрдХ рд╣реИрд╢ рдХреЗ рд╕рд╛рде рд╣реИ 1 рдХреБрдВрдЬреА-рдореВрд▓реНрдп рдЬреЛрдбрд╝реАред

  let s:cmake_project_file_tree = {} for fullpath in s:cmake_project_files let current_tree = s:cmake_project_file_tree let cmake_project_args = split(fullpath, '\/') let filename = remove(cmake_project_args, -1) for path in cmake_project_args if !has_key(current_tree, path) let current_tree[path] = {} "   endif let current_tree = current_tree[path] endfor let current_tree[filename] = 1 endfor call s:cmake_project_print_bar(s:cmake_project_file_tree, 0) 


рдЕрдм рд╣рдо рдмрдлрд░ рдореЗрдВ рдкреЗрдбрд╝ рдХреЛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддреЗ рд╣реИрдВред рд╕реНрдерд╛рди рдХреЗ рд░реВрдк рдореЗрдВ рдЗрдВрдбреЗрдВрдЯреЗрд╢рди рдХреЛ рдкрджрд╛рдиреБрдХреНрд░рдо рдХреЗ рд╕реНрддрд░ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ (рдлрд╝рдВрдХреНрд╢рди s: cmake_project_indent рдЗрд╕рдХреЗ рд▓рд┐рдП рдЬрд┐рдореНрдореЗрджрд╛рд░ рд╣реИ)ред
 function! s:cmake_project_print_bar(tree, level) for pair in items(a:tree) if type(pair[1]) == type({}) "   let name = s:cmake_project_indent(a:level) . "-" . pair[0] call append(line('$'), name . "/") "   "-<dir>/" let newlevel = a:level + 1 call s:cmake_project_print_bar(pair[1], newlevel) "      . else "   let name = s:cmake_project_indent(a:level) . pair[0] call append(line('$'), name) endif endfor endfunction 


Cmake_project_window () рдлрд╝рдВрдХреНрд╢рди рдХреЛ CMakePro рдХрдорд╛рдВрдб рд╕реЗ рдмрд╛рдБрдзреЗрдВ
 command -nargs=0 -bar CMakePro call s:cmake_project_window() 


рд╣рдореЗрдВ cmake рдлрд╛рдЗрд▓реНрд╕ рдЬреЗрдирд░реЗрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рднреА рдХрдорд╛рдВрдб рдХреА рдЬрд░реВрд░рдд рд╣реЛрддреА рд╣реИред
 command -nargs=1 -bar CMake call s:cmake_project_cmake(<f-args>) function! s:cmake_project_cmake(srcdir) if !isdirectory(a:srcdir) echo "This directory not exists!" . a:srcdir return endif let s:cmake_project_dir = a:srcdir exec "cd" a:srcdir if !isdirectory(g:cmake_project_build_dir) call mkdir(g:cmake_project_build_dir) endif cd build exec "!cmake" "../" cd .. call s:cmake_project_window() endfunction 


рдЬрдм рдХрд░реНрд╕рд░ рдкреИрдирд▓ рдХреЗ рдкрд╛рд░ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдлрд╝рд╛рдЗрд▓ рдХреЛ рдХрд░реНрд╕рд░ рдХреЗ рдиреАрдЪреЗ рдЦреЛрд▓рдирд╛ рдЪрд╛рд╣рд┐рдПред рд╣рдо s: cmake_project_cursor_moved () рдлрд╝рдВрдХреНрд╢рди рдмрдирд╛рддреЗ рд╣реИрдВ рдФрд░ рдЗрд╕реЗ CursorMoved рд╕рд┐рдЧреНрдирд▓ рд╕реЗ рдмрд╛рдВрдзрддреЗ рд╣реИрдВред
 autocmd CursorMoved * call s:cmake_project_cursor_moved() 

рдлрд╝рдВрдХреНрд╢рди рдХреЗ рд▓рд┐рдП рдХреЗрд╡рд▓ рдкреИрдирд▓ рдмрдлрд░ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдирд┐рд╖реНрдкрд╛рджрди рд╕реЗ рдкрд╣рд▓реЗ рдЙрд╕рдХрд╛ рдирд╛рдо рдЬрд╛рдВрдЪреЗрдВред
 function! s:cmake_project_cursor_moved() if exists('s:cmake_project_bufname') && bufname('%') == s:cmake_project_bufname <code> endif endfunction 

рд╣рдореЗрдВ рд╡рд░реНрддрдорд╛рди рд▓рд╛рдЗрди рдХрд╛ рдбреЗрдЯрд╛ рдорд┐рд▓рддрд╛ рд╣реИ рдФрд░ рдХрд░реНрд╕рд░ рдХреЗ рдиреАрдЪреЗ рд╢рдмреНрдж рдХрд╛ рдЪрдпрди рдХрд░рддреЗ рд╣реИрдВред
  let cmake_project_filename = getline('.') let fullpath = s:cmake_project_var(cmake_project_filename) let highlight_pattern = substitute(fullpath, '[.]', '\\.', '') let highlight_pattern = substitute(highlight_pattern, '[/]', '\\/', '') exec "match" "ErrorMsg /" . highlight_pattern . "/" 


рдЙрд╕ рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░реЗрдВ рдЬрд┐рд╕рдореЗрдВ рдлрд╝рд╛рдЗрд▓ рдЗрдВрдбреЗрдВрдЯреЗрд╢рди рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╕реНрдерд┐рдд рд╣реИред рдпрджрд┐ рдлрд╝рд╛рдЗрд▓ nth рд╕реНрддрд░ рдХрд╛ рдПрдХ рддрддреНрд╡ рд╣реИ, рддреЛ рд╡рд╣ рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдЬрд┐рд╕рдореЗрдВ рдлрд╝рд╛рдЗрд▓ рд╕реНрдерд┐рдд рд╣реИ, nth рд╕реНрддрд░ рдХреЗ рдЗрдВрдбреЗрдВрдЯреЗрд╢рди рдХреЗ рд╕рд╛рде рд╢реАрд░реНрд╖ рдкрд░ рдирд┐рдХрдЯрддрдо рддрддреНрд╡ рд╣реИред
  let level = s:cmake_project_level(cmake_project_filename) let level -= 1 let finding_line = s:cmake_project_find_parent(level, line('.')) while level > -1 let path = s:cmake_project_var(getline(finding_line)) let fullpath = path . fullpath let level -= 1 let finding_line = s:cmake_project_find_parent(level, finding_line) endwhile let fullpath = "/" . fullpath "     


рдЖрд╡рд╢реНрдпрдХ рдлрд╝рд╛рдЗрд▓ рдЦреЛрд▓реЗрдВ
  if filereadable(fullpath) wincmd l exec 'e' fullpath setf cpp endif endif 


рдкрд░рд┐рдгрд╛рдо рд╣реИ:

рдЫрд╡рд┐

рдпрд╣рд╛рдБ рд▓реЗ рдЬрд╛рдиреЗ рдХреЗ рд╕реНрд░реЛрдд: рдЫрд╡рд┐

Source: https://habr.com/ru/post/In153873/


All Articles