2

インラインでVimでコメントの再マップを実行して、ifすでにコメントされているかどうかを確認しようとしています。これは私がすでに持っているものであり、もちろんそれは機能していませんハハ:

imap <c-c> <Esc>^:if getline(".")[col(".")-1] == '/' i<Delete><Delete> else i// endif

私がやりたいのは、最初の文字がa/かどうかを確認することです。の場合は/、その行の最初の2文字を削除し、そうでない場合は、行の前に2文字を/追加//します。

私が最初に持っていたのはこれでした:

imap <c-c> <Esc>^i//

それは完璧に機能しましたが、私が欲しいのは気まぐれでコメント/コメント解除できることです。

4

3 に答える 3

4

vimには多くのコメントプラグインがあります:

自分でプラグインを作成する前に、まずこれらのプラグインを確認することを強くお勧めします。それはあなたに大きな努力を節約します。

補足として、通常、挿入モードではなく通常モードでコメント/コメント解除する必要があります。これはvimの方法であるだけでなく、より良い元に戻る履歴を提供します。

独自のマッピングを作成することに完全に取り掛かっている場合は、すべてのハードワークを実行する関数を作成し、マッピングでその関数をを介して呼び出すことをお勧めします:call。関数を必要としない単純なロジックでうまくいくと思う場合は、式のマッピングを使用できます(を参照:h map-<expr>)。プラグインは大きくなる可能性があるため、プラグインに整理することをお勧めします。その場合は、:h write-pluginプラグインを適切な方法で作成するための感触をつかむために見てください。

コメントを切り替えるための単純な式マッピングの例:

nnoremap <expr> <leader>c getline(".") =~ '\m^\s*\/\/' ? '^"_2x' : 'I//<esc>`['
于 2012-08-08T16:28:26.677 に答える
4

挿入モードでこれを行うことに対する@PeterRinckerの回答の警告、および完全な機能を備えたプラグインを示すことに完全に同意します。

しかし、私はあなたが求めていることを正確に実行するためにこの関数を書くことに抵抗できませんでした。この種のマッピングを関数で処理する方が簡単だと思います。追加のボーナスとして、開始した行の同じ位置(文字の挿入または削除によってシフトされた)で挿入モードに戻ります。

function! ToggleComment()
    let pos=getpos(".")
    let win=winsaveview()
    if getline(".") =~ '\s*\/\/'
        normal! ^2x
        let pos[2]-=1
    else 
        normal! ^i//
        let pos[2]+=3
    endif
    call winrestview(win)
    call setpos(".",pos)
    startinsert
endfunction   

inoremap <c-c> <Esc>:call ToggleComment()<CR>

posカーソルが正しい列に戻されるようにするための変更に注意してください。このコマンドstartinsertは、このタイプの関数で挿入モードに戻るのに役立ちます。noremap非常に正当な理由がない限り、マッピングに使用する方が常に安全です。

これはうまく機能しているように見えますが、Vimにあまり似ておらず、長期的には他のプラグインの方が柔軟であることがわかるかもしれません。

于 2012-08-08T16:36:10.910 に答える
1

このvimtipもあります! http://vim.wikia.com/wiki/Comment/UnComment_visually_selected_text

私は下のものを使用します

...
noremap <silent> ,c :<C-B>sil <C-E>s/^/<C-R>=escape(b:comment_leader,'\/')<CR>/<CR>:noh<CR>
noremap <silent> ,u :<C-B>sil <C-E>s/^\V<C-R>=escape(b:comment_leader,'\/')<CR>//e<CR>:noh<CR>

,c comments out a region
,u uncomments a region
于 2012-08-08T18:16:07.573 に答える