Code Monkey home page Code Monkey logo

cosco.vim's Introduction

cosco.vim

Comma and semi-colon insertion bliss for vim.

Cosco's official vim.org page: http://www.vim.org/scripts/script.php?script_id=4758

What Cosco does:

Appends, substitutes or removes a comma or a semi-colon to the end of your line, based on its context.

It:

  • Takes into consideration previous and next lines endings, as well line indentations.
  • Ignores blank lines.
  • Will maintain your cursor's original position.

The best way to describe it is with examples.

Demo / Examples

Examples (as well this plugin) were created with javascript in mind (but the plugin works for any kind of file).

Click to watch the video

(Click the image to watch the video)

Dependencies

This plugin depends on tpope/vim-repeat being installed in order to have the repeat functionality.

Installation

  1. Add lfilho/cosco.vim to your Plug, Vundle, NeoBundle, pathogen, or manually copy the files... You know the deal.
  2. Run your Plugn/Vundle/NeoBundle/pathogen process of updating / installing new bundles... (Links above should help you)
  3. Use it
  4. Profit!

Usage

Cosco command won't override any mappings or commands you might already have. You have to add them yourself. (Good vim plugin writing practice!). Here you can find two examples on how to do this. Put them on your .vimrc.

Using it via command

Go to the target line then: :CommaOrSemiColon

Using it via mappings

An example mapping, using the key combo <Leader>; for both normal and insert modes:

autocmd FileType javascript,css,YOUR_LANG nmap <silent> <Leader>; <Plug>(cosco-commaOrSemiColon)
autocmd FileType javascript,css,YOUR_LANG imap <silent> <Leader>; <c-o><Plug>(cosco-commaOrSemiColon)

and then you can just type <Leader>;.

Repeating it

You can repeat it with . key as long as you have tpope/vim-repeat installed.

Configuration Options

Ignoring comment lines

If you are in a comment line and don't want the plugin to act on it, put the following in your .vimrc:

let g:cosco_ignore_comment_lines = 1     " Default : 0

It uses the underlying vim syntax mechanism, so it will work for any language. Naturally, this requires syntax to be enabled in your vim.

Caveat: You have to be inside the comment for this to work. That is, if you have the following line:

var foo = 'bar' // A comment

Or a merely indented comment:

    // A comment

And the cursor is placed anywhere before the //, it won't work as vim won't identify the current cursor position's syntax to be a comment. Pull Requests are welcome to improve this.

Ignoring filetypes

If you want to explicitly declare a set of filetypes that cosco will ignore you can add one of the following lines to your .vimrc:

let g:cosco_filetype_whitelist = ['php', 'javascript']
let g:cosco_filetype_blacklist = ['vim', 'bash']

These variables must be declared as a list (array) of languages recognized by vim

Whitelist
The g:cosco_filetype_whitelist variable is used to declare a list of filetypes that cosco will work in. If this variable is declared, cosco will ignore any filetype that is not specified in the whitelist variable.

Blacklist
The g:cosco_filetype_blacklist variable is used to declare a list of filetypes that cosco will ignore. If this variable is declared, cosco will ignore any filetype that is specified in the blacklist variable.

If neither of these variables are declared in the .vimrc cosco will work in any filetype.

The g:cosco_filetype_whitelist variable will override and ignore the g:cosco_filetype_blacklist variable if both variables are declared in your .vimrc.

Getting the current filetype
You can easily get the current filetype by calling:

:set ft?

Custom regex ignore patterns per filetype For more granular control, if you need to ignore a regex pattern per filetype you can use this dictionary g:cosco_ignore_ft_pattern, for example:

let g:cosco_ignore_ft_pattern = {
      \ 'cpp': '^#',
      \ 'c': '^#',
      \ 'd': '^.*cornerCase',
      \}

Auto CommaOrSemicolon Insertion Mode (Experimental)

Auto insertion of a comma or a semicolon is also supported through the function:

:call AutoCommaOrSemiColon()

To activate the AutoCommaOrSemiColon by default add the following line to your .vimrc:

let g:cosco_auto_comma_or_semicolon = 1     " Default : 0

For faster toggle you can use the command:

:AutoCommaOrSemiColonToggle

or better map it to the desireable key-bindings,F9 for example:

nmap <F9> :AutoCommaOrSemiColonToggle<CR>

This will show a message about the current state of the auto insetion mode (ON / OFF). By default what triggers the auto insertion is leaving insert mode (InsertLeave event). This can be modified by changing the desired events in the events list:

let g:cosco_auto_comma_or_semicolon_events = ["InsertLeave"]

Warning:

This feature is currently experimental and still not mature enough to work for many vim events (e.g: "TextChangedI") or in many places in your code, so use with care.

Tests

Tests are done with vim-unittest.

Known caveats

){
    'use strict';

    var foo = 2,
        bar = null;

Will change the use strict line ending to a comma (it thinks we are inside a hash declaration). Can't really address this issue without a var (specific to javascript) check. Might be resolved if we develop a language extension to this plugin.

TODO and wish list

  • Write plugin's vim documentation
  • Write all the examples possible
  • Improve test coverage
  • Write mappings examples using autocommand grouping
  • Write a better javascript integration, possible reading from an option .eslint and/or .jshint file (settings for comma dangling, etc)

cosco.vim's People

Contributors

ammarnajjar avatar atsepkov avatar kronik907 avatar lfilho avatar roryokane avatar tandrewnichols avatar viniarck avatar

Stargazers

 avatar

Watchers

 avatar

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.