Syntax highlighting of a514140 ~( vim)

<<TableOfContents()>>

= Links =

https://danielmiessler.com/study/vim/#gs.Xg9jNGw

https://www.labnol.org/internet/learning-vim-for-beginners/28820/

[[https://eax.me/vim-commands/|Шпаргалка|class=" moin-https"]]

[[http://vimcasts.org/|VimCasts|class=" moin-http"]]

https://gist.github.com/theotherzach/5033931

[[https://habr.com/post/131951/|Эффективное использование Vim|class=" moin-https"]]

[[https://habr.com/ru/post/454742/|Минимум один трюк Vim, про который вы не знали|class=" moin-https"]]

= Recipes =

{{{
" spaces to tabs
%!unexpand -t 2 --first-only
" tabs to spaces
set tabstop=2 shiftwidth=2 expandtab
:retab
" объединяем строки через запятую или запятую с пробелом
" https://vi.stackexchange.com/a/4149/26373
:'<,'>s/\n/,/
:'<,'>s/\n/, /

" Rails.vim - кандидат на альтернативный файл
" можно использовать для создания нового файла
:echo rails#buffer().alternate_candidates()

}}}

{{{
# --- vim as default editor
sudo update-alternatives --config editor

}}}

= .gitignore =

{{{
# Swap
[._]*.s[a-v][a-z]
[._]*.sw[a-p]
[._]s[a-rt-v][a-z]
[._]ss[a-gi-z]
[._]sw[a-p]

# Session
Session.vim
Sessionx.vim

# Temporary
.netrwhist
*~
# Auto-generated tag files
tags
# Persistent undo
[._]*.un~

}}}

= Commands =

== View ==

||Command (via :set)||Description||
=====
||`cursorline`||подсветка текущей строки||
||`hls`||Подсветка поискового запроса||
||`list`||Отображение непечатных символов||
||`number`||отображение номеров строк||

== Buffer Navi ==

||Command||Decsription||
=====
||NORM||||
||`:Exp`||Эксплоер||
||+||На первый символ следущей строки||
||-||На первый символ предыдущей строки||
||Ctrl+g||Отображение информации о текущем расположении курсора||
||Ctrl+e||Прокручивание на одну строку вниз||
||Ctrl+y||Прокручивание на одну строку вверх||
||Ctrl+d||Вниз на полстраницы||
||Ctrl+u||Вверх на полстраницы||
||Ctrl+f||Вниз на страницу||
||Ctrl+b||Вверх на страницу||
||Ctrl+o||Перейти на предыдущую позицию в истории переходов||
||Ctrl+i||Перейти на следующую позицию в истории переходов||
||Ctrl+j||Перейти по гиперссылке||
||Ctrl+t||Перейти назад по истории переходов по гиперссылкам||
||`:e %:h/filename`||Открыть (создать) файл ''filename'' в текущей директории||

== Clipboard ==

||Command||Decsription||
=====
||<<BR>>p||вставляем из буфера после курсора||
||P||(заглавная p) вставляем из буфера перед курсором||
||yyp или Yp||Дублировать строку||
||"ay||Скопировать текст в буффер `a`||
||"ap||Вставить текст из буффера `a`||
||"+y||Копировать в системный буфер обмена||

== Editing ==

||Command||Decsription||
=====
||<<BR>>i||Переход в режим редактирования. Курсор остается на месте||
||I||Заглавная `i`. Переход в режим редактирования. Курсор переходит в начало строки.||
||a||Переход в режим редактирования. Курсор переходит на следующий символ.||
||A||Переход в режим редактирования. Курсор переходит в конец строки.||
||o||Переход в режим редактирования с созданием пустой строки ниже. Курсор переходит на новую строку.||
||O||Заглавная `o`. Переход в режим редактирования с созданием пустой строки выше. Курсор переходит на новую строку.||
||s||Переход в режим редактирования с удалением текущего символа.||
||Ns||Удаление N-символов и переход в режим редактирования||
||S||Переход в режим редактирования с удалением строки.||
||rx||Заменить символ под курсором на символ `x`||
||`R`||Переход в режим замены||
||cc||Удаление строки, переход в режим редактирования и отступ||
||c$||Удаление от курсора до конца строки и переход в режим редактирования||
||ce||Удаление символов от курсора до конца слова и переход в режим редактирования||
||di)||Удаление символов между скобками||
||di"||Удаление символов между кавычками||
||ddp||Удаление строки и вставка ее ниже следующей (смена строк)||
||u||Отмена изменений, сделанных крайней командой||
||U||(заглавная `u`) Отмена крайних изменений в строке||

== Find ==

||Command||Description||
=====
||<<BR>>fx||Поиск далее по строке символа x||
||2fx||Поиск второго символа `х` в строке||
||tx||Поиск далее по строке символа `x`x с установкой курсора перед ним||
||Fx||Поиск назад по строке символа x||
||Tx||Поиск назад по строке символа x с установкой курсора перед ним||
||*||Поиск всех вхождений слова под курсором||
||#||Поиск всех вхождений слова под курсором (в обратном направлении)||
||`/text`||Поиск||
||`?text`||Поиск в обратном направлении||
||n||Переход к следующему совпадению||
||N||Переход к предыдущему совпадению||

== Visual Mode ==

||Command||Description||
=====
||<<BR>>v||включаем визуальный режим||
||V||строчное выделение||
||y||копируем выделенное||
||d||вырезаем выделенное||
||u||преобразование в нижний регистр||

== Windows ==

||Command||Description||
=====
||<<BR>>Ctrl+g||Отображение информации о позиции в файле||
||Ctrl+wr||поменять местами компоновку||
||Ctrl+ww||переключение курсора между буферами компоновки||
||Ctrl+w_||максимизировать окно||
||Ctrl+w=||выровнять окна||
||Ctrl+wc||закрыть текущее окно||
||Ctrl+wH||переключение горизонтальной в вертикальную компоновку||
||Ctrl+wJ||переключение вертикальной в горизонтальную компоновку||

== Tabs ==

[[http://vim.wikia.com/wiki/Using_tab_pages|link|class=" moin-http"]]

||Command||Description||
=====
||`$vim -p file1 file2`||открываем vim с вкладками||
||`:tabn file3`||открываем файл file3 в новой вкладке||
||`:tabf index*`||открываем файл с шаблону имени||
||`:tabn`<<BR>> (или gt)||следующая вкладка||
||gT||предыдущая вкладка||
||igt||перейти на i-ую вкладку||
||`:tabfirst`||первая вкладка||
||`:tablast`||последняя вкладка||
||`:tabs`||список вкладок||
||`:tabm X`||перемещаем текущую вкладку на позицию Х+1||
||`:tabclose`<<BR>><<BR>>`:q`||закрываем текущую вкладку||
||`:tabclose i`||закрываем i-ую вкладку||
||`:tabonly`||закрываем все вкладки кроме текущей||

== Reduce & Expand ==

||Command||Decsription||
=====
||<<BR>>zc||свернуть блок||
||zo||развернуть блок||
||zM||свернуть все блоки||
||zR||развернуть все блоки||
||za||инвертировать свернутые блоки||

== Macros ==

||Command||Decsription||
=====
||<<BR>>qa||Старт записи макроса `a`.||
||q||остановка записи макроса.||
||@a||Вызов макроса `a`||
||n@a||исполнение макроса n-раз||

== Marks ==

||Command||Decsription||
=====
||<<BR>>ma||Установка метки `a`.||
||'a||переход на метку `a`||
||d'a||удалить всё до метки `a`||
||`:marks`||Отображение меток||
||`:delm!`||Удаление всех меток в нижнем регистре||

== Commentary ==

[[https://github.com/tpope/vim-commentary|commentary.vim|class=" moin-https"]] - плагин для комментариев

||Command||Description||
=====
||NORM||||
||gcc||комментирование строки||
||Ngcc||Комментирование ''N'' строк||
||gc}||Комментировать до конца параграфа||
||gc{||Комментировать до начала параграфа||
||gcNk||Комментировать N строк вверх||
||`:X,YCommentary`||Коментирование строк X-Y||

== Surround ==

[[https://github.com/tpope/vim-surround|vim-surround|class=" moin-https"]] - оборачивание текста в кавычки и скобки

[[https://github.com/tpope/vim-surround/blob/master/doc/surround.txt|Документация|class=" moin-https"]]

||Command||Description||
=====
|| ||Normal Mode||
||ds'||Удаление одинарных кавычек||
||ds"||Удаление двойных кавычек||
||cs"'||Замена двойных кавычек на одинарные||
|| ||Visual Mode||
||S'||оборачивание выделенного текста в одинарные кавычки||
||S"||оборачивание выделенного текста в двойные кавычки||

== FZF ==

https://github.com/junegunn/fzf

{{{
git clone --depth 1 https://github.com/junegunn/fzf.git ~/.fzf
~/.fzf/install

cd ~/.vim-config/.vim/bundle
git clone https://github.com/junegunn/fzf

}}}

.vimrc

{{{
" --- open zfz on Ctrl + P
nnoremap <C-p> :<C-u>FZF<CR>

}}}

||Command||Decsription||
=====
||<<BR>>Ctrl+p||Включение режима zfz||
||Ctrl+c||Отключение режима zfz||
||Ctrl+j or Down||Выделение вниз||
||Ctrl+k or Up||Выделение вверх||
||Ctrl+x||Открыть выделенный файл с горизонтальным разделением||
||Ctrl+v||Открыть выделенный файл с вертикальным разделением||
||Ctrl+t||Открыть выделенный файл новой вкладке||

== Grep ==

||Command||Decsription||
=====
||`:vimgrep QUERY dir/**`||Поиск строки QUERY в файлах директории dir/||

== Quickfix ==

||Command||Decsription||
=====
||`:copen`||Open the quickfix window||
||`:ccl`||Close window||
||`:cw`||Open it if there are "errors", close it otherwise (some people prefer this)||
||`:cn`||Go to the next error in the window||
||`:cp`||Go to previous||
||`:cnf`||Go to the first error in the next file||

== Bash ==

||Command||Decsription||
=====
||`:!cmd`||Выполнить bash-команду `cmd`||
||`:!motionCMD`||Фильтрация строк, попадающих под ''motion'',  bash-командой ''CMD''. Например, `!10Gsort` - сортировка строк между текущей и 10й bash-командой ''sort''||
||`:!`||Выполнить пустую команду (отобразить предыдущий вывод)||
||`:.!cmd`||Выполнение bash-команды ''cmd'' и вставка стандартного вывода в текущую строку. Пример: `:.!date`||

== Terminal ==

Команда `:term` включает терминал с горизонтальным разделением.

Переход между терминалом и редактором Ctrlw+w

В терминале переход в режим просмотра комбинацией Ctrlw+N

Выход из режима просмотра i или a

== Misc ==

||Command||Decsription||
=====
||NORM||||
||`:set paste`||Режим "вклейки". Текст вставляется "как есть", без автоотсутпов||
||`:set nopaste`||Отключение режима "вклейки"||
||`:set autowrite`||Автоматическая запись при переходе к другому файлу.||
||INSERT||||
||`C-R "`||Вставить текст, скопированный yank||
||`ccl`||Скрыть список быстрых исправлений||
||`C-K AB`||Вставка символа из таблицы символов, `AB` комбинация из таблицы `:digraphs`||
||`:retab`||Изменить режим отступов в соответствии с текущими настройками||

Трансляция кириллицы в латиницу. Позволяет выполнять команды в кириллической раскладке.

https://github.com/powerman/vim-plugin-ruscmd

{{{
# переключение курсора между буферами (,l)
let mapleader = ","
nmap <Leader>l <C-w>w

}}}

{{{
# переключение курсора между буферами (,l)
let mapleader = ","
nmap <Leader>l <C-w>w

}}}

= Python =

https://skillbox.ru/media/code/prevrashchaem-vim-v-polnotsennuyu-ide-dlya-python/

= Rails =

[[https://github.com/tpope/vim-rails|Rails.Vim|class=" moin-https"]]

[[https://github.com/tpope/vim-bundler|vim-bundler|class=" moin-https"]]

[[https://github.com/tpope/vim-dispatch|vim-dispatch|class=" moin-https"]]

[[https://github.com/jpo/vim-railscasts-theme|RailsCasts Color Scheme|class=" moin-https"]]

https://robots.thoughtbot.com/extending-rails-vim-with-custom-commands

||Command||Description||
=====
||<<BR>>gf||Перейти к файл под курсором||
||Ctrl+wgf||Открыть файл под курсором в новой вкладке||
||Ctrl+wf||Открыть файл под курсором с горизонтальным разделением||
||Ctrl+wvgf||Открыть файл под курсором с вертикальным разделением||
||`:A`||Alternate. Переключение между MVC и MVC spec||
||`:R`||Related. Переключение связанных сущностей: экшн контроллера - вьюха,||
||`:{E/S/V/T}controller`||перейти к контроллеру||
||`:{E/S/V/T}helper`||перейти к хелперу||
||`:{E/S/V/T}init`||переход в ''routes.rb''||
||`:{E/S/V/T}mailel`||перейти к майлеру||
||`:{E/S/V/T}migration`||перейти к миграции||
||`:{E/S/V/T}schema`||перейти к файлу схему||
||`:{E/S/V/T}task`||перейти к задаче||
||`:{E/S/V/T}layout`||перейти к корневому представлению||
|| ||`E` - в текущей вкладке `:edit`<<BR>><<BR>>`S` - `:split`<<BR>><<BR>>`V` - `:vsplit`<<BR>><<BR>>`T` - `:tabedit`||
||`:Rails console`||запуск Rails console||
||`:Generate controller Blog`||Запуск генератора||
||`:help Rails`||Справка по плагину||

https://www.sitepoint.com/effective-rails-development-vim/

https://github.com/smolnar/vim-rails-bundle

https://robots.thoughtbot.com/intro-rails-vim

https://masteruby.github.io/productivity-booster/2014/05/02/vim-plugins-for-ruby.html#.WnCE03omzCI

= Golang =

[[https://github.com/fatih/vim-go|vim-go|class=" moin-https"]] | - полезные команды

{{{
git clone https://github.com/fatih/vim-go.git ~/.vim/bundle/vim-go

}}}

[[https://github.com/fatih/vim-go/blob/master/doc/vim-go.txt|readme|class=" moin-https"]]

[[https://github.com/majutsushi/tagbar|tagbar|class=" moin-https"]] - панель со структурой файла

{{{
git clone git@github.com:majutsushi/tagbar.git ~/.vim/bundle/vim-tagbar

}}}

Добавляем строку в ''.vimrc''

{{{
" ~/.vimrc
nmap <F8> :TagbarToggle<CR>

}}}

Для корректной работы ''tagbar'' требуется ''ctags''.

{{{
sudo apt-get install autoconf
git clone git@github.com:universal-ctags/ctags.git
cd ctags
./autogen.sh
./configure
make
sudo make install

}}}

[[https://github.com/rjohnsondev/vim-compiler-go|vim-compiler-go|class=" moin-https"]] - проверка синтаксиса

{{{
git clone https://github.com/rjohnsondev/vim-compiler-go.git ~/.vim/bundle/vim-compiler-go

}}}

В файл ''.vimrc'' необходимо прописать путь к директории установки Golang.

{{{
" ~/.vimrc
let g:golang_goroot = "/usr/lib/go-1.10"

}}}

Узнать полный путь к этой директории можно командой

{{{
go env GOROOT

}}}

= Snippets =

https://github.com/SirVer/ultisnips

{{{
cd ~/.vim/bundle && git clone git://github.com/SirVer/ultisnips.git
cd ~/.vim/bundle && git clone git://github.com/honza/vim-snippets.git

}}}

{{{
" ~/.vimrc
" Trigger configuration. Do not use <tab> if you use https://github.com/Valloric/YouCompleteMe.
let g:UltiSnipsExpandTrigger="<tab>"
let g:UltiSnipsJumpForwardTrigger="<c-b>"
let g:UltiSnipsJumpBackwardTrigger="<c-z>"

" If you want :UltiSnipsEdit to split your window.
let g:UltiSnipsEditSplit="vertical"

}}}

Открытие редактора снипетов `:UltiSnipsEdit`
Документация `:help UltiSnips` (или [[http://bazaar.launchpad.net/%7Esirver/ultisnips/trunk/view/head:/doc/UltiSnips.txt|онлайн|class=" moin-http"]])

[[https://www.sirver.net/blog/2011/12/30/first-episode-of-ultisnips-screencast/|UltiSnips Screencast Episode 1|class=" moin-https"]]

[[https://www.sirver.net/blog/2012/01/08/second-episode-of-ultisnips-screencast/|UltiSnips Screencast Episode 2|class=" moin-https"]]

Ruby snippets (from procure gem)

{{{
global !p
def upperfirst(t):
    if len(t) < 2:
        return '' if len(t) < 1 else t.capitalize()
    return t[0].capitalize() + t[1:]
def lowerdash(t):
    return '-'.join([ w.lower() for w in re.findall('[a-z]+|[A-Z]+[a-z]*', t) ])
def snake(t):
    return '_'.join([ w.lower() for w in re.findall('[a-z]+|[A-Z]+[a-z]*', t) ])
endglobal

snippet llc "one line class"
class $1; end
endsnippet

snippet xc "class with include XML::Mapping"
class ${1}
  include XML::Mapping$0
end
endsnippet

snippet tn "text_node"
text_node :$2`!p snip.rv=snake(t[1])`, '$1'
endsnippet

snippet tno "text_node optional"
text_node :$2`!p snip.rv=snake(t[1])`, '$1', optional: true
endsnippet

snippet opt "optional: true" i
, optional: true
endsnippet

snippet on "object_node"
object_node :$2`!p snip.rv=snake(t[1])`, '$1',
            class: ${3:`!p snip.rv=upperfirst(t[1])`}
endsnippet

# --- EXAMPLES

snippet rc "require package that converts from camelCase or PascalCase to kebab-cased" b
const $1 = require('$2`!p snip.rv=lowerdash(t[1])`');
endsnippet

snippet imp "import package that converts from camelCase or PascalCase to kebab-cased" b
import $1 from '$2`!p snip.rv=lowerdash(t[1])`';
endsnippet

}}}

yaml.snippets

{{{
# --- TYPES

snippet ta "type array"
description: $1
type: array
items:
  $2
endsnippet

snippet to "type object"
description: $1
type: object
properties:
  $2
endsnippet

snippet ti "type integer"
description: $1
type: integer
nullable: ${2:false}
example: ${3:0}
$0
endsnippet

snippet tf "type float"
description: $1
type: number
format: float
nullable: false
example: ${2:1.23}
$0
endsnippet

snippet ts "type string"
description: $1
type: string
nullable: ${2:false}
example: "${3:string}"
$0
endsnippet

snippet tbs "type binary string"
description: $1
type: string
format: binary
nullable: ${2:false}
$3
endsnippet

snippet tdt "type date-time"
description: $1
type: string
format: date-time
nullable: ${2:false}
$0
endsnippet

snippet turl "type url"
description: $1
type: string
format: uri
nullable: ${2:false}
example: "${3:http://example.com}"
$0
endsnippet

snippet tb "type boolean"
description: $1
type: boolean
default: ${2:false}
nullable: ${3:false}
$0
endsnippet

# --- QUERY PARAMETERS

snippet parip "parameter integer in path"
- name: $1
  in: path
  description: $2
  required: true
  schema:
    type: integer
endsnippet

snippet pars "parameter string in query"
- name: $1
  in: query
  description: $2
  required: ${3:false}
  schema:
    type: string
endsnippet

snippet parsort "parameter for sorting"
- name: sort_by
  in: query
  description: Сортировка записей по заданному полю
  required: false
  schema:
    type: string
    enum: [$1]
$0
endsnippet

snippet parpages "parameter with referenced page and limit"
- $ref: "${1:../../swagger.yaml}#/components/parameters/page"
- $ref: "$1#/components/parameters/limit"
endsnippet

snippet parif "parameter with referenced Id-Modified-Since"
- $ref: "${1:../../swagger.yaml}#/components/parameters/ifmods"
endsnippet

snippet parauth "parameter with referenced Authorization"
- $ref: "#/components/parameters/auth"
endsnippet

# --- REFERENCES

snippet refc "reference to component"
$ref: "${1:../../swagger.yaml}#/components/schemas/$2"
endsnippet

# --- PATHS

snippet pathget "path get"
${1:get}:
  summary: $2
  operationId: `!v expand('%:t:r')`
  tags:
    - $3
  parameters:
  responses:
    "200":
      description: Успешный запрос
      content:
        application/json:
          schema:
    "401":
      $ref: "${4:../../swagger.yaml}#/components/responses/Unauthorized"
endsnippet

snippet pathpost "path post"
post:
  summary: $1
  operationId: ${2:`!v expand('%:t:r')`}
  tags:
    - $3
  requestBody:
    required: true
    content:
      application/json:
        schema:
          type: object
          properties:
        $0
  responses:
    "200":
      description: Успешный запрос
      content:
        application/json:
          schema:
    "401":
      $ref: "${4:../../swagger.yaml}#/components/responses/Unauthorized"
    "422":
      $ref: "$4#/components/responses/UnprocessableEntity"
endsnippet

# --- RESPONSES

snippet 304 "NotModified response"
"404":
  $ref: "${1:../../swagger.yaml}#/components/responses/NotModified"
endsnippet

snippet 404 "NotFound response"
"404":
  $ref: "${1:../../swagger.yaml}#/components/responses/NotFound"
endsnippet

snippet 422 "UnprocessableEntity response"
"422":
  $ref: "${1:../../swagger.yaml}#/components/responses/UnprocessableEntity"
endsnippet

# --- HEADERS

snippet hlast "header Last-Modified"
Last-Modified:
  $ref: "${1:../../swagger.yaml}#/components/headers/Last-Modified"
$0
endsnippet

snippet hpages "header paginate"
X-Total:
  $ref: "${1:../../swagger.yaml}#/components/headers/X-Total"
X-Page:
  $ref: "$1#/components/headers/X-Page"
X-TotalPages:
  $ref: "$1#/components/headers/X-TotalPages"
$0
endsnippet

}}}

= Syntax highlighting & Themes =

http://vimcolors.com/

[[https://www.cyberciti.biz/faq/turn-on-or-off-color-syntax-highlighting-in-vi-or-vim/|source|class=" moin-https"]]

||Команда||Описание||
=====
||`:syntax on`||включение подсветки синтаксиса||
||`:syntax off`||отключение подсветки||

== Rails Theme ==

https://github.com/jpo/vim-railscasts-theme

== JS Hightlite ==

https://github.com/jelera/vim-javascript-syntax

== Markdown Highlight ==

[[https://github.com/plasticboy/vim-markdown|Vim Markdown|class=" moin-https"]]

{{{
" --- отсключение folding по умолчанию
let g:vim_markdown_folding_disabled = 1

}}}

== Изменение цвета курсора ==

https://stackoverflow.com/questions/34251566/how-can-i-change-the-cursor-style-in-vim-depending-if-im-in-insert-mode-or-norm

= Plugins =

== Pathogen ==

[[https://github.com/tpope/vim-pathogen|Pathogen|class=" moin-https"]] - плагин для управления плагинами

{{{
# устанавливаем плагин
mkdir -p ~/.vim/autoload ~/.vim/bundle && \
curl -LSso ~/.vim/autoload/pathogen.vim https://tpo.pe/pathogen.vim
# корректируем файл конфигурации vim
vim ~/.vimrc

}}}

Добавляем строки

{{{
execute pathogen#infect()
syntax on
filetype plugin indent on

}}}

Плагины, помещенные в директорию `~/.vim/bundle` будут активироваться автоматически.

Пример загрузки плагина [[https://github.com/tomlion/vim-solidity/|vim-sensible|class=" moin-https"]]

{{{
cd ~/.vim/bundle && \
git clone https://github.com/tpope/vim-sensible.git

}}}

= Troubleshooting =

== Не работает цветовая схема в tmux ==

Решение
https://stackoverflow.com/questions/10158508/lose-vim-colorscheme-in-tmux-mode

Создаем или редактируем файл конфигурации tmux

{{{
# ~/.tmux.conf
set -g default-terminal "xterm-256color"

}}}

== Ошибки при старте vim-config на новом сервере ==

{{{
vim .
...
line   28:
E474: Invalid argument: listchars=tab:>·,trail:~,extends:>,precedes:<,space:.

}}}

Возможно установлена некорректная локаль в ОС. Открываем файл ''~/.vim-config/vimrc'' и кириллица будет нарушена.

Решение:

{{{
# --- текущая локаль
locale
# --- доступные локали
locale -a
# --- генерация новой (если нет ru_RU.UTF-8)
sudo locale-gen ru_RU.UTF-8
# --- устанавливаем текущую
sudo update-locale LANG=ru_RU.UTF-8

}}}

== Error detected while processing .vimrc: ==

Чаще всего на новом сервере при первом запуске `vim` видим нечто подобное:

{{{
Error detected while processing /home/zoid/.vimrc:
line   22:
E474: Invalid argument: listchars=tab:>·,trail:~,extends:>,precedes:<,space:.
Press ENTER or type command to continue

}}}

При этом в открытом файле наблюдаем нарушение отображения некоторых символов. 

Этом может быть связано с тем, что на сервере не установлена русская локаль:

{{{
sudo locale
LANG=en_US
...
sudo locale -a | grep ru
# ничего не выводится

}}}

Решение: https://vps.ua/wiki/setting-russian-locale-linux/

{{{
sudo apt-get install language-pack-ru
sudo vim /etc/default/locale
# заменяем содержимое на
LANGUAGE=ru_RU:ru
LANG=ru_RU.UTF-8

}}}

== Буфер обмена ==

=== Ubuntu ===

По-умолчанию vim не поддерживает работу с системным буфером обмена. Для работы с ним необходимо установить `vim-gnome` вместо `vim`.

[[https://stackoverflow.com/a/51186812/4498602|источник|class=" moin-https"]]

{{{
# проверяем поддержку
# -xterm_clipboard - не поддерживается
# +xterm_clipboard - поддерживается
vim --version | grep .xterm_clipboard -o
# удаляем "старый" vim
sudo apt-get purge vim
sudo apt-get autoremove
# устанавливаем "новый"
sudo apt-get install vim-gtk3

}}}

Комбинации клавиш
`"+y` - копирование в буфер
`"+d` - вырезание в буфер
`"+p` - вставка из буфера

=== WSL ===

https://www.reddit.com/r/bashonubuntuonwindows/comments/be2q3l/how_do_i_copy_whole_text_from_vim_to_clipboard_at/el2vx7u/?utm_source=share&utm_medium=web2x

{{{
" WSL yank support
let s:clip = '/mnt/c/Windows/System32/clip.exe'  " change this path according to your mount point
if executable(s:clip)
    augroup WSLYank
        autocmd!
        autocmd TextYankPost * if v:event.operator ==# 'y' | call system(s:clip, @0) | endif
    augroup END
endif

}}}

== "Зависание" vim ==

[[https://stackoverflow.com/questions/3419820/sometimes-my-file-just-freezes-in-my-vi-vim-what-happened|Stackoverflow|class=" moin-https"]]

В произвольный момент vim "зависает" - перестает отвечать на команды. Причиной тому может служить комбинация `Ctrl+S`

Лечение - `Ctrl-Q`