如果它存在于vim中,则删除行开头的特定char

问题描述 投票:0回答:2

这里只是另一个vim源代码注释问题。我有我的python源代码文件的映射:

map <C-C> <Home>i#<Esc>
imap <C-C> <Home>#<Esc> i

在Ctrl-C上,如果要对其进行注释,则将#放在开头。这大大提高了生产力。但是当我想取消注释行时,我必须手动执行此操作,这意味着转到每个注释行的第一个字符并将其删除。这非常烦人。乍一看,我可以将Home-x绑定到某个键上,但我偶尔可以删除一个无辜的空间或其他东西,以防万一我想错,并在线上执行此操作,在开头没有#字符。我首先尝试使用:%s //替换单行,但这会产生不必要的影响 - 它会触发搜索并在其他行中突出显示“模式”。如果是单个#字符,则表示失败。任何人都可以建议如何删除当前行开头的指定字符,如果它存在则不执行任何操作,如果没有,则不使用模式替换?

vim
2个回答
1
投票

我创建了一个简单的函数来切换注释:

function! ToggleComment()
    let l:pos = col('.')
    if getline('.') =~ '\v(\s+|\t+)?#'
        exec 'normal! _"_x'
        let l:pos -= 1
    else
        exec 'normal! I#'
        let l:pos += 1
    endif
    call cursor(line("."), l:pos)
endfunction
nnoremap <Leader>t :call ToggleComment()<CR>
inoremap <Leader>t <C-o>:call ToggleComment()<CR>

我推荐Tim Pope的插件vim-commentary,因为它更完整。但当然,我们的想法让你们一瞥我们可以用vimscript取得多大的成就。

here可以看到另一种方法,它不需要保存windowview并切换其他语言的注释


0
投票

任何人都可以建议如何删除当前行开头的指定字符,如果它存在则不执行任何操作,如果没有,则不使用模式替换?

一个解决方案是(假设你的光标在使用地图时位于#右侧的任何位置):

map <c-c> mmF#x`m

更通用的解决方案是使用替换和histdel()删除最后一个搜索模式:

function! DelComment()                                                   
  s/^\( *\)#/\1/
  call histdel("search", -1)
  let @/ = histget("search", -1)      
endfunction

执行该功能后(通过选择它并键入:@"),您可以将其映射到<c-c>

map <silent> <c-c> mm:silent! call DelComment()<cr>`m                    

我喜欢在执行地图后使用函数周围的标记来保持光标位置。随意删除上面的地图中的mm`m

© www.soinside.com 2019 - 2024. All rights reserved.