LINUX.ORG.RU

Сочетания клавиш (выжимка из руководства)

 


3

3

Приветствую.
Осваиваю vim, проштудировал справку, образовалась таблица с командами/сочетаниями клавиш. С высокой долей вероятности - они самые ходовые. Сделаю бумажную версию, буду пытаться прирости. Оставляю здесь, надеюсь, будет полезно.

#----------------- Перемещение ------------------------------------------------
* h j k l
* 0 ^
* $
* gM                     Середина строки.
* [N]|                   Переход к столбцу с номером N, 1 по умолчанию.
* [N]f{char} [N]F{char}  К N'му символу char справа/слева.
* [N]t{char} [N]T{char}  До символа.
* [N]; [N],              Повтор f F t T в прямом/обратном напр-ии.
* g0 g^ g$ gm gk gj      Оперируют с экранными линиями.
* gg [line num]G
* {N}%                   На строку, являющуюся N % файла.
* w e b ge
  W E B gE               Границы слов - только пробелы.
* [N][* [N]]*            К /* или к */.
* gd gD                  К локальному/глобальному объявлению.
* {N}go                  К N байту буфера.
* CTRL-{U|Y|B}           Прокрутка назад на половину/строку/экран.
* CTRL-{D|E|F}           Прокрутка вперёд на половину/строку/экран.
* zz zt zb               Сдвиг окна так, что курсор в центре/в верху/в низу.
* [# ]# %                Перемещение по препроцессорным директивам.
* [[ ][                  К внешней {/};
  [{ ]}                  К текущей {/};
  [m ]m                  К предыдущей/следующей старту функции-члену;
  [] ]]                  Переход между функциями.
* [( ])                  К текущей (/).
* [/ ]/                  К /* /  */.
#----------------- Модификация, копирование -----------------------------------
* i I                    Добавление перед курсором/в начало строки.
* a A                    Добавление за курсором/в начале строки.
* x X                    Удалить под курсором/слева.
* i_CTRL-A i_CTRL-@      Вставить текст введённый в предыдущем insert режиме/
                         с выходом из insert режима.
* i_CTRL-Y i_CTRL-E      Скопировать символ со строки выше/ниже.
* ["x]d{pos} dd [N]D     Удалить до pos/всю строку/до конца строки;
                         Регистр X - добавить в x.
* i_CTRL-R[_CTRL-R]{reg} Вставка из регистра; [не вып-ть команды, <BS> и т.п.].
* ["x]y[pos] yy          Копирование объекта/всей строки.
* ["x]p P                Вставка после/перед курсором.
* o O                    Вставка пустой строки выше/ниже курсора.
* J gJ                   Удалить \n. В vis режиме - у всех выд-ых строк;
                         gJ - без пробелов.  
* r gr R gR              Замена одного/нескольких символов, с g - виртуальная;
                         В виз-ом ре-ме заменит блок символом.
* c{pos} cc C s          Замена объекта/строки/до конца строки/одного сивола.
* ~ v_{~|u|U}            Изменение регистра;
  {g~|gu|gU}{pos}        Всю строку - g~~, guu, ...
* i_CTRL-V{int|kstroke}  Вставить символ литерально.
* [N]CTRL-A [N]CTRL-X    Увеличить/уменьшить число под курсором на N.
#----------------- Поиск, поиск с заменой -------------------------------------
* %                      Поиск парных скобок.
* # *                    Поиск слова под курсором назад/вперёд.
  g# g*                  Находить и частичные совпадения.
* /txt[\c] ?txt[\c]      Поиск верёд/назад; n N продолжить вперёд/назад;
                         CTRL-I CTRL-O переходы вперёд/назад; \c иг-ть рег-тр.
* [range][%]s/было/стало/[g|c|e]  % - во всём файле; g не только первое;
                                  с - с запросом; e - отсут-ие совпад-ий не
                                  ошибка.
* :[range]g/{ptrn}/{cmd} Выполнить cmd на строках, подходящих под ptrn.
* :grep x *.cc
  :cnext :cprev :clist
* :set ic hls is         Нечувствительность к регистру/подсветка/инкр-ый поиск;
  :wrapscan               Для отключения префикс no (noic, ...).
* gf :find nm :sfind     Найти и открыть файл под курсором/nm в текущей
  CTRL-W f               директории и в path директориях.
  :set path+=
#----------------- Метки ------------------------------------------------------
* CTRL-{O|I}             Перемещение по меткам.
* ``                     Переход на последюю, тек-ая позиция - последняя метка.
* :jumps :clearjumps
* m{a-z} {`|'}{a-z}      Именованные метки; Создать/перейти/список;
  :marks [abc]           a-z локальные, A-Z глобальные.
* `" `.                  Поз-ия при выходе из файла/модификация перед выходом.
#----------------- Кодинг, фолдинг, отступы -----------------------------------
* zf zo zc               Фолдинг, создать/развернуть/свернуть;
  zr zm                  Уровень свёрнутости меньше/больше;
  zR zM                  Развернуть/свернуть всё;
  zn zN zt               Убарать фолдинг/вернуть/переключение между ними;
  zO zC                  Развернуть/свенруть всё под курсором;
  zd zD                  Удалить фол-г под курсором/весь;
  :set foldmethod=syntax
  :set foldopen=all      Автофолдинг.
       foldclose=all
* CTRL-X_CTRL-O          omni completion, CTRL-{P|N} для перемещения.
* set makeprg            Задать команду, выполняемую при :make;
  :c{next|previous|
     first|last}
  :cc[n] :clist[!]       Описание ошибок/список ошибок;
  :colder :cnewer        К старому/к новому списку ошибок;
  :compiler              Выбрать формат ошибок (set errorformat).
* set shiftwidth=4
  set softtabstop=4
  =                      Форм-вать текст (отступы); ==, v_=, gg=G весь файл;
  CTRL-T CTRL-D          Добавить/удалить один shiftwidth в строке;
  > <  << >>             Добавить/удалить отступ в норм-ом или виз-ом реж-ме;
  :set cinoptions        Настройка отступов.
#----------------- Файлы ------------------------------------------------------
* :w                     Сохранение части файла в виз-ом режиме/всего в об-ом.
* :e!                    Переоткрыть файл.
* ZZ                     Выход с сохранением или из справ-го окна.
* [range]r{file | !cmd}  Вставка файла/вывода cmd.
* :w :wa :w>>name
  :saveas :file :edit
  :hide edit
  :args [other*.txt]
  :[N]next :prev :last
  :first 
* CTRL-^                 Переход между последними файлами;
  CTRL-w CTRL-^          Переход с разделением окна.
* $ view file            Открыть read-only.
* :oldfiles :e #<2       История файлов/ссылка на второй.
* :buffers :ls
  :[s]buffer 3
  :bnext :bprevious
  :bdelete 3
#----------------- Окна, вкладки ----------------------------------------------
* :close :only :[v]new
* :[sz][v]split {name}
  :[vertical]all
* [sz]CTRL-W _           Изменить размер окна.
  CTRL-W +
  CTRL-W -
* CTRL-W {H|J|K}L}       Переход между окнами.
  CTRL-W w
* tab split [file]
  tabedit {file}
* gt :tabonly            Переход по вкладкам/закрыть кроме текущей.
#----------------- vimdiff ----------------------------------------------------
* zo zc                  Фолдинг в vimdiff.
* [vertical] diffsplit
* ]c [c                  Переход по изменениям.
* dp do                  Прменить изменение в/из другой/го файла.
* :diffupdate            Обновить подсветку.
#----------------- Командная строка -------------------------------------------
* <S-Right> <S-Left>     Перемещение
  CTRL-B CTRL-E
* CTRL-W CTRL-U CTRL-C   Удалить слово/всю строку/выйти.
* <Tab> CTRL-{P|N}       ctrl комбинации после Tab;
  CTRL-D                 Список совпадений;
  CTRL-L                 Дополнить слово длиннейшим однозначным вар-то.
* history [/] 
  <Up> <Down>
  CTRL-{P|N}             В отличие от up down, не учитывает префикс.
* :q                     Command line window.
* gQ                     Ex mode, похож на cmd mode, но многокомандный.
* :!{cmd}                Выполнить внешнюю команду.
* :shell
#----------------- Отмена изменений -------------------------------------------
* u U                    Отмена посл-го/всех изм-ий в пос-ей редакт-мой строке;
  CTRL-R                 Отмена отмены; Проходят по активной ветке.
* g- g+                  К более ранней/поздней версии текста, активность ветки
                         неважна.
* :undolist              Показать листья в дереве изменений.
* :undo 2                Перейти на ветку с номером 2.
* :earlier 1f            Переход к версиям файла, которые были на момент
  :later 1f              сохранения; Необязательно на 1 шаг.
* :earlier 10{s|m|h|d}   Переход к версии файла в указанный момент.
* :later 1m  
#----------------- Разное -----------------------------------------------------
* q{reg} ... q           Записать макрос в reg (REG - добавить);
  @reg @@                Выполнить макрос/повторить.
* .                      Повторить последюю редактирующую команду.
* :{range}!cmd           Выполнить внешнюю команду над диапазоном.
  !{motion}cmd
* {vis block} {A|I|c|C|  + выделение строк блока через $.
  ~|u|U|r|<|>}
* text-objects           На месте {pos} и виз-ом реж-ме. :h text-objects.
* !{motion}{program}     Пропустить блок через внешнюю команду.
* v V CTRL-V             Визуальный режим/визуальная строка/виз-ый блок;
  v_o v_O                Смена угла;
  gv                     Перевыделить.
* CTRL-G                 Инфа о местоположении.
  g CTRL-G
* gq                     Форматировать текст (ширина строк, set textwidt).
* i_CTRL-{U|W}           Удалить слово слева/всё слева кроме отступа.
* i_CTRL-O               insert normal mode.
* CTRL-H                 Backspace.
* CTRL-I                 Tab.
* CTRL-[                 Esc.
* "* "+                  Primary selection/clipboard.
* :options
* :set {option}&         Вернуть значение по умолчанию.
* :set [no]number        Номера строк.
* :set [no]ruler
* :set textwidth
* :set viminfo
  :wviminfo! fnm         Перекинуть инфу между разными
  :rviminfo! fnm         vim экземплярами.
* :set sessionoptions
  :mksession f.vim       Сохранить/
  :source f.vim          загрузить сессию.
* :mkview :loadview      Как сессия, но для одного окна.
* Modelines              Установка опций для файла (спец строка в файле).
* :edit .                Открыть netrw file browser.
* :pwd :cd :cd -
  :lcd :tcd              Локальная директория окна/вкладки.
* vim -b datafile        Hex редактор; -b запрещает потенциальные
  :%!xxd :%!xxd -r       автокорректировки.
* :{i|c}abbrev           Создание аббревиатур.
  :abbreviate
* :argdo :windo :bufdo   Выполнить cmd на всех файлах-аргумента/окнах/буферах.
#----------------- Справка ----------------------------------------------------
* K                      Найти man для слова под курсором.
* :helgrep               Поиск по справке.
  :cnext :copen
* :help langmap
* :help ft-<filetype>-<functionality>    Пример: help ft-c-syntax.

они самые ходовые
CTRL-G Инфа о местоположении.

И как часто ты этим пользуешься?

А в перемещении нет самого вкусного: ta Ta fa Fa - переместиться к символу 'a' вперед/назад и с разным соусом. А потом с помощью ; повторить перемещение. Офигительно для навигации и для удаления. ta;; - переместиться до третьего символа a. dta.. - удалить до третьего символа 'а'.

А в Insert Mode Ctrl+N - автодополнение по уже встречающимся словам.

А еще, если пишешь код, можно сделать что-то типа такого:
:w | ! g++ % && ./a.out
Сохранить, скомпилить, запустить. Сейчас набегут матёрые девелоперы, скажут, что можно по-другому, с навигацией по ошибкам, блекджеком и девушками. Но я не девелопер, а на кончиках пальцев именно такая комбинация.

А еще :Ex запускает псевдографический выбор файлов для редактирования. Притом оно очень фичастое.

Еще в vimrc можно делать алиасы, я это использую для букмарков:
cnoreabbrev _sql tab drop /home/user/notes/sql.txt
И после этого написав в command mode :_sql в новой табе откроются мои записи по SQL.

А быстро открывать свой vimrc можно так:
:e $MYVIMRC

И это можно продолжать бесконечно.

У каждого свои привычки в vim.

Kroz ★★★★★ ()

Извини, но нет. Это сродни: «осваиваю русский язык, вот мой словарь из 32-ух фраз Эллочки-Людоедки»

Vi – это живой мнемонический язык, а не набор аккордов, как а Emacs и в других аккордных редакторах.

beastie ★★★★★ ()
Последнее исправление: beastie (всего исправлений: 1)
Ответ на: комментарий от Kroz

Вообще-то всё, что написал (кроме :e $MYVIMRC), есть в первом сообщении.

Не ну если кому-то из начинающих приятней читать тысяч десять строк текста, то дело хозяйское.
А это короткий путь - увидел в таблице, попробовал, нашёл в справке, а не гуглить по всему интернету при каждом «выходе».

pavlick ()
Последнее исправление: pavlick (всего исправлений: 1)
Ответ на: комментарий от Kroz

Ex нету

* :edit . Открыть netrw file browser.
Если сократить, то :e . даже вводить проще, можешь взять на вооружение. Видишь, и тебе конспект помог ))

Ctrl-N нету

CTRL-{N|P} постоянно фигурирует и в проходе по истории командной строки, и в переборе вариантов omni completion, что быстро дойдёт и без всяких пояснений. Да и к чему это примитвное стандартное дополнение? Для кодинга на крестах поставил clangd, это куда более совершенное средство. Вообще искал как отключить всю эту встроенную умную лабуду, а то вим там шибко сильно напрягается для поиска дополнений, а мне лишь clangd нужен.

pavlick ()
Ответ на: красиво сказано. от mos

Re: красиво сказано.

С xepa ли то?
Основные сочетания аналогичны bash ‘из каропки’.
Что в CLI, что в emacs мягкий переход из одной среды в другую, без единого разрыва.

anonymous ()
Ответ на: Re: красиво сказано. от anonymous

Основные сочетания аналогичны bash

о, спецыализды подъехали. сочетания интерпертатора? с чем? с сыром и дичью?

и вообще это у ридлайна биндинги емаксовые, а не наоборот.

mos ★★☆☆☆ ()
Ответ на: комментарий от andreyu

Я достаточно часто использую и C-g, и gC-g.

Зачем тебе так часто нужна эта информация. И почему в таком случае она у тебя до сих пор не на статус-лайне.

Kroz ★★★★★ ()
Последнее исправление: Kroz (всего исправлений: 1)
Ответ на: комментарий от Kroz

Зачем тебе так часто нужна эта информация. И почему в таком случае она у тебя до сих пор не на статус-лайне.

В статуслайне она лишняя. И «достаточно часто» все же сильно реже, чем «так часто» :)

andreyu ★★★★★ ()
Ответ на: комментарий от andreyu

Чем clangd лучше ycm?

Хз, я так чувствую.
Вот что интересно - я никак не могу получить подсказку с аргументами для функции во время их ввода. YCM умеет? Ну или окно со всем перегрузками умеет?

pavlick ()
Последнее исправление: pavlick (всего исправлений: 3)
Ответ на: комментарий от pavlick

YCM умеет?

Увидел сам - умеет. Значит поставлю-ка ycm и я. clangd+LanguageClient-neovim конечно круто, но дополнение без подсказки аргументов (ладно бы перегрузок не было) как-то не торт.

pavlick ()
Ответ на: комментарий от pavlick

я никак не могу получить подсказку с аргументами для функции во время их ввода.

Похоже этого он не умеет. Показывает сигнатуру лишь при вводе имени.

Ну или окно со всем перегрузками умеет?

Хороший вопрос. У меня показывает лишь одну сигнатуру.

andreyu ★★★★★ ()
Ответ на: комментарий от andreyu

но собрать рабочий ycm с clangd мне таки не удалось, к сожалению (а с libclang.so работает), в лог слал такую фигню

2019-11-30 03:27:33,793 - ERROR - The language server communication channel closed unexpectedly. Issue a RestartServer command to recover.
Traceback (most recent call last):
  File "/home/pavlick/.vim/plugged/YouCompleteMe/third_party/ycmd/ycmd/completers/language_server/language_server_completer.py", line 331, in run
    self._ReadMessages()
  File "/home/pavlick/.vim/plugged/YouCompleteMe/third_party/ycmd/ycmd/completers/language_server/language_server_completer.py", line 450, in _ReadMessages
    data, read_bytes, headers = self._ReadHeaders( data )
  File "/home/pavlick/.vim/plugged/YouCompleteMe/third_party/ycmd/ycmd/completers/language_server/language_server_completer.py", line 514, in _ReadHeaders
    data = self.ReadData()
  File "/home/pavlick/.vim/plugged/YouCompleteMe/third_party/ycmd/ycmd/completers/language_server/language_server_completer.py", line 657, in ReadData
    raise RuntimeError( "Connection to server died" )
RuntimeError: Connection to server died

и хз чего с этим делать.

pavlick ()
Ответ на: комментарий от pavlick

С чем-то подобным я встречался несколько лет назад. Вообще давно пора перейти на LSP, осталось дождаться, когда запилят решение, которое заведется без танцев с бубном.

andreyu ★★★★★ ()
Ответ на: комментарий от andreyu

в неовиме будет из коробки (в найтли уже есть, я правда не пробовал) https://twitter.com/Neovim/status/1194879302887559168

Пользуюсь vim-lsp и в виме и неовиме

habamax ★★ ()
Последнее исправление: habamax (всего исправлений: 1)
Ответ на: комментарий от andreyu

Тем, что он – Language Server.

LSP - общепринятый стандарт, и сейчас можно найти сервер почти для любого языка. Я использую CoC, клиент LSP для вима, и я могу сразу же писать и на крестах, и на гошечке, и даже на баше (даже для него запилили LSP-сервер), все, что мне нужно это установить соответствующий Language Server и прописать его в конфиг coc или иного плагина.

К тому же LSP editor agnostic, и все нужные фичи, такие как автокомплит, сигнатур хелп, семантическая подсветка и прочие будут абсолютно в любом редакторе при условии, что для него есть соответствующий плагин.

YCM конечно хорошая штука была. Да вот только зачем, если есть гораздо лучшая альтернатива.

Unicode4all ★★★★ ()
Ответ на: комментарий от Unicode4all

YCM конечно хорошая штука была. Да вот только зачем, если есть гораздо лучшая альтернатива.

Снова попробовал несколько связок, но ни одна из них не заработала даже на hello world. А тормозной и жирный YCM работает. Поэтому буду ждать, когда запилят связку vim-плагин/lsp, которая сможет заменить YCM без плясок с бубном.

andreyu ★★★★★ ()
Ответ на: комментарий от andreyu

Там особо готовить ничего не надо в vim-lsp, о каких проектах идёт речь?

Ставишь нужный сервер, в конфиг прописываешь 5 строчек и работает. Я правда проверял на питоне, руби, дарте. То бишь никаких плюсов и растов.

habamax ★★ ()
Ответ на: комментарий от andreyu

Если под «готовить под них проект» ты имеешь в виду создание «compiler_commands.json», то это проблема не в coc или vim-lsp, а в clangd, скорее даже в самих плюсах. Если бы у них была общепринятая система сборки, как, например cargo в русте, то этот файл бы и не понадобился, а так…

А так тот же CMake умеет генерировать этот файло сам.

Unicode4all ★★★★ ()
Ответ на: комментарий от andreyu

Сделать :CocConfig и вставить

  {
      "signature.enable": true,
      "signature.target": "float",
      "signature.maxWindowHeight": 100,
  
      "languageserver": {
          "clangd": {
              "command": "clangd",
              "filetypes": [
                  "c",
                  "cpp",
                  "objc",
                  "objcpp"
              ],
              "rootPatterns": [
                  ".ccls",
                  "compile_commands.json",
                  ".vim/",
                  ".git/",
                  ".hg/"
              ],
              "initializationOptions": {
                  "cache": {
                      "directory": "/tmp/ccls"
                  }
              }
          }
      }
  }

vimrc скопипастить отсюда, compiler_commands.json генерить можно этим ($ bear make)

pavlick ()
Ответ на: комментарий от habamax

Там особо готовить ничего не надо в vim-lsp, о каких проектах идёт речь?

О разных. Но оно даже на hello world не работает.

Ставишь нужный сервер, в конфиг прописываешь 5 строчек и работает. Я правда проверял на питоне, руби, дарте. То бишь никаких плюсов и растов.

Я рад, что эта штука работает с питоном, руби и дартом. Но меня интересует C++.

andreyu ★★★★★ ()
Ответ на: комментарий от Unicode4all

А так тот же CMake умеет генерировать этот файло сам.

Умеет, но это совсем неудобно. Для YCM мне достаточно в конфиге прописать нужные пути к хедерам, дефайны, и различные желаемые параметры компилятора и он начинает работать.

Все связки, описанные выше в этом и соседнем топике, не работают. Танцы с бубном мне порядком надоели.

andreyu ★★★★★ ()
Ответ на: комментарий от pavlick

«compile_commands.json»,

И на каждое перемещение/переименование файла, добавление/удаление файла приходится снова перегенерировать этот конфиг. Удобно, че. Пожалуй продолжу пользоваться YCM, который просто работает.

andreyu ★★★★★ ()
Ответ на: комментарий от andreyu

Наверное уже ничего не переубедит, но отсюда

compile_flags.txt

If all files in a project use the same build flags, you can put those flags, one flag per line, in compile_flags.txt in your source root.

Clangd will assume the compile command is clang $FLAGS some_file.cc.

Creating this file by hand is a reasonable place to start if your project is quite simple.

только в конфиге добавить в «rootPatterns» compile_flags.txt

pavlick ()
Ответ на: комментарий от pavlick

Наверное уже ничего не переубедит, но отсюда

Спасибо, но как это поможет избавиться от compile_commands.json или его постоянного обновления при изменении source tree?

Сделаю очередной заход через пару месяцев. Возможно к тому времени все станет удобнее.

andreyu ★★★★★ ()
Ответ на: комментарий от andreyu

ccls по идее умеет работать без этих файлов, однако он не будет индексировать проект, вместо этого он будет индексировать файлы, открытые LSP-клиентом, редактором то бишь. Но мне как-то не удается его попробовать. После сборки на малине, он сегфолтится при запуске, поэтому приходится сидеть на тормозном clangd. Мне даже интересно, почему же он так тормозит, и насколько ccls менее тормозной. Тот же gopls (сервер для голанга) не тормозит и не жрет память.

Unicode4all ★★★★ ()