Feature/begin end #3

Merged
lohhiiccc merged 6 commits from feature/begin-end into main 2025-08-21 15:26:13 +00:00
4 changed files with 93 additions and 21 deletions

View file

@ -39,10 +39,16 @@ git clone https://tpope.io/vim/repeat.git
## Usage ## Usage
By default, the plugin provides two mappings: By default, the plugin provides four mappings:
> [optional param]
> (param)
- `<Leader>i` - Insert a character at the cursor position > `[count]<bind>(char)`
- `<Leader>a` - Insert a character after the cursor position
- `[count]<Leader>i(char)` - Insert a character at the cursor position
- `[count]<Leader>a(char)` - Insert a character after the cursor position
- `[count]<Leader>I(char)` - Insert a character at the beginning of the line
- `[count]<Leader>A(char)` - Insert a character at the end of the line
After pressing the mapping, you'll see a prompt asking for the character to insert. Press any character and it will be inserted without entering insert mode. After pressing the mapping, you'll see a prompt asking for the character to insert. Press any character and it will be inserted without entering insert mode.
@ -65,6 +71,11 @@ You can customize the plugin by setting these variables in your vimrc:
" Change the mappings (before loading the plugin) " Change the mappings (before loading the plugin)
let g:singlechar_map_insert_at = '<Leader>i' " Default let g:singlechar_map_insert_at = '<Leader>i' " Default
let g:singlechar_map_insert_after = '<Leader>a' " Default let g:singlechar_map_insert_after = '<Leader>a' " Default
let g:singlechar_map_insert_begin = '<Leader>I' " Default
let g:singlechar_map_insert_end = '<Leader>A' " Default
" Set the static cursor (no cursor move during singlechar actions)
let g:singlechar_static_cursor = 1
" Change the prompt message " Change the prompt message
let g:singlechar_prompt = 'Press the character to insert - Press Esc to cancel...' " Default let g:singlechar_prompt = 'Press the character to insert - Press Esc to cancel...' " Default
@ -84,9 +95,14 @@ let g:singlechar_warning_message = 'Only the first character will be taken: {cha
The plugin provides these commands: The plugin provides these commands:
- `:InsertCharAt [count]` - Insert a character at the cursor position > [optional param]
- `:InsertCharAfter [count]` - Insert a character after the cursor position > (param)
- `:InsertCharAt (count) [char]` - Insert a character at the cursor position
- `:InsertCharAfter (count) [char]` - Insert a character after the cursor position
- `:InsertCharBegin (count) [char]` - Insert a character at the beginning of the line
- `:InsertCharEnd (count) [char]` - Insert a character at the end of the line
## License ## License
MIT License [MIT License](https://github.com/lohhiiccc/vim-singlechar/blob/main/LICENSE)

View file

@ -19,11 +19,10 @@ export def InsertChar(mode: string, count: number, input_char: string = ''): voi
return return
endif endif
# Determine whether to insert before (i) or after (a) cursor var insert_command = GetInsertCommand(mode)
var insert_command = (mode ==# 'at') ? 'i' : 'a'
var insert_text = repeat(first_char, (count == 0) ? 1 : count) var insert_text = repeat(first_char, (count == 0) ? 1 : count)
execute 'normal! ' .. insert_command .. insert_text .. "\<Esc>" DoSingleChar(insert_command, insert_text, g:singlechar_static_cursor)
# Save last used values # Save last used values
g:last_singlechar_key = first_char g:last_singlechar_key = first_char
@ -38,6 +37,31 @@ export def InsertChar(mode: string, count: number, input_char: string = ''): voi
endif endif
enddef enddef
def GetInsertCommand(mode: string): string
if mode ==# 'at'
return 'i'
elseif mode ==# 'after'
return 'a'
elseif mode ==# 'begin'
return 'I'
elseif mode ==# 'end'
return 'A'
else
return 'i'
endif
enddef
def DoSingleChar(command: string, text: string, resetCursor: number): void
var pos = getpos('.')
execute 'normal! ' .. command .. text .. "\<Esc>"
if resetCursor == 1
if (command ==# 'i')
pos[2] = pos[2] + 1
endif
setpos('.', pos)
endif
enddef
def g:RepeatSingleChar(): void def g:RepeatSingleChar(): void
if g:last_singlechar_key != '' if g:last_singlechar_key != ''
call InsertChar(g:last_singlechar_mode, g:last_singlechar_count, g:last_singlechar_key) call InsertChar(g:last_singlechar_mode, g:last_singlechar_count, g:last_singlechar_key)

View file

@ -6,7 +6,7 @@
Author: lohhiiccc Author: lohhiiccc
Version: 1.0.0 Version: 1.0.0
License: MIT License: MIT
Last Change: 2025-08-19 Last Change: 2025-08-21
CONTENTS *singlechar-contents* CONTENTS *singlechar-contents*
@ -79,8 +79,10 @@ COMMANDS *singlechar-commands
The plugin provides two commands: The plugin provides two commands:
`:InsertCharAt [count]` - Insert a character at the cursor position `:InsertCharAt [count] [char]` - Insert a character at the cursor position
`:InsertCharAfter [count]` - Insert a character after the cursor position `:InsertCharAfter [count] [char]` - Insert a character after the cursor position
`:InsertCharBegin [count] [char]` - Insert a character at the beginning of the line
`:InsertCharEnd [count] [char]` - Insert a character at the end of the line
The optional count parameter specifies how many times to insert the character. The optional count parameter specifies how many times to insert the character.
@ -89,8 +91,10 @@ MAPPINGS *singlechar-mappings
By default, the plugin defines these mappings: By default, the plugin defines these mappings:
`<Leader>i` - Map to `:InsertCharAt` `[count]<Leader>i` - Map to `:InsertCharAt [count]`
`<Leader>a` - Map to `:InsertCharAfter` `[count]<Leader>a` - Map to `:InsertCharAfter [count]`
`[count]<Leader>I` - Map to `:InsertCharBegin [count]`
`[count]<Leader>A` - Map to `:InsertCharEnd [count]`
=============================================================================== ===============================================================================
CONFIGURATION *singlechar-configuration* CONFIGURATION *singlechar-configuration*
@ -99,6 +103,8 @@ Customizing mappings: >
" Must be set before the plugin is loaded " Must be set before the plugin is loaded
let g:singlechar_map_insert_at = '<Leader>i' " Default let g:singlechar_map_insert_at = '<Leader>i' " Default
let g:singlechar_map_insert_after = '<Leader>a' " Default let g:singlechar_map_insert_after = '<Leader>a' " Default
let g:singlechar_map_insert_begin = '<Leader>I' " Default
let g:singlechar_map_insert_end = '<Leader>A' " Default
< <
Disabling default mappings: > Disabling default mappings: >
" Disable default mappings " Disable default mappings
@ -107,7 +113,13 @@ Disabling default mappings: >
" Create your own mappings " Create your own mappings
nnoremap <expr> <silent> ,i ":<C-u>InsertCharAt " .. v:count1 .. "<CR>" nnoremap <expr> <silent> ,i ":<C-u>InsertCharAt " .. v:count1 .. "<CR>"
nnoremap <expr> <silent> ,a ":<C-u>InsertCharAfter " .. v:count1 .. "<CR>" nnoremap <expr> <silent> ,a ":<C-u>InsertCharAfter " .. v:count1 .. "<CR>"
nnoremap <expr> <silent> ,I ":<C-u>InsertCharBegin " .. v:count1 .. "<CR>"
nnoremap <expr> <silent> ,A ":<C-u>InsertCharEnd " .. v:count1 .. "<CR>"
< <
Set static cursor option: >
" When enabled, cursor returns to its original position after insertion
let g:singlechar_static_cursor = 1
Changing the prompt message: > Changing the prompt message: >
let g:singlechar_prompt = 'Character to insert (Esc to cancel): ' let g:singlechar_prompt = 'Character to insert (Esc to cancel): '
< <

View file

@ -30,15 +30,32 @@ if !exists('g:singlechar_map_insert_after')
g:singlechar_map_insert_after = '<Leader>a' g:singlechar_map_insert_after = '<Leader>a'
copilot-pull-request-reviewer[bot] commented 2025-08-21 15:24:18 +00:00 (Migrated from github.com)
Review

The comment 'Toggle off static cursor' is misleading. This variable enables/disables the static cursor feature, not toggles it off.

# Enable/disable static cursor feature
The comment 'Toggle off static cursor' is misleading. This variable enables/disables the static cursor feature, not toggles it off. ```suggestion # Enable/disable static cursor feature ```
copilot-pull-request-reviewer[bot] commented 2025-08-21 15:24:18 +00:00 (Migrated from github.com)
Review

Spelling error: 'warnign' should be 'warning'.

# toggle warning
Spelling error: 'warnign' should be 'warning'. ```suggestion # toggle warning ```
endif endif
# Mapping to insert a character at the endline
if !exists('g:singlechar_map_insert_end')
g:singlechar_map_insert_end = '<Leader>A'
endif
# Mapping to insert a character at the startline
if !exists('g:singlechar_map_insert_begin')
g:singlechar_map_insert_begin = '<Leader>I'
endif
# Prompt message shown when waiting for character input # Prompt message shown when waiting for character input
if !exists('g:singlechar_prompt') if !exists('g:singlechar_prompt')
g:singlechar_prompt = 'Press the character to insert - Press Esc to cancel...' g:singlechar_prompt = 'Press the character to insert - Press Esc to cancel...'
endif endif
# Enable/disable static cursor feature
if !exists('g:singlechar_static_cursor')
g:singlechar_static_cursor = 0
endif
# toggle warning
if !exists('g:singlechar_keylen_warning') if !exists('g:singlechar_keylen_warning')
g:singlechar_keylen_warning = 1 g:singlechar_keylen_warning = 1
endif endif
# warning message
if !exists('g:singlechar_warning_message') if !exists('g:singlechar_warning_message')
g:singlechar_warning_message = 'Only the first character will be taken: {char}' g:singlechar_warning_message = 'Only the first character will be taken: {char}'
endif endif
@ -54,6 +71,8 @@ g:last_singlechar_count = 1
nnoremap <Plug>(singlechar-repeat) :call g:RepeatSingleChar()<CR> nnoremap <Plug>(singlechar-repeat) :call g:RepeatSingleChar()<CR>
# Direct command implementations # Direct command implementations
command! -count=1 -nargs=? InsertCharBegin singlechar.InsertChar('begin', <count>, <q-args>)
command! -count=1 -nargs=? InsertCharEnd singlechar.InsertChar('end', <count>, <q-args>)
command! -count=1 -nargs=? InsertCharAt singlechar.InsertChar('at', <count>, <q-args>) command! -count=1 -nargs=? InsertCharAt singlechar.InsertChar('at', <count>, <q-args>)
command! -count=1 -nargs=? InsertCharAfter singlechar.InsertChar('after', <count>, <q-args>) command! -count=1 -nargs=? InsertCharAfter singlechar.InsertChar('after', <count>, <q-args>)
@ -61,13 +80,14 @@ command! -count=1 -nargs=? InsertCharAfter singlechar.InsertChar('after', <count
if !exists('g:singlechar_no_mappings') if !exists('g:singlechar_no_mappings')
execute 'nnoremap <expr> <silent> ' .. g:singlechar_map_insert_at .. ' ":<C-u>InsertCharAt " .. v:count1 .. "<CR>"' execute 'nnoremap <expr> <silent> ' .. g:singlechar_map_insert_at .. ' ":<C-u>InsertCharAt " .. v:count1 .. "<CR>"'
execute 'nnoremap <expr> <silent> ' .. g:singlechar_map_insert_after .. ' ":<C-u>InsertCharAfter " .. v:count1 .. "<CR>"' execute 'nnoremap <expr> <silent> ' .. g:singlechar_map_insert_after .. ' ":<C-u>InsertCharAfter " .. v:count1 .. "<CR>"'
execute 'nnoremap <expr> <silent> ' .. g:singlechar_map_insert_begin .. ' ":<C-u>InsertCharBegin " .. v:count1 .. "<CR>"'
execute 'nnoremap <expr> <silent> ' .. g:singlechar_map_insert_end .. ' ":<C-u>InsertCharEnd " .. v:count1 .. "<CR>"'
endif endif
# Usage: # Usage:
# <Leader>i - Insert character at cursor position # [count]<Leader>i - Insert character at cursor position
# <Leader>a - Insert character after cursor position # [count]<Leader>I - Insert character at begin of the line
# [count]<Leader>a - Insert character after cursor position
# [count]<Leader>A - Insert character at end of the line
# #
# You can use a count before the mapping to insert multiple copies
# of the same character. For example: 3<Leader>i will insert the
# character 3 times at the cursor position.
# ------------------------------------------------------------------------------ # # ------------------------------------------------------------------------------ #