diff --git a/README.md b/README.md index 4cd4129..d1bd33f 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,68 @@ -# vim-split-open +# SplitOpen -This is my first vim plugin. It provides a command to open a combination of c++ source and header file in a new tab split side-by-side. +This vim plugin opens file-pairs in a new split-window tab + +## Usage + +Use + + :SplitOpen filename + +with a .cpp or .h file as filename to open a new tab containing a vertical split +with the corresponding header file in the left window and the corresponding +source file in the right window. + +Use + + :Split + +to open the corresponding header or source file to your currently open file in +a vertical split. + +## Configuration + +You can configure the following settings: + +### g:splitopen_extensions + +Use this dictionary to define your pairs of left-hand- right-hand-side file +types. E.g. + + let g:splitopen_extensions = {"h": "cpp"} + +always places a .cpp file on the right-hand side when opening an .h file and +vice versa. + +### g:splitopen_set_fzf_keys + +Set this option to 1 + + let g:splitopen_set_fzf_keys = 1 + +to have SplitOpen overwrite the default fzf keybindings ctrl-t/x/v for opening +files in splits or tabs to add an addional binding ctrl-s to call SplitOpen. + +## License + +SplitOpen is GPL-3.0 licensed. See LICENSE file for more info. + +## Changelog + +v1.1.0 +* Added Split() command + +v1.0.0 +* Fixed error when reloading plugin + +v0.0.4 +* Add filetype configuraton + +v0.0.3 +* Add fzf.vim keybinding + +v0.0.2 +* Added delay-loading +* Added documentation + +v0.0.1 +* Initial release diff --git a/autoload/splitopen.vim b/autoload/splitopen.vim index d4f2aac..1151120 100644 --- a/autoload/splitopen.vim +++ b/autoload/splitopen.vim @@ -1,11 +1,68 @@ -function splitopen#SplitOpenFile(filename) - execute("tabedit " . a:filename) - let l:file_extension = tolower(fnamemodify(a:filename, ":e")) - if l:file_extension == "cpp" - execute("FSSplitLeft") - execute("wincmd l") - elseif l:file_extension == "h" - execute("FSSplitRight") - execute("wincmd h") +function s:invert_dict(source_dict) + let result = {} + for [key, value] in items(a:source_dict) + let result[value] = key + endfor + return result +endfunction + +let s:extensions = g:splitopen_extensions +let s:extensions_rev = s:invert_dict(s:extensions) + +function s:isLeftSideExtension(extension) + return has_key(s:extensions, a:extension) +endfunction + +function s:isRightSideExtension(extension) + return has_key(s:extensions_rev, a:extension) +endfunction + +function s:getFileExtension(filename) + return fnamemodify(a:filename, ":e") +endfunction + +function s:getFileRoot(filename) + return fnamemodify(a:filename, ":r") +endfunction + +function s:getSwitchExtension(filename) + let extension = s:getFileExtension(a:filename) + if s:isLeftSideExtension(extension) + return s:extensions[extension] + elseif s:isRightSideExtension(extension) + return s:extensions_rev[extension] endif endfunction + +function s:getSwitchFile(filename) + return s:getFileRoot(a:filename) . "." . s:getSwitchExtension(a:filename) +endfunction + +function s:addLeftSplit(filename) + execute("vsplit " . s:getSwitchFile(a:filename)) + execute("wincmd l") +endfunction + +function s:addRightSplit(filename) + execute("vsplit " . s:getSwitchFile(a:filename)) + execute("wincmd L") + execute("wincmd h") +endfunction + +function s:splitOpenFile(filename) + let extension = s:getFileExtension(a:filename) + if s:isLeftSideExtension(extension) + call s:addRightSplit(a:filename) + elseif s:isRightSideExtension(extension) + call s:addLeftSplit(a:filename) + endif +endfunction + +function! splitopen#SplitOpenFile(filename) + execute("tabedit " . a:filename) + call s:splitOpenFile(a:filename) +endfunction + +function! splitopen#SplitFile() + call s:splitOpenFile(expand("%:p")) +endfunction diff --git a/doc/splitopen.txt b/doc/splitopen.txt index 66af367..8d64698 100644 --- a/doc/splitopen.txt +++ b/doc/splitopen.txt @@ -3,9 +3,12 @@ ================================================================================ CONTENTS *SplitOpenContents* - 1. Usage ..................................|SplitOpenUsage| - 2. License ................................|SplitOpenLicense| - 3. Changelog ..............................|SplitOpenChangelog| + 1. Usage ..............................|SplitOpenUsage| + 2. Configuration ......................|SlitOpenConfiguraton| + 2.1 g:splitopen_extensions.........|SplitOpenConfiguration_extensions| + 2.2 g:splitopen_set_fzf_keys.......|SplitOpenConfiguration_set_fzf_keys| + 3. License ............................|SplitOpenLicense| + 4. Changelog ..........................|SplitOpenChangelog| ================================================================================ 1. Usage *SplitOpenUsage* @@ -18,17 +21,57 @@ with a .cpp or .h file as filename to open a new tab containing a vertical split with the corresponding header file in the left window and the corresponding source file in the right window. +Use + + :Split + +to open the corresponding header or source file to your currently open file in +a vertical split. + ================================================================================ -2. License *SplitOpenLicense* +2. Configuration *SplitOpenConfiguration* + +You can configure the following settings: + +-------------------------------------------------------------------------------- +2.1 g:splitopen_extensions *SplitOpenConfiguration_extensions* + +Use this dictionary to define your pairs of left-hand- right-hand-side file +types. E.g. + + let g:splitopen_extensions = {"h": "cpp"} + +always places a .cpp file on the right-hand side when opening an .h file and +vice versa. + +-------------------------------------------------------------------------------- +2.2 g:splitopen_set_fzf_keys *SplitOpenConfiguration_set_fzf_keys* + +Set this option to 1 + + let g:splitopen_set_fzf_keys = 1 + +to have SplitOpen overwrite the default fzf keybindings ctrl-t/x/v for opening +files in splits or tabs to add an addional binding ctrl-s to call SplitOpen. + +================================================================================ +3. License *SplitOpenLicense* SplitOpen is GPL-3.0 licensed. See LICENSE file for more info. ================================================================================ -3. Changelog *SplitOpenChangelog* +4. Changelog *SplitOpenChangelog* +v1.1.0 + * Added Split() command +v1.0.0 + * Fixed error when reloading plugin +v0.0.4 + * Add filetype configuraton +v0.0.3 + * Add fzf.vim keybinding v0.0.2 * Added delay-loading * Added documentation - v0.0.1 * Initial release diff --git a/plugin/splitopen.vim b/plugin/splitopen.vim index 9036e30..2534fdb 100644 --- a/plugin/splitopen.vim +++ b/plugin/splitopen.vim @@ -1 +1,23 @@ -command -nargs=1 SplitOpen :call splitopen#SplitOpenFile("") +command! -nargs=1 SplitOpen :call splitopen#SplitOpenFile("") +command! Split :call splitopen#SplitFile() + +" map left-split / right-split file extensions +if !exists("g:splitopen_extensions") + let g:splitopen_extensions = { + \ "h": "cpp", + \ "H": "CPP", + \ } +endif + +if !exists('g:splitopen_set_fzf_keys') + let g:splitopen_set_fzf_keys = 0 +endif + +if g:splitopen_set_fzf_keys + let g:fzf_action = { + \ 'ctrl-s': 'SplitOpen', + \ 'ctrl-t': 'tab split', + \ 'ctrl-x': 'split', + \ 'ctrl-v': 'vsplit', + \ } +endif