Ecosyste.ms: Awesome
An open API service indexing awesome lists of open source software.
https://github.com/kana/vim-textobj-user
Vim plugin: Create your own text objects
https://github.com/kana/vim-textobj-user
vim vim-plugins vim-textobj-user
Last synced: 6 days ago
JSON representation
Vim plugin: Create your own text objects
- Host: GitHub
- URL: https://github.com/kana/vim-textobj-user
- Owner: kana
- Created: 2010-03-23T13:46:01.000Z (almost 15 years ago)
- Default Branch: master
- Last Pushed: 2020-02-21T09:29:25.000Z (almost 5 years ago)
- Last Synced: 2024-12-09T04:29:26.584Z (13 days ago)
- Topics: vim, vim-plugins, vim-textobj-user
- Language: Vim script
- Homepage: http://www.vim.org/scripts/script.php?script_id=2100
- Size: 218 KB
- Stars: 1,444
- Watchers: 30
- Forks: 48
- Open Issues: 22
-
Metadata Files:
- Readme: README.md
Awesome Lists containing this project
README
# vim-textobj-user - Create your own text objects
[![Build Status](https://travis-ci.org/kana/vim-textobj-user.png)](https://travis-ci.org/kana/vim-textobj-user)
vim-textobj-user is a Vim plugin to create your own text objects without pain.
It is hard to create text objects, because there are many pitfalls to deal
with. This plugin hides such details and provides a declarative way to define
text objects. You can use regular expressions to define simple text objects,
or use functions to define complex ones.## Examples
### Simple text objects defined by a pattern
Define `ad`/`id` to select a date such as `2013-03-16`, and
define `at`/`it` to select a time such as `22:04:21`:```vim
call textobj#user#plugin('datetime', {
\ 'date': {
\ 'pattern': '\<\d\d\d\d-\d\d-\d\d\>',
\ 'select': ['ad', 'id'],
\ },
\ 'time': {
\ 'pattern': '\<\d\d:\d\d:\d\d\>',
\ 'select': ['at', 'it'],
\ },
\ })
```### Simple text objects surrounded by a pair of patterns
Define `aA` to select text from `<<` to the matching `>>`, and
define `iA` to select text inside `<<` and `>>`:```vim
call textobj#user#plugin('braces', {
\ 'angle': {
\ 'pattern': ['<<', '>>'],
\ 'select-a': 'aA',
\ 'select-i': 'iA',
\ },
\ })
```### Complex text objects defined by functions
Define `al` to select the current line, and
define `il` to select the current line without indentation:```vim
call textobj#user#plugin('line', {
\ '-': {
\ 'select-a-function': 'CurrentLineA',
\ 'select-a': 'al',
\ 'select-i-function': 'CurrentLineI',
\ 'select-i': 'il',
\ },
\ })function! CurrentLineA()
normal! 0
let head_pos = getpos('.')
normal! $
let tail_pos = getpos('.')
return ['v', head_pos, tail_pos]
endfunctionfunction! CurrentLineI()
normal! ^
let head_pos = getpos('.')
normal! g_
let tail_pos = getpos('.')
let non_blank_char_exists_p = getline('.')[head_pos[2] - 1] !~# '\s'
return
\ non_blank_char_exists_p
\ ? ['v', head_pos, tail_pos]
\ : 0
endfunction
```### Text objects for a specific filetype
Define `a(` to select text from `\left(` to the matching `\right)`, and
define `i(` to select text inside `\left(` to the matching `\right)`,
but *only for tex files*:```vim
call textobj#user#plugin('tex', {
\ 'paren-math': {
\ 'pattern': ['\\left(', '\\right)'],
\ 'select-a': [],
\ 'select-i': [],
\ },
\ })augroup tex_textobjs
autocmd!
autocmd FileType tex call textobj#user#map('tex', {
\ 'paren-math': {
\ 'select-a': ' a(',
\ 'select-i': ' i(',
\ },
\ })
augroup END
```## Further reading
You can define your own text objects like the above examples. See also
[the reference manual](https://github.com/kana/vim-textobj-user/blob/master/doc/textobj-user.txt)
for more details.There are many text objects written with vim-textobj-user.
If you want to find useful ones, or to know how they are implemented,
see [a list of text objects implemented with
vim-textobj-user](https://github.com/kana/vim-textobj-user/wiki).