--- a/vim/bundle/yankring/doc/yankring.txt Fri Jun 14 17:10:17 2013 -0400
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,1585 +0,0 @@
-*yankring.txt* For Vim version 7.0.
-
-Author: David Fishburn April 1, 2011
-Version: 14.0
-
-For instructions on installing this file, type
- :help add-local-help |add-local-help| inside Vim.
-
-Homepage: http://vim.sourceforge.net/script.php?script_id=1234
-
-
-==============================================================================
-1. Contents *yankring* *yankring-contents*
-
- 1. Contents...............................: |yankring-contents|
- 2. Description............................: |yankring-description|
- 3. Configuration..........................: |yankring-configure|
- 3.1 Global Variables...................: |yankring-globals|
- 3.2 Default Keys.......................: |yankring-mappings|
- 3.3 Customizing Maps...................: |yankring-custom-maps|
- 3.4 Customizing Menus..................: |yankring-custom-menus|
- 4. Using the YankRing Window..............: |yankring-window|
- 5. Commands...............................: |yankring-commands|
- 5.1 YRToggle..........................: |:YRToggle|
- 5.2 YRClear...........................: |:YRClear|
- 5.3 YRShow............................: |:YRShow|
- 5.5 YRGetElem.........................: |:YRGetElem|
- 5.6 YRGetMultiple.....................: |:YRGetMultiple|
- 5.7 YRPush............................: |:YRPush|
- 5.8 YRPop.............................: |:YRPop|
- 5.9 YRYankCount.......................: |:YRYankCount|
- 5.10 YRYankRange.......................: |:YRYankRange|
- 5.11 YRDeleteRange.....................: |:YRDeleteRange|
- 5.12 YRPaste...........................: |:YRPaste|
- 5.13 YRReplace.........................: |:YRReplace|
- 5.14 YRMapsCreate......................: |:YRMapsCreate|
- 5.15 YRMapsDelete......................: |:YRMapsDelete|
- 5.16 YRSearch..........................: |:YRSearch|
- 5.17 YRCheckClipboard..................: |:YRCheckClipboard|
- 5.18 YRRunAfterMaps....................: |:YRRunAfterMaps|
- 6. Tutorial...............................: |yankring-tutorial|
- 6.1 YRShow............................: |YRShow-example|
- 6.2 YRReplace.........................: |YRReplace-example|
- 6.3 YRPush............................: |YRPush-example|
- 6.4 YRClear...........................: |YRClear-example|
- 6.8 YRPop.............................: |YRPop-example|
- 6.9 Visual modes......................: |yankring-visual-example|
- 6.10 Using ranges......................: |YRYankRange-example|
- 6.11 :global...........................: |global-example|
- 6.12 YRSearch..........................: |YRSearch-example|
- 7. History................................: |yankring-history|
-
-
-==============================================================================
-2. Description *yankring-description*
-
-Vim already maintains a list of numbered registers containing the last 9
-deletes. These previous deletes can be referenced using [register]p, so
-"1p will paste the last delete, "2p the 2nd last delete. For more
-information see |quote_number|.
-
-Vim does not provide any mechanism to reference previously yanked text.
-In Emacs this feature is called the "kill ring".
-
-The YankRing plugin allows the user to configure the number of yanked
-and deleted text. After text has been pasted, it can be replaced with
-a previous value from the yankring.
-
-As of version 3.0, the yankring's content will persist (by default)
-between starting and stopping Vim.
-
-The plugin can be toggled on and off, and supports:
- Ranges
- Registers
- Counts
- All visual modes
- All motions
- All text-objects
-
-If you have any suggestions for the improvement of this plugin, see the
-yankring.vim file for my email address. Suggestions / bug reports are
-always welcome.
-
-For details on the changes between versions see |yankring-history|.
-
-
-==============================================================================
-3. Configuration *yankring-configure*
-
-The YankRing allows the user to choose which keys are to be assigned to
-the various commands. By default, the YankRing chose keys identical
-with Vim's standard behaviour/keys.
-
-3.1 Global Variables *yankring-globals*
-
-You can customize the YankRing by setting various global variables in
-your |.vimrc|.
->
- yankring_max_history
-< Default: 100
- Controls how many elements to save in the yankring. >
- let g:yankring_max_history = 100
- yankring_min_element_length
-< Default: 1
- If the yanked element has a length less than this value
- if will not be added to the YankRing. This can be useful if
- you want to bypass single letter deletes by adding the
- following to your .vimrc: >
- let g:yankring_min_element_length = 2
- yankring_max_element_length
-< Default: 1048576 (1M)
- Will truncate a new entry to the specified maximum. If
- g:yankring_max_element_length is set to 0, there is no limit. >
- let g:yankring_max_element_length = 4194304 " 4M
- yankring_max_display
-< Default: 500
- When the YankRing window is opened, each element is displayed on a
- separate line. Since each yank could be very large, the display of
- the element is limited to the above default. >
- let g:yankring_max_display = 70
- yankring_enabled
-< Default: 1
- If you do not want to YankRing enabled by default, set this
- variable in your |vimrc|. >
- let g:yankring_enabled = 0 " Disables the yankring
- yankring_persist
-< Default: 1
- If you have enabled the storing of global variables in the |viminfo|
- file, the YankRing will be default persist the contents of the ring
- between starting and stopping Vim. To disable this feature: >
- let g:yankring_persist = 0
- yankring_share_between_instances
-< Default: 1
- By default, any instance of Vim will share the same yankring
- history file. But if want each instance to have their own history
- you can set this option to 0. Setting g:yankring_persist = 0 and
- g:yankring_share_between_instances = 0 will ensure no 2 instances
- of Vim share the same YankRing history AND the history is not
- remembered the next time Vim is started. >
- let g:yankring_share_between_instances = 0
- yankring_dot_repeat_yank
-< Default: Based on the Vim cpoption setting
- By default Vim will not repeat (using '.') yanking of text. This can
- be controlled via the |'cpoptions'| setting. The YankRing now respects
- the cpoptions setting, if 'y' is included and you press '.', the
- previous yank command is repeated and added to the yankring.
- You can also add this behaviour by setting this in your |vimrc|: >
- let g:yankring_dot_repeat_yank = 1
- yankring_ignore_duplicate
-< Default: 1
- Duplicates will not be added to the YankRing by default. If a
- duplicate is found, that element will be moved to the top of the
- yankring. This can be controlled by setting this in your |vimrc|: >
- let g:yankring_ignore_duplicate = 0
- yankring_map_dot
-< Default: 1
- If the '.' (repeat) command should be mapped by the yankring. Since
- most of the normal commands yy,dd,dw,... are mapped by the yankring,
- if g:yankring_map_dot is false the . operator will not repeat these
- operations. The YankRing tracks several of the internal Vim registers
- and decides whether an action was the result of the YankRing or an
- action outside of it. If the previous action was a result of the
- yankring, it will be executed again. If it was an action outside of
- the yankring, it asks Vim to repeat the command. >
- let g:yankring_map_dot = 1
- yankring_paste_using_g
-< Default: 1
- By default [p] and [P] are mapped to interact with the yankring. This
- option controls whether [gp] and [gP] are also mapped. Setting this
- option to 0 will not create these maps. >
- let g:yankring_paste_using_g = 1
- yankring_window_use_separate
-< Default: 1
- This is a new feature as of the 2.0 release. The YankRing now uses a
- separate split buffer to display the yankring. There are many buffer
- specific maps that allow you to operate over the various elements from
- within the yankring. Setting this option to 0, uses the 1.0
- interface. >
- let g:yankring_window_use_separate = 0
- yankring_window_auto_close
-< Default: 1
- By default once you choose an option in the YankRing buffer, the
- action is performed and the buffer window is closed, returning you to
- the original buffer. This option can be toggled from within the
- YankRing buffer by pressing [a]. The YankRing buffer status line
- visually indicates where auto close is enabled or disabled. There are
- many times where you need to paste (or delete) many items from the
- yankring. Pressing [a], disables auto close, allows you to paste many
- items, and finally you can press [a] to re-enable auto close, followed
- by [q] to quit the buffer window. >
- let g:yankring_window_auto_close = 1
- yankring_window_use_horiz
-< Default: 1
- When the YankRing window is opened, it uses a horizontal split at the
- bottom of the Vim window. It can optionally use a vertical split by
- setting this option to 0. >
- let g:yankring_window_use_horiz = 0 " Use vertical split
- yankring_window_height
-< Default: 1
- If using a horizontal split, this option controls how high to make
- the window. >
- let g:yankring_window_height = 8
- yankring_window_width
-< Default: 1
- If using a vertical split, this option controls how wide to make the
- window. >
- let g:yankring_window_width = 30
- yankring_window_use_bottom
-< Default: 1
- If using a horizontal split, this option control whether the window is
- opened at the top or bottom of the Vim window. Setting this option to
- 0 forces the window to open at the top of the Vim window. >
- let g:yankring_window_use_bottom = 1
- yankring_window_use_right
-< Default: 1
- If using a vertical split, this option control whether the window is
- opened on the left or right side of the Vim window. To force the
- window to open on the left side, set this option to 0. >
- let g:yankring_window_use_right = 1
- yankring_window_increment
-< Default: 1
- If using a vertical split the default width of the vertical window may
- be too narrow to view enough of the elements. Pressing [<space>] will
- increase the size of the window by this number of columns. Pressing
- [<space>] again will toggle it back to the original size. >
- let g:yankring_window_increment = 50
- yankring_manage_numbered_reg
-< Default: 0
- Vim already maintains a list of numbered registers containing the last
- yanked item and the previous 9 deletes. These items can be referenced
- using [register]p, so "0p will paste the last yank, "1p will paste the
- last delete, "2p the 2nd last delete. For more information see
- |quote_number|.
- If you wish the YankRing to maintain these numbered registers so
- the top 10 elements in the YankRing are in the numbered reqisters 0-9
- you can put the following in your |vimrc| >
- let g:yankring_manage_numbered_reg = 1
- yankring_ignore_operator
-< Default: 'g~ gu gU ! = gq g? > < zf g@'
- There are a number of Vim operations which do not change any
- registers, and therefore should not be captured by the yankring.
- This list is used to ignore the appropriate operators.
- You can put the following in your |vimrc| >
- let g:yankring_ignore_operator = 'g~ gu gU ! = gq g? > < zf g@'
- yankring_history_dir
-< Default: $HOME
- The YankRing stores the text in a file. This global variable
- allows you to customize where the file(s) will be stored.
- You can put the following in your |vimrc| >
- let g:yankring_history_dir = '$VIM'
- yankring_history_file
-< Default: 'yankring_history'
- The history filename prefix can be controlled by setting this
- variable.
- You can put the following in your |vimrc| >
- let g:yankring_history_file = 'my_yankring_history_file'
- yankring_clipboard_monitor
-< Default: 1
- When flipping between applications I find I often copy text
- and attempt to use it inside of Vim. This is typically easy
- by simply using "+p, but there are times when I will repeatedly
- want to use the same text later on. By default, the YankRing
- will detect when Vim regains focus and check if the clipboard
- has changed since it last checked. If so, it will add the contents
- of the clipboard to the YankRing. This is accomplished by the
- use of the FocusGained Vim event for the GUI Vim. For console
- Vims, the FocusGained event does not fire, so additional logic
- is added to deal with it. To disable this feature
- you can put the following in your |vimrc| >
- let g:yankring_clipboard_monitor = 0
- yankring_manual_clipboard_check
-< Default: 0
- If running in console mode, Vim's FocusGained event will not
- fire as we flip back and forth between windows. This normally
- instructs the YankRing to check for updates to the system
- clipboard. When this option is set, the YankRing will check
- the clipboard under many different circumstances:
- Adding a new entry to the YankRing
- Replacing a previous paste
- Showing the YankRing window
- If the YankRing is setup to check the clipboard and the
- GUI is not running, this option will be enabled by default.
- To disable this feature you can put the following in your |vimrc| >
- let g:yankring_manual_clipboard_check = 0
- yankring_paste_check_default_buffer
-< Default: 1
- If the default register has changed without the YankRing registering
- the change the YankRing will paste the top item from the history
- rather than what is currently in the default register.
- This option allows you to control the behaviour. Plugins can
- intentionally change the default buffer which the YankRing has
- no way to noticing. To disable this feature you can put the following
- in your |vimrc| >
- let g:yankring_paste_check_default_buffer = 0
- yankring_default_menu_mode
-< - Menus are useful for a number of reasons:
- See a list of available commands.
- Remember what the shortcut maps are.
- Have a floating menu when using the plugin a lot.
- Quick reference guide.
- There are four settings that will control the placement
- of the menu:
- "0": Turns the menu off.
- "1": Turns the 'Yankring' menu on with no menu shortcut.
- "2": Turns the 'Yankring 'menu on with <alt>-y as the shortcut.
- "3": Turns the 'Plugin -> YankRing' menu on with <alt>-y as
- the shortcut.
- This option defaults to a value of 3 and can be changed
- by adding the following to your vimrc: >
- :let g:yankring_default_menu_mode = 3
- yankring_menu_root
-< - Can be used in conjuction with g:yankring_default_menu_mode = 3 but
- it also allows you to control the fullname and location of the
- YankRing menu. To create the menu: 'MyPlugins -> YankRing' you
- can create the following variable: >
- :let g:yankring_menu_root = 'MyPlugin.&YankRing'
- yankring_menu_priority
-< - Menus are created in a documented order by Vim (|menu-priority|).
- This option allows you to override the setting and shift the
- YankRing menu item to the left between the Edit and Tools menu. >
- :let g:yankring_menu_priority = 30
-
-<
-3.2 Default Keys *yankring-mappings*
-
-You can choose to override the default keys by creating these global
-variables in your |vimrc|.
->
- yankring_n_keys
-< n - normal mode
- Default Vim 7.2:
- 'Y D x X'
- Default Vim 7.1 and below:
- 'x yy dd yw dw ye de yE dE yiw diw yaw daw y$ d$ Y D yG dG ygg dgg'
-
- With the introduction of some new features in Vim 7.2 it is no longer
- necessary to list all cmds which the YankRing will act upon.
- The yankring_n_keys only lists actions which an omap cannot be used.
- Using the yankring_separator, the above list is parsed and
- individual mappings are created. For each of the above normal
- commands the YankRing will include the text those commands
- acted upon. There are many ways to accomplish the same result
- in Vim, if you do not see a common key stroke you regularly use
- simply add the following to your |vimrc| with the additional
- keys you wished mapped. >
- let g:yankring_n_keys = 'Y D x X'
- yankring_o_keys
-< o - omap mode
- Default:
- Standard motions: 'b B w W e E d y $ G ;'
- Vim text objects: ' iw iW aw aW as is ap ip a] a[ i] i['
- 'a) a( ab i) i( ib a> a< i> i< at it '
- 'a} a{ aB i} i{ iB a" a'' a` i" i'' i`'
-
- As of Vim 7.2 omaps are used to capture changes to the registers
- in Vim. All of the standard motion commands are captured.
- New to YankRing 5.0 all default Vim text objects are also
- captured.
- Using the yankring_separator, the above list is parsed and
- individual mappings are created. For each of the above normal
- commands the YankRing will include the text those commands
- acted upon. There are many ways to accomplish the same result
- in Vim, if you do not see a common key stroke you regularly use
- simply add the following to your |vimrc| with the additional
- keys you wished mapped. >
- let g:yankring_o_keys = 'b B w W e E d y $ G ; iw iW aw aW'
- yankring_zap_keys
-< Default: 'f F t T / ?'
- omaps are enough for most operations except for f and t.
- These motions prompt the user for a character or string which
- they should act upon. These must be treated as a special case
- in YankRing. >
- let g:yankring_zap_keys = 'f t'
- yankring_ignore_operator
-< Default: 'g~ gu gU ! = gq g? > < zf g@'
- There are certain motions which do not update any registers
- in Vim. If the registers are not changed, there is nothing
- the YankRing can capture. This list instructs the YankRing
- to ignore any action for these keys. >
- let g:yankring_ignore_operator = 'g~ gu gU'
- yankring_v_key
-< v - visual mode
- Default: y
- Yanks visually select text. >
- yankring_del_v_key
-< n - normal mode
- Default: d
- The visually select text is included in the YankRing and deleted. >
- yankring_paste_n_bkey
-< n - normal mode
- b - before
- Default: P
- The default Vim paste key will retrieve from the yankring. This
- will paste the text BEFORE the current position.
- There is a special check to see if the text in the default paste
- register is the same as what is in the current position of the
- yankring. If it is not, we assume the user used some other
- mechanism to yank text (ie yt<character>). If this is the case
- we paste the text in the default paste buffer. Using <C-P> the
- text can be replaced with the current entry from the yankring.
- Since there are many ways to do things in Vim, this provides
- the best integration. >
- yankring_paste_n_akey
-< n - normal mode
- a - after
- Default: p
- The default Vim paste key will retrieve from the yankring. This
- will paste the text AFTER the current position.
- There is a special check to see if the text in the default paste
- register is the same as what is in the current position of the
- yankring. If it is not, we assume the user used some other
- mechanism to yank text (ie yt<character>). If this is the case
- we paste the text in the default paste buffer. Using <C-P> the
- text can be replaced with the current entry from the yankring.
- Since there are many ways to do things in Vim, this provides
- the best integration. >
- yankring_paste_v_key
-< n - normal mode
- Default: p
- This will replace the visually select text with the contents
- from the yankring. See yankring_paste_n_akey for additional
- details. >
- yankring_replace_n_pkey
-< n - normal mode
- Default: <C-P>
- If you do not want to open the YankRing window to choose your
- selection, then you can paste (as usual) then use a YankRing
- mapping to cycle through items in the YankRing. This is especially
- useful if you know you recently used the text you are looking for.
- If you wish to cycle through the yankring, replacing the previously
- pasted text with the previous yanked text you can repeatedly press
- <C-P> (or whatever keystroke you choose to map it to). This map
- moves backwards through the yankring, so you will retrieve your
- most recent yank.
-
- I prefer not to use <C-P> since I like using that key to cycle
- through all the matches in the QuickFix window. You can add
- something similar to this in your |.vimrc| to get similar
- functionality.
-
- On Windows use the ALT-< character to move through the YankRing.
- To determine what character # these are go into insert mode
- in a new buffer. Press CTRL-V then ALT and the < key.
- Leave insert mode, move the cursor onto the character
- and press ga. This will display the decimal, hex and octal
- representation of the character. In this case it is 172. >
- if has('win32')
- let g:yankring_replace_n_pkey = '<Char-172>'
- let g:yankring_replace_n_nkey = '<Char-174>'
- " Instead map these keys to moving through items in the quickfix window.
- nnoremap <C-P> :cp<cr>
- nnoremap <C-N> :cn<cr>
- endif
-< Other users have also stated that this will work: >
- let g:yankring_replace_n_pkey = '<m-p>'
- let g:yankring_replace_n_nkey = '<m-n>'
- yankring_replace_n_nkey
-< n - normal mode
- Default: <C-N>
- If you do not want to open the YankRing window to choose your
- selection, then you can paste (as usual) then use a YankRing
- mapping to cycle through items in the YankRing. This is especially
- useful if you know you recently used the text you are looking for.
- If you wish to cycle through the yankring, replacing the previously
- pasted text with the next yanked text you can repeatedly press
- <C-N> (or whatever keystroke you choose to map it to). This map
- moves forwards through the YankRing, so you will retrieve your
- most recent yank.
-
- I prefer not to use <C-N> since I like using that key to cycle
- through all the matches in the QuickFix window. You can add
- something similar to this in your |.vimrc| to get similar
- functionality.
-
- On Windows use the ALT-> character to move through the YankRing.
- To determine what character # these are go into insert mode
- in a new buffer. Press CTRL-V then ALT and the > key.
- Leave insert mode, move the cursor onto the character
- and press ga. This will display the decimal, hex and octal
- representation of the character. In this case it is 174. >
- if has('win32')
- let g:yankring_replace_n_pkey = '<Char-172>'
- let g:yankring_replace_n_nkey = '<Char-174>'
- " Instead map these keys to moving through items in the quickfix window.
- nnoremap <C-P> :cp<cr>
- nnoremap <C-N> :cn<cr>
- endif
-< Other users have also stated that this will work: >
- let g:yankring_replace_n_pkey = '<m-p>'
- let g:yankring_replace_n_nkey = '<m-n>'
-
-3.3 Customizing Maps *yankring-custom-maps*
-
-The YankRing plugin uses the yankring_n_keys global variable to create
-a number of defaults maps. The maps are of the form: >
- nnoremap Y :<C-U>YRYankCount 'Y'<CR>
-<
-When capital Y is pressed, the YankRing will execute 'Y' and capture the
-output from Vim. But there are cases where you do not want the default
-behaviour of Vim, since you have customized some of these maps.
-
-In this case, I usually map Y to be |y$|, which makes it consistent with
-the |D| and |C| operators. The way yankring_n_keys works does not allow
-me to customize this behaviour. Since many people may like to customize
-the behaviour of these maps the YankRing will check to see if a
-function called YRRunAfterMaps() exists. If it does, it will call
-this function after it has created the maps. So in my case, I created
-the following function in my |vimrc|: >
- function! YRRunAfterMaps()
- nnoremap Y :<C-U>YRYankCount 'y$'<CR>
- endfunction
-<
-You can do anything you need in this function. >
- nnoremap Y :<C-U>YRYankCount 'y$'<CR>
-<
-This line remaps Y (which the user presses) to the YRYankCount command. The
-YRYankCount tells Vim to execute y$ instead.
-
-3.4 Customizing Menus *yankring-custom-menus*
-
-There are several global variables which can be created in your vimrc to
-allow you to customize where and what is displayed for the YankRing menu.
-Simply look up the following global variables: >
- yankring_default_menu_mode
- yankring_menu_root
- yankring_menu_priority
-
-
-==============================================================================
-4. Using the YankRing Window: *yankring-window*
-
-This is a new feature as of the 2.0 release. The YankRing uses a
-separate split buffer to display the yankring. There are many buffer
-specific maps that allow you to operate over the various elements from
-within the yankring.
-
-To display the YankRing buffer you can issue the :YRShow command. For
-convience you can map a key, <F11>, to this command: >
- :nnoremap <silent> <F11> :YRShow<CR>
-
-Status line~
-The first line in the YankRing window is the status line. >
- AutoClose=1;ClipboardMonitor=1;Cmds:[g]p,[g]P,1-9,d,r,s,a,c,u,q,<enter>,<space>;Help=?
-<
-Help=?, pressing [?] will toggle the display of available commands the
-yankring window supports. Pressing [?] again will remove the additional
-items.
-
-AutoClose=1 indicates the window will close when an action is performed
-against elements within the yankring. If you wish to perform multiple
-yankring operations press [a] to toggle the auto close feature off. Use the
-commands below and when finished you can press [a] to toggle auto close on and
-press [q] to close the window. The Cmds displayed are simply reminders of
-the available keys.
-
-ClipboardMonitor=1 indicates the YankRing will monitor the clipboard (+)
-during Focus change events. If the clipboard has changed since the YankRing
-last checked, the contents are added to the YankRing. Pressing [c] allows
-you to quickly toggle this setting since it may not be useful at times.
-
-YankRing window key list~
-The following table lists the description of the keys that can be used
-in the YankRing window.
-
- Key Description~
- p Puts text after the cursor. In visual mode, all elements
- selected will be pasted.
- P Puts text before the cursor. In visual mode, all elements
- selected will be pasted.
- gp Just like "p", but leave the cursor just after the new text.
- gP Just like "P", but leave the cursor just after the new text.
- <CR> Just like "p".
- <Enter> Just like "p".
- <2-LeftMouse> Just like "p". Normal mode only.
- 1-9 Short cut to paste the n'th number from the YankRing.
- d Removes the element from the yankring. In visual mode all
- elements selected will be removed.
- r Just like "p", but in visual mode if many lines are selected
- it will paste these items in reverse order.
- s Prompts you for a regex to search the YankRing and display
- only matching items.
- a Toggles the g:yankring_window_auto_close setting.
- u Updates the YankRing window.
- q Closes the YankRing window.
- <Space> Toggles the width of the vertical window by the
- g:yankring_window_increment setting.
- ? Toggles the display of the help.
-
-
-==============================================================================
-5. Commands: *yankring-commands*
-
-The predefined mappings call some specific commands with special parameters.
-If you are going to create additional maps, it is important you mirror
-the same parameters. Most of these commands have been made obsolete by
-the YankRing window, since it incorporates the functionality below, but
-through maps against a buffer, instead of commands. This makes it much easier
-to use.
-
-
-5.1 YRToggle :*YRToggle*
- Allows you to enable and disable the YankRing quickly. This
- command will remove the default maps and recreate them.
-
- Examples: >
- :YRToggle " Toggles it
- :YRToggle 1 " Enables it
- :YRToggle 0 " Disables it
-<
-
-5.2 YRClear :*YRClear*
- Clears all elements from the yankring.
- See also |YRClear-example|.
-
-
-5.3 YRShow :*YRShow*
- Similar to |:register|, will display all the entries in the yankring.
- The element at the top will be the next element pasted from the
- yankring.
-
- Examples: >
- :YRShow " Shows all entries in the yankring
-
- --- YankRing ---
- Elem Content
- 1 five^@
- 2 four^@
- 3 three^@
- 4 two^@
- 5 one^@
-<
-
-5.5 YRGetElem :*YRGetElem*
- This command has two modes. If no parameters are provided, it
- becomes interactive. It uses YRShow to display the list and
- allows you to choose which element to paste. If a parameter
- is supplied it will paste that element from the yankring. If the
- number specified is outside of the YankRing an error is returned.
- You may want to create a separate mapping for this call. >
- nnoremap <silent> <Leader>yr :YRGetElem<CR>
-< See also |YRSearch|.
-
- Examples:
- Assume there are 10 elements in the YankRing and element 6 is
- at the top of the ring. >
- :YRGetElem " Interactive mode, you choose from a list
- :YRGetElem 4 " Will paste element 5.
- :YRGetElem 12 " Will paste element 6.
- :YRGetElem 99 " Error, invalid choice is reported
- :YRGetElem 0 " Error, invalid choice is reported
-
-
-5.6 YRGetMultiple :*YRGetMultiple*
- Will paste many elements from the YankRing in one command.
- If the number specified is 1 or less, it is assumed you want
- just the current element pasted. If the number specified is
- greater than or equal to the number of elements in the yankring,
- it is assumed you want all elements pasted. If a ! is included
- as part of the command, paste the items in reverse order.
- See the |yankring-tutorial| for more examples.
-
- Examples:
- Assume there are 10 elements in the YankRing. >
- :YRGetMultiple 4 " Will paste elements 1,2,3,4
- :YRGetMultiple! 4 " Will paste elements 4,3,2,1
- :YRGetMultiple " Will paste element 1
- :YRGetMultiple 12 " Will paste elements 1,2,...,10
- :YRGetMultiple 99 " Will paste elements 1,2,...,10
- :YRGetMultiple 0 " Will paste element 1
-
-
-5.7 YRPush :*YRPush*
- Allows the user to "push" additional entries into the yankring.
- If you yanked text via a key mapping which does not use the
- YankRing (or there is text on the clipboard) you can use this
- command to add the text to the yankring.
-
- Examples: >
- :YRPush " Push the " register's contents
- :YRPush '*' " Push the "* register's contents (clipboard)
- :YRPush '+' " Push the "+ register's contents (clipboard)
- :YRPush 'a' " Push the "a register's contents
-< See also |YRPush-example|.
-
-
-5.8 YRPop :*YRPop*
- Allows you to pop any elements from the yankring. If no parameters
- are provided, the 1st element is removed from the yankring. The
- command optionally takes a second parameter to specify how many
- elements to pop. The default value is 1.
-
- Examples: >
- :YRPop " Removes the highest numbered element from the
- yankring
- :YRPop 3 " Removes the 3rd element from the yankring
- :YRPop 3,5 " Removes 5 elements from the YankRing beginning
- at element 3
-< See also |YRPop-example|.
-
-
-5.9 YRYankCount :*YRYankCount*
- This command has the most mappings created for it. If you are
- in normal mode and you are not specifying a range, this command
- will add the text to the yankring.
-
- The goal of this command is to allow the YankRing to be integrated
- as seamlessly as possible with Vim. So it supports counts and
- registers. If you create a mapping to it, you must pass as a
- parameter the action you want Vim to perform. You could do the
- following: >
- nnoremap \test :<C-U>YRYankCount 'dd'<CR>
-< This map is executed when you hit the '\test' keystrokes, but
- it will actually delete the current line and add it to the
- yankring.
-
- The following are the default mappings: >
- nnoremap yy :<C-U>YRYankCount 'yy'<CR>
- nnoremap dd :<C-U>YRYankCount 'dd'<CR>
- nnoremap yw :<C-U>YRYankCount 'yw'<CR>
- nnoremap dw :<C-U>YRYankCount 'dw'<CR>
- nnoremap ye :<C-U>YRYankCount 'ye'<CR>
- nnoremap de :<C-U>YRYankCount 'de'<CR>
- nnoremap yiw :<C-U>YRYankCount 'yiw'<CR>
- nnoremap diw :<C-U>YRYankCount 'diw'<CR>
- nnoremap Y :<C-U>YRYankCount 'Y'<CR>
- nnoremap D :<C-U>YRYankCount 'D'<CR>
- nnoremap y$ :<C-U>YRYankCount 'y$'<CR>
- nnoremap d$ :<C-U>YRYankCount 'd$'<CR>
- nnoremap yG :<C-U>YRYankCount 'yG'<CR>
- nnoremap dG :<C-U>YRYankCount 'dG'<CR>
-<
- Examples:
- yy - Adds the current line to the yankring.
- dd - Adds the current line to the YankRing and deletes it.
- 5yw - Adds 5 words to the yankring.
- "ade - Deletes the word, and puts it into both the yankring
- and the "a register.
- 10"zyy - Places 10 lines into both the YankRing and the "z
- register.
- See also |yankring-tutorial|.
-
-
-5.10 YRYankRange :*YRYankRange*
- This command by default is only called in visual mode. All
- visual modes (|characterwise-visual|, |linewise-visual|,
- |blockwise-visual|) are supported. Any visually selected text
- is added to the yankring. You can also call this command
- directly using a range.
-
- Examples:
- Visual mode
- -----------
- Press v (to enter visual mode), highlight want you want,
- press y (to yank the selected area).
- Repeat using V and Control-V.
-
- Normal mode
- ----------- >
- :5,20YRYankRange " Will yank lines 5-20 into the yankring
- :5,20YRDeleteRange " Will delete lines 5-20 and add them to
- the yankring
-< See also |YRYankRange-example|.
-
-
-5.11 YRDeleteRange :*YRDeleteRange*
- This command is identical to YRYankRange, except the range is
- also deleted.
-
-
-5.12 YRPaste :*YRPaste*
- This command will paste elements from the yankring. By default it has
- been mapped to p and P to match Vim's native key strokes. The text
- pasted is exactly what was yanked, including newline characters and
- blockwise-visual mode behaviours. It supports counts and registers.
-
- Examples:
- p " Paste the current element from the YankRing after the cursor
- P " Paste the current element from the YankRing before the cursor
- 5p " Paste the current element from the YankRing after the cursor
- 5 times
- "ap " Ignore the YankRing and paste the contents of register "a
- 5"ap " Ignore the YankRing and paste the contents of register "a
- 5 times
- See also |yankring-tutorial|.
-
-
-5.13 YRReplace :*YRReplace*
- The purpose of the YankRing is to gain access to previously yanked
- (or deleted) elements. This command will replace the previous
- paste with a different entry from the yankring.
- By default, I choose <C-P> (P for previous) to replace the last paste
- while moving backwards through the yankring. <C-N> (N for next)
- replaces the last paste while moving forward through the yankring.
-
- Examples:
- See the |yankring-tutorial| for examples.
-
- On the Windows platform, I use ALT-< and ALT-> to move back and
- forwards through the yankring instead of C-P and C-N. ALT-< is
- actually ALT-, since I do not press the Shift key to get the <.
-
- To do this, I added the following to my .vimrc:
- " Do not map the default <C-N> and <C-P> keys
- " These two characters are the ALT-< and ALT->.
- " To determine what character # these are go into insert mode
- " in a new buffer. Press CTRL-V then ALT and the > key.
- " Leave insert mode, move the cursor onto the character
- " and press ga. This will display the decimal, hex and octal
- " representation of the character. In this case, they are
- " 172 and 174.
- if has('win32')
- let g:yankring_replace_n_pkey = '<Char-172>'
- let g:yankring_replace_n_nkey = '<Char-174>'
- endif
-
-5.14 YRMapsCreate :*YRMapsCreate*
- This public function is responsible for creating the maps which
- enable the yankring. This function is called by the YRToggle
- command.
-
-
-5.15 YRMapsDelete :*YRMapsDelete*
- This public function removes the YankRing maps and disables
- the yankring. This function is called by the YRToggle command.
-
-
-5.16 YRSearch :*YRSearch*
- This command is similar to |YRGetElem|. The command takes
- one parameter which is a regular expression. Similar to
- YRGetElem, it will display all items in the YankRing that match
- the regular expression. It is also interactive, and will
- prompt you to enter which match you wish pasted.
- See also |YRSearch-example|.
-
-5.17 YRCheckClipboard :*YRCheckClipboard*
- Normally the GUI Vims will automatically (via autocmds)
- check for changes to the system clipboard and add any new
- changes to the YankRing. Most console Vim's do not fire
- the required autocmds. This command will perform the check
- manually.
-
-5.18 YRRunAfterMaps :*YRRunAfterMaps*
- See the following section |yankring-custom-maps|.
-
-
-==============================================================================
-6. Tutorial *yankring-tutorial*
-
-To understand how to use the yankring, the following example will
-demonstrate the various features. Assume you have created the following
-mapping: >
- nnoremap <silent> <F11> :YRShow<CR>
-<
- Assume we have this buffer: >
- one
- two
- three
- four
- five
-< *YRShow-example*
- Now yank (yy) each line separately starting at line 1.
- Display the contents of the YankRing by executing the command
- YRShow, or pressing <F11>. The contents of the YankRing is
- displayed in a new buffer. The size, location and type of buffer
- is configurable via various options. See section 3 for more details. >
- :YRShow or F11
- --- YankRing ---
- Elem Content
- 1 five^@
- 2 four^@
- 3 three^@
- 4 two^@
- 5 one^@
-< Since we yanked the text starting at line 1 and finishing at
- line 5, the most current YankRing element is the last one, the
- contents of line 5. "five^@" is displayed, the "^@" is a
- newline character (since we issued a "yy").
-
- *yankring-window-example*
- At this point, you have two options. You can choose which element
- from the YankRing you wish to paste and press <CR> or 'p' or 'P'
- and a variety of other options, see |yankring-window|. After pressing
- the key, the YankRing window will close (default behaviour). Pressing
- '?' will display additional help for the commands that are active within
- the YankRing window. Pressing '?' will toggle the help.
-
- You do not need to interact with the YankRing using the YankRing window.
- Using the window makes many tasks must easier, but for speed using some
- of the other maps can be preferrable if you know what you have yanked /
- deleted recently. It was designed to work with Vim in the usual manner.
- You can press, 'p', to paste the last item in yanked or deleted.
-
- Close the YankRing window by pressing 'q' or F11 (which toggles it).
-
- *YRReplace-example*
- Now, go to the end of the file and press 'p'. The resulting
- buffer appears as: >
- one
- two
- three
- four
- five
- five
-<
- Assume you did not want 'five", but a different entry from within the
- yankring. <C-P> moves backwards through the yankring, it will replace
- the previous pasted text with a different item from the yankring. This
- allows you to quickly iterate through different elements. <C-P> is the
- default mapping, this can be user defined. See the following options for
- more details: >
- yankring_replace_n_nkey, yankring_replace_n_pkey
-<
- After pressing <C-P> the buffer results in: >
- one
- two
- three
- four
- five
- four
-< Now press 2<C-P>. This would be the same as pressing
- <C-P> two times in a row. This results in: >
- one
- two
- three
- four
- five
- two
-< Now press <C-N> to move forwards through the yankring,
- this results in: >
- one
- two
- three
- four
- five
- three
-< Display the contents of the yankring. >
- :YRShow
- --- YankRing ---
- Elem Content
- 1 five^@
- 2 four^@
- 3 three^@
- 4 two^@
- 5 one^@
-<
- Now lets yank some text with a key stroke that has not been
- mapped to the yankring. Place your cursor at the start of
- line 4. Press 'ytr', yank-to-(to the character r), which yanks
- the 'fou' letters (no newline character). Now press p. Here is
- the result: >
- one
- two
- three
- ffouour
- five
- three
-< This is good, even though the keys 'ytr' has not been mapped
- to YRYankCount, the YankRing still pasted the most recently
- yanked text. Since the text did not have a newline character
- the 'fou' was inserted after the 'f'.
-
- Now replace that previous paste with the current element from
- the YankRing by pressing <C-N>. This is the result: >
- one
- two
- three
- four
- one
- five
- three
-< The #1 entry in the YankRing is still the line "five@". When
- choosing the next entry, it wraps around to the last entry in
- the yankring, element #5. The 'fou' was replaced with 'one^@'.
- Since it had a newline character in it (when it was yanked) the
- newline is included when it is pasted.
-
- *YRPush-example*
- Assume you need to paste text from the system clipboard, and this
- is text you will need routinely. We can simulate this by running
- this command (see |quote+|): >
- :let @+ = "From the clipboard\n"
- :echo @+
-
-< With the cursor at the start of the line with the word 'five', press 'p'.
- We still have pasted the 'fou' which is in the default paste buffer. >
- one
- two
- three
- four
- two
- ffouive
- three
-< We have the option of getting the text from the clipboard directly
- with the following. >
- First undo the previous change - u
- Next - "+p
-< The line changes since we bypassed the yankring, and specified
- which register to get the text from: >
- four
- five
- From the clipboard
- three
-< <C-P> replaces this with the #1 entry in the yankring: >
- four
- five
- five
- three
-< Now add the contents of the clipboard to the yankring: >
- :YRPush '+'
-< Move the cursor to the last row 'three' and press 'p'. The result is: >
- four
- five
- one
- three
- From the clipboard
-< YRPush '+' adds the value of the register '+' to the yankring, but it
- also adds its contents to the default Vim paste buffer. So pressing
- 'p' pasted this text. Adding a new value to the YankRing we have
- repositioned it which you can see with: >
- :YRShow or F11
- --- YankRing ---
- Elem Content
- 1 From the clipboard^@
- 2 five^@
- 3 four^@
- 4 three^@
- 5 two^@
- 6 one^@
-< *YRClear-example*
- Now we will clear the yankring, and begin over again. Delete all lines
- from the buffer and replace them with the original rows: >
- one
- two
- three
- four
- five
-< Now run this command to clear the YankRing to start over: >
- :YRClear
-<
- Issue a 'yy' on each of the 5 lines. If you run the YRShow command you
- should see the following: >
- :YRShow or F11
- --- YankRing ---
- Elem Content
- 1 five^@
- 2 four^@
- 3 three^@
- 4 two^@
- 5 one^@
-< *any-item-example*
- If you need to quickly browse the YankRing to determine which element you
- wish to paste you can simply press 'p' or <CR> or <Enter> on any element
- displayed in the YankRing window. Press '?' for more detailed description
- of the commands available.
-
- Using the YankRing window can be much faster if you do not want to cycle
- through the YankRing using <C-P> and <C-N> to find the element.
-
- As a short cut, when using the YankRing window, you can press the numbers
- 1-9 to paste that item directly and close the YankRing window. This can
- be faster than navigating to the correct line number and pressing 'p'.
-
- *multiple-items-example*
- There are times when you need to move through a buffer capturing many
- different lines (or snippets of code) and eventually want to switch
- buffers and paste these elements. With some advance planning you can do
- this without the YankRing by issuing commands of the form: >
- "ayy
- "Ayy
-< When specifying the register using UPPERCASE, Vim appends the yanked text
- to register "a, instead of replacing it. Many times you forget the
- advance planning (or didn't even know about this great feature) you can
- use the YankRing window to do this easily. If this is the current
- yankring: >
- :YRShow or F11
- --- YankRing ---
- Elem Content
- 1 five^@
- 2 four^@
- 3 three^@
- 4 two^@
- 5 one^@
-< The YankRing works in |visual-mode|. To demonstrate move the cursor in
- the buffer to the line with 'two'. Press 'F11' to display the yankring
- window. Move the cursor to element 2, press 'V' to enable
- |linewise-visual| mode and then press 'j' twice. This should have
- visually highlighted elements 2,3,4. Press 'p' to paste all the
- highlighted elements: >
- one
- two
- four
- three
- two
- three
- four
- five
-< You can see here it has pasted four, three, two after the second line of
- the buffer. Now press 'u' to undo our last change. Leave the cursor
- on the second line 'two'. Press 'F11' to show the YankRing again.
- Visually select the same lines, but this time press 'r' instead of 'p'.
- 'r' is for reverse, so it will paste the following: >
- one
- two
- two
- three
- four
- three
- four
- five
-<
- *YRGetMultiple-example*
- The same behaviour listed above (by visually selecting items in the
- YankRing window) can be achieved using the YRGetMultiple command.
- Assume there are 10 elements in the YankRing. >
- :YRGetMultiple 4 " Will paste elements 1,2,3,4
- :YRGetMultiple! 4 " Will paste elements 4,3,2,1
- :YRGetMultiple " Will paste element 1
- :YRGetMultiple 12 " Will paste elements 1,2,...,10
- :YRGetMultiple 99 " Will paste elements 1,2,...,10
- :YRGetMultiple 0 " Will paste element 1
-<
- *YRSearch-example*
- The default size of the YankRing is 100 elements. It can be
- tedious searching through the YankRing to find the element you
- need. YRSearch is similar to YRShow except it will limit the
- items displayed to only those items matching the regex provided. >
- :YRShow
- --- YankRing ---
- Elem Content
- 1 Three Mississippi
- 2 Two Mississippi
- 3 One Mississippi
- 4 @", '\\/.*$^~[]' )
- :YRSearch Mississippi
- --- YankRing ---
- Elem Content
- 1 Three Mississippi
- 2 Two Mississippi
- 3 One Mississippi
-< Consider some items which require escaping the search string: >
- :YRSearch @", '\\
- --- YankRing ---
- Elem Content
- 1 @", '\\/.*$^~[]' )
-< Forward slashes and various other symbols require escapes, in this
- case the slash was not escaped enough: >
- :YRSearch @", '\\/
- --- YankRing ---
- Elem Content
-< There are enough escapes this time: >
- :YRSearch @", '\\\\/
- --- YankRing ---
- Elem Content
- 1 @", '\\/.*$^~[]' )
-< Period, star, dollar and so on require one slash: >
- :YRSearch @", '\\\\/\.\*\$\^\~\[\]
- --- YankRing ---
- Elem Content
- 1 @", '\\/.*$^~[]' )
-
-< *YRPop-example*
- You can remove any element from the YankRing by pressing pressing 'd' from
- within the YankRing window. Visual mode is also supported to remove more
- than one element at a time. >
- :YRShow
- --- YankRing ---
- Elem Content
- 1 four^@
- 2 three^@
- 3 two^@
- 4 one^@
-< Visually select elements 2,3. Press 'd', the result is: >
- :YRShow
- --- YankRing ---
- Elem Content
- 1 four^@
- 2 one^@
-
-< *yankring-visual-example*
- There are 3 visual modes and all are supported. Any visually selected
- text is added to the yankring. You can try the various modes. Move
- the cursor to inside the buffer (not the YankRing window).
-
- |characterwise-visual|
- Go to line 1, press 'v' and move using the cursor keys until you have
- highlighted some text. Then press y to yank the visually selected
- area. Pressing p with paste the yanked region.
-
- |linewise-visual|
- Go to line 2, press 'V' and move using the cursor keys until you have
- highlighted some text. Notice the entire line is selected (including
- the carriage returns). Then press y to yank the visually selected
- area. Pressing p with paste the yanked region.
-
- |blockwise-visual|
- Go to line 3 column 4, press CTRL-V and move to the right using the
- cursor keys until you have highlighted some text. Then press y to
- yank the visually selected area. Pressing p with paste the yanked
- region. Notice the pasted text retained its blockwise visual
- characteristics.
-
- *YRYankRange-example*
- YRYankRange is called during visual modes, but it is also possible to
- use this via the command line. >
- :1,4YRYankRange
- :3,$YRDeleteRange
- :YRShow
-<
- *global-example*
- Using Vim's |:global| command can be very useful at times. The example
- adds all rows (in a buffer) to the YankRing if they have a certain
- phrase: >
- :g/addme/YRYankCount 'yy'
-< This is the breakdown for the above command: >
- :g - for each line in the buffer
- /addme - check if the string "addme" is in the line
- /YRYankCount 'yy' - Ask the YankRing to execute the 'yy' command
-
-
-==============================================================================
-7. History *yankring-history*
-
- 14.0: April 1, 2012
- NF: The YankRing window supports 1-9 to choose to paste those
- items for quicker access to the top 9 items.
- NF: The YankRing now maps the @ key to run macros. Not all actions
- performed during the macro are recorded by the YankRing
- as a number of items had to be unmapped to support the replay
- of actions which can prompt the user for input (i.e. t and f)
- (Asis Hallab).
- BF: When flipping between applications the system clipboard
- was not added to the YankRing in all cases.
- BF: The YankRing could report E121: Undefined variable:
- g:yankring_manual_clipboard_check (Thilo Six).
- BF: The YankRing could report: E132: Function call depth is higher
- than 'maxfuncdepth'. When executing a YRClear or YRPop or
- when flipping between applications (Marcin Szamotulski).
- BF: Strange behaviour when opening the YankRing with
- :e [YankRing] instead of :YRShow (Marcin Szamotulski).
-
- 13.0: February 5, 2012
- NF: [p, ]p, [P, ]P are now supported within the YankRing
- window (Alexandre Provencio).
- NF: When using the console version of Vim the yankring was not
- detecting the "+ register automatically as the FocusGained
- event does not fire in console mode. When new elements are
- added or the YankRing is shown the clipboard will be
- checked for new values (Giuseppe Rota).
- NF: Added a new option, g:yankring_manual_clipboard_check which
- when enabled will manually check for clipboard changes at
- certain times within the YankRing. This option is not used
- if the GUI is running as the FocusGained will perform checks
- at appropriate times (Erik Westrup).
- BF: With clipboard=unnamed replacing the previous paste with a
- different value from the YankRing did not work in all cases
- (Chris Lott).
- BF: Under certain conditions the YankRing would still check
- the system clipboard even if g:yankring_clipboard_monitor == 0.
- This can lead to delays when attempting to access the
- clipboard when running in console mode. Starting Vim with
- the -X switch removes the delay (Erik Westrup).
- BF: Incorrect syntax setting cpoptions (Thilo Six).
-
- 12.0: October 15, 2011
- NF: A console Vim does not necessarily react to a FocusGained event
- which means as you switch Focus back and forth between a
- console Vim, the YankRing's feature to automatically gather
- changes to the system clipboard is not triggered. Now special
- processing takes place in various spots when you are not running
- Vim with a GUI, to check for changes to the clipboard. Those
- already running a GUI Vim, are unaffected by this change
- (Giuseppe Rota).
- NF: New command, YRCheckClipboard, which allows you to force
- the YankRing to check the system clipboard and if the
- value is not present already in the YankRing, it will add it.
- This is typically done automatically, but certain console
- Vim's do not receive the necessary events for automation.
- BF: Some additional changes were required for the "unnamedplus"
- support.
- BF: YRGetMultiple reported an error, though typically you would
- use YRShow to paste the items.
-
- 12.0: September 16, 2011
- NF: Added support for the clipboard option "unnamedplus" which was
- added after 7.3 (Hong Xu).
- NF: When displaying the YankRing using YRShow, a new command "R"
- has been added to display all of Vim's registers [0-9a-z].
- BF: YRMapsDelete did not remove the normal mode @ map, which
- interfers with recorded macros (Philippe Vaucher).
-
- 11.0: August 09, 2010
- NF: Documented the global variables to customize the location
- of the YankRing menu.
- NF: The YankRing menu now shows the maps used for the default
- actions to help learn them more easily.
- NF: Added g:yankring_menu_root and g:yankring_menu_priority
- (David Barsam).
- NF: Added a warning indicating a stored value has been truncated
- based on g:yankring_max_element_length and a new option to
- suppress this warning, g:yankring_warn_on_truncate (Hans-Günter).
- BF: The YRAfterMaps() function (if it exists) was not re-run if
- YRToggle was used to disable and enable the YankRing.
- BF: Multibyte strings may not have been pasted correctly (Dr. Chip).
- BF: When pasting a string of 1111's, and additional -1 could also
- be included in the output.
-
- 10.0: January 31, 2010
- NF: Change the buffer name to [YankRing] to resemble other
- non-user buffers.
- NF: Added g:yankring_min_element_length which can prevent
- items from being added to the YankRing if they are too small.
- For example, single character deletes (Vedran M).
- BF: When shifting focus back to Vim, the YankRing may incorrectly
- report: "YR:Failed to change to the yankring buffer,
- please contact author".
- BF: When entering Vim for the first time and hitting "p"
- nothing was pasted (Mark Huiskes).
- BF: When entering Vim for the first time and the
- yankring_clipboard_monitor = 1, the clipboard entry
- was not automatically added to the yankring.
- BF: When overriding the default and setting
- g:yankring_window_use_bottom = 0, the YankRing would
- report the error (Sergey Khorev):
- E21: Cannot make changes, 'modifiable' is off
-
- 9.0: August 29, 2009:
- BF: You cannot execute a macro with ":normal @a". It is still
- not possible, but you can execute it with ":normal! @a"
- (A S Budden).
- BF: When g:yankring_persist = 0 the YankRing could go into
- an infinite loop (A S Budden).
- BF: When replaying a macro which used any of the zap
- keys (f,F,t,T,/,?) you were prompted again for the
- string to match on (Ovidiu C).
- BF: When checking the clipboard for changes
- (g:yankring_clipboard_monitor == 1) only add the item
- if it is not already in the ring. Previously, the item
- was moved to the top of the YankRing each time you flipped
- focus.
-
- 8.0: December 21, 2008:
- NF: Changed the implementation of YRGetSearch() (David Liang).
- BF: Under some unknown circumstances, the yankring can fail
- to change to the correct buffer. Put in code to double
- check and abort.
- BF: Yanking and pasting a line which ends in a backslash
- resulted in the backslash being replaced by "@@@".
- BF: When repeating a command (".") which used any of the zap
- keys (f,F,t,T,/,?) you were prompted again for the
- string to match on (Vasilii Pascal).
-
- 7.0: November 14, 2008:
- NF: Added support for the / and ? motions so that y/search is
- supported (Vasilii Pascal).
- NF: When the YankRing window is displayed (or updated) an additional
- check is made against the default register. If it has changed
- since the YankRing recorded it, the value will be added to the
- history.
- NF: Added support for more motions h, j, k, l, H, M, L, ^, 0, -, +, _.
- And a pile of g motions g_, g^, gm, g$, gk, gj, gg, ge, gE.
- NF: The YankRing window will display a message it is operating
- in a limited mode if not using Vim 7.2 or the correct patch
- level.
- BF: Correction to some internal code which could lead to an
- endless loop (John Beckett).
- BF: Opening and closing the YankRing window with "set report=0"
- reported "1 line less" messages (Bill McCarthy).
- BF: Changed the default value of g:yankring_paste_check_default_buffer
- to check if the default paste buffer has changed when pressing
- 'p'. For example, if a plugin has changed the default registers
- it will be pasted rather than the top item from the YankRing.
- BF: YRMapsDelete did not remove all the maps created by the YankRing.
- BF: Under particular circumstances, yanking text with embedded @
- characters were not properly stored and retrieved from the
- YankRing (Andrew Long).
- BF: Changed to use xmaps instead of vmaps so that the maps only work
- in visual mode and not select mode (David Liang).
-
- 6.1: October 31, 2008:
- BF: If the g:yankring_history_dir contains spaces (default on
- Windows) an error was reported. A simple work around was to
- let g:yankring_history_dir = 'c:\Vim' or no spaces (Matt).
-
- 6.0: October 25, 2008:
- NF: The YankRing now maintains the history in a file. This means
- if you are running multiple instances of Vim, they all see
- the same yankring.
- NF: The location and name of the file is configurable by the user.
- NF: The g:yankring_separator is no longer used and has been removed.
- NF: The g:yankring_max_element_length can be used to limit the size
- of an element in the yankring.
- NF: The g:yankring_share_between_instances can be used to indicate
- whether each instance of Vim running on a machine should share
- the history file or whether each should have their own
- individual history file.
- NF: The g:yankring_clipboard_monitor can be used to indicate
- whether changes to the system clipboard should be added to the
- YankRing (default is on).
- NF: The YankRing window can toggle the clipboard monitor by pressing
- 'c'. See the help in the window by pressing ?.
- NF: Added some highlighting to the YankRing window (Marty Grenfell).
-
- 5.0: September 21, 2008:
- NF: The YankRing can recognize certain Vim commands which do not
- change the contents of a buffer and not attempt to capture it.
- NF: The global variables which allow you to customize the behaviour
- are now space separated instead of comma separated. This
- provides greater flexibility but will require you to modify
- your vimrc (if you have customized it). (Andy Wokula)
- BF: If using <C-O> from within insert mode, the YankRing inserted
- characters into the buffer instead of capturing the changes,
- this was fixed by Andy Wokula (Agathoklis Hatzimanikas).
- BF: The YankRing did not properly account for all the different
- forms of counts "5yy" worked but "y5y" did not (Edwin Shao).
-
- 4.1: August 9, 2008:
- NF: The YankRing now allows you to override which operators should
- be ignored (yankring_ignore_operator). By default this is
- set for the standard Vim operators which do not modify any
- registers (Examples: = and gu) (Andy Wokula).
- NF: The YankRing did not map v_x (Matt Tolton).
- BF: The expression register (quote=) was not accounted for correctly
- (Agathoklis Hatzimanikas).
- BF: Using the v:operator variable must be escaped when used in
- a regular expression.
-
- 4.0: June 24, 2008:
- NF: The YankRing by default now captures all |text-objects| and
- all motions (|motion.txt|) which Vim supports. Version 3.0 only
- supported a subset of the basic motion commands.
- NF: Prior to this version only predefined maps triggered the
- capture of data into the yankring. These maps only supported
- yanks and deletes. The YankRing now also supports
- operator-pending mode, which allows a greater range of operations
- to be automatically captured and added to the yankring.
- Operating pending mode functionality requires Vim 7.2 or Vim 7.1
- with patch #205. If using Vim 7.1 you can determine this with:
- echo has("patch205")
- NF: Prior to this version only yanks and deletes were registered
- in the yankring. Changes are now also captured into the
- yankring.
- NF: The YankRing will also capture the system cliboard when focus is
- returned to the vim window. This is useful if you copy text
- between applications.
- NF: The YankRing window always opened bottom horizontal. Now it
- can be opened top or bottom and horizontal or vertically.
- This can be controlled via variables in your .vimrc.
- BF: The YankRing has an option to persist between instances
- of Vim by storing the values in global variables within
- the viminfo. This has led to some unusual ordering of
- items in the ring from conflicts between instances.
- This option has been turn off by default.
- BF: Their was an issue with yanking using y$.
-
- 3.1: September 10, 2007:
- NF: YRClear will now unlet all global variables it uses to store
- the data if the persist storage is specified (the default).
- Large values in the viminfo file could possibly affect other
- applications.
-
- 3.0: September 7, 2007:
- NF: Converted the YankRing to use the new Vim7's List object which
- means it is no longer compatible with Vim6.
- NF: By default the YankRing will now maintain the yankring's items
- persistently by default. It does this via the |viminfo| file.
- This means the contents of the YankRing rely on the internal
- variables of only 1 Vim instance.
- BF: YRToggle was not unmapping 'gp' and 'gP'.
- BF: YRSearch prompted the user for a regex even if one was provided
- on the command line.
- BF: If g:yankring_manage_numbered_reg is enabled, the "." operator
- did not correctly repeat the previous action (Pedro DeRose).
-
- 2.2: November 1, 2005:
- NF: Added 'x' to the list of yankring_n_keys. This is very useful
- in visual mode since it can delete a lot of characters.
-
- 2.2: October 19, 2005:
- BF: If you pressed '?' to toggle the display of the help in the
- YankRing window, the window would close. This also applied to
- 'a', which allowed you to toggle the autoclose feature.
-
- 2.1: October 11, 2005:
- NF: Added the ability for the YankRing to override Vim's numbered
- registers. Instead of the numbered registers holding the last
- yanked value, and the 9 previous deletes, they will now reflect
- the top 10 items in the yankring. This allows you to reference
- them directly with "5p.
-
- 2.0: August 20, 2005:
- NF: Much improved usability, the YankRing now has a "GUI" to service
- the yankring. If YRShow or YRSearch is used, a split buffer is
- opened which displays all the elements in the yankring. There
- are a number of maps that allow you to interact with the
- contents. The window can be positioned vertically or
- horizontally as well as being sized all through options
- specified in your vimrc.
- NF: YRPop can now delete any items from the yankring, rather
- that just from the top.
- NF: YRSetTop has been removed, it is no longer required as the
- internal representation of the YankRing has changed.
- BF: If g:yankring_ignore_duplicate is set (which is the default)
- you could get some unpredicable results when moving
- backwards and forwards (<C-P> and <C-N>) through the
- previous values.
-
- 1.7: June 10, 2005:
- BF: The expression register support added in version 1.6 used
- getreg('='), which has the side effect of executing the
- expression register. Depending on what was in the register
- this could have unusual results. Changed to use histget().
-
- 1.6: April 20, 2005:
- NF: YRSearch is similar to YRGetElem. Given a regular expression
- it will interactively display all the elements in the yankring
- that match the regular expression. You can enter the number
- of the element to paste it. If you have many elements within
- the yankring, this can help you identify them more easily.
- NF: Updated the default history size from 30 to 100, which is
- partially the reason for the YRSearch command.
- NF: By default it supports "gp" and "gP", in addition to "p" and "P".
- NF: Added support for the expression register (:h quote=). Here
- is an example of how it is used:
- "="X"<CR>P
-
- 1.5: March 30, 2005:
- NF: The YankRing now respects the cpoptions setting, if 'y' is
- included and you press '.', the previous yank command is executed
- and added to the yankring. You can also add this behaviour by
- setting this in your |vimrc|: >
- let g:yankring_dot_repeat_yank = 1
-< NF: Duplicates will not be added to the YankRing by default. If
- a duplicate is found, the element will be moved to the top
- of the yankring. This can be controlled by setting this in
- your |vimrc|: >
- let g:yankring_ignore_duplicate = 0 (1 is default)
-< BF: Regression from version 1.4, the '.' operator may incorrectly
- insert garbage.
-
- 1.4: March 28, 2005:
- NF: YRToggle has been updated. If you toggle the YankRing off
- (disable) the maps it creates are removed. Calling YRToggle
- again will recreate the maps. This truly disables the yankring,
- where the previous version attempted to do this via code.
- BF: Using the '.' operator was not correctly replaying operations
- that did not move text in some way (g~t_) changed the case
- of the text but a '.' did not replay it.
- BF: When replacing previously pasted text the YankRing did not
- respect what key was used to paste the text originally.
- All replaced items were pasted using 'p', even if you had
- originally pasted the text with 'P'.
-
- 1.3: March 16, 2005:
- BF: The '.' operator did not handle the <<, >> shift operator.
- Pressing '.' would result in the previous YankRing operation
- instead of repeating the shift.
-
- 1.2: March 14, 2005:
- NF: Added support for '.' operator to repeat the last change.
- NF: Changed YRGetElem to show the contents of the yankring
- and allow you to choose which element you want pasted.
- It is only interactive if you do not provide a parameter.
- NF: Added 'ygg,dgg' default maps by extending the yankring_n_keys
- variable.
-
- 1.1: March 09, 2005:
- NF: Added support for the black hole register |quote_|.
- NF: Custom Maps allows the user to more finely tune the yankring
- maps to perform whatever action they require. This function,
- YRRunAfterMaps(), is run automatically after the YankRing
- creates it's default mappings. See |yankring-custom-maps|.
- NF: Added some more default maps by extending the yankring_n_keys
- variable. It now contains:
- yy,dd,yw,dw,ye,de,yE,dE,yiw,diw,yaw,daw,y$,d$,Y,D,yG,dG
- NOTE: You can easily extend these default mappings by
- creating this global variable in your |vimrc|, you do not
- have to wait for the plugin to be updated.
- NF: Added support for Dr. Chips GetLatestVimScripts plugin.
- BF: The check for g:yankring_n_keys was incorrect, so it was not
- possible to override the default maps.
-
- 1.0: March 08, 2005:
- NF: Initial release.
-
-vim: ts=4 ft=help tw=78
--- a/vim/bundle/yankring/plugin/yankring.vim Fri Jun 14 17:10:17 2013 -0400
+++ /dev/null Thu Jan 01 00:00:00 1970 +0000
@@ -1,2766 +0,0 @@
-" yankring.vim - Yank / Delete Ring for Vim
-" ---------------------------------------------------------------
-" Version: 14.0
-" Author: David Fishburn <dfishburn dot vim at gmail dot com>
-" Maintainer: David Fishburn <dfishburn dot vim at gmail dot com>
-" Last Modified: 2012 Mar 23
-" Script: http://www.vim.org/scripts/script.php?script_id=1234
-" Based On: Mocked up version by Yegappan Lakshmanan
-" http://groups.yahoo.com/group/vim/post?act=reply&messageNum=34406
-" License: GPL (Gnu Public License)
-" GetLatestVimScripts: 1234 1 :AutoInstall: yankring.vim
-
-if exists('loaded_yankring')
- finish
-endif
-
-if v:version < 700
- echomsg 'yankring: You need at least Vim 7.0'
- finish
-endif
-
-let loaded_yankring = 140
-
-" Turn on support for line continuations when creating the script
-let s:cpo_save = &cpo
-set cpo&vim
-
-let s:yr_has_voperator = 0
-if v:version > 701 || ( v:version == 701 && has("patch205") )
- let s:yr_has_voperator = 1
-endif
-
-if !exists('g:yankring_history_dir')
- let g:yankring_history_dir = expand('$HOME')
-else
- let g:yankring_history_dir = expand(g:yankring_history_dir)
-endif
-
-if !exists('g:yankring_history_file')
- let g:yankring_history_file = 'yankring_history'
-endif
-
-" Allow the user to override the # of yanks/deletes recorded
-if !exists('g:yankring_max_history')
- let g:yankring_max_history = 100
-elseif g:yankring_max_history < 0
- let g:yankring_max_history = 100
-endif
-
-" Specify the minimum length of 1 entry
-if !exists('g:yankring_min_element_length')
- let g:yankring_min_element_length = 1
-endif
-
-" Specify the maximum length of 1 entry (1MB default)
-if !exists('g:yankring_max_element_length')
- let g:yankring_max_element_length = 1048576
-endif
-
-" Warn if truncation occurs
-if !exists('g:yankring_warn_on_truncate')
- let g:yankring_warn_on_truncate = 1
-endif
-
-" Allow the user to specify if the plugin is enabled or not
-if !exists('g:yankring_enabled')
- let g:yankring_enabled = 1
-endif
-
-" Specify max display length for each element for YRShow
-if !exists('g:yankring_max_display')
- let g:yankring_max_display = 0
-endif
-
-" Check if yankring should persist between Vim instances
-if !exists('g:yankring_persist')
- let g:yankring_persist = 1
-endif
-
-" Check if yankring share 1 file between all instances of Vim
-if !exists('g:yankring_share_between_instances')
- let g:yankring_share_between_instances = 1
-endif
-
-" Specify whether the results of the ring should be displayed
-" in a separate buffer window instead of the use of echo
-if !exists('g:yankring_window_use_separate')
- let g:yankring_window_use_separate = 1
-endif
-
-" Specifies whether the window is closed after an action
-" is performed
-if !exists('g:yankring_window_auto_close')
- let g:yankring_window_auto_close = 1
-endif
-
-" When displaying the buffer, how many lines should it be
-if !exists('g:yankring_window_height')
- let g:yankring_window_height = 8
-endif
-
-" When displaying the buffer, how many columns should it be
-if !exists('g:yankring_window_width')
- let g:yankring_window_width = 30
-endif
-
-" When displaying the buffer, where it should be placed
-if !exists('g:yankring_window_use_horiz')
- let g:yankring_window_use_horiz = 1
-endif
-
-" When displaying the buffer, where it should be placed
-if !exists('g:yankring_window_use_bottom')
- let g:yankring_window_use_bottom = 1
-endif
-
-" When displaying the buffer, where it should be placed
-if !exists('g:yankring_window_use_right')
- let g:yankring_window_use_right = 1
-endif
-
-" If the user presses <space>, toggle the width of the window
-if !exists('g:yankring_window_increment')
- let g:yankring_window_increment = 50
-endif
-
-" Controls whether the . operator will repeat yank operations
-" The default is based on cpoptions: |cpo-y|
-" y A yank command can be redone with ".".
-if !exists('g:yankring_dot_repeat_yank')
- let g:yankring_dot_repeat_yank = (s:cpo_save=~'y'?1:0)
-endif
-
-" Only adds unique items to the yankring.
-" If the item already exists, that element is set as the
-" top of the yankring.
-if !exists('g:yankring_ignore_duplicate')
- let g:yankring_ignore_duplicate = 1
-endif
-
-" Vim automatically manages the numbered registers:
-" 0 - last yanked text
-" 1-9 - last deleted items
-" If this option is turned on, the yankring will manage the
-" values in them.
-if !exists('g:yankring_manage_numbered_reg')
- let g:yankring_manage_numbered_reg = 0
-endif
-
-" Allow the user to specify what characters to use for the mappings.
-if !exists('g:yankring_n_keys')
- " 7.1.patch205 introduces the v:operator function which was essential
- " to gain the omap support.
- if s:yr_has_voperator == 1
- " Use omaps for the rest of the functionality
- let g:yankring_n_keys = 'Y D x X'
- else
- let g:yankring_n_keys = 'x yy dd yw dw ye de yE dE yiw diw yaw daw y$ d$ Y D yG dG ygg dgg'
- endif
-endif
-
-" Allow the user to specify what operator pending motions to map
-if !exists('g:yankring_o_keys')
- " o-motions and text objects, without zap-to-char motions
- let g:yankring_o_keys = 'b B w W e E d h j k l H M L y G ^ 0 $ , ;'
- let g:yankring_o_keys .= ' g_ g^ gm g$ gk gj gg ge gE - + _ '
- let g:yankring_o_keys .= ' iw iW aw aW as is ap ip a] a[ i] i[ a) a( ab i) i( ib a> a< i> i< at it a} a{ aB i} i{ iB a" a'' a` i" i'' i`'
-endif
-
-if !exists('g:yankring_zap_keys')
- let g:yankring_zap_keys = 'f F t T / ?'
-endif
-
-" Allow the user to specify what operator pending motions to map
-if !exists('g:yankring_ignore_operator')
- let g:yankring_ignore_operator = 'g~ gu gU ! = gq g? > < zf g@'
-endif
-let g:yankring_ignore_operator = ' '.g:yankring_ignore_operator.' '
-
-" Whether we should map the . operator
-if !exists('g:yankring_map_dot')
- let g:yankring_map_dot = 1
-endif
-
-" Whether we sould map the "g" paste operators
-if !exists('g:yankring_paste_using_g')
- let g:yankring_paste_using_g = 1
-endif
-
-if !exists('g:yankring_v_key')
- let g:yankring_v_key = 'y'
-endif
-
-if !exists('g:yankring_del_v_key')
- let g:yankring_del_v_key = 'd x'
-endif
-
-if !exists('g:yankring_paste_n_bkey')
- let g:yankring_paste_n_bkey = 'P'
-endif
-
-if !exists('g:yankring_paste_n_akey')
- let g:yankring_paste_n_akey = 'p'
-endif
-
-if !exists('g:yankring_paste_v_bkey')
- let g:yankring_paste_v_bkey = 'P'
-endif
-
-if !exists('g:yankring_paste_v_akey')
- let g:yankring_paste_v_akey = 'p'
-endif
-
-if !exists('g:yankring_paste_check_default_buffer')
- let g:yankring_paste_check_default_buffer = 1
-endif
-
-if !exists('g:yankring_replace_n_pkey')
- let g:yankring_replace_n_pkey = '<C-P>'
-endif
-
-if !exists('g:yankring_replace_n_nkey')
- let g:yankring_replace_n_nkey = '<C-N>'
-endif
-
-if !exists('g:yankring_clipboard_monitor')
- let g:yankring_clipboard_monitor = (has('clipboard')?1:0)
-endif
-
-if !exists('g:yankring_manual_clipboard_check')
- let g:yankring_manual_clipboard_check = 0
- if g:yankring_clipboard_monitor == 1
- if has("gui_running")
- " FocusGained event will take care of
- " monitoring the clipboard.
- let g:yankring_manual_clipboard_check = 0
- else
- " If the GUI is not running and the user wants to monitor the
- " clipboard, we need to manually check for clipboard entries as
- " the FocusGained event does not fire in console mode.
- let g:yankring_manual_clipboard_check = 1
- endif
- endif
-endif
-
-if !exists('g:yankring_default_menu_mode')
- let g:yankring_default_menu_mode = 3
-endif
-
-" Script variables for the yankring buffer
-let s:yr_buffer_name = '[YankRing]'
-let s:yr_buffer_last_winnr = -1
-let s:yr_buffer_last = -1
-let s:yr_buffer_id = -1
-let s:yr_search = ''
-let s:yr_remove_omap_dot = 0
-let s:yr_history_version = 'v2'
-let s:yr_history_v1_nl = '@@@'
-let s:yr_history_v1_nl_pat = '\%(\\\)\@<!@@@'
-let s:yr_history_v2_nl = "\2" " Use double quotes for a special character
-let s:yr_history_v2_nl_pat = "\2"
-let s:yr_history_last_upd = 0
-let s:yr_history_file_v1 =
- \ g:yankring_history_dir.'/'.
- \ g:yankring_history_file.
- \ (g:yankring_share_between_instances==1?'':'_'.v:servername).
- \ '.txt'
-let s:yr_history_file_v2 =
- \ g:yankring_history_dir.'/'.
- \ g:yankring_history_file.
- \ (g:yankring_share_between_instances==1?'':'_'.v:servername).
- \ '_v2.txt'
-
-
-" Vim window size is changed by the yankring plugin or not
-let s:yr_winsize_chgd = 0
-let s:yr_maps_created = 0
-let s:yr_maps_created_zap = 0
-let s:yr_last_motion = ''
-
-" Enables or disables the yankring
-function! s:YRToggle(...)
- " Default the current state to toggle
- let new_state = ((g:yankring_enabled == 1) ? 0 : 1)
-
- " Allow the user to specify if enabled
- if a:0 > 0
- let new_state = ((a:1 == 1) ? 1 : 0)
- endif
-
- " YRToggle accepts an integer value to specify the state
- if new_state == g:yankring_enabled
- return
- elseif new_state == 1
- call s:YRMapsCreate()
- call s:YRWarningMsg('YR: The YankRing is now enabled')
- else
- call s:YRMapsDelete()
- call s:YRWarningMsg('YR: The YankRing is now disabled')
- endif
-endfunction
-
-" Enables or disables the yankring
-function! s:YRDisplayElem(disp_nbr, script_var)
- if g:yankring_max_display == 0
- if g:yankring_window_use_separate == 1
- let max_display = 500
- else
- let max_display = g:yankring_window_width +
- \ g:yankring_window_increment -
- \ 12
- endif
- else
- let max_display = g:yankring_max_display
- endif
-
- let elem = matchstr(a:script_var, '^.*\ze,.*$')
- if s:yr_history_version == 'v1'
- " v1
- " let elem = substitute(elem, '\%(\\\)\@<!@@@', '\\n', 'g')
- " v2
- let elem = substitute(elem, s:yr_history_v1_nl_pat, '\\n', 'g')
- let elem = substitute(elem, '\\@', '@', 'g')
- else
- let elem = substitute(elem, s:yr_history_v2_nl_pat, '\\n', 'g')
- endif
- let length = strlen(elem)
- " Fancy trick to align them all regardless of how many
- " digits the element # is
- return a:disp_nbr.
- \ strtrans(
- \ strpart(" ",0,(6-strlen(a:disp_nbr+1))).
- \ (
- \ (length>max_display)?
- \ (strpart(elem,0,max_display).
- \ '...'):
- \ elem
- \ )
- \ )
-
- return ""
-endfunction
-
-" Enables or disables the yankring
-function! s:YRShow(...)
- " Prevent recursion
- if exists('s:yankring_showing') && s:yankring_showing == 1
- " call s:YRWarningMsg('YR: YRShow aborting for recursion')
- return
- endif
-
- if g:yankring_enabled == 0
- call s:YRWarningMsg('YR: The YankRing is disabled, use YRToggle to re-enable')
- return
- endif
-
- " Prevent recursion
- let s:yankring_showing = 1
-
- " If the GUI is not running, we need to manually check for clipboard
- " entries as the FocusGained event does not fire in console mode.
- if g:yankring_manual_clipboard_check == 1
- call s:YRCheckClipboard()
- endif
-
- " If no parameter was provided assume the user wants to
- " toggle the display.
- let toggle = 1
- if a:0 > 0
- let toggle = matchstr(a:1, '\d\+')
- endif
-
- let show_registers = 0
- if a:0 > 1 && a:2 ==# 'R'
- let show_registers = 1
- endif
-
- if toggle == 1
- if bufwinnr(s:yr_buffer_id) > -1
- " If the YankRing window is already open close it
- exec bufwinnr(s:yr_buffer_id) . "wincmd w"
- hide
-
- " Switch back to the window which the YankRing
- " window was opened from
- if bufwinnr(s:yr_buffer_last) != -1
- " If the buffer is visible, switch to it
- exec s:yr_buffer_last_winnr . "wincmd w"
- endif
-
- " Prevent recursion
- let s:yankring_showing = 0
-
- return
- endif
- endif
-
- " Reset the search string, since this is automatically called
- " if the yankring window is open. A previous search must be
- " cleared since we do not want to show new items. The user can
- " always run the search again.
- let s:yr_search = ""
-
- " It is possible for registers to be changed outside of the
- " maps of the YankRing. Perform this quick check when we
- " show the contents (or when it is refreshed).
- if g:yankring_paste_check_default_buffer == 1
- let save_reg = 0
- let register = ((&clipboard=~'\<unnamed\>')?'*':((&clipboard=~'\<unnamedplus\>' && has('unnamedplus'))?'+':'"'))
-
- if &clipboard =~ '\<unnamed\>' && getreg('*') != s:yr_prev_clipboard_star
- let save_reg = 1
- endif
- if has('unnamedplus') && &clipboard =~ '\<unnamedplus\>' && getreg('+') != s:yr_prev_clipboard_plus
- let save_reg = 1
- endif
- if register == '"' && getreg('"') != s:yr_prev_reg_unnamed
- let save_reg = 1
- endif
-
- if save_reg == 1
- " The user has performed a yank / delete operation
- " outside of the yankring maps. Add this
- " value to the yankring.
- call YRRecord(register)
- endif
- endif
-
- " List is shown in order of replacement
- " assuming using previous yanks
- let output = "--- YankRing ---\n"
- let output = output . (show_registers == 1 ? 'Reg ' : 'Elem')." Content\n"
-
- if show_registers == 1
- for reg_name in map( range(char2nr('0'), char2nr('9')) +
- \ (range(char2nr('a'), char2nr('z')))
- \, 'nr2char(v:val)'
- \ )
- let output = output . s:YRDisplayElem(reg_name, getreg(reg_name).',') . "\n"
- endfor
- else
- call s:YRHistoryRead()
- let disp_item_nr = 1
- for elem in s:yr_history_list
- let output = output . s:YRDisplayElem(disp_item_nr, elem) . "\n"
- let disp_item_nr += 1
- endfor
- endif
-
- if g:yankring_window_use_separate == 1
- call s:YRWindowOpen(output)
- else
- echo output
- endif
-
- " Prevent recursion
- let s:yankring_showing = 0
-endfunction
-
-
-" Used in omaps if a following character is required
-" like with motions (f,t)
-function! s:YRGetChar()
- let msg = "YR:Enter character:"
- echomsg msg
- let c = getchar()
- if c =~ '^\d\+$'
- let c = nr2char(c)
- echomsg msg.c
- endif
- return c
-endfunction
-
-
-" Used in omaps if a following string is required
-" like with motions (/,?)
-" function! s:YRGetSearch()
-" " let msg = "YR:Enter string:"
-" " echomsg msg
-" let str = input("YR:Enter string:")
-" " let str = ''
-" " while 1==1
-" " let c = getchar()
-" " if c =~ '^\d\+$'
-" " let c = nr2char(c)
-" " if c == "\<C-C>"
-" " return c
-" " endif
-" " if c == "\<CR>"
-" " break
-" " endif
-" " let str = str.c
-" " echomsg msg.str
-" " else
-" " break
-" " endif
-" " endwhile
-" return str
-" endfunction
-
-
-" Paste a certain item from the yankring
-" If no parameter is provided, this function becomes interactive. It will
-" display the list (using YRShow) and allow the user to choose an element.
-function! s:YRGetElem(...)
- if g:yankring_manual_clipboard_check == 1
- call s:YRCheckClipboard()
- endif
-
- if s:yr_count == 0
- call s:YRWarningMsg('YR: yankring is empty')
- return -1
- endif
-
- let default_buffer = ((&clipboard=~'\<unnamed\>')?'*':((&clipboard=~'\<unnamedplus\>' && has('unnamedplus'))?'+':'"'))
-
- let direction = 'p'
- if a:0 > 1
- " If the user indicated to paste above or below
- " let direction = ((a:2 ==# 'P') ? 'P' : 'p')
- if a:2 =~ '\(p\|gp\|P\|gP\)'
- let direction = a:2
- endif
- endif
-
- " Check to see if a specific value has been provided
- let elem = 0
- if a:0 > 0
- " Ensure we get only the numeric value (trim it)
- let elem = matchstr(a:1, '\d\+')
- let elem = elem - 1
- else
- " If no parameter was supplied display the yankring
- " and prompt the user to enter the value they want pasted.
- call s:YRShow(0)
-
- if g:yankring_window_use_separate == 1
- " The window buffer is used instead of command line
- return
- endif
-
- let elem = input("Enter # to paste:")
-
- " Ensure we get only the numeric value (trim it)
- let elem = matchstr(elem, '\d\+')
-
- if elem == ''
- " They most likely pressed enter without entering a value
- return
- endif
-
- let elem = elem - 1
- endif
-
- if elem < 0 || elem >= s:yr_count
- call s:YRWarningMsg("YR: Invalid choice:".elem)
- return -1
- endif
-
- let default_buffer = ((&clipboard=~'\<unnamed\>')?'*':((&clipboard=~'\<unnamedplus\>' && has('unnamedplus'))?'+':'"'))
- call setreg(default_buffer
- \ , s:YRGetValElemNbr((elem), 'v')
- \ , s:YRGetValElemNbr((elem), 't')
- \ )
- exec 'normal! "'.default_buffer.direction
-
- " Set the previous action as a paste in case the user
- " press . to repeat
- call s:YRSetPrevOP('p', '', default_buffer, 'n')
-
-endfunction
-
-
-" Starting the top of the ring it will paste x items from it
-function! s:YRGetMultiple(reverse_order, ...)
- if g:yankring_manual_clipboard_check == 1
- call s:YRCheckClipboard()
- endif
-
- if s:yr_count == 0
- call s:YRWarningMsg('YR: yankring is empty')
- return
- endif
-
- let max = 1
- if a:0 == 1
- " If the user provided a range, exit after that many
- " have been displayed
- let max = matchstr(a:1, '\d\+')
- endif
- if max > s:yr_count
- " Default to all items if they specified a very high value
- let max = s:yr_count
- endif
-
- " Base the increment on the sort order of the results
- let increment = ((a:reverse_order==0)?(1):(-1))
- if a:reverse_order == 0
- let increment = 1
- let elem = 1
- else
- let increment = -1
- let elem = max
- endif
-
- if a:0 > 1
- let iter = 1
- while iter <= a:0
- let elem = (a:{iter} - 1)
- call s:YRGetElem(elem)
- let iter = iter + 1
- endwhile
- else
- while max > 0
- " Paste the first item, and move on to the next.
- call s:YRGetElem(elem)
- let elem = elem + increment
- let max = max - 1
- endwhile
- endif
-endfunction
-
-
-" Given a regular expression, check each element within
-" the yankring, display only the matching items and prompt
-" the user for which item to paste
-function! s:YRSearch(...)
- if s:yr_count == 0
- call s:YRWarningMsg('YR: yankring is empty')
- return
- endif
-
- let s:yr_search = ""
- " If the user provided a range, exit after that many
- " have been displayed
- if a:0 == 0 || (a:0 == 1 && a:1 == "")
- let s:yr_search = input('Enter [optional] regex:')
- else
- let s:yr_search = a:1
- endif
-
- if s:yr_search == ""
- " Show the entire yankring
- call s:YRShow(0)
- return
- endif
-
- " List is shown in order of replacement
- " assuming using previous yanks
- let output = "--- YankRing ---\n"
- let output = output . "Elem Content\n"
- let valid_choices = []
-
- let search_result = filter(copy(s:yr_history_list), "v:val =~ '".s:yr_search."'")
-
- let disp_item_nr = 1
-
- for elem in s:yr_history_list
- if elem =~ s:yr_search
- let output = output . s:YRDisplayElem(disp_item_nr, elem) . "\n"
- call add(valid_choices, disp_item_nr.'')
- endif
- let disp_item_nr += 1
- endfor
-
- if len(valid_choices) == 0
- let output = output . "Search for [".s:yr_search."] did not match any items "
- endif
-
- if g:yankring_window_use_separate == 1
- call s:YRWindowOpen(output)
- else
- if len(valid_choices) > 0
- echo output
- let elem = input("Enter # to paste:")
-
- " Ensure we get only the numeric value (trim it)
- let elem = matchstr(elem, '\d\+')
-
- if elem == ''
- " They most likely pressed enter without entering a value
- return
- endif
-
- if index(valid_choices, elem) != -1
- exec 'YRGetElem ' . elem
- else
- " User did not choose one of the elements that were found
- " Remove leading ,
- call s:YRWarningMsg( "YR: Item[" . elem . "] not found, only valid choices are[" .
- \ join(valid_choices, ',') .
- \ "]"
- \ )
- return -1
- endif
-
- else
- call s:YRWarningMsg( "YR: The pattern [" .
- \ s:yr_search .
- \ "] does not match any items in the yankring"
- \ )
- endif
- endif
-
-endfunction
-
-
-" Resets the common script variables for managing the ring.
-function! s:YRReset()
- call s:YRHistoryDelete()
- " Update the history file
- call s:YRHistorySave()
-endfunction
-
-
-" Clears the yankring by simply setting the # of items in it to 0.
-" There is no need physically unlet each variable.
-function! s:YRInit(...)
- let s:yr_next_idx = 0
- let s:yr_last_paste_idx = 1
- let s:yr_count = 0
- let s:yr_history_last_upd = 0
- let s:yr_history_list = []
- let s:yr_paste_dir = 'p'
-
- " For the . op support
- let s:yr_prev_op_code = ''
- let s:yr_prev_op_mode = 'n'
- let s:yr_prev_count = ''
- let s:yr_prev_reg = ''
- let s:yr_prev_reg_unnamed = getreg('"')
- let s:yr_prev_reg_small = ''
- let s:yr_prev_reg_insert = ''
- let s:yr_prev_reg_expres = ''
- let s:yr_prev_clipboard_star = ''
- let s:yr_prev_clipboard_plus = ''
- let s:yr_prev_vis_lstart = 0
- let s:yr_prev_vis_lend = 0
- let s:yr_prev_vis_cstart = 0
- let s:yr_prev_vis_cend = 0
- let s:yr_prev_changenr = 0
- let s:yr_prev_repeating = 0
-
- " This is used to determine if the visual selection should be
- " reset prior to issuing the YRReplace
- let s:yr_prev_vis_mode = 0
-
- if a:0 == 0 && g:yankring_persist == 0
- " The user wants the yankring reset each time Vim is started
- call s:YRClear()
- endif
-
- call s:YRHistoryRead()
-endfunction
-
-
-" Clears the yankring by simply setting the # of items in it to 0.
-function! s:YRClear()
- call s:YRReset()
- call s:YRInit('DoNotClear')
-
- " If the yankring window is open, refresh it
- call s:YRWindowUpdate()
-endfunction
-
-
-" Determine which register the user wants to use
-" For example the 'a' register: "ayy
-function! s:YRRegister()
- " v:register can be blank in some (unknown) cases
- " so test for this condition and return the
- " default register
- let user_register = ((v:register=='')?('"'):(v:register))
- if &clipboard =~ '\<unnamed\>' && user_register == '"'
- let user_register = '*'
- endif
- if has('unnamedplus') && &clipboard =~ '\<unnamedplus\>' && user_register == '"'
- let user_register = '+'
- endif
- return user_register
-endfunction
-
-
-" Allows you to push a new item on the yankring. Useful if something
-" is in the clipboard and you want to add it to the yankring.
-" Or if you yank something that is not mapped.
-function! s:YRPush(...)
- let user_register = s:YRRegister()
-
- if a:0 > 0
- " If no yank command has been supplied, assume it is
- " a full line yank
- let user_register = ((a:1 == '') ? user_register : a:1)
- endif
-
- " If we are pushing something on to the yankring, add it to
- " the default buffer as well so the next item pasted will
- " be the item pushed
- let default_buffer = ((&clipboard=~'\<unnamed\>')?'*':((&clipboard=~'\<unnamedplus\>' && has('unnamedplus'))?'+':'"'))
- call setreg(default_buffer, getreg(user_register),
- \ getregtype(user_register))
-
- call s:YRSetPrevOP('', '', '', 'n')
- call YRRecord(user_register)
-endfunction
-
-
-" Allows you to pop off any element from the yankring.
-" If no parameters are provided the first element is removed.
-" If a vcount is provided, that many elements are removed
-" from the top.
-function! s:YRPop(...)
- if s:yr_count == 0
- call s:YRWarningMsg('YR: yankring is empty')
- return
- endif
-
- let v_count = 1
- if a:0 > 1
- let v_count = a:2
- endif
-
- " If the user provided a parameter, remove that element
- " from the yankring.
- " If no parameter was provided assume the first element.
- let elem_index = 0
- if a:0 > 0
- " Get the element # from the parameter
- let elem_index = matchstr(a:1, '\d\+')
- let elem_index = elem_index - 1
- endif
-
- " If the user entered a count, then remove that many
- " elements from the ring.
- while v_count > 0
- call s:YRMRUDel('s:yr_history_list', elem_index)
- let v_count = v_count - 1
- endwhile
-
- " If the yankring window is open, refresh it
- call s:YRWindowUpdate()
-endfunction
-
-
-" Adds this value to the yankring.
-function! YRRecord(...)
-
- let register = '"'
- if a:0 > 0
- " If no yank command has been supplied, assume it is
- " a full line yank
- let register = ((a:1 == '') ? register : a:1)
- endif
-
- " v:register can be blank in some (unknown) cases
- " if v:register == '' || v:register == '_'
- if v:register == '_'
- " Black hole register, ignore recording the operation
- return ""
- endif
-
- let register = ((&clipboard=~'\<unnamed\>')?'*':((&clipboard=~'\<unnamedplus\>' && has('unnamedplus'))?'+':register))
-
- " let s:yr_prev_changenr = changenr()
- if register == '"'
- " If the change has occurred via an omap, we must delay
- " the capture of the default register until this event
- " since register updates are not reflected until the
- " omap function completes
- let s:yr_prev_reg_unnamed = getreg('"')
- let s:yr_prev_reg_small = getreg('-')
- endif
-
- " Add item to list
- " This will also account for duplicates.
- call s:YRMRUAdd( 's:yr_history_list'
- \ , getreg(register)
- \ , getregtype(register)
- \ )
-
- if g:yankring_clipboard_monitor == 1
- let s:yr_prev_clipboard_plus = getreg('+')
- let s:yr_prev_clipboard_star = getreg('*')
- endif
-
- " Manage the numbered registers
- if g:yankring_manage_numbered_reg == 1
- " Allow the user to define an autocmd to dynamically
- " setup their connection information.
- silent! doautocmd User YRSetNumberedReg
- endif
-
- " If the yankring window is open, refresh it
- call s:YRWindowUpdate()
-
- " Reset the past paste entry to the top of the ring.
- " When the user hits replace last entry it should
- " start from the top (not from the last previous
- " replace) after capturing a new value in the YankRing.
- let s:yr_last_paste_idx = 1
-
- return ""
-endfunction
-
-
-" Adds this value to the yankring.
-function! YRRecord3(...)
- let register = '"'
-
- if a:0 > 0 && a:1 != ''
- let register = a:1
- else
- " v:register can be blank in some (unknown) cases
- " if v:register == '' || v:register == '_'
- if v:register == '_'
- " Black hole register, ignore recording the operation
- return ""
- endif
-
- let register = s:YRRegister()
-
- if &clipboard =~ '\<unnamed\>' && register == '*'
- " unnamed A variant of "unnamed" flag which uses the clipboard
- " register '*' (|quote|) for all operations except yank.
- " Yank shall copy the text into register '*' when "unnamed"
- " is included.
- "
- let register = '*'
-
- " The + and * registers are not modified by yank operations.
- " We do not know what operation triggered this event so do a
- " simple check if the register values have changed.
- " If not, check it against the " register. Use which ever
- " one has changed.
- if s:yr_prev_clipboard_star == '' || getreg(register) == s:yr_prev_clipboard_star
- if getreg('"') != getreg(register)
- let register = '"'
- endif
- endif
- endif
-
- if has('unnamedplus') && &clipboard =~ '\<unnamedplus\>' && register == '+'
- " unnamedplus A variant of "unnamed" flag which uses the clipboard
- " register '+' (|quoteplus|) instead of register '*' for all
- " operations except yank. Yank shall copy the text into
- " register '+' and also into '*' when "unnamed" is included.
- "
- let register = '+'
-
- " The + and * registers are not modified by yank operations.
- " We do not know what operation triggered this event so do a
- " simple check if the register values have changed.
- " If not, check it against the " register. Use which ever
- " one has changed.
- if s:yr_prev_clipboard_plus == '' || getreg(register) == s:yr_prev_clipboard_plus
- if getreg('"') != getreg(register)
- let register = '"'
- endif
- endif
- endif
- endif
-
- if register == '"'
- " If the change has occurred via an omap, we must delay
- " the capture of the default register until this event
- " since register updates are not reflected until the
- " omap function completes
- let s:yr_prev_reg_unnamed = getreg('"')
- let s:yr_prev_reg_small = getreg('-')
- endif
-
- if s:yr_remove_omap_dot == 1
- call s:YRMapsCreate('add_only_zap_keys')
- endif
-
- " Add item to list
- " This will also account for duplicates.
- call s:YRMRUAdd( 's:yr_history_list'
- \ , getreg(register)
- \ , getregtype(register)
- \ )
-
- if g:yankring_clipboard_monitor == 1
- let s:yr_prev_clipboard_plus = getreg('+')
- let s:yr_prev_clipboard_star = getreg('*')
- endif
-
- " Manage the numbered registers
- if g:yankring_manage_numbered_reg == 1
- " Allow the user to define an autocmd to dynamically
- " setup their connection information.
- silent! doautocmd User YRSetNumberedReg
- endif
-
- " If the yankring window is open, refresh it
- call s:YRWindowUpdate()
-
- " Reset the past paste entry to the top of the ring.
- " When the user hits replace last entry it should
- " start from the top (not from the last previous
- " replace) after capturing a new value in the YankRing.
- let s:yr_last_paste_idx = 1
-
- return ""
-endfunction
-
-
-" Record the operation for the dot operator
-function! s:YRSetPrevOP(op_code, count, reg, mode)
- let s:yr_prev_op_code = a:op_code
- let s:yr_prev_op_mode = a:mode
- let s:yr_prev_count = a:count
- let s:yr_prev_changenr = changenr()
- let s:yr_prev_reg = a:reg
- let s:yr_prev_reg_unnamed = getreg('"')
- let s:yr_prev_reg_small = getreg('-')
- let s:yr_prev_reg_insert = getreg('.')
- let s:yr_prev_vis_lstart = line("'<")
- let s:yr_prev_vis_lend = line("'>")
- let s:yr_prev_vis_cstart = col("'<")
- let s:yr_prev_vis_cend = col("'>")
- let s:yr_prev_reg_expres = histget('=', -1)
-
- if a:mode == 'n'
- " In normal mode, the change has already
- " occurred, therefore we can mark the
- " actual position of the change.
- let s:yr_prev_chg_lstart = line("'[")
- let s:yr_prev_chg_lend = line("']")
- let s:yr_prev_chg_cstart = col("'[")
- let s:yr_prev_chg_cend = col("']")
- else
- " If in operator pending mode, the change
- " has not yet occurred. Therefore we cannot
- " use the '[ and ]' markers. But we can
- " store the current line position.
- let s:yr_prev_chg_lstart = line(".")
- let s:yr_prev_chg_lend = line(".")
- let s:yr_prev_chg_cstart = col(".")
- let s:yr_prev_chg_cend = col(".")
- endif
-
- " If storing the last change position (using '[, '])
- " is not good enough, then another option is to:
- " Use :redir on the :changes command
- " and grab the last item. Store this value
- " and compare it is YRDoRepeat.
-endfunction
-
-
-" Adds this value to the yankring.
-function! s:YRDoRepeat()
- let dorepeat = 0
-
- if s:yr_has_voperator == 1
- " Let Vim handle the repeat, just capture the updates
- " as usual.
- return 0
- endif
-
- if s:yr_prev_op_code =~ '^c'
- " You cannot repeat change operations, let Vim's
- " standard mechanism handle these, or the user will
- " be prompted again, instead of repeating the
- " previous change.
- return 0
- endif
-
- if g:yankring_manage_numbered_reg == 1
- " When resetting the numbered register we are
- " must ignore the comparision of the " register.
- if s:yr_prev_reg_small == getreg('-') &&
- \ s:yr_prev_reg_insert == getreg('.') &&
- \ s:yr_prev_reg_expres == histget('=', -1) &&
- \ s:yr_prev_vis_lstart == line("'<") &&
- \ s:yr_prev_vis_lend == line("'>") &&
- \ s:yr_prev_vis_cstart == col("'<") &&
- \ s:yr_prev_vis_cend == col("'>") &&
- \ s:yr_prev_chg_lstart == line("'[") &&
- \ s:yr_prev_chg_lend == line("']") &&
- \ s:yr_prev_chg_cstart == col("'[") &&
- \ s:yr_prev_chg_cend == col("']")
- let dorepeat = 1
- endif
- else
- " Check the previously recorded value of the registers
- " if they are the same, we need to reissue the previous
- " yankring command.
- " If any are different, the user performed a command
- " command that did not involve the yankring, therefore
- " we should just issue the standard "normal! ." to repeat it.
- if s:yr_prev_reg_unnamed == getreg('"') &&
- \ s:yr_prev_reg_small == getreg('-') &&
- \ s:yr_prev_reg_insert == getreg('.') &&
- \ s:yr_prev_reg_expres == histget('=', -1) &&
- \ s:yr_prev_vis_lstart == line("'<") &&
- \ s:yr_prev_vis_lend == line("'>") &&
- \ s:yr_prev_vis_cstart == col("'<") &&
- \ s:yr_prev_vis_cend == col("'>")
- let dorepeat = 1
- endif
- if dorepeat == 1 && s:yr_prev_op_mode == 'n'
- " Hmm, not sure why I was doing this now
- " so I will remove it
- " let dorepeat = 0
- " if s:yr_prev_chg_lstart == line("'[") &&
- " \ s:yr_prev_chg_lend == line("']") &&
- " \ s:yr_prev_chg_cstart == col("'[") &&
- " \ s:yr_prev_chg_cend == col("']")
- " let dorepeat = 1
- " endif
- elseif dorepeat == 1 && s:yr_prev_op_mode == 'o'
- " Hmm, not sure why I was doing this now
- " so I will remove it
- " let dorepeat = 0
- " if s:yr_prev_chg_lstart == line("'[") &&
- " \ s:yr_prev_chg_lend == line("']") &&
- " \ s:yr_prev_chg_cstart == col("'[") &&
- " \ s:yr_prev_chg_cend == col("']")
- " let dorepeat = 1
- " endif
- endif
- endif
-
- " " If another change has happened that was not part of the
- " " yankring we cannot replay it (from the yankring). Use
- " " the standard ".".
- " " If the previous op was a change, do not use the yankring
- " " to repeat it.
- " " changenr() is buffer specific, so anytime you move to
- " " a different buffer you will definitely perform a
- " " standard "."
- " " Any previous op that was a change, must be replaced using "."
- " " since we do not want the user prompted to enter text again.
- " if s:yr_prev_changenr == changenr() && s:yr_prev_op_code !~ '^c'
- " let dorepeat = 1
- " endif
-
- " If we are going to repeat check to see if the
- " previous command was a yank operation. If so determine
- " if yank operations are allowed to be repeated.
- if dorepeat == 1 && s:yr_prev_op_code =~ '^y'
- " This value be default is set based on cpoptions.
- if g:yankring_dot_repeat_yank == 0
- let dorepeat = 0
- endif
- endif
- return dorepeat
-endfunction
-
-
-" Manages the Vim's numbered registers
-function! s:YRSetNumberedReg()
-
- let i = 0
-
- while i <= 10
- if i > s:yr_count
- break
- endif
-
- call setreg( (i)
- \ , s:YRGetValElemNbr((i),'v')
- \ , s:YRGetValElemNbr((i),'t')
- \ )
- let i += 1
- endwhile
-
- " There are a few actions that Vim automatically takes
- " when modifying the numbered registers.
- " Modifying register 1 - changes the named register.
- " It is impossible to set register 2 to a value, since Vim will change it.
-
- " This will at least preserve the default register
- let @" = @0
-endfunction
-
-
-" This internal function will add and subtract values from a starting
-" point and return the correct element number. It takes into account
-" the circular nature of the yankring.
-function! s:YRGetNextElem(start, iter)
-
- let needed_elem = a:start + a:iter
-
- " The yankring is a ring, so if an element is
- " requested beyond the number of elements, we
- " must wrap around the ring.
- if needed_elem > s:yr_count
- let needed_elem = needed_elem % s:yr_count
- endif
-
- if needed_elem == 0
- " Can happen at the end or beginning of the ring
- if a:iter == -1
- " Wrap to the bottom of the ring
- let needed_elem = s:yr_count
- else
- " Wrap to the top of the ring
- let needed_elem = 1
- endif
- elseif needed_elem < 1
- " As we step backwards through the ring we could ask for a negative
- " value, this will wrap it around to the end
- let needed_elem = s:yr_count
- endif
-
- return needed_elem
-
-endfunction
-
-
-" Lets Vim natively perform the operation and then stores what
-" was yanked (or deleted) into the yankring.
-" Supports this for example - 5"ayy
-"
-" This is a legacy function now since the release of Vim 7.2
-" and the use of omaps with YankRing 5.0 and above.
-" If Vim 7.1 has patch205, then the new omaps and the v:operator
-" variable is used instead.
-function! s:YRYankCount(...) range
-
- let user_register = s:YRRegister()
- let v_count = v:count
-
- " Default yank command to the entire line
- let op_code = 'yy'
- if a:0 > 0
- " If no yank command has been supplied, assume it is
- " a full line yank
- let op_code = ((a:1 == '') ? op_code : a:1)
- endif
-
- if op_code == '.'
- if s:YRDoRepeat() == 1
- if s:yr_prev_op_code != ''
- let op_code = s:yr_prev_op_code
- let v_count = s:yr_prev_count
- let user_register = s:yr_prev_reg
- endif
- else
- " Set this flag so that YRRecord will
- " ignore repeats
- let s:yr_prev_repeating = 1
- exec "normal! ."
- return
- endif
- else
- let s:yr_prev_repeating = 0
- endif
-
- " Supports this for example - 5"ayy
- " A delete operation will still place the items in the
- " default registers as well as the named register
- exec "normal! ".
- \ ((v_count > 0)?(v_count):'').
- \ (user_register=='"'?'':'"'.user_register).
- \ op_code
-
- if user_register == '_'
- " Black hole register, ignore recording the operation
- return
- endif
-
- call s:YRSetPrevOP(op_code, v_count, user_register, 'n')
-
- call YRRecord(user_register)
-endfunction
-
-
-" Handles ranges. There are visual ranges and command line ranges.
-" Visual ranges are easy, since we pass through and let Vim deal
-" with those directly.
-" Command line ranges means we must yank the entire line, and not
-" just a portion of it.
-function! s:YRYankRange(do_delete_selection, ...) range
-
- let user_register = s:YRRegister()
- let default_buffer = ((&clipboard=~'\<unnamed\>')?'*':((&clipboard=~'\<unnamedplus\>' && has('unnamedplus'))?'+':'"'))
-
- " Default command mode to normal mode 'n'
- let cmd_mode = 'n'
- if a:0 > 0
- " Change to visual mode, if command executed via
- " a visual map
- let cmd_mode = ((a:1 == 'v') ? 'v' : 'n')
- endif
-
- if cmd_mode == 'v'
- " We are yanking either an entire line, or a range
- exec "normal! gv".
- \ (user_register==default_buffer?'':'"'.user_register).
- \ 'y'
- if a:do_delete_selection == 1
- exec "normal! gv".
- \ (user_register==default_buffer?'':'"'.user_register).
- \ 'd'
- endif
- else
- " In normal mode, always yank the complete line, since this
- " command is for a range. YRYankCount is used for parts
- " of a single line
- if a:do_delete_selection == 1
- exec a:firstline . ',' . a:lastline . 'delete '.user_register
- else
- exec a:firstline . ',' . a:lastline . 'yank ' . user_register
- endif
- endif
-
- if user_register == '_'
- " Black hole register, ignore
- return
- endif
-
- call s:YRSetPrevOP('', '', user_register, 'n')
- call YRRecord(user_register)
-endfunction
-
-
-" Paste from either the yankring or from a specified register
-" Optionally a count can be provided, so paste the same value 10 times
-function! s:YRPaste(replace_last_paste_selection, nextvalue, direction, ...)
- if g:yankring_manual_clipboard_check == 1
- call s:YRCheckClipboard()
- endif
-
- " Disabling the yankring removes the default maps.
- " But there are some maps the user can create on their own, and
- " these would most likely call this function. So place an extra
- " check and display a message.
- if g:yankring_enabled == 0
- call s:YRWarningMsg(
- \ 'YR: The yankring is currently disabled, use YRToggle.'
- \ )
- return
- endif
-
- let user_register = s:YRRegister()
- let default_buffer = ((&clipboard=~'\<unnamed\>')?'*':((&clipboard=~'\<unnamedplus\>' && has('unnamedplus'))?'+':'"'))
- let v_count = v:count
-
- " Default command mode to normal mode 'n'
- let cmd_mode = 'n'
- if a:0 > 0
- " Change to visual mode, if command executed via
- " a visual map
- let cmd_mode = ((a:1 == 'v') ? 'v' : 'n')
- endif
-
- " User has decided to bypass the yankring and specify a specific
- " register
- if user_register != default_buffer
- if a:replace_last_paste_selection == 1
- call s:YRWarningMsg( 'YR: A register cannot be specified in replace mode' )
- return
- else
- " Check for the expression register, in this special case
- " we must copy it's evaluation into the default buffer and paste
- if user_register == '='
- " Save the default register since Vim will only
- " allow the expression register to be pasted once
- " and will revert back to the default buffer
- let save_default_reg = @"
- call setreg(default_buffer, eval(histget('=', -1)) )
- else
- let user_register = '"'.user_register
- endif
- exec "normal! ".
- \ ((cmd_mode=='n') ? "" : "gv").
- \ ((v_count > 0)?(v_count):'').
- \ ((user_register=='=')?'':user_register).
- \ a:direction
- if user_register == '='
- let @" = save_default_reg
- endif
- " In this case, we have bypassed the yankring
- " If the user hits next or previous we want the
- " next item pasted to be the top of the yankring.
- let s:yr_last_paste_idx = 1
- endif
- let s:yr_paste_dir = a:direction
- let s:yr_prev_vis_mode = ((cmd_mode=='n') ? 0 : 1)
- return
- endif
-
- " Try to second guess the user to make these mappings less intrusive.
- " If the user hits paste, compare the contents of the paste register
- " to the current entry in the yankring. If they are different, lets
- " assume the user wants the contents of the paste register.
- " The user could have:
- " let @" = 'test string'
- " would not be in the yankring as no mapping triggered this action.
- if a:replace_last_paste_selection != 1
- " Only check the default buffer is the user wants us to.
- " This was necessary prior to version 4.0 since we did not
- " capture as many items as 4.0 and above does. (A. Budden)
- if g:yankring_paste_check_default_buffer == 1
- if ( default_buffer == '"' && getreg(default_buffer) != s:yr_prev_reg_unnamed )
- " There are only a couple of scenarios where this would happen
- " 1. set clipboard = unnamed[plus]
- " The user performs an action which changes the
- " unnamed register (i.e. x - delete character)
- " 2. Any type of direct manipulation of the registers
- " let @" = 'something'
- " 3. Something changed the system clipboard outside of Vim
- if getreg('"') != s:yr_prev_reg_unnamed
- let default_buffer = '"'
- endif
-
- " The user has performed a yank / delete operation
- " outside of the yankring maps. First, add this
- " value to the yankring.
- call YRRecord(default_buffer)
- elseif ( default_buffer == '+' &&
- \ len(getreg(default_buffer)) != 0 &&
- \ getreg(default_buffer) != s:yr_prev_clipboard_plus
- \ )
-
- " The user has performed a yank / delete operation
- " outside of the yankring maps. First, add this
- " value to the yankring.
- call YRRecord(default_buffer)
- elseif ( default_buffer == '*' &&
- \ len(getreg(default_buffer)) != 0 &&
- \ getreg(default_buffer) != s:yr_prev_clipboard_star
- \ )
-
- " The user has performed a yank / delete operation
- " outside of the yankring maps. First, add this
- " value to the yankring.
- call YRRecord(default_buffer)
- endif
- endif
-
- exec "normal! ".
- \ ((cmd_mode=='n') ? "" : "gv").
- \ ((v_count > 0)?(v_count):'').
- \ a:direction
- "\ '"'.default_buffer.
- let s:yr_paste_dir = a:direction
- let s:yr_prev_vis_mode = ((cmd_mode=='n') ? 0 : 1)
- return
- endif
-
- " if s:yr_count > 0 || (
- " \ default_buffer != '"' &&
- " \ len(getreg(default_buffer)) == 0
- " \ )
- " " Nothing to paste
- " return
- " endif
-
- if a:replace_last_paste_selection == 1
- " Replacing the previous put
- let start = line("'[")
- let end = line("']")
-
- if start != line('.')
- call s:YRWarningMsg( 'YR: You must paste text first, before you can replace' )
- return
- endif
-
- if start == 0 || end == 0
- return
- endif
-
- " If a count was provided (ie 5<C-P>), multiply the
- " nextvalue accordingly and position the next paste index
- " let which_elem = a:nextvalue * ((v_count > 0)?(v_count):1) * -1
- let which_elem = matchstr(a:nextvalue, '-\?\d\+') * ((v_count > 0)?(v_count):1) * -1
- let s:yr_last_paste_idx = s:YRGetNextElem(
- \ s:yr_last_paste_idx, which_elem
- \ )
-
- let save_reg = getreg(default_buffer)
- let save_reg_type = getregtype(default_buffer)
- call setreg( default_buffer
- \ , s:YRGetValElemNbr((s:yr_last_paste_idx-1),'v')
- \ , s:YRGetValElemNbr((s:yr_last_paste_idx-1),'t')
- \ )
-
- " First undo the previous paste
- exec "normal! u"
- " Check if the visual selection should be reselected
- " Next paste the correct item from the ring
- " This is done as separate statements since it appeared that if
- " there was nothing to undo, the paste never happened.
- exec "normal! ".
- \ ((s:yr_prev_vis_mode==0) ? "" : "gv").
- \ '"'.default_buffer.
- \ s:yr_paste_dir
- call setreg(default_buffer, save_reg, save_reg_type)
- call s:YRSetPrevOP('', '', '', 'n')
- else
- " User hit p or P
- " Supports this for example - 5"ayy
- " And restores the current register
- let save_reg = getreg(default_buffer)
- let save_reg_type = getregtype(default_buffer)
- let s:yr_last_paste_idx = 1
- call setreg(default_buffer
- \ , s:YRGetValElemNbr(0,'v')
- \ , s:YRGetValElemNbr(0,'t')
- \ )
- exec "normal! ".
- \ ((cmd_mode=='n') ? "" : "gv").
- \ ((v_count > 0)?(v_count):'').
- \ '"'.default_buffer.
- \ a:direction
- call setreg(default_buffer, save_reg, save_reg_type)
- call s:YRSetPrevOP(
- \ a:direction
- \ , v_count
- \ , default_buffer
- \ , 'n'
- \ )
- let s:yr_paste_dir = a:direction
- let s:yr_prev_vis_mode = ((cmd_mode=='n') ? 0 : 1)
- endif
-endfunction
-
-
-" Handle any omaps
-function! YRMapsExpression(sid, motion, ...)
- let cmds = a:motion
- " echomsg "YRMapsE:".localtime()
- " echomsg "YRMapsE 1:".cmds.":".v:operator.":".s:yr_maps_created_zap
-
- if (a:motion =~ '\.' && s:yr_remove_omap_dot == 1) || a:motion =~ '@'
- " If we are repeating a series of commands we must
- " unmap the _zap_ keys so that the user is not
- " prompted when a command is replayed.
- " These maps must be re-instated in YRRecord3()
- " after the action of the replay is completed.
- call s:YRMapsDelete('remove_only_zap_keys')
- endif
-
- " Check if we are in operator-pending mode
- if a:motion =~ '\('.substitute(g:yankring_zap_keys, ' ', '\\|', 'g').'\)'
- if a:motion =~ '\(/\|?\)'
- let zapto = (a:0==0 ? "" : input("YR:Enter string:"))
- if zapto != ""
- let zapto = zapto . "\<CR>"
- else
- let zapto = "\<C-C>"
- endif
- else
- let zapto = (a:0==0 ? "" : s:YRGetChar())
- endif
-
- if zapto == "\<C-C>"
- " Abort if the user hits Control C
- call s:YRWarningMsg( "YR:Aborting command:".v:operator.a:motion )
- return "\<C-C>"
- endif
-
- let cmds = cmds . zapto
- endif
-
- " There are a variety of commands which do not change the
- " registers, so these operators should be ignored when
- " determining which operations to record
- " Simple example is '=' which simply formats the
- " the selected text.
- if ' \('.escape(join(split(g:yankring_ignore_operator), '\|'), '/.*~$^[]' ).'\) ' !~ escape(v:operator, '/.*~$^[]')
- " Check if we are performing an action that will
- " take us into insert mode
- if '[cCsS]' !~ escape(v:operator, '/.*~$^[]') && a:motion !~ '@'
- " if '[cCsS]' !~ escape(v:operator, '/.*~$^[]')
- " If we have not entered insert mode, feed the call
- " to record the current change when the function ends.
- " This is necessary since omaps do not update registers
- " until the function completes.
- " The InsertLeave event will handle the motions
- " that place us in insert mode and record the
- " changes when insert mode ends.
- " let cmds .= a:sid. "yrrecord ".a:motion
- let cmds .= a:sid. "yrrecord"
- endif
- endif
-
- " This will not work since we are already executing an expression
- " if a:motion =~ '@'
- " let cmds = 'normal! ' . cmds
- " endif
-
- " YRRecord3() will use this value to determine what operation
- " the user just initiated.
- let s:yr_last_motion = cmds
-
- " echomsg "YRMapsE 5:".a:motion.":'".cmds."':".s:yr_maps_created_zap
- return cmds
-
-endfunction
-
-
-" Handle macros (@).
-" This routine is not used, YRMapsExpression is used to
-" handle the @ symbol.
-function! s:YRMapsMacro(bang, ...)
- " If we are repeating a series of commands we must
- " unmap the _zap_ keys so that the user is not
- " prompted when a command is replayed.
- " These maps must be re-instated in YRRecord3()
- " after the action of the replay is completed.
- call s:YRMapsDelete('remove_only_zap_keys')
-
- " let zapto = (a:0==0 ? "" : s:YRGetChar())
- let zapto = s:YRGetChar()
-
- if zapto == "\<C-C>"
- " Abort if the user hits Control C
- call s:YRWarningMsg( "YR:Aborting macro" )
- return ""
- endif
-
- let v_count = v:count
- " If no count was specified it will have a value of 0
- " so set it to at least 1
- let v_count = ((v_count > 0)?(v_count):'')
-
- " let range = ''
- " if a:firstline != a:lastline
- " let rannge = a:firstline.','.a:lastline
- " endif
-
- " let cmd = range."normal! ".v_count.'@'.zapto
- let cmd = "normal! ".v_count.'@'.zapto
- " DEBUG
- " echomsg cmd
- exec cmd
-
- call s:YRMapsCreate('add_only_zap_keys')
-endfunction
-
-
-" Create the default maps
-function! s:YRMapsCreate(...)
- " 7.1.patch205 introduces the v:operator function which was
- " essential to gain the omap support.
- if s:yr_has_voperator == 1
- let s:yr_remove_omap_dot = 1
- for key in split(g:yankring_zap_keys)
- try
- if key != '@'
- exec 'omap <expr>' key 'YRMapsExpression("<SID>", "'. key. '", 1)'
- endif
- catch
- endtry
- endfor
- endif
-
- " silent! nmap <expr> @ YRMapsExpression("<SID>", "@", "1")
- silent! nmap @ :<C-U>YRMapsMacro<CR>
-
- let s:yr_maps_created_zap = 1
-
- if a:0 > 0
- " We have only removed the _zap_ keys temporarily
- " so abandon further changes.
- return
- endif
-
- " 7.1.patch205 introduces the v:operator function which was essential
- " to gain the omap support.
- if s:yr_has_voperator == 1
- let s:yr_remove_omap_dot = 1
- " Set option to add and remove _zap_ keys when
- " repeating commands
- let o_maps = split(g:yankring_o_keys)
- " Loop through and prompt the user for all buffer connection parameters.
- for key in o_maps
- exec 'omap <expr>' key 'YRMapsExpression("<SID>", "'. escape(key,'\"'). '")'
- endfor
- endif
-
- " Iterate through a space separated list of mappings and create
- " calls to the YRYankCount function
- let n_maps = split(g:yankring_n_keys)
- " Loop through and prompt the user for all buffer connection parameters.
- for key in n_maps
- " exec 'nnoremap <silent>'.key." :<C-U>YRYankCount '".key."'<CR>"
- " exec 'nnoremap <silent>'.key." :<C-U>YRYankCount '".key."'<CR>"
- " Andy Wokula's suggestion
- exec 'nmap' key key."<SID>yrrecord"
- endfor
-
- if g:yankring_map_dot == 1
- if s:yr_has_voperator == 1
- nmap <expr> . YRMapsExpression("<SID>", ".")
- else
- nnoremap <silent> . :<C-U>YRYankCount '.'<CR>
- endif
- endif
-
- if g:yankring_v_key != ''
- exec 'xnoremap <silent>'.g:yankring_v_key." :YRYankRange 'v'<CR>"
- endif
- if g:yankring_del_v_key != ''
- for v_map in split(g:yankring_del_v_key)
- if strlen(v_map) > 0
- try
- exec 'xnoremap <silent>'.v_map." :YRDeleteRange 'v'<CR>"
- catch
- endtry
- endif
- endfor
- endif
- if g:yankring_paste_n_bkey != ''
- exec 'nnoremap <silent>'.g:yankring_paste_n_bkey." :<C-U>YRPaste 'P'<CR>"
- if g:yankring_paste_using_g == 1
- exec 'nnoremap <silent> g'.g:yankring_paste_n_bkey." :<C-U>YRPaste 'gP'<CR>"
- endif
- endif
- if g:yankring_paste_n_akey != ''
- exec 'nnoremap <silent>'.g:yankring_paste_n_akey." :<C-U>YRPaste 'p'<CR>"
- if g:yankring_paste_using_g == 1
- exec 'nnoremap <silent> g'.g:yankring_paste_n_akey." :<C-U>YRPaste 'gp'<CR>"
- endif
- endif
- if g:yankring_paste_v_bkey != ''
- exec 'xnoremap <silent>'.g:yankring_paste_v_bkey." :<C-U>YRPaste 'P', 'v'<CR>"
- endif
- if g:yankring_paste_v_akey != ''
- exec 'xnoremap <silent>'.g:yankring_paste_v_akey." :<C-U>YRPaste 'p', 'v'<CR>"
- endif
- if g:yankring_replace_n_pkey != ''
- exec 'nnoremap <silent>'.g:yankring_replace_n_pkey." :<C-U>YRReplace '-1', 'P'<CR>"
- endif
- if g:yankring_replace_n_nkey != ''
- exec 'nnoremap <silent>'.g:yankring_replace_n_nkey." :<C-U>YRReplace '1', 'p'<CR>"
- endif
-
- let g:yankring_enabled = 1
- let s:yr_maps_created = 1
-
- if exists('*YRRunAfterMaps')
- " This will allow you to override the default maps if necessary
- call YRRunAfterMaps()
- endif
-endfunction
-
-
-" Create the default maps
-function! s:YRMapsDelete(...)
-
- let o_maps = split(g:yankring_zap_keys)
- for key in o_maps
- try
- " Why not remove the @ map?
- if key != '@'
- silent! exec 'ounmap' key
- endif
- catch
- endtry
- endfor
-
- let s:yr_maps_created_zap = 0
-
- if a:0 > 0
- " We have only removed the _zap_ keys temporarily
- " so abandon further changes.
- return
- endif
-
- " Iterate through a space separated list of mappings and create
- " calls to an appropriate YankRing function
- let n_maps = split(g:yankring_n_keys)
- " Loop through and prompt the user for all buffer connection parameters.
- for key in n_maps
- try
- silent! exec 'nunmap' key
- catch
- endtry
- endfor
-
- let o_maps = split(g:yankring_o_keys)
- for key in o_maps
- try
- silent! exec 'ounmap' key
- catch
- endtry
- endfor
-
- if g:yankring_map_dot == 1
- silent! exec "nunmap ."
- endif
- if g:yankring_v_key != ''
- silent! exec 'vunmap '.g:yankring_v_key
- endif
- if g:yankring_del_v_key != ''
- for v_map in split(g:yankring_del_v_key)
- if strlen(v_map) > 0
- try
- silent! exec 'vunmap '.v_map
- catch
- endtry
- endif
- endfor
- endif
- if g:yankring_paste_n_bkey != ''
- silent! exec 'nunmap '.g:yankring_paste_n_bkey
- if g:yankring_paste_using_g == 1
- silent! exec 'nunmap g'.g:yankring_paste_n_bkey
- endif
- endif
- if g:yankring_paste_n_akey != ''
- silent! exec 'nunmap '.g:yankring_paste_n_akey
- if g:yankring_paste_using_g == 1
- silent! exec 'nunmap g'.g:yankring_paste_n_akey
- endif
- endif
- if g:yankring_paste_v_bkey != ''
- silent! exec 'vunmap '.g:yankring_paste_v_bkey
- endif
- if g:yankring_paste_v_akey != ''
- silent! exec 'vunmap '.g:yankring_paste_v_akey
- endif
- if g:yankring_replace_n_pkey != ''
- silent! exec 'nunmap '.g:yankring_replace_n_pkey
- endif
- if g:yankring_replace_n_nkey != ''
- silent! exec 'nunmap '.g:yankring_replace_n_nkey
- endif
-
- " silent! exec 'nunmap @'
-
- let g:yankring_enabled = 0
- let s:yr_maps_created = 0
-endfunction
-
-function! s:YRGetValElemNbr( position, type )
- let needed_elem = a:position
-
- " The List which contains the items in the yankring
- " history is also ordered, most recent at the top
- let elem = s:YRMRUGet('s:yr_history_list', needed_elem)
-
- if a:type == 't'
- let elem = matchstr(elem, '^.*,\zs.*$')
- else
- let elem = matchstr(elem, '^.*\ze,.*$')
- if s:yr_history_version == 'v1'
- " Match three @@@ in a row as long as it is not
- " preceeded by a @@@
- " v1
- let elem = substitute(elem, s:yr_history_v1_nl_pat, "\n", 'g')
- let elem = substitute(elem, '\\@', '@', 'g')
- else
- let elem = substitute(elem, s:yr_history_v2_nl_pat, "\n", 'g')
- endif
- endif
-
- return elem
-endfunction
-
-function! s:YRMRUReset( mru_list )
- let {a:mru_list} = []
-
- return 1
-endfunction
-
-function! s:YRMRUSize( mru_list )
- return len({a:mru_list})
-endfunction
-
-function! s:YRMRUElemFormat( element, element_type )
- let elem = a:element
- if g:yankring_max_element_length != 0
- let elem = strpart(a:element, 0, g:yankring_max_element_length)
- if (g:yankring_warn_on_truncate > 0)
- let bytes = len (a:element) - len(elem)
- if (bytes > 0)
- call s:YRWarningMsg("Yankring truncated its element by ".
- \ bytes.
- \ " bytes due to a g:yankring_max_element_length of ".
- \ g:yankring_max_element_length
- \ )
- endif
- endif
- endif
- if s:yr_history_version == 'v1'
- let elem = escape(elem, '@')
- let elem = substitute(elem, "\n", s:yr_history_v1_nl, 'g')
- else
- let elem = substitute(elem, "\n", s:yr_history_v2_nl, 'g')
- endif
- " Append the regtype to the end so we have it available
- let elem = elem.",".a:element_type
-
- return elem
-endfunction
-
-function! s:YRMRUHas( mru_list, find_str )
- " This function will find a string and return the element #
- let find_idx = index({a:mru_list}, a:find_str)
-
- return find_idx
-endfunction
-
-function! s:YRMRUGet( mru_list, position )
- " This function will return the value of the item at a:position
- " Find the value of one element
- let value = get({a:mru_list}, a:position, -2)
-
- return value
-endfunction
-
-function! s:YRMRUAdd( mru_list, element, element_type )
- " Only add new items if they do not already exist in the MRU.
- " If the item is found, move it to the start of the MRU.
- let found = -1
- " let elem = a:element
- " if g:yankring_max_element_length != 0
- " let elem = strpart(a:element, 0, g:yankring_max_element_length)
- " endif
- " if s:yr_history_version == 'v1'
- " let elem = escape(elem, '@')
- " let elem = substitute(elem, "\n", s:yr_history_v1_nl, 'g')
- " else
- " let elem = substitute(elem, "\n", s:yr_history_v2_nl, 'g')
- " endif
- " " Append the regtype to the end so we have it available
- " let elem = elem.",".a:element_type
-
- if strlen(a:element) < g:yankring_min_element_length
- return 1
- endif
-
- let elem = s:YRMRUElemFormat(a:element, a:element_type)
-
- " Refresh the List
- call s:YRHistoryRead()
-
- let found = s:YRMRUHas(a:mru_list, elem)
-
- " Special case for efficiency, if it is first item in the
- " List, do nothing
- if found != 0
- if found != -1
- " Remove found item since we will add it to the top
- call remove({a:mru_list}, found)
- endif
- call insert({a:mru_list}, elem, 0)
- call s:YRHistorySave()
- endif
-
- return 1
-endfunction
-
-function! s:YRMRUDel( mru_list, elem_nbr )
- if a:elem_nbr >= 0 && a:elem_nbr < s:yr_count
- call remove({a:mru_list}, a:elem_nbr)
- call s:YRHistorySave()
- endif
-
- return 1
-endfunction
-
-function! s:YRHistoryDelete()
- let s:yr_history_list = []
- let yr_filename = s:yr_history_file_{s:yr_history_version}
-
- if filereadable(yr_filename)
- let rc = delete(yr_filename)
- if rc != 0
- call s:YRErrorMsg(
- \ 'YRHistoryDelete: Unable to delete the yankring history file: '.
- \ yr_filename
- \ )
- endif
- endif
-
- return 0
-endfunction
-
-function! s:YRHistoryRead()
- let refresh_needed = 1
- let yr_history_list = []
- let yr_filename = s:yr_history_file_{s:yr_history_version}
-
- if filereadable(yr_filename)
- let last_upd = getftime(yr_filename)
-
- if s:yr_history_last_upd != 0 && last_upd <= s:yr_history_last_upd
- let refresh_needed = 0
- endif
-
- if refresh_needed == 1
- let s:yr_history_list = readfile(yr_filename)
- let s:yr_history_last_upd = last_upd
- let s:yr_count = len(s:yr_history_list)
- return
- else
- return
- endif
- else
- if s:yr_history_version == 'v2'
- " Check to see if an upgrade is required
- " else, let the empty yr_history_list be returned.
- if filereadable(s:yr_history_file_v1)
- " Perform upgrade to v2 of the history file
- call s:YRHistoryUpgrade('v1')
- return
- endif
- endif
- endif
-
- let s:yr_history_list = yr_history_list
- call s:YRHistorySave()
-
-endfunction
-
-function! s:YRHistorySave()
- let yr_filename = s:yr_history_file_{s:yr_history_version}
-
- if len(s:yr_history_list) > g:yankring_max_history
- " Remove items which exceed the max # specified
- call remove(s:yr_history_list, g:yankring_max_history)
- endif
-
- let rc = writefile(s:yr_history_list, yr_filename)
-
- if rc == 0
- let s:yr_history_last_upd = getftime(yr_filename)
- let s:yr_count = len(s:yr_history_list)
- else
- call s:YRErrorMsg(
- \ 'YRHistorySave: Unable to save yankring history file: '.
- \ yr_filename
- \ )
- endif
-endfunction
-
-function! s:YRHistoryUpgrade(version)
- if a:version == 'v1'
- if filereadable(s:yr_history_file_v1)
- let v1_list = readfile(s:yr_history_file_v1)
- let v2_list = []
- for elem in v1_list
- " Restore from version 1
- let elem = substitute(elem, s:yr_history_v1_nl_pat, "\n", 'g')
- let elem = substitute(elem, '\\@', '@', 'g')
- " Encode to version 2
- let elem = substitute(elem, "\n", s:yr_history_v2_nl, 'g')
- call add(v2_list, elem)
- endfor
- let s:yr_history_list = v2_list
- call s:YRHistorySave()
- call s:YRWarningMsg(
- \ "YR:History file:".
- \ s:yr_history_file_v1.
- \ ' has been upgraded.'
- \ )
- endif
- endif
-endfunction
-
-" YRWindowUpdate
-" Checks if the yankring window is already open.
-" If it is, it will refresh it.
-function! s:YRWindowUpdate()
- let orig_win_bufnr = bufwinnr('%')
-
- " Switch to the yankring buffer
- " only if it is already visible
- if bufwinnr(s:yr_buffer_id) != -1
- call s:YRShow(0)
- " Switch back to the original buffer
- exec orig_win_bufnr . "wincmd w"
- endif
-endfunction
-
-" YRWindowStatus
-" Displays a brief command list and option settings.
-" It also will toggle the Help text.
-function! s:YRWindowStatus(show_help)
- let full_help = 0
- let orig_win_bufnr = bufwinnr('%')
- let yr_win_bufnr = bufwinnr(s:yr_buffer_id)
-
- if yr_win_bufnr == -1
- " Do not update the window status since the
- " yankring is not currently displayed.
- return ""
- endif
- " Switch to the yankring buffer
- if orig_win_bufnr != yr_win_bufnr
- " If the buffer is visible, switch to it
- exec yr_win_bufnr . "wincmd w"
- endif
-
- let msg = 'AutoClose='.g:yankring_window_auto_close.
- \ ';ClipboardMonitor='.g:yankring_clipboard_monitor.
- \ ';Cmds:<enter>,[g]p,[g]P,1-9,d,r,s,a,c,u,R,q,<space>;Help=?'.
- \ (s:yr_search==""?"":';SearchRegEx='.s:yr_search)
-
- if s:yr_has_voperator == 0
- let msg = msg . "\nYankRing has limited functionality without Vim 7.2 or higher"
- endif
-
- " Toggle help by checking the first line of the buffer
- if a:show_help == 1 && getline(1) !~ 'selection'
- let full_help = 1
- let msg =
- \ '" <enter> : [p]aste selection'."\n".
- \ '" double-click : [p]aste selection'."\n".
- \ '" [g]p : [g][p]aste selection'."\n".
- \ '" [g]P : [g][P]aste selection'."\n".
- \ '" 1-9 : Paste # entry from the YankRing (shortcut for speed)'."\n".
- \ '" d : [d]elete item from the YankRing'."\n".
- \ '" r : [p]aste selection in reverse order'."\n".
- \ '" s : [s]earch the yankring for text'."\n".
- \ '" u : [u]pdate display show YankRing'."\n".
- \ '" R : [R]egisters display'."\n".
- \ '" a : toggle [a]utoclose setting'."\n".
- \ '" c : toggle [c]lipboard monitor setting'."\n".
- \ '" q : [q]uit / close the yankring window'."\n".
- \ '" ? : Remove help text'."\n".
- \ '" <space> : toggles the width of the window'."\n".
- \ '" Visual mode is supported for above commands'."\n".
- \ '" YankRing Version: '.g:loaded_yankring."\n".
- \ msg
- endif
-
- let saveMod = &modifiable
-
- " Go to the top of the buffer and remove any previous status
- " Use the blackhole register so it does not affect the yankring
- setlocal modifiable
- exec 0
- silent! exec 'norm! "_d/^---'."\n"
- call histdel("search", -1)
-
- silent! 0put =msg
-
- " Erase it's contents to the blackhole
- silent! exec '%g/^\s*$/delete _'
- call histdel("search", -1)
-
- call cursor(1,1)
- if full_help == 0
- call search('^\d', 'W')
- endif
-
- let &modifiable = saveMod
-
- if orig_win_bufnr != s:yr_buffer_id
- exec orig_win_bufnr . "wincmd w"
- endif
-endfunction
-
-" YRWindowOpen
-" Display the Most Recently Used file list in a temporary window.
-function! s:YRWindowOpen(results)
-
- " Setup the cpoptions properly for the maps to work
- " and to not set the alternate buffer
- let old_cpoptions = &cpoptions
- set cpoptions&vim
- set cpoptions-=a
- set cpoptions-=A
-
- " Save the current buffer number. The yankring will switch back to
- " this buffer when an action is taken.
- let s:yr_buffer_last = bufnr('%')
- let s:yr_buffer_last_winnr = winnr()
-
- if bufwinnr(s:yr_buffer_id) == -1
- if g:yankring_window_use_horiz == 1
- if g:yankring_window_use_bottom == 1
- let location = 'botright'
- else
- let location = 'topleft'
- " Creating the new window will offset all other
- " window numbers. Account for that so we switch
- " back to the correct window.
- let s:yr_buffer_last_winnr = s:yr_buffer_last_winnr + 1
- endif
- let win_size = g:yankring_window_height
- else
- " Open a horizontally split window. Increase the window size, if
- " needed, to accomodate the new window
- if g:yankring_window_width &&
- \ &columns < (80 + g:yankring_window_width)
- " one extra column is needed to include the vertical split
- let &columns = &columns + g:yankring_window_width + 1
- let s:yr_winsize_chgd = 1
- else
- let s:yr_winsize_chgd = 0
- endif
-
- if g:yankring_window_use_right == 1
- " Open the window at the rightmost place
- let location = 'botright vertical'
- else
- " Open the window at the leftmost place
- let location = 'topleft vertical'
- " Creating the new window will offset all other
- " window numbers. Account for that so we switch
- " back to the correct window.
- let s:yr_buffer_last_winnr = s:yr_buffer_last_winnr + 1
- endif
- let win_size = g:yankring_window_width
- endif
-
- " Special consideration was involved with these sequence
- " of commands.
- " First, split the current buffer.
- " Second, edit a new file.
- " Third record the buffer number.
- " If a different sequence is followed when the yankring
- " buffer is closed, Vim's alternate buffer is the yanking
- " instead of the original buffer before the yankring
- " was shown.
- let cmd_mod = ''
- if v:version >= 700
- let cmd_mod = 'keepalt '
- endif
- exec 'silent! ' . cmd_mod . location . ' ' . win_size . 'split '
-
- " Using :e and hide prevents the alternate buffer
- " from being changed.
- exec ":e " . escape(s:yr_buffer_name, ' ')
- " Save buffer id
- let s:yr_buffer_id = bufnr('%') + 0
- else
- " If the buffer is visible, switch to it
- exec bufwinnr(s:yr_buffer_id) . "wincmd w"
- endif
-
- " Perform a double check to ensure we have entered the correct
- " buffer since we don't want to do the %d_ in the wrong buffer!
- if (bufnr('%') + 0) != s:yr_buffer_id
- call s:YRWarningMsg(
- \ "YR:Failed to change to the yankring buffer, please contact author id:".
- \ s:yr_buffer_id.
- \ ' last:'.s:yr_buffer_last
- \ )
- return -1
- endif
-
- " Mark the buffer as scratch
- setlocal buftype=nofile
- setlocal bufhidden=hide
- setlocal noswapfile
- setlocal nowrap
- setlocal nonumber
- setlocal nobuflisted
- setlocal noreadonly
- setlocal nospell
- setlocal modifiable
-
- " set up syntax highlighting
- syn match yankringTitle #^--- YankRing ---$#hs=s+4,he=e-4
- syn match yankringHeaders #^Elem Content$#
- syn match yankringItemNumber #^\d\+#
-
- syn match yankringKey #^AutoClose.*<enter>#hs=e-6
- syn match yankringKey #^AutoClose.*\[g\]p#hs=e-3 contains=yankringKey
- syn match yankringKey #^AutoClose.*\[p\]P#hs=e-3 contains=yankringKey
- syn match yankringKey #^AutoClose.*,d,#hs=e-1,he=e-1 contains=yankringKey
- syn match yankringKey #^AutoClose.*,r,#hs=e-1,he=e-1 contains=yankringKey
- syn match yankringKey #^AutoClose.*,s,#hs=e-1,he=e-1 contains=yankringKey
- syn match yankringKey #^AutoClose.*,a,#hs=e-1,he=e-1 contains=yankringKey
- syn match yankringKey #^AutoClose.*,c,#hs=e-1,he=e-1 contains=yankringKey
- syn match yankringKey #^AutoClose.*,u,#hs=e-1,he=e-1 contains=yankringKey
- syn match yankringKey #^AutoClose.*,q,#hs=e-1,he=e-1 contains=yankringKey
- syn match yankringKey #^AutoClose.*<space>#hs=e-6 contains=yankringKey
- syn match yankringKey #^AutoClose.*?$#hs=e contains=yankringKey
-
- syn match yankringKey #^".*:#hs=s+1,he=e-1
- syn match yankringHelp #^".*$# contains=yankringKey
-
- hi link yankringTitle directory
- hi link yankringHeaders keyword
- hi link yankringItemNumber constant
- hi link yankringKey identifier
- hi link yankringHelp string
-
- " Clear all existing maps for this buffer
- " We should do this for all maps, but I am not sure how to do
- " this for this buffer/window only without affecting all the
- " other buffers.
- mapclear <buffer>
- " Create a mapping to act upon the yankring
- nnoremap <buffer> <silent> <2-LeftMouse> :call <SID>YRWindowActionN('p' , 'n')<CR>
- nnoremap <buffer> <silent> <CR> :call <SID>YRWindowActionN('p' , 'n')<CR>
- xnoremap <buffer> <silent> <CR> :call <SID>YRWindowAction ('p' , 'v')<CR>
- nnoremap <buffer> <silent> p :call <SID>YRWindowActionN('p' , 'n')<CR>
- nnoremap <buffer> <silent> [p :call <SID>YRWindowActionN('[p' , 'n')<CR>
- nnoremap <buffer> <silent> ]p :call <SID>YRWindowActionN(']p' , 'n')<CR>
- xnoremap <buffer> <silent> p :call <SID>YRWindowAction ('p' , 'v')<CR>
- xnoremap <buffer> <silent> [p :call <SID>YRWindowAction ('[p' , 'v')<CR>
- xnoremap <buffer> <silent> ]p :call <SID>YRWindowAction (']p' , 'v')<CR>
- nnoremap <buffer> <silent> P :call <SID>YRWindowActionN('P' , 'n')<CR>
- nnoremap <buffer> <silent> [P :call <SID>YRWindowActionN('[P' , 'n')<CR>
- nnoremap <buffer> <silent> ]P :call <SID>YRWindowActionN(']P' , 'n')<CR>
- xnoremap <buffer> <silent> P :call <SID>YRWindowAction ('P' , 'v')<CR>
- xnoremap <buffer> <silent> [P :call <SID>YRWindowAction ('[P' , 'v')<CR>
- xnoremap <buffer> <silent> ]P :call <SID>YRWindowAction (']P' , 'v')<CR>
- nnoremap <buffer> <silent> gp :call <SID>YRWindowActionN('gp' , 'n')<CR>
- xnoremap <buffer> <silent> gp :call <SID>YRWindowAction ('gp' , 'v')<CR>
- nnoremap <buffer> <silent> gP :call <SID>YRWindowActionN('gP' , 'n')<CR>
- xnoremap <buffer> <silent> gP :call <SID>YRWindowAction ('gP' , 'v')<CR>
- nnoremap <buffer> <silent> d :call <SID>YRWindowActionN('d' , 'n')<CR>
- xnoremap <buffer> <silent> d :call <SID>YRWindowAction ('d' , 'v')<CR>
- xnoremap <buffer> <silent> r :call <SID>YRWindowAction ('r' , 'v')<CR>
- nnoremap <buffer> <silent> s :call <SID>YRWindowAction ('s' , 'n')<CR>
- nnoremap <buffer> <silent> a :call <SID>YRWindowAction ('a' , 'n')<CR>
- nnoremap <buffer> <silent> c :call <SID>YRWindowAction ('c' , 'n')<CR>
- nnoremap <buffer> <silent> ? :call <SID>YRWindowAction ('?' , 'n')<CR>
- nnoremap <buffer> <silent> u :call <SID>YRWindowAction ('u' , 'n')<CR>
- nnoremap <buffer> <silent> q :call <SID>YRWindowAction ('q' , 'n')<CR>
- nnoremap <buffer> <silent> R :call <SID>YRWindowAction ('R' , 'n')<CR>
- nnoremap <buffer> <silent> 1 :call <SID>YRWindowAction ('q' ,'n')<CR>:call <SID>YRGetElem(1)<CR>
- nnoremap <buffer> <silent> 2 :call <SID>YRWindowAction ('q' ,'n')<CR>:call <SID>YRGetElem(2)<CR>
- nnoremap <buffer> <silent> 3 :call <SID>YRWindowAction ('q' ,'n')<CR>:call <SID>YRGetElem(3)<CR>
- nnoremap <buffer> <silent> 4 :call <SID>YRWindowAction ('q' ,'n')<CR>:call <SID>YRGetElem(4)<CR>
- nnoremap <buffer> <silent> 5 :call <SID>YRWindowAction ('q' ,'n')<CR>:call <SID>YRGetElem(5)<CR>
- nnoremap <buffer> <silent> 6 :call <SID>YRWindowAction ('q' ,'n')<CR>:call <SID>YRGetElem(6)<CR>
- nnoremap <buffer> <silent> 7 :call <SID>YRWindowAction ('q' ,'n')<CR>:call <SID>YRGetElem(7)<CR>
- nnoremap <buffer> <silent> 8 :call <SID>YRWindowAction ('q' ,'n')<CR>:call <SID>YRGetElem(8)<CR>
- nnoremap <buffer> <silent> 9 :call <SID>YRWindowAction ('q' ,'n')<CR>:call <SID>YRGetElem(9)<CR>
- nnoremap <buffer> <silent> <space> \|:silent exec 'vertical resize '.
- \ (
- \ g:yankring_window_use_horiz!=1 && winwidth('.') > g:yankring_window_width
- \ ?(g:yankring_window_width)
- \ :(winwidth('.') + g:yankring_window_increment)
- \ )<CR>
-
- " Erase it's contents to the blackhole
- silent! exec '%delete _'
-
- " Display the status line / help
- call s:YRWindowStatus(0)
- exec 'normal! G'
-
- " Display the contents of the yankring
- silent! put =a:results
-
- if getline('$') == ''
- " Erase last blank line
- silent! exec '$delete _'
- endif
-
- " Move the cursor to the first line with an element
- exec 0
- call search('^\d','W')
-
- setlocal nomodifiable
- "
- " Restore the previous cpoptions settings
- let &cpoptions = old_cpoptions
-
-endfunction
-
-function! s:YRWindowActionN(op, cmd_mode)
- let v_count = v:count
- " If no count was specified it will have a value of 0
- " so set it to at least 1
- let v_count = ((v_count > 0)?(v_count):1)
-
- if v_count > 1
- if !exists("b:yankring_show_range_error")
- let b:yankring_show_range_error = v_count
- else
- let b:yankring_show_range_error = b:yankring_show_range_error - 1
- endif
-
- if b:yankring_show_range_error == 1
- call s:YRWarningMsg("YR:Use visual mode if you need to specify a count")
- unlet b:yankring_show_range_error
- endif
- return
- endif
-
- call s:YRWindowAction(a:op, a:cmd_mode)
- let v_count = v_count - 1
-
- if g:yankring_window_auto_close == 1 && v_count == 0 && a:op != 'd'
- " If autoclose is set close the window unless
- " you are removing items from the YankRing
- exec 'bdelete '.s:yr_buffer_id
- return ""
- endif
-
- return ""
-endfunction
-
-function! s:YRWindowAction(op, cmd_mode) range
- let default_buffer = ((&clipboard=~'\<unnamed\>')?'*':((&clipboard=~'\<unnamedplus\>' && has('unnamedplus'))?'+':'"'))
- let opcode = a:op
- let lines = []
- let v_count = v:count
- let cmd_mode = a:cmd_mode
- let firstline = a:firstline
- let lastline = a:lastline
-
- if a:lastline < a:firstline
- let firstline = a:lastline
- let lastline = a:firstline
- endif
-
- if cmd_mode == 'n'
- let v_count = 1
- " If a count was provided (5p), we want to repeat the paste
- " 5 times, but this also alters the a:firstline and a:lastline
- " ranges, which while in normal mode we do not want
- let lastline = firstline
- endif
- " If no count was specified it will have a value of 0
- " so set it to at least 1
- let v_count = ((v_count > 0)?(v_count):1)
-
- if '[dr]' =~ opcode
- " Reverse the order of the lines to act on
- let begin = lastline
- while begin >= firstline
- call add(lines, getline(begin))
- let begin = begin - 1
- endwhile
- else
- " Process the selected items in order
- let begin = firstline
- while begin <= lastline
- call add(lines, getline(begin))
- let begin = begin + 1
- endwhile
- endif
-
- if opcode ==# 'q'
- " Close the yankring window
- if s:yr_winsize_chgd == 1
- " Adjust the Vim window width back to the width
- " it was before we showed the yankring window
- let &columns= &columns - (g:yankring_window_width)
- endif
-
- " Hide the YankRing window
- hide
-
- if bufwinnr(s:yr_buffer_last) != -1
- " If the buffer is visible, switch to it
- exec s:yr_buffer_last_winnr . "wincmd w"
- endif
-
- return
- elseif opcode ==# 's'
- " Switch back to the original buffer
- exec s:yr_buffer_last_winnr . "wincmd w"
-
- call s:YRSearch()
- return
- elseif opcode ==# 'u'
- " Switch back to the original buffer
- exec s:yr_buffer_last_winnr . "wincmd w"
-
- call s:YRShow(0)
- return
- elseif opcode ==# 'R'
- " Switch back to the original buffer
- exec s:yr_buffer_last_winnr . "wincmd w"
-
- call s:YRShow(0, 'R')
- return
- elseif opcode ==# 'a'
- let l:curr_line = line(".")
- " Toggle the auto close setting
- let g:yankring_window_auto_close =
- \ (g:yankring_window_auto_close == 1?0:1)
- " Display the status line / help
- call s:YRWindowStatus(0)
- call cursor(l:curr_line,0)
- return
- elseif opcode ==# 'c'
- let l:curr_line = line(".")
- " Toggle the clipboard monitor setting
- let g:yankring_clipboard_monitor =
- \ (g:yankring_clipboard_monitor == 1?0:1)
- " Display the status line / help
- call s:YRWindowStatus(0)
- call cursor(l:curr_line,0)
- return
- elseif opcode ==# '?'
- " Display the status line / help
- call s:YRWindowStatus(1)
- return
- endif
-
- " Switch back to the original buffer
- exec s:yr_buffer_last_winnr . "wincmd w"
-
- " Intentional case insensitive comparision
- if opcode =~? 'p'
- let cmd = 'YRGetElem '
- let parms = ", '".opcode."' "
- elseif opcode ==? 'r'
- let opcode = 'p'
- let cmd = 'YRGetElem '
- let parms = ", 'p' "
- elseif opcode ==# 'd'
- let cmd = 'YRPop '
- let parms = ""
- endif
-
- " Only execute this code if we are operating on elements
- " within the yankring
- if '[auq?]' !~# opcode
- while v_count > 0
- " let iter = 0
- " let index = 0
- for line in lines
- let elem = matchstr(line, '^\d\+')
- if elem > 0
- if elem > 0 && elem <= s:yr_count
- " if iter > 0 && opcode =~# 'p'
- if opcode =~# 'p'
- " Move to the end of the last pasted item
- " only if pasting after (not above)
- " ']
- endif
- exec cmd . elem . parms
- " let iter += 1
- endif
- endif
- endfor
- let v_count = v_count - 1
- endwhile
-
- if opcode ==# 'd'
- call s:YRShow(0)
- " Return the user to their last known position, assuming
- " it is still available after the delete
- if firstline < line("$")
- call cursor(firstline,0)
- else
- call cursor(line("$"),0)
- endif
- return ""
- endif
-
- if g:yankring_window_auto_close == 1 && cmd_mode == 'v'
- exec 'bdelete '.s:yr_buffer_id
- return ""
- endif
-
- endif
-
- return ""
-
-endfunction
-
-function! s:YRWarningMsg(msg)
- echohl WarningMsg
- echomsg a:msg
- echohl None
-endfunction
-
-function! s:YRErrorMsg(msg)
- echohl ErrorMsg
- echomsg a:msg
- echohl None
-endfunction
-
-function! s:YRWinLeave()
- " Track which window we are last in. We will use this information
- " to determine where we need to paste any contents, or which
- " buffer to return to.
-
- if s:yr_buffer_id < 0
- " The yankring window has never been activated
- return
- endif
-
- if winbufnr(winnr()) == s:yr_buffer_id
- " Ignore leaving the yankring window
- return
- endif
-
- if bufwinnr(s:yr_buffer_id) != -1
- " YankRing window is visible, so save off the previous buffer ids
- let s:yr_buffer_last_winnr = winnr()
- let s:yr_buffer_last = winbufnr(s:yr_buffer_last_winnr)
- " else
- " let s:yr_buffer_last_winnr = -1
- " let s:yr_buffer_last = -1
- endif
-endfunction
-
-function! s:YRFocusGained()
- " FocusGained is not available in general by console vim.
- " There are some terminal windows which support it though.
- " This thread on vim_use covers some of it:
- " http://groups.google.com/group/vim_use/browse_thread/thread/8dd3fb054ee922c6/59bee226473a9eea?lnk=gst&q=console+FocusGained#59bee226473a9eea
- " http://groups.google.com/group/vim_dev/browse_thread/thread/ba58fb493a3cf4ba/dc1a22ba1e92579d?lnk=gst&q=terminal+FocusGained#dc1a22ba1e92579d
- " Does not work:
- " urxvt terminal
- " Works:
- " GTK2 GUI, on Fedora 11, both as gvim and as vim in a GNOME Terminal
- "
- " Simple test, create the following autocmd and gain and loose focus in
- " the terminal:
- " autocmd FocusLost * echomsg "focus lost"
- " autocmd FocusGained * echomsg "focus gained"
- call s:YRCheckClipboard()
-
- " If the yankring window is open, refresh it
- call s:YRWindowUpdate()
-endfunction
-
-function! s:YRCheckClipboard()
- if g:yankring_clipboard_monitor == 1
- " If the clipboard has changed record it inside the yankring
- " echomsg "YRCheckClipboard[".len(@*)."][".@*.']['.s:yr_prev_clipboard_star.']'
- if has('unnamedplus') && &clipboard =~ '\<unnamedplus\>'
- if len(@+) > 0 && @+ != s:yr_prev_clipboard_plus
- let elem = s:YRMRUElemFormat(
- \ getreg('+')
- \ , getregtype('+')
- \ )
- let found = s:YRMRUHas('s:yr_history_list', elem)
-
- " Only add the item to the "top" of the ring if it is
- " not in the ring already.
- if found == -1
- call YRRecord3("+")
- endif
- let s:yr_prev_clipboard_plus = @+
- endif
- else
- if len(@*) > 0 && @* != s:yr_prev_clipboard_star
- let elem = s:YRMRUElemFormat(
- \ getreg('*')
- \ , getregtype('*')
- \ )
- let found = s:YRMRUHas('s:yr_history_list', elem)
-
- " Only add the item to the "top" of the ring if it is
- " not in the ring already.
- if found == -1
- call YRRecord3("*")
- endif
- let s:yr_prev_clipboard_star = @*
- endif
- endif
- endif
-endfunction
-
-function! s:YRInsertLeave()
- " The YankRing uses omaps to execute the prescribed motion
- " and then appends to the motion a call to a YankRing
- " function to record the contents of the changed register.
- "
- " We cannot append a function call to the end of a motion
- " that results in Insert mode. For example, any command
- " like 'cw' enters insert mode. Appending a function call
- " after the w, simply writes out the call as if the user
- " typed it.
- "
- " Using the InsertLeave event, allows us to capture the
- " contents of any changed register after it completes.
-
- call YRRecord(s:YRRegister())
-
- " When performing a change (not a yank or delete)
- " it is not possible to call <SID>yrrecord at the end
- " of the command (or it's contents will be inserted
- " into the buffer instead of executed).
- " So, when using ".", we have to remove the _zap_
- " keys and then re-add them back again after we
- " record the updates.
- if s:yr_remove_omap_dot == 1
- call s:YRMapsCreate('add_only_zap_keys')
- endif
-
-endfunction
-
-" Deleting autocommands first is a good idea especially if we want to reload
-" the script without restarting vim.
-" Call YRFocusGained to check if the clipboard has been updated
-augroup YankRing
- autocmd!
- autocmd VimEnter * :if has('clipboard') | call <SID>YRFocusGained() | endif
- autocmd WinLeave * :call <SID>YRWinLeave()
- autocmd FocusGained * :if has('clipboard') | call <SID>YRFocusGained() | endif
- autocmd InsertLeave * :call <SID>YRInsertLeave()
- autocmd User YRSetNumberedReg :call <SID>YRSetNumberedReg()
- " autocmd User YRSetNumberedReg :let i = 0 | while i <= 10 | if i > s:yr_count | break | endif | call setreg( (i), s:YRGetValElemNbr((i),'v'), s:YRGetValElemNbr((i),'t') ) | let i += 1 | endwhile
-augroup END
-
-
-" copy register
-inoremap <script> <SID>YRGetChar <c-r>=YRGetChar()<CR>
-" inoremap <script> <SID>YRGetSearch <c-r>=YRGetSearch()<CR>
-nnoremap <silent> <SID>yrrecord :call YRRecord3()<cr>
-inoremap <silent> <SID>yrrecord <C-R>=YRRecord3()<cr>
-
-
-" Public commands
-command! YRClear call s:YRClear()
-command! -nargs=0 YRMapsCreate call s:YRMapsCreate()
-command! -nargs=0 YRMapsDelete call s:YRMapsDelete()
-command! -range -bang -nargs=? YRDeleteRange <line1>,<line2>call s:YRYankRange(<bang>1, <args>)
-command! -nargs=* YRGetElem call s:YRGetElem(<args>)
-command! -bang -nargs=? YRGetMultiple call s:YRGetMultiple(<bang>0, <args>)
-command! -count -register -nargs=* YRPaste call s:YRPaste(0,1,<args>)
-command! -nargs=? YRPop <line1>,<line2>call s:YRPop(<args>)
-command! -register -nargs=? YRPush call s:YRPush(<args>)
-command! -nargs=* YRReplace call s:YRPaste(1,<f-args>)
-command! -nargs=? YRSearch call s:YRSearch(<q-args>)
-command! -nargs=? YRShow call s:YRShow(<args>)
-command! -nargs=? YRToggle call s:YRToggle(<args>)
-command! -nargs=? YRCheckClipboard call s:YRCheckClipboard(<args>)
-command! -count -register -nargs=* YRYankCount call s:YRYankCount(<args>)
-command! -range -bang -nargs=? YRYankRange <line1>,<line2>call s:YRYankRange(<bang>0, <args>)
-command! -count=1 -bang -nargs=0 YRMapsMacro call s:YRMapsMacro(<bang>0, <args>)
-
-" Menus
-" 0: Turns the menu off.
-if has("menu") && g:yankring_default_menu_mode != 0
- if g:yankring_default_menu_mode == 1
- " 1: Turns the 'Yankring' menu on with no menu shortcut.
- let menuRoot = 'YankRing'
- let menuPriority = ''
- elseif g:yankring_default_menu_mode == 2
- " 2: Turns the 'Yankring 'menu on with <alt>-y as the shortcut.
- let menuRoot = '&YankRing'
- let menuPriority = ''
- elseif g:yankring_default_menu_mode == 3
- " 3: Turns the 'Plugin -> YankRing' menu on with <alt>-y as the shortcut.
- let menuRoot = exists("g:yankring_menu_root") ? g:yankring_menu_root : '&Plugin.&YankRing'
- let menuPriority = exists("g:yankring_menu_priority") ? yankring_menu_priority : ''
- else
- " 3: Turns the 'Plugin -> YankRing' menu on with <alt>-y as the shortcut.
- let menuRoot = '&Plugin.&YankRing'
- let menuPriority = ''
- endif
-
- let leader = '\'
- if exists('g:mapleader')
- let leader = g:mapleader
- endif
- let leader = escape(leader, '\')
-
- exec 'noremenu <script> '.menuPriority.' '.menuRoot.'.YankRing\ Window :YRShow<CR>'
- exec 'noremenu <script> '.menuPriority.' '.menuRoot.'.YankRing\ Search :YRSearch<CR>'
- exec 'noremenu <script> '.menuPriority.' '.menuRoot.'.Replace\ with\ Previous<TAB>'.leader.g:yankring_replace_n_pkey.' :YRReplace -1, ''P''<CR>'
- exec 'noremenu <script> '.menuPriority.' '.menuRoot.'.Replace\ with\ Next<TAB>'.leader.g:yankring_replace_n_pkey.' :YRReplace 1, ''P''<CR>'
- exec 'noremenu <script> '.menuPriority.' '.menuRoot.'.Clear :YRClear<CR>'
- exec 'noremenu <script> '.menuPriority.' '.menuRoot.'.Toggle :YRToggle<CR>'
- exec 'noremenu <script> '.menuPriority.' '.menuRoot.'.Check\ Clipboard :YRCheckClipboard<CR>'
-endif
-
-if g:yankring_enabled == 1
- " Create YankRing Maps
- call s:YRMapsCreate()
-endif
-
-call s:YRInit()
-call s:YRCheckClipboard()
-
-let &cpo = s:cpo_save
-unlet s:cpo_save
-
-" vim:fdm=marker:nowrap:ts=4:expandtab: