summaryrefslogtreecommitdiff
path: root/.vim/miniplugins/code_terminal.vim
diff options
context:
space:
mode:
authorSyndamia <kamen@syndamia.com>2023-02-24 22:39:05 +0200
committerSyndamia <kamen@syndamia.com>2023-02-24 22:39:05 +0200
commit6ea45e425be52b92006e97e2caf315036542856d (patch)
tree99e37b4a5963af7c99b35e705135b9457800aa82 /.vim/miniplugins/code_terminal.vim
parent9020beac90c6779d831f0d73639c95a2dabacdb1 (diff)
downloaddotfiles-6ea45e425be52b92006e97e2caf315036542856d.tar
dotfiles-6ea45e425be52b92006e97e2caf315036542856d.tar.gz
dotfiles-6ea45e425be52b92006e97e2caf315036542856d.zip
[.vimrc] Huge overhaul, separating contents into different files
Diffstat (limited to '.vim/miniplugins/code_terminal.vim')
-rw-r--r--.vim/miniplugins/code_terminal.vim79
1 files changed, 79 insertions, 0 deletions
diff --git a/.vim/miniplugins/code_terminal.vim b/.vim/miniplugins/code_terminal.vim
new file mode 100644
index 0000000..86ed1e6
--- /dev/null
+++ b/.vim/miniplugins/code_terminal.vim
@@ -0,0 +1,79 @@
+" Program in which build actions are executed. If no value, build commands are executes as bash commands.
+" This is only really useful in languages with interpreters
+let g:codeenvs = {
+\ 'scheme' : 'racket',
+\ 'lisp' : 'rlwrap sbcl --noinform',
+\ }
+
+" The following two dictionaries support certain substitutions:
+" %F - location of current file (relative path)
+" %D - directory of current file (full path)
+
+" Building the current file only
+let g:codebuildsingle = {
+\ 'scheme' : '(enter! "%F")',
+\ 'cpp' : "g++ -g -pedantic '%F' && ./a.out",
+\ 'yacc' : 'bison -t -d %F',
+\ 'lex' : 'flex %F',
+\ 'haskell' : 'runhaskell "%F"',
+\ 'lisp' : '(load "%F")',
+\ }
+" Building all files in the directory (and subdirectories) of the current file
+let g:codebuildproject = {
+\ 'cpp' : "g++ -g -pedantic '%D/'**/*.cpp && ./a.out"
+\ }
+
+noremap <F3> :call CodeTerminal(g:codebuildsingle)<CR>
+noremap <F4> :call CodeTerminal(g:codebuildproject)<CR>
+inoremap <F3> <C-O>:call CodeTerminal(g:codebuildsingle)<CR>
+inoremap <F4> <C-O>:call CodeTerminal(g:codebuildproject)<CR>
+" We assume that the last accessed window is the one with the source code, otherwise it gets complicated
+tnoremap <F3> <C-W><C-P>:call CodeTerminal(g:codebuildsingle)<CR><C-W><C-P>
+tnoremap <F4> <C-W><C-P>:call CodeTerminal(g:codebuildproject)<CR><C-W><C-P>
+
+
+let t:codetermbufnr = -1
+let t:codetermft = ""
+let t:codetermhadenv = 0
+function! OpenCodeTerminal()
+ if !bufexists(t:codetermbufnr)
+ term
+ " Latest buffer is the terminal buffer we just opened
+ let t:codetermbufnr = bufnr("$")
+ " We go back to the file from which this was called
+ wincmd p
+ let t:codetermft = ""
+ let t:codetermhadenv = 0
+ endif
+
+ if &filetype != t:codetermft
+ if t:codetermhadenv
+ " This is kinda bad, since certain environments might not close with this only
+ call term_sendkeys(t:codetermbufnr, "\<C-D>")
+ " The sleep is kinda bad, but it fixes the next term_sendkeys not working properly
+ sleep 500m
+ endif
+
+ let t:codetermft = &filetype
+ if has_key(g:codeenvs, &filetype)
+ call term_sendkeys(t:codetermbufnr, g:codeenvs[&filetype] . "\<CR>")
+ let t:codetermhadenv = 1
+ else
+ let t:codetermhadenv = 0
+ endif
+ endif
+endfunction
+
+function! CodeTerminal(builddict)
+ call OpenCodeTerminal()
+
+ if has_key(a:builddict, &filetype)
+ let buildcomm = a:builddict[&filetype] . "\<CR>"
+ let buildcomm = substitute(buildcomm, "%F", @%, "")
+ let buildcomm = substitute(buildcomm, "%D", expand('%:p:h'), "")
+ call term_sendkeys(t:codetermbufnr, buildcomm)
+ echo "[CodeTerminal] Sent build command!"
+ else
+ echo "[CodeTerminal] No value in build dictionary!"
+ endif
+endfunction