vim-scripts / countjump Goto Github PK
View Code? Open in Web Editor NEWCreate custom motions and text objects via repeated jumps.
Home Page: http://www.vim.org/scripts/script.php?script_id=3130
Create custom motions and text objects via repeated jumps.
Home Page: http://www.vim.org/scripts/script.php?script_id=3130
This is a mirror of http://www.vim.org/scripts/script.php?script_id=3130 DESCRIPTION Though it is not difficult to write a custom movement (basically a :map that executes some kind of search or jump) and a custom text-object (an :omap that selects a range of text), this is too complex for a novice user and often repetitive. This plugin covers the common use case where the movement and boundaries of a text object can be specified via start and end patterns, and offers a single function to set up related mappings. With it, you can enhance some built-in Vim mappings to take an optional [count], and quickly define new mappings for help file sections, diff hunks, embedded macros, and so on... As a generalization of the start and end patterns, the movement and boundaries of a text object can also be specified via jump functions, i.e. Funcrefs of functions that position the cursor on the appropriate location and return that location. This can be used where the jump is difficult to express with a single regular expression, the jump may need adapting depending on the context, or other uses. This plugin contains some support for movement and text objects consisting of text regions that can be defined by continuous lines that match a particular pattern, e.g. comment blocks that all start with /^\s*#/. SEE ALSO The following ftplugins use this plugin: diff_movement (vimscript #3180): Movement over diff hunks with ]] etc. fortunes_movement (vimscript #3181): Movement over email fortunes with ]] etc. help_movement (vimscript #3179): Movement over Vim help sections with ]] etc. mail_movement (vimscript #3182): Movement over email quotes with ]] etc. diffwindow_movement: Movement over changes in a diff window. (vimscript #3719) JumpToTrailingWhitespace: Motions to locate unwanted whitespace at the end of lines. (vimscript #3968) TaskMotion (vimscript #3990): Motions to task and TODO markers. ConflictMotions (vimscript #3991): Motions to and inside SCM conflict markers. vim_movement (vimscript #4002): Movement over Vim functions with ]m etc. vbs_movement (vimscript #4003): Movement over VBScript classes / functions / properties / subs with ]m etc. dosbatch_movement (vimscript #4004): Movement over MSDOS batch file functions / labels with ]m etc. SameSyntaxMotion (vimscript #4338): Motions to the borders of the same syntax highlighting. JumpToVerticalOccurrence: Like f{char}, but searching the same (vimscript #4841) screen column, not line. RELATED WORKS - motpat.vim (vimscript #3030) offers similar functions to setup motion mappings, but no text objects (yet). - textobj-user (vimscript #2100) has support for user-defined text objects via regular expressions, but they don't support selecting multiple via [count]. - movealong.vim (vimscript #4691) provides a :Movealong command (and optional mappings) that repeatedly executes a motion until a condition of a syntax, pattern match, or arbitrary expression is met. USAGE The plugin defines several functions, which set up the appropriate mappings based on the arguments that you supply. The following is an overview; you'll find the details directly in the implementation files in the .vim/autoload/CountJump/ directory. CountJump#Motion#MakeBracketMotion( mapArgs, keyAfterBracket, inverseKeyAfterBracket, patternToBegin, patternToEnd, isEndPatternToEnd, ... ) This function sets up mappings starting with [ and ] for movement (with optional [count]) relative to the current cursor position, targeting either a text pattern at the beginning ([{keyAfterBracket} mapping) or a text pattern at the end (]{inverseKeyAfterBracket} mapping) of whatever you want to treat as a text block. CountJump#Motion#MakeBracketMotionWithJumpFunctions( mapArgs, keyAfterBracket, inverseKeyAfterBracket, JumpToBeginForward, JumpToBeginBackward, JumpToEndForward, JumpToEndBackward, isEndJumpToEnd, ... ) This function sets up mappings starting with [ and ] for movement (with optional [count]) relative to the current cursor position, but rely on four passed jump functions instead of text patterns to do the movement. CountJump#TextObject#MakeWithCountSearch( mapArgs, textObjectKey, types, selectionMode, patternToBegin, patternToEnd ) Defines a complete set of mappings for inner and/or outer text objects that support an optional [count] and are driven by search patterns for the beginning and end of a block. Outer text objects include the matched pattern text, inner ones not. Selection can be characterwise, linewise or blockwise. CountJump#TextObject#MakeWithJumpFunctions( mapArgs, textObjectKey, types, selectionMode, JumpToBegin, JumpToEnd ) This is a generalization of CountJump#TextObject#MakeWithCountSearch() that invokes custom functions instead of searching for a fixed pattern. This is useful if the check for a match is too complex for a single regular expression, or if you need to adjust the match position depending on the circumstances. Often, a region can be defined as a block of continuous lines that all match a certain pattern (or, even more generic, where a provided predicate function returns a match position). The following functions aid in implementing movements to the boundaries of these regions and text objects consisting of the region: CountJump#Region#JumpToRegionEnd( count, Expr, isMatch, step, isToEndOfLine ) Starting from the current line, search for the position where the count'th region ends. Use this function to build Funcrefs for forward / backward jumps that can then be passed to CountJump#TextObject#MakeWithJumpFunctions(). CountJump#Region#JumpToNextRegion( count, Expr, isMatch, step, isAcrossRegion, isToEndOfLine ) Starting from the current line, search for the position where the count'th region begins/ends. CountJump#Region#Motion#MakeBracketMotion( mapArgs, keyAfterBracket, inverseKeyAfterBracket, Expr, isMatch, ... ) This function sets up mappings starting with [ and ] for movement (with optional [count]) relative to the current cursor position, targeting a text region defined by contiguous lines that (don't) match a:Expr. CountJump#Region#TextObject#Make( mapArgs, textObjectKey, types, selectionMode, Expr, isMatch ) Defines a complete set of mappings for inner and/or outer text objects that support an optional [count] and select regions of lines which are defined by contiguous lines that (don't) match a:Expr. The inner text object comprises all lines of the region itself, while the outer text object also includes all adjacent lines above and below which do not themselves belong to a region. The custom Funcrefs for jumps and predicates of lines belonging to a range may be invoked multiple times until the CountJump function arrives at its destination. To help the Funcrefs to determine where in this sequence they are, an empty g:CountJump_Context dictionary is initialized at the start of each CountJump function. Funcrefs can put custom information (e.g. the particular comment prefix on the current line) in there and evaluate this in subsequent invocations. EXAMPLE Let's illustrate the usage by developing custom motions and text objects for Pascal begin..end blocks. We want to move around blocks, and override the default section movements for it: ]] Go to [count] next start of a block. ][ Go to [count] next end of a block. [[ Go to [count] previous start of a block. [] Go to [count] previous end of a block. > call CountJump#Motion#MakeBracketMotion('<buffer>', '', '', '\c^begin\n\zs', '\c^.*\nend', 0) The begin pattern positions the cursor on the beginning of the line following the "begin" keyword, the end pattern on the beginning of the line preceding the "end" keyword. We want to select a block, either including or excluding the lines with the begin..end keywords: ib "inner block" text object, select [count] contents of a block. ab "a block" text object, select [count] blocks. > call CountJump#TextObject#MakeWithCountSearch('<buffer>', 'b', 'ai', 'V', '\c^begin\n', '\c^end.*$') If there is a filetype detection for Pascal files, we can simply put the above calls in a ~/.vim/ftplugin/pascal_movement.vim script and are done.
A declarative, efficient, and flexible JavaScript library for building user interfaces.
๐ Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. ๐๐๐
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google โค๏ธ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.