refactor: migrate core logic to autoload/singlechar.vim
- Move main functions (InsertChar, RepeatSingleChar) to autoload/singlechar.vim, using Vim9script and export for modularity - Refactor plugin/singlechar.vim to import autoload module and update commands/mappings accordingly - Prepare for improved maintainability and compatibility with vim-repeat
This commit is contained in:
parent
64bcd7a1a0
commit
8463cdcf4b
2 changed files with 49 additions and 49 deletions
43
autoload/singlechar.vim
Normal file
43
autoload/singlechar.vim
Normal file
|
|
@ -0,0 +1,43 @@
|
||||||
|
vim9script noclear
|
||||||
|
|
||||||
|
# Function to handle character insertion
|
||||||
|
# Parameters:
|
||||||
|
# mode: 'at' to insert before cursor, 'after' to insert after cursor
|
||||||
|
# count: number of times to repeat the character
|
||||||
|
# pkey: character to insert (optional)
|
||||||
|
export def InsertChar(mode: string, count: number, pkey: string = ''): void
|
||||||
|
|
||||||
|
var key = pkey
|
||||||
|
if pkey == ''
|
||||||
|
echo g:singlechar_prompt
|
||||||
|
redraw
|
||||||
|
|
||||||
|
# Get character from user
|
||||||
|
var char = getchar()
|
||||||
|
key = nr2char(char)
|
||||||
|
endif
|
||||||
|
if key ==# "\<Esc>"
|
||||||
|
return
|
||||||
|
endif
|
||||||
|
|
||||||
|
# Determine whether to insert before (i) or after (a) cursor
|
||||||
|
var cmd = (mode ==# 'at') ? 'i' : 'a'
|
||||||
|
var text = repeat(key, count)
|
||||||
|
|
||||||
|
execute 'normal! ' .. cmd .. text .. "\<Esc>"
|
||||||
|
#save
|
||||||
|
g:last_singlechar_key = key
|
||||||
|
g:last_singlechar_mode = mode
|
||||||
|
g:last_singlechar_count = count
|
||||||
|
|
||||||
|
#set vim-repeat
|
||||||
|
#if exists('*repeat#set')
|
||||||
|
legacy silent! call repeat#set("\<Plug>(singlechar-repeat)")
|
||||||
|
#endif
|
||||||
|
enddef
|
||||||
|
|
||||||
|
def g:RepeatSingleChar(): void
|
||||||
|
if g:last_singlechar_key != ''
|
||||||
|
call InsertChar(g:last_singlechar_mode, g:last_singlechar_count, g:last_singlechar_key)
|
||||||
|
endif
|
||||||
|
enddef
|
||||||
|
|
@ -1,4 +1,5 @@
|
||||||
vim9script noclear
|
vim9script noclear
|
||||||
|
import autoload 'singlechar.vim'
|
||||||
# ------------------------------------------------------------------------------ #
|
# ------------------------------------------------------------------------------ #
|
||||||
# singlechar.vim - Insert single characters without entering insert mode
|
# singlechar.vim - Insert single characters without entering insert mode
|
||||||
# Author: lohhiiccc
|
# Author: lohhiiccc
|
||||||
|
|
@ -17,8 +18,8 @@ if exists('g:loaded_singlechar') || &cp || v:version < 900
|
||||||
endif
|
endif
|
||||||
g:loaded_singlechar = 1
|
g:loaded_singlechar = 1
|
||||||
# ------------------------------------------------------------------------------ #
|
# ------------------------------------------------------------------------------ #
|
||||||
|
|
||||||
# Configuration options
|
# Configuration options
|
||||||
|
|
||||||
# Mapping to insert a character at cursor position (before cursor)
|
# Mapping to insert a character at cursor position (before cursor)
|
||||||
if !exists('g:singlechar_map_insert_at')
|
if !exists('g:singlechar_map_insert_at')
|
||||||
g:singlechar_map_insert_at = '<Leader>i'
|
g:singlechar_map_insert_at = '<Leader>i'
|
||||||
|
|
@ -35,61 +36,18 @@ if !exists('g:singlechar_prompt')
|
||||||
endif
|
endif
|
||||||
|
|
||||||
# ------------------------------------------------------------------------------ #
|
# ------------------------------------------------------------------------------ #
|
||||||
# Core functionality
|
#
|
||||||
|
|
||||||
g:last_singlechar_key = ''
|
g:last_singlechar_key = ''
|
||||||
g:last_singlechar_mode = ''
|
g:last_singlechar_mode = ''
|
||||||
g:last_singlechar_count = 1
|
g:last_singlechar_count = 1
|
||||||
|
#
|
||||||
# Function to handle character insertion
|
|
||||||
# Parameters:
|
|
||||||
# mode: 'at' to insert before cursor, 'after' to insert after cursor
|
|
||||||
# count: number of times to repeat the character
|
|
||||||
# pkey: character to insert (optional)
|
|
||||||
def InsertChar(mode: string, count: number, pkey: string = ''): void
|
|
||||||
|
|
||||||
var key = pkey
|
|
||||||
if pkey == ''
|
|
||||||
echo g:singlechar_prompt
|
|
||||||
redraw
|
|
||||||
|
|
||||||
# Get character from user
|
|
||||||
var char = getchar()
|
|
||||||
key = nr2char(char)
|
|
||||||
endif
|
|
||||||
if key ==# "\<Esc>"
|
|
||||||
return
|
|
||||||
endif
|
|
||||||
|
|
||||||
# Determine whether to insert before (i) or after (a) cursor
|
|
||||||
var cmd = (mode ==# 'at') ? 'i' : 'a'
|
|
||||||
var text = repeat(key, count)
|
|
||||||
|
|
||||||
execute 'normal! ' .. cmd .. text .. "\<Esc>"
|
|
||||||
#save
|
|
||||||
g:last_singlechar_key = key
|
|
||||||
g:last_singlechar_mode = mode
|
|
||||||
g:last_singlechar_count = count
|
|
||||||
|
|
||||||
#set vim-repeat
|
|
||||||
if exists('*repeat#set')
|
|
||||||
legacy call repeat#set("\<Plug>(singlechar-repeat)")
|
|
||||||
endif
|
|
||||||
enddef
|
|
||||||
|
|
||||||
def g:RepeatSingleChar(): void
|
|
||||||
if g:last_singlechar_key != ''
|
|
||||||
call InsertChar(g:last_singlechar_mode, g:last_singlechar_count, g:last_singlechar_key)
|
|
||||||
endif
|
|
||||||
enddef
|
|
||||||
|
|
||||||
# ------------------------------------------------------------------------------ #
|
# ------------------------------------------------------------------------------ #
|
||||||
# Mappings <Plug>
|
# Mappings <Plug>
|
||||||
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=0 InsertCharAt InsertChar('at', <count>)
|
command! -count=1 -nargs=0 InsertCharAt singlechar.InsertChar('at', <count>)
|
||||||
command! -count=1 -nargs=0 InsertCharAfter InsertChar('after', <count>)
|
command! -count=1 -nargs=0 InsertCharAfter singlechar.InsertChar('after', <count>)
|
||||||
|
|
||||||
# Create default mappings unless disabled
|
# Create default mappings unless disabled
|
||||||
if !exists('g:singlechar_no_mappings')
|
if !exists('g:singlechar_no_mappings')
|
||||||
|
|
@ -97,7 +55,6 @@ if !exists('g:singlechar_no_mappings')
|
||||||
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>"'
|
||||||
endif
|
endif
|
||||||
|
|
||||||
|
|
||||||
# Usage:
|
# Usage:
|
||||||
# <Leader>i - Insert character at cursor position
|
# <Leader>i - Insert character at cursor position
|
||||||
# <Leader>a - Insert character after cursor position
|
# <Leader>a - Insert character after cursor position
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue