2

Ctrl-v (ビジュアルモード) でテキストを選択しています。次に、\s と入力してこれらの行を整列させ、次のように並べ替えます。

"Strip trailing space
 :map <Leader>S :1,$ s/\s\+$//g<CR>
:imap <Leader>S :1,$ s/\s\+$//g<CR>

選択したすべての行を Sort() に渡すにはどうすればよいですか。vim.current.rangeオブジェクトでできると思ったの ですが、うまくいきませんでした。現在、Sort() 関数は、cr[0] を介して一度に 1 行ずつテキストを読み取ります。私がする必要があるのは、分割行をマトリックスに格納し、必要な長さ/列を計算して、それらをバッファーに出力することです。

function! Sort()
python << EOF
import vim
cr = vim.current.range
line = cr[0]
line = line.split()
fmt_str = ['%8s' for word in line]
fmt_str = ' '.join(fmt_str)

line = tuple([word for word in line])
print(fmt_str)
cr[0]= fmt_str % line
EOF
endfunction

"Sort and align
:map <Leader>s :call Sort()<CR>
4

1 に答える 1

2

視覚的な選択でマッピングを機能させたい場合は、 を使用する必要があります:vnoremap。Ex コマンド ( など:call) には、自動的に視覚範囲が'<,'>付加されます。:help function-range-example通常の関数は 1 行に 1 回呼び出されますが、範囲自体を処理する特別な種類の関数 (cp.) を定義できます。

あなたは Python を使いたいと思われるので、先頭に追加された範囲を 経由でドロップし、とマーク<C-u>を介して選択範囲の境界にアクセスし、次のように行にアクセスして変更します。<>vim.current.buffer[lnum]

:vnoremap <Leader>s :<C-u>call Sort()<CR>
function! Sort()
    ...
    start = vim.current.buffer.mark('<')[0]
    end = vim.current.buffer.mark('>')[0]
于 2012-12-29T12:27:13.947 に答える