17

В терминальном vim вставка данных из буфера обмена часто портит отступ кода. Я просто знал, что если я использую :set paste отступ не сломан. Хотя, после вставки данных, я должен сделать : снова :set nopaste ? Что если я не пойму, какая проблема возникнет?

5 ответов5

7

Этот пост имеет мой любимый ответ, https://coderwall.com/p/if9mda/automatics-set-paste-mode-in-vim-when-pasting-in-insert-mode

В основном, если вы запускаете в режиме вставки и используете Ctrl+Shift+V или вставку правой кнопкой мыши с помощью мыши, Vim обнаруживает, что это пришло из терминала, и автоматически устанавливает режим вставки, а затем отменяет его после завершения, чтобы вы не потеряли переназначенные ключи (который не может работать в режиме вставки, потому что он записывает необработанные данные), и вы вернетесь в "нормальное" состояние, когда это будет сделано.

Для просто VIM (положить в свой .vimrc)

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

Если вы используете Vim под Tmux (все еще идет в .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()
5

Как написали другие, вы не хотите оставлять "вставить" установленным. Я просто хотел отметить, что с хорошим эмулятором терминала и правильно скомпилированным и настроенным vim вам не нужно менять "вставку". Вам нужен хороший эмулятор терминала, такой как xterm или GNOME Terminal, vim с включенной функцией X11 и опцией 'mouse', установленной в 'a'. Тогда vim будет "знать", когда вы вставляете мышью, и эффективно установит и отменит опцию "вставить" для вас.

Один из способов получить vim с помощью функции X11 - запустить gvim с параметром -v или создать псевдоним,

alias vim='gvim -v'

Затем положить

set mouse=a

в вашем ~/.vimrc.

2

Как предположил romainl, в документации объясняется, что установка параметра 'paste' отключает несколько других параметров, и вы наверняка обнаружите, что рано или поздно это вызовет проблемы для вас. По этой причине есть опция 'pastetoggle' . Увидеть:

:help 'paste'
:help 'pastetoggle'
1

Когда вы вставляете в vim, IIRC, по сути, думает, что вы набрали все эти символы самостоятельно. Так что, если авто-отступ включен, он будет делать отступы для вас, но вставленный текст обычно содержит отступ, так что отступ действительно "испорчен". Переключение в режим вставки отключает такие вещи, как авто-отступ.

Если вам нравится автоматический отступ при вводе текста, вы должны переключить его обратно на nopaste после того, как закончите вставку. Попробуйте и обратите внимание, как вы должны делать все отступы вручную в режиме вставки.

1

Если что-то существует, оно должно иметь свое значение. Вам следует внимательно изучить документацию vim, которая очень полезна.

  :help 'paste'
  :help 'pastetoggle'

После прочтения вы можете захотеть это:

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

Я надеюсь, что вы найдете этот пост полезным :)

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .