gpt4 book ai didi

vim - 围绕枢轴交换选择

转载 作者:行者123 更新时间:2023-12-04 20:44:03 24 4
gpt4 key购买 nike

(不是 Swap text around equal sign 的可能副本:)

我经常发现自己在交换东西。这是一个痛苦的屁股。

让我们说在我写完这段代码之后

tmp = realloc (words, sizeof (char **) * (*count + 1));

我注意到一行中有太多的星号,不喜欢它,并想在乘法星号周围交换两个因子。

或者,我写
#if !defined(_CONSOLE_H_) && defined (__MINGW32__)

但我突然意识到 defined (__MINGW32__)出于某种原因必须排在第一位。

我认为如果我能做这样的事情会很酷:

(在字符 x 上, [x] 表示光标位置。 <S> 代表这个假设的“交换”命令)
#if [!]defined(_CONSOLE_H_) && defined (__MINGW32__)

命令: vf&<S>$ => 从光标选择到枢轴(单词 && ),并将选择与文本交换到行尾。

或者,对于前一个例子:
tmp = realloc (words, [s]izeof (char **) * (*count + 1));

命令: v3f*<S>f) => 从这里选择到第三 * , 与文本交换转发到 ) .

对我来说,这将是非常有用的。有没有这样的东西,或者我必须编写自己的插件?

谢谢!

编辑 ——

作为@ib。在对他的回答的评论中说,我需要更具体地说明什么是支点。

枢轴也可以是一个字符,例如这里:
static char ** tokenize_input (char * input, PDWORD count);

我可能想交换 "," 周围的两个参数.更准确地说, ", " .

所以也许我需要两个命令:
<s> - char-wise - the pivot is the last character of the selection;
<S> - word-wise - the pivot is the last word of the selection.

谢谢!
(ps。最后一个 Word 怎么样?:)

最佳答案

这似乎在这里工作,让我知道它是如何工作的:

function! Swap(...) "{{{
let start_v = col("'<")
let end_v = col("'>")
let mv = ''
let isMv = 0
while !isMv
let char = s:GetChar()
if char == '<Esc>'
return ''
endif
let mv .= char
let isMv = s:IsMovement(mv)
echon mv."\r"
endwhile
if isMv == 2
return ''
endif
exec "normal! ".end_v.'|'.mv
let lhs = '\%'.start_v.'c\(.\{-}\S\)'
if !a:0
let pivot = '\(\s*\%'.(end_v).'c.\s*\)'
else
let pivot = '\(\s*'.a:1.'*\%'.(end_v).'c'.a:1.'\+\s*\)'
endif
let rhs = '\(.*\%#.\)'
exec 's/'.lhs.pivot.rhs.'/\3\2\1/'
endfunction "Swap }}}

function! s:GetChar() "{{{
let char = getchar()
if type(char) == type(0) && char < 33
return '<Esc>'
elseif char
let char = nr2char(char)
endif
return char
endfunction "GetChar }}}

function! s:IsMovement(mv) "{{{
let ft = a:mv =~ '^\C\d*[fFtT].$'
let ft_partial = a:mv =~ '^\C\d*\%([fFtT].\?\)\?$'
let right = a:mv =~ '^\d*[l$|;,]\|g[m$]$'
let right_partial = a:mv =~ '^\d*\%([l$|;,]\|g[m$]\?\)\?$'
if !right_partial && !ft_partial
return 2
endif
return ft || right
endfunction "IsMovement2Right }}}

" Use last char as pivot. e.g.: the comma in the given example.
vmap <silent> <leader>s1 :<C-U>call Swap()<CR>
" Use \S\+ (WORD) as pivot. e.g.: &&
vmap <silent> <leader>ss :<C-U>call Swap('\S')<CR>
" Use \w\+ as pivot.
vmap <silent> <leader>sw :<C-U>call Swap('\w')<CR>

现在无需按 Enter 键指定移动。 'pivot' 始终包括任何周围的空格,并且可以使用作为映射中 Swap() 参数给出的单个字符类来定义。

如果您想看到它突出显示,请检查 https://gist.github.com/1921196

关于vim - 围绕枢轴交换选择,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9458076/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com