怎么用map在行末添加或删除特定的字符串?

15 views
Skip to first unread message

Derek Tan

unread,
Nov 21, 2017, 7:12:54 PM11/21/17
to vim...@googlegroups.com
各位大佬,

想实现的功能是按了 \td 以后,在行末添加“// TODO",如果已经添加过了,就把”// TODO"删掉。

我的想法是首先找一找有没有匹配的字符串,没有的话就在行末添加,如果匹配到了,就从匹配的位置开始删到行尾。

" add or remove TODO
augroup add_todo
autocmd!
autocmd FileType c,cpp :nnoremap <silent> <buffer> <leader>td m`<c-r>=ToggleTODO()<CR><esc>``
autocmd FileType c,cpp :inoremap <silent> <buffer> <leader>td <esc>m`<c-r>=ToggleTODO()<CR><esc>``a
function! ToggleTODO()
let l:idx = match(getline('.'), '// TODO\s*$')
if l:idx < 0
" add // TODO
return "A // TODO"
else
" remove // TODO
return l:idx + 1 ."|D"
endif
endfunction
augroup END

我原本以为<C-R>=后面加函数,就是函数的返回值,但是看起来好像这个套路只在normal模式下是不能用的,所以上面这段并不能正常工作。

请问应该如何修改?或者有什么其他的实现思路吗?谢谢!

--
        DerekTan
        Mobile:13813597112
        tan...@gmail.com

依云

unread,
Nov 22, 2017, 2:02:21 AM11/22/17
to vim...@googlegroups.com
你需要 :help setline。

另外,为什么要腹膜 autocmd 呢?你可以把特定文件类型的配置写到
~/.vim/ftplugin 下的。具体请 :help filetype-plugin。

--
Best regards,
lilydjwg

Linux Vim Python 我的博客:
https://blog.lilydjwg.me/
--
A: Because it obfuscates the reading.
Q: Why is top posting so bad?

Derek Tan

unread,
Nov 22, 2017, 2:31:04 AM11/22/17
to vim...@googlegroups.com
谢谢依云。

最近刚刚学了一点vim script,所以autocmd啥的能用的都套上去了。现在去掉了,用setline实现了一下。可以添加和去除,但是现在的做法仍然有一个问题就是如何保持原来光标的位置?

:nnoremap <buffer> <leader>td :call ToggleTODO() <CR>
:inoremap <buffer> <leader>td <ESC>:call ToggleTODO() <CR>

function! ToggleTODO()
let l:idx = match(getline('.'), '// TODO\s*$')
if l:idx < 0
" add // TODO
call setline(line('.'), getline('.'). " // TODO")
else
" remove // TODO
call setline(line('.'), substitute(getline('.'), "\s*// TODO.*$", "", "g") )
endif
endfunction


--
要退订此论坛,请发邮件至 vim-cn+unsubscribe@googlegroups.com
更多选项,请通过 http://groups.google.com/group/vim-cn 访问该论坛

---
您收到此邮件是因为您订阅了 Google 网上论坛的“Vim.cn”群组。
要退订此群组并停止接收此群组的电子邮件,请发送电子邮件到vim-cn+unsubscribe@googlegroups.com
要查看更多选项,请访问 https://groups.google.com/d/optout

世东 王

unread,
Nov 22, 2017, 2:44:00 AM11/22/17
to vim...@googlegroups.com
可以阅读下 https://github.com/wsdjeg/vim-galore-zh_cn

发自我的华为手机

-------- 原始邮件 --------
主题:Re: [Vim-cn] 怎么用map在行末添加或删除特定的字符串?
发件人:Derek Tan
收件人:vim...@googlegroups.com
抄送:

--
要退订此论坛,请发邮件至 vim-cn+un...@googlegroups.com

更多选项,请通过 http://groups.google.com/group/vim-cn 访问该论坛

---
您收到此邮件是因为您订阅了Google网上论坛上的“Vim.cn”群组。
要退订此群组并停止接收此群组的电子邮件,请发送电子邮件到vim-cn+un...@googlegroups.com
要查看更多选项,请访问https://groups.google.com/d/optout

Derek Tan

unread,
Nov 22, 2017, 2:52:38 AM11/22/17
to vim...@googlegroups.com
谢谢 王世东,clone下来了,弱弱地问下,用什么工具看比较方便,还是就vim看?我这里vim打开README.md乱码了……

您收到此邮件是因为您订阅了Google网上论坛上的“Vim.cn”群组。

要退订此群组并停止接收此群组的电子邮件,请发送电子邮件到vim-cn+unsubscribe@googlegroups.com
要查看更多选项,请访问https://groups.google.com/d/optout

--
要退订此论坛,请发邮件至 vim-cn+unsubscribe@googlegroups.com
更多选项,请通过 http://groups.google.com/group/vim-cn 访问该论坛

---
您收到此邮件是因为您订阅了Google网上论坛上的“Vim.cn”群组。

要退订此群组并停止接收此群组的电子邮件,请发送电子邮件到vim-cn+unsubscribe@googlegroups.com
要查看更多选项,请访问https://groups.google.com/d/optout

世东 王

unread,
Nov 22, 2017, 3:26:08 AM11/22/17
to vim...@googlegroups.com
就是Vim看呀,应该是你的编码设置有问题吧,如果只是阅读的话,可以就在github上看。
--
要退订此论坛,请发邮件至 vim-cn+un...@googlegroups.com

更多选项,请通过 http://groups.google.com/group/vim-cn 访问该论坛

---
您收到此邮件是因为您订阅了Google网上论坛上的“Vim.cn”群组。
要退订此群组并停止接收此群组的电子邮件,请发送电子邮件到vim-cn+un...@googlegroups.com
要查看更多选项,请访问https://groups.google.com/d/optout

依云

unread,
Nov 22, 2017, 5:38:36 AM11/22/17
to vim...@googlegroups.com
On Wed, Nov 22, 2017 at 03:30:59PM +0800, Derek Tan wrote:
> 谢谢依云。
>
> 最近刚刚学了一点vim
> script,所以autocmd啥的能用的都套上去了。现在去掉了,用setline实现了一下。可以添加和去除,但是现在的做法仍然有一个问题就是如何保持原来光标的位置?

:help setpos

猜不到的话,你可以在这里找你需要的函数:
:help function-list

Derek Tan

unread,
Nov 22, 2017, 7:46:37 PM11/22/17
to vim...@googlegroups.com
再次感谢依云!
现在基本上能够工作了!
唯一的不足是,删除末尾的 // TODO 时,我希望删除以后末尾不要遗留多余的空格,所以替换的时候在前面匹配了\s*。但是好像没有作用,按理说*匹配的时候是贪婪的啊。我直接在命令模式下用s/\s*\/\/ TODO.*$//g替换是可以把多余的空格删掉的,但是用substitute替换就不行,不知道是怎么回事。

:nnoremap <silent> <buffer> <leader>td :call ToggleTODO() <CR>
:inoremap <silent> <buffer> <leader>td <ESC>:call ToggleTODO() <CR>a

function! ToggleTODO()
let l:idx = match(getline('.'), '// TODO\s*$')
let l:pos = getcurpos()
if l:idx < 0
" add // TODO
call setline(line('.'), getline('.'). " // TODO")
else
" remove // TODO
call setline(line('.'), substitute(getline('.'), "\s*// TODO.*$", "", "g") )
endif
call setpos(".", l:pos)
endfunction


--
要退订此论坛,请发邮件至 vim-cn+unsubscribe@googlegroups.com
更多选项,请通过 http://groups.google.com/group/vim-cn 访问该论坛

---
您收到此邮件是因为您订阅了 Google 网上论坛的“Vim.cn”群组。
要退订此群组并停止接收此群组的电子邮件,请发送电子邮件到vim-cn+unsubscribe@googlegroups.com
要查看更多选项,请访问 https://groups.google.com/d/optout

世东 王

unread,
Nov 22, 2017, 11:38:05 PM11/22/17
to vim...@googlegroups.com
既然是 setline, 我觉得没必要使用 setpos 了。 其实你可以直接在vim
里面测试你的setline是否能正常工作。
> > 要退订此论坛,请发邮件至 vim-cn+un...@googlegroups.com
> > 更多选项,请通过 http://groups.google.com/group/vim-cn 访问该论坛
> >
> > ---
> > 您收到此邮件是因为您订阅了 Google 网上论坛的“Vim.cn”群组。
> > 要退订此群组并停止接收此群组的电子邮件,请发送电子邮件到vim-cn+un...@googlegroups.com
> > 要查看更多选项,请访问 https://groups.google.com/d/optout
> >
>
>
>
> --
> DerekTan
> Mobile:13813597112
> tan...@gmail.com
>
> --
> 要退订此论坛,请发邮件至 vim-cn+un...@googlegroups.com
> 更多选项,请通过 http://groups.google.com/group/vim-cn 访问该论坛
>
> ---
> 您收到此邮件是因为您订阅了 Google 网上论坛的“Vim.cn”群组。
> 要退订此群组并停止接收此群组的电子邮件,请发送电子邮件到vim-cn+un...@googlegroups.com
> 要查看更多选项,请访问 https://groups.google.com/d/optout

依云

unread,
Nov 23, 2017, 3:01:04 AM11/23/17
to vim...@googlegroups.com
On Thu, Nov 23, 2017 at 08:46:33AM +0800, Derek Tan wrote:
> 再次感谢依云!
> 现在基本上能够工作了!
> 唯一的不足是,删除末尾的 // TODO
> 时,我希望删除以后末尾不要遗留多余的空格,所以替换的时候在前面匹配了\s*。但是好像没有作用,按理说*匹配的时候是贪婪的啊。我直接在命令模式下用s/\s*\/\/
> TODO.*$//g替换是可以把多余的空格删掉的,但是用substitute替换就不行,不知道是怎么回事。
> [...]
> call setline(line('.'), substitute(getline('.'), "\s*// TODO.*$", "", "g") )

:help expr-'

Derek Tan

unread,
Nov 23, 2017, 3:23:54 AM11/23/17
to vim...@googlegroups.com
改成单引号果然好了,完美!

谢谢依云,太牛啦!

--
要退订此论坛,请发邮件至 vim-cn+unsubscribe@googlegroups.com
更多选项,请通过 http://groups.google.com/group/vim-cn 访问该论坛

---
您收到此邮件是因为您订阅了 Google 网上论坛的“Vim.cn”群组。
要退订此群组并停止接收此群组的电子邮件,请发送电子邮件到vim-cn+unsubscribe@googlegroups.com
要查看更多选项,请访问 https://groups.google.com/d/optout
Reply all
Reply to author
Forward
0 new messages