From 4b6d506d7bcdb683ad4b18a8267b57d75a4826ad Mon Sep 17 00:00:00 2001 From: Michael Campagnaro Date: Sun, 10 Dec 2023 18:49:05 -0500 Subject: [PATCH] Try to execute run-cpp if editing a C/C++ file --- .vimrc | 47 ++++++++++++++++++++++++++--------------------- 1 file changed, 26 insertions(+), 21 deletions(-) diff --git a/.vimrc b/.vimrc index 7db2edc..1743499 100644 --- a/.vimrc +++ b/.vimrc @@ -1301,8 +1301,10 @@ endfu fu! RunProgramInDirectory(starting_path, file_exe_name) abort let l:search_path = a:starting_path + let l:ext = tolower(expand('%:e')) + let l:also_search_for_cpp_run_script = 0 " Covers the case of having a run-cpp file in a jai project. - if tolower(expand('%:e')) == "jai" + if l:ext == "jai" " Check if we're editing inside a modules file and if so then get a " path that takes us outside of it. We'll use that path for finding an " exe or run script. @@ -1326,6 +1328,8 @@ fu! RunProgramInDirectory(starting_path, file_exe_name) abort let l:search_path = l:module_root_path endif + elseif l:ext == "cpp" || l:ext == "c" || l:ext == "h" || l:ext == "inc" + let l:also_search_for_cpp_run_script = 1 endif let l:search_path = fnamemodify(l:search_path, ':p') " Normalize the path just in case. @@ -1338,35 +1342,36 @@ fu! RunProgramInDirectory(starting_path, file_exe_name) abort " If nothing is found after exhausting the search then we start over and " find the first exe with any name. + fu! TryRun(path) abort + if filereadable(a:path) + exec "AsyncRun! " . a:path + return 1 + endif + return 0 + endfu + let l:current_path = l:search_path while 1 - " Run script has higher priority over an exe named after the current file. - let l:search = l:current_path . 'run' - if filereadable(l:search) - exec "AsyncRun! " . l:search - return 1 + " run script + if l:also_search_for_cpp_run_script + if TryRun(l:current_path . 'run-cpp') | return 1 | endif endif + if TryRun(l:current_path . 'run') | return 1 | endif + + " run_tree/run script + if l:also_search_for_cpp_run_script + if TryRun(l:current_path . 'run_tree/run-cpp') | return 1 | endif + endif + if TryRun(l:current_path . 'run_tree/run') | return 1 | endif " filename exe - let l:search = l:current_path . a:file_exe_name - if filereadable(l:search) - exec "AsyncRun! " . l:search - return 1 - endif + if TryRun(l:current_path . a:file_exe_name) | return 1 | endif " bin/filename exe - let l:search = l:current_path . 'bin/' . a:file_exe_name - if filereadable(l:search) - exec "AsyncRun! " . l:search - return 1 - endif + if TryRun(l:current_path. 'bin/' . a:file_exe_name) | return 1 | endif " run_tree/filename exe - let l:search = l:current_path . 'run_tree/' . a:file_exe_name - if filereadable(l:search) - exec "AsyncRun! " . l:search - return 1 - endif + if TryRun(l:current_path. 'run_tree/' . a:file_exe_name) | return 1 | endif " Only go back a directory if the current path doesn't have a .git folder or we're not in a root drive path. if isdirectory(l:current_path . '.git') || IsRootDrive(l:current_path)