From 187ef211301f2d160e29de1b66cdd7eb3a187bf3 Mon Sep 17 00:00:00 2001 From: michener Date: Tue, 21 Feb 2012 06:25:58 +0000 Subject: [PATCH] Add NrrRgn git-svn-id: http://photonzero.com/dotfiles/trunk@120 23f722f6-122a-0410-8cef-c75bd312dd78 --- .vim/bundle/NrrwRgn/.gitignore | 8 + .vim/bundle/NrrwRgn/Makefile | 45 ++ .vim/bundle/NrrwRgn/README | 474 ++++++++++++++++++ .vim/bundle/NrrwRgn/autoload/nrrwrgn.vim | 832 +++++++++++++++++++++++++++++++ .vim/bundle/NrrwRgn/doc/NarrowRegion.txt | 474 ++++++++++++++++++ .vim/bundle/NrrwRgn/plugin/NrrwRgn.vim | 57 +++ .vim/bundle/NrrwRgn/post.pl | 58 +++ .vim/bundle/NrrwRgn/todo.txt | 9 + 8 files changed, 1957 insertions(+) create mode 100644 .vim/bundle/NrrwRgn/.gitignore create mode 100644 .vim/bundle/NrrwRgn/Makefile create mode 100644 .vim/bundle/NrrwRgn/README create mode 100755 .vim/bundle/NrrwRgn/autoload/nrrwrgn.vim create mode 100755 .vim/bundle/NrrwRgn/doc/NarrowRegion.txt create mode 100644 .vim/bundle/NrrwRgn/plugin/NrrwRgn.vim create mode 100755 .vim/bundle/NrrwRgn/post.pl create mode 100644 .vim/bundle/NrrwRgn/todo.txt diff --git a/.vim/bundle/NrrwRgn/.gitignore b/.vim/bundle/NrrwRgn/.gitignore new file mode 100644 index 0000000..8c849bc --- /dev/null +++ b/.vim/bundle/NrrwRgn/.gitignore @@ -0,0 +1,8 @@ +post.pl +vim_passfile +.*.un~ +.*.sw* +# ignore vimballs +*.vba +# ignore *.orig files +*.orig diff --git a/.vim/bundle/NrrwRgn/Makefile b/.vim/bundle/NrrwRgn/Makefile new file mode 100644 index 0000000..ac53000 --- /dev/null +++ b/.vim/bundle/NrrwRgn/Makefile @@ -0,0 +1,45 @@ +SCRIPT=$(wildcard plugin/*.vim) +AUTOL =$(wildcard autoload/*.vim) +DOC=$(wildcard doc/*.txt) +PLUGIN=$(shell basename "$$PWD") +VERSION=$(shell sed -n '/Version:/{s/^.*\(\S\.\S\+\)$$/\1/;p}' $(SCRIPT)) + +.PHONY: $(PLUGIN).vmb README + +all: uninstall vimball install README + +vimball: $(PLUGIN).vmb + +clean: + find . -type f \( -name "*.vba" -o -name "*.orig" -o -name "*.~*" \ + -o -name ".VimballRecord" -o -name ".*.un~" -o -name "*.sw*" -o \ + -name tags -o -name "*.vmb" \) -delete + +dist-clean: clean + +install: + vim -N -c':so %' -c':q!' $(PLUGIN)-$(VERSION).vmb + +uninstall: + vim -N -c':RmVimball' -c':q!' $(PLUGIN)-$(VERSION).vmb + +undo: + for i in */*.orig; do mv -f "$$i" "$${i%.*}"; done + +README: + cp -f $(DOC) README + +$(PLUGIN).vmb: + rm -f $(PLUGIN)-$(VERSION).vmb + vim -N -c 'ru! vimballPlugin.vim' -c ':call append("0", [ "$(SCRIPT)", "$(AUTOL)", "$(DOC)"])' -c '$$d' -c ":%MkVimball $(PLUGIN)-$(VERSION) ." -c':q!' + ln -f $(PLUGIN)-$(VERSION).vmb $(PLUGIN).vmb + +release: version all + +version: + perl -i.orig -pne 'if (/Version:/) {s/\.(\d*)/sprintf(".%d", 1+$$1)/e}' ${SCRIPT} ${AUTOL} + perl -i -pne 'if (/GetLatestVimScripts:/) {s/(\d+)\s+:AutoInstall:/sprintf("%d :AutoInstall:", 1+$$1)/e}' ${SCRIPT} ${AUTOL} + #perl -i -pne 'if (/Last Change:/) {s/\d+\.\d+\.\d\+$$/sprintf("%s", `date -R`)/e}' ${SCRIPT} + perl -i -pne 'if (/Last Change:/) {s/(:\s+).*\n/sprintf(": %s", `date -R`)/e}' ${SCRIPT} ${AUTOL} + perl -i.orig -pne 'if (/Version:/) {s/\.(\d+).*\n/sprintf(".%d %s", 1+$$1, `date -R`)/e}' ${DOC} + VERSION=$(shell sed -n '/Version:/{s/^.*\(\S\.\S\+\)$$/\1/;p}' $(SCRIPT)) diff --git a/.vim/bundle/NrrwRgn/README b/.vim/bundle/NrrwRgn/README new file mode 100644 index 0000000..4e4beeb --- /dev/null +++ b/.vim/bundle/NrrwRgn/README @@ -0,0 +1,474 @@ +*NrrwRgn.txt* A Narrow Region Plugin (similar to Emacs) + +Author: Christian Brabandt +Version: 0.26 Mon, 02 Jan 2012 21:33:50 +0100 + +Copyright: (c) 2009, 2010 by Christian Brabandt + The VIM LICENSE applies to NrrwRgnPlugin.vim and NrrwRgnPlugin.txt + (see |copyright|) except use NrrwRgnPlugin instead of "Vim". + NO WARRANTY, EXPRESS OR IMPLIED. USE AT-YOUR-OWN-RISK. + + +============================================================================== +1. Contents *NarrowRegion* *NrrwRgnPlugin* + + 1. Contents.....................................: |NrrwRgnPlugin| + 2. NrrwRgn Manual...............................: |NrrwRgn-manual| + 2.1 NrrwRgn Howto..............................: |NR-HowTo| + 2.2 NrrwRgn Multi..............................: |NR-multi-example| + 2.3 NrrwRgn Configuration......................: |NrrwRgn-config| + 3. NrrwRgn Feedback.............................: |NrrwRgn-feedback| + 4. NrrwRgn History..............................: |NrrwRgn-history| + +============================================================================== +2. NrrwRgn Manual *NrrwRgn-manual* + +Functionality + +This plugin is based on a discussion in comp.editors (see the thread at +http://groups.google.com/group/comp.editors/browse_frm/thread/0f562d97f80dde13) + +Narrowing means focussing on a region and making the rest inaccessible. You +simply select the region, call |:NarrowRegion| and the selected part will open +in a new scratch buffer. The rest of the file will be protected, so you won't +accidentally modify that buffer. In the new buffer, you can do a global +replace, search or anything else to modify that part. When you are finished, +simply write that buffer (e.g. by |:w|) and your modifications will be put in +the original buffer making it accessible again. + +NrrwRgn allows you to either select a line based selection using an Ex-command +or you can simply use any visual selected region and press your preferred key +combination to open that selection in a new buffer. + +This plugin defines the following commands: + + *:NarrowRegion* *:NR* +:[range]NR +:[range]NarrowRegion When [range] is omitted, select only the current + line, else use the lines in the range given and + open it in a new Scratch Window. + Whenever you are finished modifying that region + simply write the buffer. + + *:NarrowWindow* *:NW* +:NW +:NarrowWindow Select only the range that is visible the current + window and open it in a new Scratch Window. + Whenever you are finished modifying that region + simply write the buffer. + + *:WidenRegion* +:WidenRegion[!] This command is only available in the narrowed + scratch window. If the buffer has been modified, + the contents will be put back on the original + buffer. If ! is specified, the window will be + closed, otherwise it will remain open. + + *:NRV* +:NRV Opened the narrowed window for the region that was + last selected in visual mode + + *:NUD* + +:NUD When viewing unified diffs, this command opens + the current chunk in 2 Narrowed Windows in + |diff-mode| The current chunk is determined as the + one, that the cursor is at. This command does not + make sense if editing a different file format (or + even different diff format) + + *:NRPrepare* +:[range]NRPrepare +:[range]NRP You can use this command, to mark several lines + that will later be put into a Narrowed Window + using |:NRM|. + + *:NRMulti* +:NRMulti +:NRM This command takes all lines, that have been + marked by |:NRP| and puts them together in a new + narrowed buffer. + When you write your changes back, all separate + lines will be put back at their origin. + This command also clears the list of marked lines, + that was created with |NRP|. + See also |NR-multi-example|. + + *:NRSyncOnWrite* *:NRS* +:NRSyncOnWrite +:NRS Enable synching the buffer content back to the + original buffer when writing. + (this is the default). + + *:NRNoSyncOnWrite* *:NRN* +:NRNoSyncOnWrite +:NRN Disable synching the buffer content back to the + original buffer when writing. When set, the + narrowed buffer behaves like an ordinary buffer + that you can write in the filesystem. + (this is the default). + +2.1 NrrwRgn HowTo *NR-HowTo* +----------------- + +Use the commands provided above to select a certain region to narrow. You can +also start visual mode and have the selected region being narrowed. In this +mode, NarrowRegion allows you to block select |CTRL-V| , character select |v| +or linewise select |V| a region. Then press nr where by +default is set to '\', unless you have set it to something different (see +|| for information how to change this) and the selected range will +open in a new scratch buffer. This key combination only works in |Visual-mode| + +When finished, simply write that Narrowed Region window, from which you want +to take the modifications in your original file. + +It is possible, to recursively open a Narrowed Window on top of an already +narrowed window. This sounds a little bit silly, but this makes it possible, +to have several narrowed windows, which you can use for several different +things, e.g. If you have 2 different buffers opened and you want to diff a +certain region of each of those 2 buffers, simply open a Narrowed Window for +each buffer, and execute |:diffthis| in each narrowed window. + +You can then interactively merge those 2 windows. And when you are finished, +simply write the narrowed window and the changes will be taken back into the +original buffer. + +When viewing unified diffs, you can use the provided |:NUD| command to open 2 +Narrowed Windows side by side viewing the current chunk in |diff-mode|. Those +2 Narrowed windows will be marked 'modified', since there was some post +processing involved when opening the narrowed windows. Be careful, when +quitting the windows, not to write unwanted changes into your patch file! In +the window that contains the unified buffer, you can move to a different +chunk, run |:NUD| and the 2 Narrowed Windows in diff mode will update. + +2.2 NrrwRgn Multi *NR-multi-example* +----------------- + +Using the commands |:NRP| and |:NRM| allows to select a range of lines, that +will be put into a narrowed buffer together. This might sound confusing, but +this allows to apply a filter before making changes. For example before +editing your config file, you decide to strip all comments for making big +changes but when you write your changes back, these comments will stay in your +file. You would do it like this: > + :v/^#/NRP + :NRMulti +< +Now a Narrowed Window will open, that contains only the configuration lines. +Each block of independent region will be separated by a string like + +# Start NarrowRegion1 +..... +# End NarrowRegion1 + +This is needed, so the plugin later knows, which region belongs where in the +original place. Blocks you don't want to change, you can safely delete, they +won't be written back into your original file. But other than that, you +shouldn't change those separating lines. + +When you are finished, simply write your changes back. + +============================================================================== + +2.3 NrrwRgn Configuration *NrrwRgn-config* +------------------------- + +NarrowRegion can be customized by setting some global variables. If you'd +like to open the narrowed window as a vertical split buffer, simply set the +variable g:nrrw_rgn_vert to 1 in your |.vimrc| > + + let g:nrrw_rgn_vert = 1 +< +------------------------------------------------------------------------------ + +If you'd like to specify a certain width/height for you scratch buffer, then +set the variable g:nrrw_rgn_wdth in your |.vimrc| . This variable defines the +width or the nr of columns, if you have also set g:nrrw_rgn_vert. > + + let g:nrrw_rgn_wdth = 30 +< +------------------------------------------------------------------------------ + +By default, NarrowRegion highlights the region that has been selected +using the WildMenu highlighting (see |hl-WildMenu|). If you'd like to use a +different highlighting, set the variable g:nrrw_rgn_hl to your preferred +highlighting Group. For example to have the region highlighted like a search +result, you could put that in your |.vimrc| > + + let g:nrrw_rgn_hl = 'Search' +< +If you want to turn off the highlighting (because this can be distracting), you +can set the global variable g:nrrw_rgn_nohl to 1 in your |.vimrc| > + + let g:nrrw_rgn_nohl = 1 +< +------------------------------------------------------------------------------ + +If you'd like to change the key combination that starts the Narrowed Window +for your selected range, you could put this in your |.vimrc| > + + xmap NrrwrgnDo +< +This will let open the Narrow-Window, but only if you have pressed it in +Visual Mode. It doesn't really make sense to map this combination to any other +mode, unless you want it to Narrow your last visually selected range. + +------------------------------------------------------------------------------ + +If you'd like to specify the options that you want to have set for the +narrowed window, you can set the g:nrrw_custom_options setting, in your +|.vimrc| e.g. > + + let g:nrrw_custom_options={} + let g:nrrw_custom_options['filetype'] = 'python' +> +This will only apply those options to the narrowed buffer. You need to take +care that all options you need will apply. + +------------------------------------------------------------------------------ + +If you don't like that your narrowed window opens above the current window, +define the g:nrrw_topbot_leftright variable to your taste, e.g. > + + let g:nrrw_topbot_leftright = 'botright' +< +Now, all narrowed windows will appear below the original window. If not +specified, the narrowed window will appear above/left of the original window. + +------------------------------------------------------------------------------ + +If you want to use several independent narrowed regions of the same buffer +that you want to write at the same time, protecting the original buffer is not +really useful. Therefore, set the g:nrrw_rgn_protect variable, e.g. in your +|.vimrc| > + + let g:nrrw_rgn_protect = 'n' +< +This can be useful if you diff different regions of the same file, and want +to be able to put back the changes at different positions. Please note that +you should take care not to change any part that will later be influenced +when writing the narrowed region back. + +Note: Don't use overlapping regions! Your changes will probably not be put +back correctly and there is no guard against losing data accidentally. NrrwRgn +tries hard to adjust the highlighting and regions as you write your changes +back into the original buffer, but it can't guarantee that this will work and +might fail silently. Therefore, this feature is experimental! + +------------------------------------------------------------------------------ + *NR-hooks* + +NarrowRegion can execute certain commands, when creating the narrowed window +and when closing the narrowed window. For this, you can set 2 buffer-local +variables that specify what commands to execute, which will hook into the +execution of the Narrow Region plugin. + +For example, suppose you have a file, containing columns separated data (CSV +format) which you want to modify and you also have the CSV filetype plugin +(http://www.vim.org/scripts/script.php?script_id=2830) installed and you want +to modify the CSV data which should be visually arranged like a table in the +narrowed window. + +Therefore you want the command |:ArrangeColumn| to be executed in the new +narrowed window upon entering it, and when writing the changes back, you want +the command |:UnArrangeColumn| to be executed just before putting the +changes back. So you set those two variables in your original buffer: > + + let b:nrrw_aucmd_create = "set ft=csv|%ArrangeCol" + let b:nrrw_aucmd_close = "%UnArrangeColumn" +< +This will execute the commands in the narrowed window: > + + :set ft=csv + :%ArrangeCol + +and before writing the changes back, it'll execute: > + + :%UnArrangeCol + +============================================================================== +3. NrrwRgn Feedback *NrrwRgn-feedback* + +Feedback is always welcome. If you like the plugin, please rate it at the +vim-page: +http://www.vim.org/scripts/script.php?script_id=3075 + +You can also follow the development of the plugin at github: +http://github.com/chrisbra/NrrwRgn + +Please don't hesitate to report any bugs to the maintainer, mentioned in the +third line of this document. + +============================================================================== +4. NrrwRgn History *NrrwRgn-history* + + +0.26: Jan 02, 2012 {{{1 + +- Fix issue https://github.com/chrisbra/NrrwRgn/issues/7 + (reported by Alessio B., thanks!) + + +0.25: Nov 08, 2011 {{{1 + +- updated documentation (patch by Jean, thanks!) +- make it possible, to not sync the narrowed buffer back by disabling + it using |:NRSyncOnWrite| |:NRNoSyncOnWrite| + +0.24: Oct 24, 2011 {{{1 + +- error on vim.org page, reuploaded version 0.22 as 0.24 + +0.23: Oct 24, 2011 {{{1 + +- (wrongly uploaded to vim.org) + +0.22: Oct 24, 2011 {{{1 + +- Allow customization via the use of hooks (|NR-hooks|) + +0.21: July 26, 2011 {{{1 + +- Fix undefined variable adjust_line_numbers + https://github.com/chrisbra/NrrwRgn/issues/5 (reported by jmcantrell, + thanks!) + +0.20: July 25, 2011 {{{1 +- allow customization via the g:nrrw_topbot_leftright variable (Thanks Herbert + Sitz!) +- allow what options will be applied using the g:nrrw_custom_options dict + (suggested by Herbert Sitz. Thanks!) +- NRV didn't hightlight the region that was selected (reported by Herbert + Sitz, thanks!) +- use the g:nrrw_rgn_protect variable, to prevent that the original buffer + will be protected. This is useful, if you narrow several regions of the same + buffer and want to write those changes indepentently (reported by kolyuchiy + in https://github.com/chrisbra/NrrwRgn/issues/3, Thanks!) +- fix an error with not correctly deleting the highlighted region, that was + discovered when reporting issue 3 (see above). (Reported by kolyuchiy, + thanks!) +- Catch errors, when setting window local options. (Patch by Sung Pae, + Thanks!) + +0.19: May 22, 2011 {{{1 +- fix issue 2 from github https://github.com/chrisbra/NrrwRgn/issues/2 + (Widening does not work, if the narrowed windows have been moved to a new + tabspace). Reported by vanschelven, thanks! + +0.18: December 10, 2010 {{{1 +- experimental feature: Allow to Narrow several different regions at once + using :g/pattern/NRP and afterwards calling :NRM + (This only works linewise. Should that be made possible for any reagion?) +- disable folds, before writing changes back, otherwise chances are, you'll + lose more data then wanted +- code cleanup + +0.17: November 23, 2010 {{{1 +- cache the options, that will be set (instead of parsing + $VIMRUNTIME/doc/options.txt every time) in the Narrowed Window +- getting the options didn't work, when using an autocommand like this: + autocmd BufEnter * cd %:p:h + (reported by Xu Hong, Thanks!) +- :q didn't clean up the Narrowed Buffer correctly. Fix this +- some code cleanup + +0.16: November 16, 2010 {{{1 +- Bugfix: copy all local options to the narrowed window (reported by Xu Hong, + Thanks!) + +0.15: August 26, 2010 {{{1 +- Bugfix: minor documentation update (reported by Hong Xu, Thanks!) + +0.14: August 26, 2010 {{{1 +- Bugfix: :only in the original buffer resulted in errors (reported by Adam + Monsen, Thanks!) + +0.13: August 22, 2010 {{{1 +- Unified Diff Handling (experimental feature) + +0.12: July 29, 2010 {{{1 + +- Version 0.11, wasn't packaged correctly and the vimball file + contained some garbage. (Thanks Dennis Hostetler!) + +0.11: July 28, 2010 {{{1 + +- Don't set 'winfixwidth' and 'winfixheight' (suggested by Charles Campbell) + +0.10: May 20, 2010 {{{1 + +- Restore cursor position using winrestview() and winsaveview() +- fix a bug, that prevented the use of visual narrowing +- Make sure when closing the narrowed buffer, the content will be written to + the right original region +- use topleft for opening the Narrowed window +- check, that the original buffer is still available +- If you Narrow the complete buffer using :NRV and write the changes back, an + additional trailing line is inserted. Remove that line. +- When writing the changes back, update the highlighting. + +0.9: May 20, 2010 {{{1 + +- It is now possible to Narrow a window recursively. This allows to have + several narrowed windows, and allows for example to only diff certain + regions (as was suggested in a recent thread at the vim_use mailinglist: + http://groups.google.com/group/vim_use/msg/05d7fd9bd1556f0e) therefore, the + use for the g:nrrw_rgn_sepwin variable isn't necessary anymore. +- Small documentation updates + +0.8: May 18, 2010 {{{1 + +- the g:nrrw_rgn_sepwin variable can be used to force separate Narrowed + Windows, so you could easily diff those windows. +- make the separating of several windows a little bit safer (look at the + bufnr(), so it should work without problems for several buffers) +- switch from script local variables to buffer local variables, so narrowing + for several buffers should work. +- set 'winfixheight' for narrowed window +- Added command :NRV (suggested by Charles Campbell, thanks!) +- added error handling, in case :NRV is called, without a selected region +- take care of beeps, when calling :NRV +- output WarningMsg + +0.7: May 17, 2010 {{{1 + +- really use the black hole register for deleting the old buffer contents in + the narrowed buffer (suggestion by esquifit in + http://groups.google.com/group/comp.editors/msg/3eb3e3a7c68597db) +- make autocommand nesting, so the highlighting will be removed when writing + the buffer contents. +- Use g:nrrw_rgn_nohl variable to disable highlighting (as this can be + disturbing). + +0.6: May 04, 2010 {{{1 + +- the previous version had problems restoring the orig buffer, this version + fixes it (highlighting and setl ma did not work correctly) + +0.5: May 04, 2010 {{{1 + +- The mapping that allows for narrowing a visually selected range, did not + work. (Fixed!) +- Make :WidenRegion work as expected (close the widened window) (unreleased) + +0.4: Apr 28, 2010 {{{1 + +- Highlight narrowed region in the original buffer +- Save and Restore search-register +- Provide shortcut commands |:NR| +- Provide command |:NW| and |:NarrowWindow| +- Make plugin autoloadable +- Enable GLVS (see |:GLVS|) +- Provide Documenation (:h NarrowRegion) +- Distribute Plugin as vimball |pi_vimball.txt| + +0.3: Apr 28, 2010 {{{1 + +- Initial upload +- development versions are available at the github repository +- put plugin on a public repository (http://github.com/chrisbra/NrrwRgn) + + }}} + +============================================================================== +Modeline: +vim:tw=78:ts=8:ft=help:et:fdm=marker:fdl=0:norl diff --git a/.vim/bundle/NrrwRgn/autoload/nrrwrgn.vim b/.vim/bundle/NrrwRgn/autoload/nrrwrgn.vim new file mode 100755 index 0000000..e8b3a8f --- /dev/null +++ b/.vim/bundle/NrrwRgn/autoload/nrrwrgn.vim @@ -0,0 +1,832 @@ +" nrrwrgn.vim - Narrow Region plugin for Vim +" ------------------------------------------------------------- +" Version: 0.26 +" Maintainer: Christian Brabandt +" Last Change: Mon, 02 Jan 2012 21:33:50 +0100 +" +" Script: http://www.vim.org/scripts/script.php?script_id=3075 +" Copyright: (c) 2009, 2010 by Christian Brabandt +" The VIM LICENSE applies to NrrwRgn.vim +" (see |copyright|) except use "NrrwRgn.vim" +" instead of "Vim". +" No warranty, express or implied. +" *** *** Use At-Your-Own-Risk! *** *** +" GetLatestVimScripts: 3075 26 :AutoInstall: NrrwRgn.vim +" +" Functions: + +fun! WarningMsg(msg) "{{{1 + let msg = "NarrowRegion: " . a:msg + echohl WarningMsg + if exists(":unsilent") == 2 + unsilent echomsg msg + else + echomsg msg + endif + sleep 1 + echohl Normal + let v:errmsg = msg +endfun + +fun! Init() "{{{1 + if !exists("s:instn") + let s:instn=1 + if !exists("g:nrrw_custom_options") || empty(g:nrrw_custom_options) + let s:opts=Options('local to buffer') + endif + else + " Prevent accidently overwriting windows with instn_id set + " back to an already existing instn_id + let s:instn = (s:instn==0 ? 1 : s:instn) + while (has_key(s:nrrw_rgn_lines, s:instn)) + let s:instn+=1 + endw + endif + let s:nrrw_aucmd = {} + if exists("b:nrrw_aucmd_create") + let s:nrrw_aucmd["create"] = b:nrrw_aucmd_create + endif + if exists("b:nrrw_aucmd_close") + let s:nrrw_aucmd["close"] = b:nrrw_aucmd_close + endif + if !exists("s:nrrw_rgn_lines") + let s:nrrw_rgn_lines = {} + endif + let s:nrrw_rgn_lines[s:instn] = {} + " show some debugging messages + let s:nrrw_winname='Narrow_Region' + + " Customization + let s:nrrw_rgn_vert = (exists("g:nrrw_rgn_vert") ? g:nrrw_rgn_vert : 0) + let s:nrrw_rgn_wdth = (exists("g:nrrw_rgn_wdth") ? g:nrrw_rgn_wdth : 20) + let s:nrrw_rgn_hl = (exists("g:nrrw_rgn_hl") ? g:nrrw_rgn_hl : "WildMenu") + let s:nrrw_rgn_nohl = (exists("g:nrrw_rgn_nohl") ? g:nrrw_rgn_nohl : 0) + + let s:debug = (exists("s:debug") ? s:debug : 0) + +endfun + +fun! NrwRgnWin() "{{{1 + let local_options = s:GetOptions(s:opts) + let nrrw_winname = s:nrrw_winname . '_' . s:instn + let nrrw_win = bufwinnr('^'.nrrw_winname.'$') + if nrrw_win != -1 + exe ":noa " . nrrw_win . 'wincmd w' + " just in case, a global nomodifiable was set + " disable this for the narrowed window + setl ma + silent %d _ + noa wincmd p + else + if !exists('g:nrrw_topbot_leftright') + let g:nrrw_topbot_leftright = 'topleft' + endif + exe g:nrrw_topbot_leftright s:nrrw_rgn_wdth . + \(s:nrrw_rgn_vert?'v':'') . "sp " . nrrw_winname + " just in case, a global nomodifiable was set + " disable this for the narrowed window + setl ma + " Just in case + silent %d _ + " Set up some options like 'bufhidden', 'noswapfile', + " 'buftype', 'bufhidden', when enabling Narrowing. + call NrrwSettings(1) + let nrrw_win = bufwinnr("") + endif + call SetOptions(local_options) + return nrrw_win +endfun + +fun! CleanRegions() "{{{1 + let s:nrrw_rgn_line=[] +endfun + +fun! CompareNumbers(a1,a2) "{{{1 + return (a:a1+0) == (a:a2+0) ? 0 + \: (a:a1+0) > (a:a2+0) ? 1 + \: -1 +endfun + +fun! ParseList(list) "{{{1 + let result={} + let start=0 + let temp=0 + let i=1 + for item in sort(a:list, "CompareNumbers") + if start==0 + let start=item + endif + if temp==item-1 + let result[i]=[start,item] + else + let start=item + let result[i]=[item] + endif + let i+=1 + let temp=item + endfor + return result +endfun + + +fun! WriteNrrwRgn(...) "{{{1 + " if argument is given, write narrowed buffer back + " else destroy the narrowed window + let nrrw_instn = exists("b:nrrw_instn") ? b:nrrw_instn : s:instn + if exists("b:orig_buf") && (bufwinnr(b:orig_buf) == -1) && + \ !BufInTab(b:orig_buf) + call s:WarningMsg("Original buffer does no longer exist! Aborting!") + return + endif + if &l:mod && exists("a:1") && a:1 + " Write the buffer back to the original buffer + setl nomod + exe ":WidenRegion" + if bufname('') !~# 'Narrow_Region' + exe ':noa' . bufwinnr(s:nrrw_winname . '_' . s:instn) . 'wincmd w' + "exe ':noa' . bufwinnr(nrrw_instn) . 'wincmd w' + endif + else + " Best guess + if bufname('') =~# 'Narrow_Region' + exe ':noa' . bufwinnr(b:orig_buf) . 'wincmd w' + endif + if !exists("a:1") + " close narrowed buffer + call NrrwRgnAuCmd(nrrw_instn) + endif + endif +endfun + +fun! SaveRestoreRegister(mode) "{{{1 + if a:mode + let s:savereg = getreg('a') + let s:saveregt = getregtype('a') + let s:fold = 0 + if &fen + let s:fold=1 + setl nofoldenable + let s:fdm = &l:fdm + endif + else + call setreg('a', s:savereg, s:saveregt) + if s:fold + setl foldenable + if exists("s:fdm") + let &l:fdm=s:fdm + endif + endif + endif +endfun! + +fun! NrrwRgnAuCmd(instn) "{{{1 + " If a:instn==0, then enable auto commands + " else disable auto commands for a:instn + if !a:instn + exe "aug NrrwRgn" . b:nrrw_instn + au! + au BufWriteCmd nested :call s:WriteNrrwRgn(1) + au BufWinLeave,BufWipeout,BufDelete nested :call s:WriteNrrwRgn() + aug end + else + exe "aug NrrwRgn" . a:instn + au! + aug end + exe "aug! NrrwRgn" . a:instn + if !&ma + setl ma + endif + if s:debug + echo printf("bufnr: %d a:instn: %d\n", bufnr(''), a:instn) + echo "bwipe " s:nrrw_winname . '_' . a:instn + endif + if (has_key(s:nrrw_rgn_lines[a:instn], 'disable') && + \ !s:nrrw_rgn_lines[a:instn].disable ) || + \ !has_key(s:nrrw_rgn_lines[a:instn], 'disable') + call DeleteMatches(a:instn) + exe "bwipe! " bufnr(s:nrrw_winname . '_' . a:instn) + if s:instn>=1 + unlet s:nrrw_rgn_lines[a:instn] + let s:instn-=1 + endif + endif + endif +endfun + +fun! RetVisRegionPos() "{{{1 + let startline = [ getpos("'<")[1], virtcol("'<") ] + let endline = [ getpos("'>")[1], virtcol("'>") ] + return [ startline, endline ] +endfun + +fun! GeneratePattern(startl, endl, mode) "{{{1 + if a:mode ==# '' && a:startl[0] > 0 && a:startl[1] > 0 + return '\%>' . (a:startl[0]-1) . 'l\&\%>' . (a:startl[1]-1) . 'v\&\%<' . (a:endl[0]+1) . 'l\&\%<' . (a:endl[1]+1) . 'v' + elseif a:mode ==# 'v' && a:startl[0] > 0 && a:startl[1] > 0 + return '\%>' . (a:startl[0]-1) . 'l\&\%>' . (a:startl[1]-1) . 'v\_.*\%<' . (a:endl[0]+1) . 'l\&\%<' . (a:endl[1]+1) . 'v' + elseif a:startl[0] > 0 + return '\%>' . (a:startl[0]-1) . 'l\&\%<' . (a:endl[0]+1) . 'l' + else + return '' + endif +endfun + +fun! Options(search) "{{{1 + let c=[] + let buf=bufnr('') + try + " empty search pattern + if empty(a:search) + return c + endif + silent noa sview $VIMRUNTIME/doc/options.txt + " for whatever reasons $VIMRUNTIME/doc/options.txt + " does not exist, return empty list + if line('$') == 1 + return c + endif + keepj 0 + let reg_a=[] + call add(reg_a,getreg('a')) + call add(reg_a, getregtype('a')) + let @a='' + exe "silent :g/" . '\v'.escape(a:search, '\\/') . "/-y A" + let b=split(@a, "\n") + call setreg('a', reg_a[0], reg_a[1]) + call filter(b, 'v:val =~ "^''"') + " the following options should be set + let filter_opt='\%(modifi\%(ed\|able\)\|readonly\|noswapfile\|buftype\|bufhidden\|foldcolumn\|buflisted\)' + call filter(b, 'v:val !~ "^''".filter_opt."''"') + for item in b + let item=substitute(item, '''', '', 'g') + call add(c, split(item, '\s\+')[0]) + endfor + finally + if fnamemodify(bufname(''),':p') == + \expand("$VIMRUNTIME/doc/options.txt") + bwipe + endif + exe "noa " bufwinnr(buf) "wincmd w" + return c + endtry +endfun + +fun! GetOptions(opt) "{{{1 + if exists("g:nrrw_custom_options") && !empty(g:nrrw_custom_options) + let result = g:nrrw_custom_options + else + let result={} + for item in a:opt + try + exe "let result[item]=&l:".item + catch + endtry + endfor + endif + return result +endfun + +fun! SetOptions(opt) "{{{1 + if type(a:opt) == type({}) + for [option, result] in items(a:opt) + exe "let &l:". option " = " string(result) + endfor + endif + setl nomod noro +endfun + +fun! CheckProtected() "{{{1 + " Protect the original window, unless the user explicitly defines not to + " protect it + if exists("g:nrrw_rgn_protect") && g:nrrw_rgn_protect =~? 'n' + return + endif + let b:orig_buf_ro=0 + if !&l:ma || &l:ro + let b:orig_buf_ro=1 + call s:WarningMsg("Buffer is protected, won't be able to write the changes back!") + else + " Protect the original buffer, + " so you won't accidentally modify those lines, + " that might later be overwritten + setl noma + endif +endfun + +fun! DeleteMatches(instn) "{{{1 + " Make sure, we are in the correct buffer + if bufname('') =~# 'Narrow_Region' + exe ':noa' . bufwinnr(b:orig_buf) . 'wincmd w' + endif + if exists("s:nrrw_rgn_lines[a:instn].matchid") + " if you call :NarrowRegion several times, without widening + " the previous region, b:matchid might already be defined so + " make sure, the previous highlighting is removed. + for item in s:nrrw_rgn_lines[a:instn].matchid + if item > 0 + " If the match has been deleted, discard the error + exe (s:debug ? "" : "silent!") "call matchdelete(item)" + endif + endfor + let s:nrrw_rgn_lines[a:instn].matchid=[] + endif +endfun + +fun! HideNrrwRgnLines() "{{{1 + syn region StartNrrwRgnIgnore start="^# Start NrrwRgn\z(\d\+\).*$" fold + syn region EndNrrwRgnIgnore start="^# End NrrwRgn\z1\d\+.*$" end="^$" fold + hi def link StartNrrwRgnIgnore Ignore + hi def link EndNrrwRgnIgnore Ignore +endfun + +fun! ReturnCommentFT() "{{{1 + " Vim + if &l:ft=="vim" + return '"' + " Perl, PHP, Ruby, Python, Sh + elseif &l:ft=~"^\(perl\|php\|ruby\|python\|sh\)$" + return '#' + " C, C++ + elseif &l:ft=~"^\(c\%(pp\)\?\|java\)" + return '//' + " HTML, XML + elseif &l:ft=~"^\(ht\|x\)ml\?$" + return '' + " LaTex + elseif &l:ft=~"^\(la\)tex" + return '%' + else + " Fallback + return '#' + endif +endfun + +fun! WidenRegionMulti(content, instn) "{{{1 + if empty(s:nrrw_rgn_lines[a:instn].multi) + return + endif + + let output= [] + let list = [] + let cmt = ReturnCommentFT() + let lastline = line('$') + " We must put the regions back from top to bottom, + " otherwise, changing lines in between messes up the list of lines that + " still need to put back from the narrowed buffer to the original buffer + for key in sort(keys(s:nrrw_rgn_lines[a:instn].multi), "CompareNumbers") + let adjust = line('$') - lastline + let range = s:nrrw_rgn_lines[a:instn].multi[key] + let last = (len(range)==2) ? range[1] : range[0] + let first = range[0] + let indexs = index(a:content, cmt.' Start NrrwRgn'.key) + 1 + let indexe = index(a:content, cmt.' End NrrwRgn'.key) - 1 + if indexs <= 0 || indexe < -1 + call s:WarningMsg("Skipping Region " . key) + continue + endif + " Adjust line numbers. Changing the original buffer, might also + " change the regions we have remembered. So we must adjust these numbers. + " This only works, if we put the regions from top to bottom! + let first += adjust + let last += adjust + if last == line('$') && first == 1 + let delete_last_line=1 + else + let delete_last_line=0 + endif + exe ':silent :' . first . ',' . last . 'd _' + call append((first-1),a:content[indexs : indexe]) + " Recalculate the start and end positions of the narrowed window + " so subsequent calls will adjust the region accordingly + let last = first + len(a:content[indexs : indexe]) - 1 + if last > line('$') + let last = line('$') + endif + call AddMatches(GeneratePattern([first, 0 ], [last, 0], 'V'), a:instn) + if delete_last_line + silent! $d _ + endif + endfor +endfun + +fun! AddMatches(pattern, instn) "{{{1 + if !s:nrrw_rgn_nohl || empty(a:pattern) + if !exists("s:nrrw_rgn_lines[a:instn].matchid") + let s:nrrw_rgn_lines[a:instn].matchid=[] + endif + call add(s:nrrw_rgn_lines[a:instn].matchid, + \matchadd(s:nrrw_rgn_hl, a:pattern)) + endif +endfun + +fun! BufInTab(bufnr) "{{{1 + for tab in range(1,tabpagenr('$')) + if !empty(filter(tabpagebuflist(tab), 'v:val == a:bufnr')) + return tab + endif + endfor + return 0 +endfun + +fun! JumpToBufinTab(tab,buf) "{{{1 + if a:tab + exe "tabn" a:tab + endif + exe ':noa ' . bufwinnr(a:buf) . 'wincmd w' +endfun + +fun! RecalculateLineNumbers(instn, adjust) "{{{1 + " This only matters, if the original window isn't protected + if !exists("g:nrrw_rgn_protect") || g:nrrw_rgn_protect !~# 'n' + return + endif + + for instn in filter(keys(s:nrrw_rgn_lines), 'v:val != a:instn') + " Skip narrowed instances, when they are before + " the region, we are currently putting back + if s:nrrw_rgn_lines[instn].startline[0] <= + \ s:nrrw_rgn_lines[a:instn].startline[0] + " Skip this instn + continue + else + let s:nrrw_rgn_lines[instn].startline[0] += a:adjust + let s:nrrw_rgn_lines[instn].endline[0] += a:adjust + + if s:nrrw_rgn_lines[instn].startline[0] < 1 + let s:nrrw_rgn_lines[instn].startline[0] = 1 + endif + if s:nrrw_rgn_lines[instn].endline[0] < 1 + let s:nrrw_rgn_lines[instn].endline[0] = 1 + endif + call DeleteMatches(instn) + call AddMatches(GeneratePattern( + \s:nrrw_rgn_lines[instn].startline, + \s:nrrw_rgn_lines[instn].endline, + \'V'), instn) + endif + endfor + +endfun + +fun! NrrwSettings(on) "{{{1 + if a:on + setl noswapfile buftype=acwrite bufhidden=wipe foldcolumn=0 nobuflisted + else + setl swapfile buftype= bufhidden= buflisted + endif +endfun + +fun! SetupBufLocalCommands(visual) "{{{1 + exe 'com! -buffer -bang WidenRegion :call nrrwrgn#WidenRegion('. a:visual. + \ ', 0)' + com! -buffer NRSyncOnWrite :call nrrwrgn#ToggleSyncWrite(1) + com! -buffer NRNoSyncOnWrite :call nrrwrgn#ToggleSyncWrite(0) +endfun + +fun! nrrwrgn#NrrwRgnDoPrepare() "{{{1 + let s:nrrw_rgn_buf = ParseList(s:nrrw_rgn_line) + if empty(s:nrrw_rgn_buf) + call WarningMsg("You need to first select the lines to narrow using NRP!") + return + endif + let o_lz = &lz + let s:o_s = @/ + set lz + let orig_buf=bufnr('') + + " initialize Variables + call Init() + call CheckProtected() + let s:nrrw_rgn_lines[s:instn].startline = [] + let s:nrrw_rgn_lines[s:instn].endline = [] + let s:nrrw_rgn_lines[s:instn].multi = s:nrrw_rgn_buf + call DeleteMatches(s:instn) + + let nr=0 + let lines=[] + let buffer=[] + + let keys = keys(s:nrrw_rgn_buf) + call sort(keys,"CompareNumbers") + "for [ nr,lines] in items(s:nrrw_rgn_buf) + let comment=ReturnCommentFT() + for nr in keys + let lines = s:nrrw_rgn_buf[nr] + let start = lines[0] + let end = len(lines)==2 ? lines[1] : lines[0] + call AddMatches(GeneratePattern([start,0], [end,0], 'V'), + \s:instn) + call add(buffer, comment.' Start NrrwRgn'.nr) + let buffer = buffer + + \ getline(start,end) + + \ [comment.' End NrrwRgn'.nr, ''] + endfor + + let win=NrwRgnWin() + exe ':noa ' win 'wincmd w' + let b:orig_buf = orig_buf + call setline(1, buffer) + setl nomod + let b:nrrw_instn = s:instn + call SetupBufLocalCommands(0) + call NrrwRgnAuCmd(0) + call CleanRegions() + + " restore settings + let &lz = o_lz +endfun + +fun! nrrwrgn#NrrwRgn() range "{{{1 + let o_lz = &lz + let s:o_s = @/ + set lz + let orig_buf=bufnr('') + + " initialize Variables + call Init() + call CheckProtected() + let s:nrrw_rgn_lines[s:instn].startline = [ a:firstline, 0 ] + let s:nrrw_rgn_lines[s:instn].endline = [ a:lastline, 0 ] + call DeleteMatches(s:instn) + " Set the highlighting + call AddMatches(GeneratePattern( + \s:nrrw_rgn_lines[s:instn].startline, + \s:nrrw_rgn_lines[s:instn].endline, + \'V'), s:instn) + let a=getline( + \s:nrrw_rgn_lines[s:instn].startline[0], + \s:nrrw_rgn_lines[s:instn].endline[0]) + let win=NrwRgnWin() + exe ':noa ' win 'wincmd w' + let b:orig_buf = orig_buf + call setline(1, a) + setl nomod + let b:nrrw_instn = s:instn + call NrrwSettings(1) + call SetupBufLocalCommands(0) + call NrrwRgnAuCmd(0) + if has_key(s:nrrw_aucmd, "create") + exe s:nrrw_aucmd["create"] + endif + if has_key(s:nrrw_aucmd, "close") + let b:nrrw_aucmd_close = s:nrrw_aucmd["close"] + endif + + " restore settings + let &lz = o_lz +endfun + +fun! nrrwrgn#Prepare() "{{{1 + if !exists("s:nrrw_rgn_line") | let s:nrrw_rgn_line=[] | endif + call add(s:nrrw_rgn_line, line('.')) +endfun + +fun! nrrwrgn#WidenRegion(vmode,force) "{{{1 + let nrw_buf = bufnr('') + let orig_buf = b:orig_buf + let orig_tab = tabpagenr() + let instn = b:nrrw_instn + " Execute autocommands + if has_key(s:nrrw_aucmd, "close") + exe s:nrrw_aucmd["close"] + endif + let cont = getline(1,'$') + + let tab=BufInTab(orig_buf) + if tab != tabpagenr() + exe "tabn" tab + endif + let orig_win = bufwinnr(orig_buf) + " Should be in the right tab now! + if (orig_win == -1) + call s:WarningMsg("Original buffer does no longer exist! Aborting!") + return + endif + exe ':noa' . orig_win . 'wincmd w' + call SaveRestoreRegister(1) + let wsv=winsaveview() + call DeleteMatches(instn) + if exists("b:orig_buf_ro") && b:orig_buf_ro && !a:force + call s:WarningMsg("Original buffer protected. Can't write changes!") + call JumpToBufinTab(orig_tab, nrw_buf) + return + endif + if !&l:ma && !( exists("b:orig_buf_ro") && b:orig_buf_ro) + setl ma + endif + " This is needed to adjust all other narrowed regions + " in case we have several narrowed regions within the same buffer + if exists("g:nrrw_rgn_protect") && g:nrrw_rgn_protect =~? 'n' + let adjust_line_numbers = len(cont) - 1 - ( + \s:nrrw_rgn_lines[instn].endline[0] - + \s:nrrw_rgn_lines[instn].startline[0]) + endif + + " Now copy the content back into the original buffer + + " Multiselection + if has_key(s:nrrw_rgn_lines[instn], 'multi') + call WidenRegionMulti(cont, instn) + elseif a:vmode "charwise, linewise or blockwise selection + call setreg('a', join(cont, "\n") . "\n", s:nrrw_rgn_lines[instn].vmode) + if s:nrrw_rgn_lines[instn].vmode == 'v' + " in characterwise selection, remove trailing \n + call setreg('a', substitute(@a, '\n$', '', ''), + \s:nrrw_rgn_lines[instn].vmode) + endif + exe "keepj" s:nrrw_rgn_lines[instn].startline[0] + exe "keepj norm!" s:nrrw_rgn_lines[instn].startline[1] . '|' + exe "keepj norm!" s:nrrw_rgn_lines[instn].vmode + exe "keepj" s:nrrw_rgn_lines[instn].endline[0] + exe "keepj norm!" s:nrrw_rgn_lines[instn].endline[1] . '|' + norm! "aP + " Recalculate the start and end positions of the narrowed window + " so subsequent calls will adjust the region accordingly + let [ s:nrrw_rgn_lines[instn].startline, + \s:nrrw_rgn_lines[instn].endline ] = RetVisRegionPos() + " also, renew the highlighted region + call AddMatches(GeneratePattern( + \s:nrrw_rgn_lines[instn].startline, + \s:nrrw_rgn_lines[instn].endline, + \s:nrrw_rgn_lines[instn].vmode), + \instn) + else + " linewise selection because we started the NarrowRegion with the + " command NarrowRegion(0) + " + " if the endposition of the narrowed buffer is also the last line of + " the buffer, the append will add an extra newline that needs to be + " cleared. + if s:nrrw_rgn_lines[instn].endline[0]==line('$') && + \ s:nrrw_rgn_lines[instn].startline[0] == 1 + let delete_last_line=1 + else + let delete_last_line=0 + endif + exe ':silent :'.s:nrrw_rgn_lines[instn].startline[0].',' + \.s:nrrw_rgn_lines[instn].endline[0].'d _' + call append((s:nrrw_rgn_lines[instn].startline[0]-1),cont) + " Recalculate the start and end positions of the narrowed window + " so subsequent calls will adjust the region accordingly + " so subsequent calls will adjust the region accordingly + let s:nrrw_rgn_lines[instn].endline[0] = + \s:nrrw_rgn_lines[instn].startline[0] + len(cont) -1 + if s:nrrw_rgn_lines[instn].endline[0] > line('$') + let s:nrrw_rgn_lines[instn].endline[0] = line('$') + endif + call AddMatches(GeneratePattern( + \s:nrrw_rgn_lines[instn].startline, + \s:nrrw_rgn_lines[instn].endline, + \'V'), + \instn) + if delete_last_line + silent! $d _ + endif + endif + " Recalculate start- and endline numbers for all other Narrowed Windows. + " This matters, if you narrow different regions of the same file and + " write your changes back. + if exists("g:nrrw_rgn_protect") && g:nrrw_rgn_protect =~? 'n' + call RecalculateLineNumbers(instn, adjust_line_numbers) + endif + call SaveRestoreRegister(0) + let @/=s:o_s + call winrestview(wsv) + " jump back to narrowed window + call JumpToBufinTab(orig_tab, nrw_buf) + setl nomod + if a:force + " execute auto command + bw + endif +endfun + +fun! nrrwrgn#VisualNrrwRgn(mode) "{{{1 + if empty(a:mode) + " in case, visual mode wasn't entered, visualmode() + " returns an empty string and in that case, we finish + " here + call WarningMsg("There was no region visually selected!") + return + endif + " This beeps, when called from command mode + " e.g. by using :NRV, so using :sil! + " else exiting visual mode + exe "sil! norm! \" + " stop visualmode + let o_lz = &lz + let s:o_s = @/ + set lz + call Init() + let s:nrrw_rgn_lines[s:instn].vmode=a:mode + " Protect the original buffer, + " so you won't accidentally modify those lines, + " that will later be overwritten + let orig_buf=bufnr('') + call SaveRestoreRegister(1) + + call CheckProtected() + let [ s:nrrw_rgn_lines[s:instn].startline, + \s:nrrw_rgn_lines[s:instn].endline ] = RetVisRegionPos() + call DeleteMatches(s:instn) + call AddMatches(GeneratePattern( + \s:nrrw_rgn_lines[s:instn].startline, + \s:nrrw_rgn_lines[s:instn].endline, + \s:nrrw_rgn_lines[s:instn].vmode), + \s:instn) + norm! gv"ay + let win=NrwRgnWin() + exe ':noa ' win 'wincmd w' + let b:orig_buf = orig_buf + silent put a + let b:nrrw_instn = s:instn + silent 0d _ + setl nomod + call SetupBufLocalCommands(1) + " Setup autocommands + call NrrwRgnAuCmd(0) + " Execute autocommands + if has_key(s:nrrw_aucmd, "create") + exe s:nrrw_aucmd["create"] + endif + call SaveRestoreRegister(0) + + " restore settings + let &lz = o_lz +endfun + +fun! nrrwrgn#UnifiedDiff() "{{{1 + let save_winposview=winsaveview() + let orig_win = winnr() + " close previous opened Narrowed buffers + silent! windo | if bufname('')=~'^Narrow_Region' && &diff |diffoff|q!|endif + " minimize Window + " this is disabled, because this might be useful, to see everything + "exe "vert resize -999999" + "setl winfixwidth + " move to current start of chunk of unified diff + if search('^@@', 'bcW') > 0 + call search('^@@', 'bc') + else + call search('^@@', 'c') + endif + let curpos=getpos('.') + for i in range(2) + if search('^@@', 'nW') > 0 + .+,/@@/-NR + else + " Last chunk in file + .+,$NR + endif + " Split vertically + wincmd H + if i==0 + silent! g/^-/d _ + else + silent! g/^+/d _ + endif + diffthis + 0 + exe ":noa wincmd p" + call setpos('.', curpos) + endfor + call winrestview(save_winposview) +endfun + +fun! nrrwrgn#ToggleSyncWrite(enable) "{{{1 + let s:nrrw_rgn_lines[b:nrrw_instn].disable = !a:enable + " Enable syncing of bufers + if a:enable + " Enable Narrow settings and autocommands + call NrrwSettings(1) + call NrrwRgnAuCmd(0) + setl modified + else + " Disable Narrow settings and autocommands + call NrrwSettings(0) + " b:nrrw_instn should always be available + call NrrwRgnAuCmd(b:nrrw_instn) + endif +endfun +" Debugging options "{{{1 +fun! nrrwrgn#Debug(enable) "{{{1 + if (a:enable) + let s:debug=1 + fun! NrrwRgnDebug() "{{{2 + "sil! unlet s:instn + com! NI :call WarningMsg("Instance: ".s:instn) + com! NJ :call WarningMsg("Data: ".string(s:nrrw_rgn_lines)) + com! -nargs=1 NOutput :exe 'echo s:'. + endfun + call NrrwRgnDebug() + else + let s:debug=0 + delf NrrwRgnDebug + delc NI + delc NJ + delc NOutput + endif +endfun + +" Modeline {{{1 +" vim: ts=4 sts=4 fdm=marker com+=l\:\" fdl=0 diff --git a/.vim/bundle/NrrwRgn/doc/NarrowRegion.txt b/.vim/bundle/NrrwRgn/doc/NarrowRegion.txt new file mode 100755 index 0000000..4e4beeb --- /dev/null +++ b/.vim/bundle/NrrwRgn/doc/NarrowRegion.txt @@ -0,0 +1,474 @@ +*NrrwRgn.txt* A Narrow Region Plugin (similar to Emacs) + +Author: Christian Brabandt +Version: 0.26 Mon, 02 Jan 2012 21:33:50 +0100 + +Copyright: (c) 2009, 2010 by Christian Brabandt + The VIM LICENSE applies to NrrwRgnPlugin.vim and NrrwRgnPlugin.txt + (see |copyright|) except use NrrwRgnPlugin instead of "Vim". + NO WARRANTY, EXPRESS OR IMPLIED. USE AT-YOUR-OWN-RISK. + + +============================================================================== +1. Contents *NarrowRegion* *NrrwRgnPlugin* + + 1. Contents.....................................: |NrrwRgnPlugin| + 2. NrrwRgn Manual...............................: |NrrwRgn-manual| + 2.1 NrrwRgn Howto..............................: |NR-HowTo| + 2.2 NrrwRgn Multi..............................: |NR-multi-example| + 2.3 NrrwRgn Configuration......................: |NrrwRgn-config| + 3. NrrwRgn Feedback.............................: |NrrwRgn-feedback| + 4. NrrwRgn History..............................: |NrrwRgn-history| + +============================================================================== +2. NrrwRgn Manual *NrrwRgn-manual* + +Functionality + +This plugin is based on a discussion in comp.editors (see the thread at +http://groups.google.com/group/comp.editors/browse_frm/thread/0f562d97f80dde13) + +Narrowing means focussing on a region and making the rest inaccessible. You +simply select the region, call |:NarrowRegion| and the selected part will open +in a new scratch buffer. The rest of the file will be protected, so you won't +accidentally modify that buffer. In the new buffer, you can do a global +replace, search or anything else to modify that part. When you are finished, +simply write that buffer (e.g. by |:w|) and your modifications will be put in +the original buffer making it accessible again. + +NrrwRgn allows you to either select a line based selection using an Ex-command +or you can simply use any visual selected region and press your preferred key +combination to open that selection in a new buffer. + +This plugin defines the following commands: + + *:NarrowRegion* *:NR* +:[range]NR +:[range]NarrowRegion When [range] is omitted, select only the current + line, else use the lines in the range given and + open it in a new Scratch Window. + Whenever you are finished modifying that region + simply write the buffer. + + *:NarrowWindow* *:NW* +:NW +:NarrowWindow Select only the range that is visible the current + window and open it in a new Scratch Window. + Whenever you are finished modifying that region + simply write the buffer. + + *:WidenRegion* +:WidenRegion[!] This command is only available in the narrowed + scratch window. If the buffer has been modified, + the contents will be put back on the original + buffer. If ! is specified, the window will be + closed, otherwise it will remain open. + + *:NRV* +:NRV Opened the narrowed window for the region that was + last selected in visual mode + + *:NUD* + +:NUD When viewing unified diffs, this command opens + the current chunk in 2 Narrowed Windows in + |diff-mode| The current chunk is determined as the + one, that the cursor is at. This command does not + make sense if editing a different file format (or + even different diff format) + + *:NRPrepare* +:[range]NRPrepare +:[range]NRP You can use this command, to mark several lines + that will later be put into a Narrowed Window + using |:NRM|. + + *:NRMulti* +:NRMulti +:NRM This command takes all lines, that have been + marked by |:NRP| and puts them together in a new + narrowed buffer. + When you write your changes back, all separate + lines will be put back at their origin. + This command also clears the list of marked lines, + that was created with |NRP|. + See also |NR-multi-example|. + + *:NRSyncOnWrite* *:NRS* +:NRSyncOnWrite +:NRS Enable synching the buffer content back to the + original buffer when writing. + (this is the default). + + *:NRNoSyncOnWrite* *:NRN* +:NRNoSyncOnWrite +:NRN Disable synching the buffer content back to the + original buffer when writing. When set, the + narrowed buffer behaves like an ordinary buffer + that you can write in the filesystem. + (this is the default). + +2.1 NrrwRgn HowTo *NR-HowTo* +----------------- + +Use the commands provided above to select a certain region to narrow. You can +also start visual mode and have the selected region being narrowed. In this +mode, NarrowRegion allows you to block select |CTRL-V| , character select |v| +or linewise select |V| a region. Then press nr where by +default is set to '\', unless you have set it to something different (see +|| for information how to change this) and the selected range will +open in a new scratch buffer. This key combination only works in |Visual-mode| + +When finished, simply write that Narrowed Region window, from which you want +to take the modifications in your original file. + +It is possible, to recursively open a Narrowed Window on top of an already +narrowed window. This sounds a little bit silly, but this makes it possible, +to have several narrowed windows, which you can use for several different +things, e.g. If you have 2 different buffers opened and you want to diff a +certain region of each of those 2 buffers, simply open a Narrowed Window for +each buffer, and execute |:diffthis| in each narrowed window. + +You can then interactively merge those 2 windows. And when you are finished, +simply write the narrowed window and the changes will be taken back into the +original buffer. + +When viewing unified diffs, you can use the provided |:NUD| command to open 2 +Narrowed Windows side by side viewing the current chunk in |diff-mode|. Those +2 Narrowed windows will be marked 'modified', since there was some post +processing involved when opening the narrowed windows. Be careful, when +quitting the windows, not to write unwanted changes into your patch file! In +the window that contains the unified buffer, you can move to a different +chunk, run |:NUD| and the 2 Narrowed Windows in diff mode will update. + +2.2 NrrwRgn Multi *NR-multi-example* +----------------- + +Using the commands |:NRP| and |:NRM| allows to select a range of lines, that +will be put into a narrowed buffer together. This might sound confusing, but +this allows to apply a filter before making changes. For example before +editing your config file, you decide to strip all comments for making big +changes but when you write your changes back, these comments will stay in your +file. You would do it like this: > + :v/^#/NRP + :NRMulti +< +Now a Narrowed Window will open, that contains only the configuration lines. +Each block of independent region will be separated by a string like + +# Start NarrowRegion1 +..... +# End NarrowRegion1 + +This is needed, so the plugin later knows, which region belongs where in the +original place. Blocks you don't want to change, you can safely delete, they +won't be written back into your original file. But other than that, you +shouldn't change those separating lines. + +When you are finished, simply write your changes back. + +============================================================================== + +2.3 NrrwRgn Configuration *NrrwRgn-config* +------------------------- + +NarrowRegion can be customized by setting some global variables. If you'd +like to open the narrowed window as a vertical split buffer, simply set the +variable g:nrrw_rgn_vert to 1 in your |.vimrc| > + + let g:nrrw_rgn_vert = 1 +< +------------------------------------------------------------------------------ + +If you'd like to specify a certain width/height for you scratch buffer, then +set the variable g:nrrw_rgn_wdth in your |.vimrc| . This variable defines the +width or the nr of columns, if you have also set g:nrrw_rgn_vert. > + + let g:nrrw_rgn_wdth = 30 +< +------------------------------------------------------------------------------ + +By default, NarrowRegion highlights the region that has been selected +using the WildMenu highlighting (see |hl-WildMenu|). If you'd like to use a +different highlighting, set the variable g:nrrw_rgn_hl to your preferred +highlighting Group. For example to have the region highlighted like a search +result, you could put that in your |.vimrc| > + + let g:nrrw_rgn_hl = 'Search' +< +If you want to turn off the highlighting (because this can be distracting), you +can set the global variable g:nrrw_rgn_nohl to 1 in your |.vimrc| > + + let g:nrrw_rgn_nohl = 1 +< +------------------------------------------------------------------------------ + +If you'd like to change the key combination that starts the Narrowed Window +for your selected range, you could put this in your |.vimrc| > + + xmap NrrwrgnDo +< +This will let open the Narrow-Window, but only if you have pressed it in +Visual Mode. It doesn't really make sense to map this combination to any other +mode, unless you want it to Narrow your last visually selected range. + +------------------------------------------------------------------------------ + +If you'd like to specify the options that you want to have set for the +narrowed window, you can set the g:nrrw_custom_options setting, in your +|.vimrc| e.g. > + + let g:nrrw_custom_options={} + let g:nrrw_custom_options['filetype'] = 'python' +> +This will only apply those options to the narrowed buffer. You need to take +care that all options you need will apply. + +------------------------------------------------------------------------------ + +If you don't like that your narrowed window opens above the current window, +define the g:nrrw_topbot_leftright variable to your taste, e.g. > + + let g:nrrw_topbot_leftright = 'botright' +< +Now, all narrowed windows will appear below the original window. If not +specified, the narrowed window will appear above/left of the original window. + +------------------------------------------------------------------------------ + +If you want to use several independent narrowed regions of the same buffer +that you want to write at the same time, protecting the original buffer is not +really useful. Therefore, set the g:nrrw_rgn_protect variable, e.g. in your +|.vimrc| > + + let g:nrrw_rgn_protect = 'n' +< +This can be useful if you diff different regions of the same file, and want +to be able to put back the changes at different positions. Please note that +you should take care not to change any part that will later be influenced +when writing the narrowed region back. + +Note: Don't use overlapping regions! Your changes will probably not be put +back correctly and there is no guard against losing data accidentally. NrrwRgn +tries hard to adjust the highlighting and regions as you write your changes +back into the original buffer, but it can't guarantee that this will work and +might fail silently. Therefore, this feature is experimental! + +------------------------------------------------------------------------------ + *NR-hooks* + +NarrowRegion can execute certain commands, when creating the narrowed window +and when closing the narrowed window. For this, you can set 2 buffer-local +variables that specify what commands to execute, which will hook into the +execution of the Narrow Region plugin. + +For example, suppose you have a file, containing columns separated data (CSV +format) which you want to modify and you also have the CSV filetype plugin +(http://www.vim.org/scripts/script.php?script_id=2830) installed and you want +to modify the CSV data which should be visually arranged like a table in the +narrowed window. + +Therefore you want the command |:ArrangeColumn| to be executed in the new +narrowed window upon entering it, and when writing the changes back, you want +the command |:UnArrangeColumn| to be executed just before putting the +changes back. So you set those two variables in your original buffer: > + + let b:nrrw_aucmd_create = "set ft=csv|%ArrangeCol" + let b:nrrw_aucmd_close = "%UnArrangeColumn" +< +This will execute the commands in the narrowed window: > + + :set ft=csv + :%ArrangeCol + +and before writing the changes back, it'll execute: > + + :%UnArrangeCol + +============================================================================== +3. NrrwRgn Feedback *NrrwRgn-feedback* + +Feedback is always welcome. If you like the plugin, please rate it at the +vim-page: +http://www.vim.org/scripts/script.php?script_id=3075 + +You can also follow the development of the plugin at github: +http://github.com/chrisbra/NrrwRgn + +Please don't hesitate to report any bugs to the maintainer, mentioned in the +third line of this document. + +============================================================================== +4. NrrwRgn History *NrrwRgn-history* + + +0.26: Jan 02, 2012 {{{1 + +- Fix issue https://github.com/chrisbra/NrrwRgn/issues/7 + (reported by Alessio B., thanks!) + + +0.25: Nov 08, 2011 {{{1 + +- updated documentation (patch by Jean, thanks!) +- make it possible, to not sync the narrowed buffer back by disabling + it using |:NRSyncOnWrite| |:NRNoSyncOnWrite| + +0.24: Oct 24, 2011 {{{1 + +- error on vim.org page, reuploaded version 0.22 as 0.24 + +0.23: Oct 24, 2011 {{{1 + +- (wrongly uploaded to vim.org) + +0.22: Oct 24, 2011 {{{1 + +- Allow customization via the use of hooks (|NR-hooks|) + +0.21: July 26, 2011 {{{1 + +- Fix undefined variable adjust_line_numbers + https://github.com/chrisbra/NrrwRgn/issues/5 (reported by jmcantrell, + thanks!) + +0.20: July 25, 2011 {{{1 +- allow customization via the g:nrrw_topbot_leftright variable (Thanks Herbert + Sitz!) +- allow what options will be applied using the g:nrrw_custom_options dict + (suggested by Herbert Sitz. Thanks!) +- NRV didn't hightlight the region that was selected (reported by Herbert + Sitz, thanks!) +- use the g:nrrw_rgn_protect variable, to prevent that the original buffer + will be protected. This is useful, if you narrow several regions of the same + buffer and want to write those changes indepentently (reported by kolyuchiy + in https://github.com/chrisbra/NrrwRgn/issues/3, Thanks!) +- fix an error with not correctly deleting the highlighted region, that was + discovered when reporting issue 3 (see above). (Reported by kolyuchiy, + thanks!) +- Catch errors, when setting window local options. (Patch by Sung Pae, + Thanks!) + +0.19: May 22, 2011 {{{1 +- fix issue 2 from github https://github.com/chrisbra/NrrwRgn/issues/2 + (Widening does not work, if the narrowed windows have been moved to a new + tabspace). Reported by vanschelven, thanks! + +0.18: December 10, 2010 {{{1 +- experimental feature: Allow to Narrow several different regions at once + using :g/pattern/NRP and afterwards calling :NRM + (This only works linewise. Should that be made possible for any reagion?) +- disable folds, before writing changes back, otherwise chances are, you'll + lose more data then wanted +- code cleanup + +0.17: November 23, 2010 {{{1 +- cache the options, that will be set (instead of parsing + $VIMRUNTIME/doc/options.txt every time) in the Narrowed Window +- getting the options didn't work, when using an autocommand like this: + autocmd BufEnter * cd %:p:h + (reported by Xu Hong, Thanks!) +- :q didn't clean up the Narrowed Buffer correctly. Fix this +- some code cleanup + +0.16: November 16, 2010 {{{1 +- Bugfix: copy all local options to the narrowed window (reported by Xu Hong, + Thanks!) + +0.15: August 26, 2010 {{{1 +- Bugfix: minor documentation update (reported by Hong Xu, Thanks!) + +0.14: August 26, 2010 {{{1 +- Bugfix: :only in the original buffer resulted in errors (reported by Adam + Monsen, Thanks!) + +0.13: August 22, 2010 {{{1 +- Unified Diff Handling (experimental feature) + +0.12: July 29, 2010 {{{1 + +- Version 0.11, wasn't packaged correctly and the vimball file + contained some garbage. (Thanks Dennis Hostetler!) + +0.11: July 28, 2010 {{{1 + +- Don't set 'winfixwidth' and 'winfixheight' (suggested by Charles Campbell) + +0.10: May 20, 2010 {{{1 + +- Restore cursor position using winrestview() and winsaveview() +- fix a bug, that prevented the use of visual narrowing +- Make sure when closing the narrowed buffer, the content will be written to + the right original region +- use topleft for opening the Narrowed window +- check, that the original buffer is still available +- If you Narrow the complete buffer using :NRV and write the changes back, an + additional trailing line is inserted. Remove that line. +- When writing the changes back, update the highlighting. + +0.9: May 20, 2010 {{{1 + +- It is now possible to Narrow a window recursively. This allows to have + several narrowed windows, and allows for example to only diff certain + regions (as was suggested in a recent thread at the vim_use mailinglist: + http://groups.google.com/group/vim_use/msg/05d7fd9bd1556f0e) therefore, the + use for the g:nrrw_rgn_sepwin variable isn't necessary anymore. +- Small documentation updates + +0.8: May 18, 2010 {{{1 + +- the g:nrrw_rgn_sepwin variable can be used to force separate Narrowed + Windows, so you could easily diff those windows. +- make the separating of several windows a little bit safer (look at the + bufnr(), so it should work without problems for several buffers) +- switch from script local variables to buffer local variables, so narrowing + for several buffers should work. +- set 'winfixheight' for narrowed window +- Added command :NRV (suggested by Charles Campbell, thanks!) +- added error handling, in case :NRV is called, without a selected region +- take care of beeps, when calling :NRV +- output WarningMsg + +0.7: May 17, 2010 {{{1 + +- really use the black hole register for deleting the old buffer contents in + the narrowed buffer (suggestion by esquifit in + http://groups.google.com/group/comp.editors/msg/3eb3e3a7c68597db) +- make autocommand nesting, so the highlighting will be removed when writing + the buffer contents. +- Use g:nrrw_rgn_nohl variable to disable highlighting (as this can be + disturbing). + +0.6: May 04, 2010 {{{1 + +- the previous version had problems restoring the orig buffer, this version + fixes it (highlighting and setl ma did not work correctly) + +0.5: May 04, 2010 {{{1 + +- The mapping that allows for narrowing a visually selected range, did not + work. (Fixed!) +- Make :WidenRegion work as expected (close the widened window) (unreleased) + +0.4: Apr 28, 2010 {{{1 + +- Highlight narrowed region in the original buffer +- Save and Restore search-register +- Provide shortcut commands |:NR| +- Provide command |:NW| and |:NarrowWindow| +- Make plugin autoloadable +- Enable GLVS (see |:GLVS|) +- Provide Documenation (:h NarrowRegion) +- Distribute Plugin as vimball |pi_vimball.txt| + +0.3: Apr 28, 2010 {{{1 + +- Initial upload +- development versions are available at the github repository +- put plugin on a public repository (http://github.com/chrisbra/NrrwRgn) + + }}} + +============================================================================== +Modeline: +vim:tw=78:ts=8:ft=help:et:fdm=marker:fdl=0:norl diff --git a/.vim/bundle/NrrwRgn/plugin/NrrwRgn.vim b/.vim/bundle/NrrwRgn/plugin/NrrwRgn.vim new file mode 100644 index 0000000..e028f25 --- /dev/null +++ b/.vim/bundle/NrrwRgn/plugin/NrrwRgn.vim @@ -0,0 +1,57 @@ +" NrrwRgn.vim - Narrow Region plugin for Vim +" ------------------------------------------------------------- +" Version: 0.26 +" Maintainer: Christian Brabandt +" Last Change: Mon, 02 Jan 2012 21:33:50 +0100 +" +" Script: http://www.vim.org/scripts/script.php?script_id=3075 +" Copyright: (c) 2009, 2010 by Christian Brabandt +" The VIM LICENSE applies to histwin.vim +" (see |copyright|) except use "NrrwRgn.vim" +" instead of "Vim". +" No warranty, express or implied. +" *** *** Use At-Your-Own-Risk! *** *** +" GetLatestVimScripts: 3075 26 :AutoInstall: NrrwRgn.vim +" +" Init: {{{1 +let s:cpo= &cpo +if exists("g:loaded_nrrw_rgn") || &cp + finish +endif +set cpo&vim +let g:loaded_nrrw_rgn = 1 + +" Debug Setting +let s:debug=0 +if s:debug + call nrrwrgn#Debug(1) +endif + +" ---------------------------------------------------------------------------- +" Public Interface: {{{1 + +" Define the Command aliases "{{{2 +com! -range NRPrepare :,NRP +com! -range NarrowRegion :,NR +com! NRMulti :NRM +com! NarrowWindow :NW + +" Define the actual Commands "{{{2 +com! -range NR :, call nrrwrgn#NrrwRgn() +com! -range NRP :exe ":" . . ',' . . "call nrrwrgn#Prepare()" +com! NRV :call nrrwrgn#VisualNrrwRgn(visualmode()) +com! NUD :call nrrwrgn#UnifiedDiff() +com! NW :exe ":" . line('w0') . ',' . line('w$') . "call nrrwrgn#NrrwRgn()" +com! NRM :call nrrwrgn#NrrwRgnDoPrepare() + +" Define the Mapping: "{{{2 +if !hasmapto('NrrwrgnDo') + xmap nr NrrwrgnDo +endif +xnoremap