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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如果它存在于vim中,则删除行开头的特定char相关的知识,希望对你有一定的参考价值。

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

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

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

答案

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

function! ToggleComment()
    let l:pos = col('.')
    if getline('.') =~ 'v(s+|	+)?#'
        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并切换其他语言的注释

另一答案

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

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

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

以上是关于如果它存在于vim中,则删除行开头的特定char的主要内容,如果未能解决你的问题,请参考以下文章

vim删除空行和注释

如果表存在则删除行 SQL

VIM

Google Script:如果行中的值存在于另一个工作表中,则删除行

在 Vim 中上下移动整行

如果在另一个数据框中确实存在,则删除行 - python pandas