В терминальном vim вставка данных из буфера обмена часто портит отступ кода.
Я просто знал, что если я использую :set paste
отступ не сломан.
Хотя, после вставки данных, я должен сделать : снова :set nopaste
? Что если я не пойму, какая проблема возникнет?
5 ответов
Этот пост имеет мой любимый ответ, 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()
Как написали другие, вы не хотите оставлять "вставить" установленным. Я просто хотел отметить, что с хорошим эмулятором терминала и правильно скомпилированным и настроенным vim
вам не нужно менять "вставку". Вам нужен хороший эмулятор терминала, такой как xterm или GNOME Terminal, vim с включенной функцией X11 и опцией 'mouse', установленной в 'a'. Тогда vim
будет "знать", когда вы вставляете мышью, и эффективно установит и отменит опцию "вставить" для вас.
Один из способов получить vim
с помощью функции X11 - запустить gvim
с параметром -v
или создать псевдоним,
alias vim='gvim -v'
Затем положить
set mouse=a
в вашем ~/.vimrc.
Как предположил romainl, в документации объясняется, что установка параметра 'paste'
отключает несколько других параметров, и вы наверняка обнаружите, что рано или поздно это вызовет проблемы для вас. По этой причине есть опция 'pastetoggle'
. Увидеть:
:help 'paste'
:help 'pastetoggle'
Когда вы вставляете в vim, IIRC, по сути, думает, что вы набрали все эти символы самостоятельно. Так что, если авто-отступ включен, он будет делать отступы для вас, но вставленный текст обычно содержит отступ, так что отступ действительно "испорчен". Переключение в режим вставки отключает такие вещи, как авто-отступ.
Если вам нравится автоматический отступ при вводе текста, вы должны переключить его обратно на nopaste после того, как закончите вставку. Попробуйте и обратите внимание, как вы должны делать все отступы вручную в режиме вставки.
Если что-то существует, оно должно иметь свое значение. Вам следует внимательно изучить документацию vim, которая очень полезна.
:help 'paste'
:help 'pastetoggle'
После прочтения вы можете захотеть это:
" Toggle paste mode
" (prefer this over 'pastetoggle' to echo current state)
nmap <leader>p :setlocal paste! paste?<cr>
Я надеюсь, что вы найдете этот пост полезным :)