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

görsel olarak seçin görsel seçimi aralığında dize elde: Python kullanarakum Vim <code>is</code> için <code>is</code> den Python'la

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

, I sınıfı dizilerini elde edilebilir (parantez görsel seçimi [] temsil) Ben bu dosyayı kaynak

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 

:, :so % görsel metni seçin, r seçimi :<,'>call GetRange() ve

şimdi (1,5) ve (2,7) var.

is some text\nhere is

güzel gösterir misin: Python, nasıl şudur dize derlemek olabilir

  1. gelecek manipülasyon için bu dizeyi Edinme
  2. sonra bu seçili aralığı değiştirmek updated/manipulated string
+1

o python bunu yapmak gerekli mi? Aşağıda sadece bir cevap yazdım. Soruyu okuduktan sonra bunun sizin için kabul edilip edilmeyeceğinden emin değilim ama şimdilik oraya bırakacağım. En Vim komut – FDinoff

+1

Birçok yararlı cevaplar [VimScript görsel olarak seçilen metni almak nasıl] (http://stackoverflow.com/q/1533565). [: Col2 + 1] 'daha uygun olacaktır – glts

cevap

7

bu deneyin: Eğer vim fonksiyon ve değişkenlerin piton değerlerini almak için vim.eval kullanabilirsiniz

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 

.

+2

I' hattı [-1] düşünüyorum. – qed

4

Bu, saf vimscript

kullandıysanız muhtemelen işe yarar
function! GetRange() 
    let @" = substitute(@", '\n', '\\n', 'g') 
endfunction 

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

Bu, tüm yeni satırları görsel seçimdeki \n'a dönüştürecek ve seçimi bu dizeyle değiştirecektir.

Bu eşleme, seçimi " kayıt defterine sokar. Fonksiyonu çağırır (tek bir komuttan bu yana gerçekten gerekli değildir). Sonra görsel seçimi tekrar seçmek için gv kullanır ve ardından alıntı kaydını seçilen bölgeye geri yapıştırır.

Not: vimscript tüm kullanıcı tanımlı işlevler bir Büyük harf harf ile başlamalıdır.

1

İşte Conner'ın Yanıta göre başka versiyonu. Qed'in önerisini aldım ve seçim tamamen bir satırda olduğunda bir düzeltme ekledim.

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

** Görsel blok ** modunda metin seçilirse ne olur? İşlev doğru olarak görünmüyor. – Meow

+0

Benim için iyi çalışıyor gibi görünüyor .. sizin için ne yapıyor? –

İlgili konular