Selalu gunakan: atur tempel, Apakah ini ide yang bagus?

16

Dalam vim terminal, menempelkan data clipboard sering mengacaukan indentasi kode. Saya hanya tahu jika saya menggunakan :set paste indentasi tidak rusak. Padahal, setelah menempelkan data, harus saya lakukan :set nopaste lagi? Bagaimana jika saya tidak melakukannya, masalah apa yang muncul?

Benjamin
sumber
Bagaimana dengan mencoba sendiri? Atau membaca dokumentasinya ?
romainl
1
Lihat juga "Mode Tempel Bracketed" dalam jawaban saya untuk "Menempel kode ke jendela terminal ke vim" stackoverflow.com/a/7053522/754997 . Jika emulator terminal Anda mendukungnya, Anda dapat mengaturnya untuk memberitahu Vim untuk beralih ke / dari mode tempel secara otomatis setiap kali Anda menempelkan teks ke terminal.
Chris Page
1
@romainl Saya merasa cukup masuk akal bahwa keduanya 1) mencoba dan menunggu untuk melihat apakah ada konsekuensi negatif dari selalu menggunakan set paste (+ - nopaste), dan 2) rtfm-ing (sebagai pengguna level bawah atau menengah seperti OP) , kurang berguna daripada bertanya kepada mereka yang memiliki pengalaman dengan opsi. Bertanya di sini tampaknya merupakan pendekatan yang lebih cerdas, dan mendokumentasikan ini akan membantu orang lain.
belacqua

Jawaban:

5

Seperti yang ditulis orang lain, Anda tidak ingin membiarkan set 'tempel'. Saya hanya ingin menunjukkan bahwa dengan emulator terminal yang baik dan dikompilasi dan dikonfigurasi dengan benar vim, Anda tidak perlu mengubah 'rekatkan'. Anda memerlukan emulator terminal yang baik seperti xterm atau Terminal GNOME, vim dengan fitur X11 disertakan, dan opsi 'mouse' diatur ke 'a'. Kemudian vim akan "tahu" ketika Anda menempelkan mouse dan secara efektif akan mengatur dan menghapus opsi 'tempel' untuk Anda.

Salah satu cara untuk mendapatkan vim dengan fitur X11 untuk dijalankan gvim dengan -v pilihan atau buat alias,

alias vim='gvim -v'

Lalu letakkan

set mouse=a

di ~ / .vimrc Anda.

garyjohn
sumber
Ketika saya mengatur mouse = a, saya tidak bisa menyalin teks. "Salin" berwarna abu-abu di menu klik kanan dan di menu aplikasi.
Lee Daniel Crocker
@LeeDanielCrocker: Copy akan berwarna abu-abu atau tidak terlihat sama sekali kecuali beberapa teks telah dipilih. Bagaimana Anda memilih teks yang akan disalin?
garyjohn
Hanya dengan mouse. FYI, "y" berfungsi dengan baik ... menarik teks dan menyalinnya ke keyboard sistem. Hanya menu yang tidak berfungsi. Jika mouse diatur ke "r", maka menu berfungsi, tetapi mouse menyertakan nomor baris. Jadi, secara keseluruhan, saya bisa hidup dengan mouse = a, saya hanya perlu mengingat untuk menarik, bukan menyalin.
Lee Daniel Crocker
7

Posting ini memiliki jawaban favorit saya, https://coderwall.com/p/if9mda/automatically-set-paste-mode-in-vim-when-pasting-in-insert-mode

Pada dasarnya jika Anda mulai dalam mode Sisipkan dan menggunakan Ctrl + Shift + V atau klik kanan tempel dengan mouse Anda, Vim mendeteksi bahwa ini berasal dari terminal dan secara otomatis menyetel mode tempel, lalu hapus kodenya setelah selesai, sehingga Anda tidak kehilangan kunci yang dipetakan ulang (yang tidak dapat bekerja dalam mode tempel karena menulis data mentah) dan Anda kembali ke keadaan "waras" ketika selesai.

Untuk vim saja (masukkan .vimrc Anda)

let &t_SI .= "\<Esc>[?2004h"
let &t_EI .= "\<Esc>[?2004l"
inoremap <special> <expr> <Esc>[200~ XTermPasteBegin()

function! XTermPasteBegin()
  set pastetoggle=<Esc>[201~
  set paste
  return ""
endfunction

Jika Anda menggunakan vim di bawah Tmux (masih berjalan di .vimrc)

function! WrapForTmux(s)
  if !exists('$TMUX')
    return a:s
  endif

  let tmux_start = "\<Esc>Ptmux;"
  let tmux_end = "\<Esc>\\"

  return tmux_start . substitute(a:s, "\<Esc>", "\<Esc>\<Esc>", 'g') . tmux_end
endfunction

let &t_SI .= WrapForTmux("\<Esc>[?2004h")
let &t_EI .= WrapForTmux("\<Esc>[?2004l")

function! XTermPasteBegin()
  set pastetoggle=<Esc>[201~
  set paste
  return ""
endfunction

inoremap <special> <expr> <Esc>[200~ XTermPasteBegin()
dragon788
sumber
Saya menganggap salah satu let &t_SI .= "\<Esc>[?xxxxx" garis mendeteksi pintasan tempel keyboard? Apakah ini berfungsi untuk mac juga diberi jalan pintas yang berbeda?
doub1ejack
@ doub1ejack Ini sebenarnya mendeteksi urutan pelarian Xterm, bukan bagaimana mereka dipanggil (yaitu 2004h adalah tempel dimulai) jadi selama terminal Anda mendukung kode Xterm dan meneruskannya ke Vim seharusnya berfungsi dengan baik di Mac.
dragon788
Oh Tuhan. kamu adalah pahlawanku. Saya sudah mengetik begitu: mengatur nopaste berkali-kali.
maxwell
2

Seperti yang disarankan romainl, dokumentasi menjelaskan pengaturan itu 'paste' Opsi menonaktifkan beberapa opsi lain, dan Anda pasti akan menemukan bahwa lebih cepat daripada nanti itu akan menyebabkan masalah bagi Anda. Untuk alasan ini, ada 'pastetoggle' pilihan. Lihat:

:help 'paste'
:help 'pastetoggle'
Heptite
sumber
1

Jika ada sesuatu, itu harus memiliki maknanya. Anda harus memperhatikan dokumentasi vim yang sangat berguna.

  :help 'paste'
  :help 'pastetoggle'

Setelah membaca, Anda mungkin menginginkan ini:

" Toggle paste mode
"   (prefer this over 'pastetoggle' to echo current state)
nmap <leader>p :setlocal paste! paste?<cr>

Saya harap posting ini bermanfaat :)

nXqd
sumber
1

IIRC ketika Anda menempelkan ke vim, pada dasarnya berpikir bahwa Anda mengetik semua karakter itu sendiri. Jadi jika indentasi diaktifkan, itu akan membuat indentasi untuk Anda, tetapi teks yang disisipkan biasanya sudah mengandung indentasi sehingga indentasi memang "kacau". Beralih ke mode tempel mematikan hal-hal seperti indentasi otomatis.

Jika Anda suka indentasi otomatis seperti yang Anda ketik, Anda harus mengubahnya kembali ke nopaste setelah selesai menempel. Cobalah dan catat bagaimana Anda harus melakukan semua lekukan secara manual dalam mode tempel.

Sumudu Fernando
sumber