2013-08-10 13 views
6
Here is some text 
here is line two of text 

że wizualnie wybrać z is do is w VIM (nawiasach wybór wizualny [])vim uzyskania długości od wizualnej zakresie wyboru Pythona

Here [is some text 
here is] line two of text 

Stosując mysite.urls można uzyskać krotki zakresu doboru:

function! GetRange() 
python << EOF 

import vim 

buf = vim.current.buffer # the buffer 
start = buf.mark('<')  # start selection tuple: (1,5) 
end = buf.mark('>')  # end selection tuple: (2,7) 

EOF 
endfunction 

I pozyskiwania ten plik :so %, zaznacz tekst wizualnie, r un :<,'>call GetRange() i

teraz, gdy mam (1,5) i (2,7). W Pythonie, jak mogę skompilować ciąg znaków, który jest następujący:

is some text\nhere is

Byłoby miło:

  1. uzyskać ten ciąg dla przyszłych manipulacji
  2. następnie zastąpić ten wybrany asortyment z zaktualizowany/zmanipulowany ciąg
+1

Czy trzeba to zrobić w pythonie? Zostawiłem poniżej odpowiedź vimscript. Odzwierciedlając pytanie, nie jestem pewien, czy to będzie dla ciebie do przyjęcia, ale na razie zostawię to na razie. – FDinoff

+1

Wiele pomocnych odpowiedzi w skrypcie Vima w [Jak uzyskać wizualnie zaznaczony tekst w VimScript] (http://stackoverflow.com/q/1533565). – glts

Odpowiedz

7

Spróbuj tego:

fun! GetRange() 
python << EOF 

import vim 

buf = vim.current.buffer 
(lnum1, col1) = buf.mark('<') 
(lnum2, col2) = buf.mark('>') 
lines = vim.eval('getline({}, {})'.format(lnum1, lnum2)) 
lines[0] = lines[0][col1:] 
lines[-1] = lines[-1][:col2] 
print "\n".join(lines) 

EOF 
endfun 

Można użyć vim.eval uzyskać wartości Pythona funkcji Vima i zmiennych.

+2

Myślę, że 'linia [-1] [: col2 + 1]' byłoby wygodniejsze. – qed

4

Prawdopodobnie zadziała, jeśli użyjesz czystego vimscript

function! GetRange() 
    let @" = substitute(@", '\n', '\\n', 'g') 
endfunction 

vnoremap ,r y:call GetRange()<CR>gvp 

Spowoduje to przekształcenie wszystkich znaków nowej linii na \n w selekcji wizualnej i zastąpienie zaznaczenia tym ciągiem.

To odwzorowanie dokonuje wyboru w rejestrze ". Wywołuje funkcję (nie jest to konieczne, ponieważ jest to tylko jedno polecenie). Następnie używa gv, aby ponownie wybrać wizualną selekcję, a następnie wkleja rejestr ofert z powrotem na wybrany region.

Uwaga: w vimscript wszystkie funkcje zdefiniowane przez użytkownika muszą rozpoczynać się od wielkiej litery.

1

Oto kolejna wersja oparta na odpowiedzi Connera. Wziąłem sugestię qed i dodałem poprawkę, gdy wybór jest całkowicie w jednej linii.

import vim 

def GetRange(): 
    buf = vim.current.buffer 
    (lnum1, col1) = buf.mark('<') 
    (lnum2, col2) = buf.mark('>') 
    lines = vim.eval('getline({}, {})'.format(lnum1, lnum2)) 
    if len(lines) == 1: 
     lines[0] = lines[0][col1:col2 + 1] 
    else: 
     lines[0] = lines[0][col1:] 
     lines[-1] = lines[-1][:col2 + 1] 
    return "\n".join(lines) 
+0

Co się stanie, jeśli tekst zostanie wybrany w trybie ** blokowania wizualnego **? Wydaje się, że funkcja nie działa poprawnie. – Meow

+0

Wydaje się działać dobrze dla mnie .. co on robi dla ciebie? –

Powiązane problemy