Страницы

Поиск по вопросам

Показаны сообщения с ярлыком vim. Показать все сообщения
Показаны сообщения с ярлыком vim. Показать все сообщения

четверг, 9 апреля 2020 г.

Выделить в текущей строке всё с первого непробельного символа до последнего

#vim

                    
Допустим, у меня есть строчка кода с отступом

         promocode.discount_amount


и курсор где-нибудь в районе слова discount_amount.

Чтобы выделить всё важное на строке, например, для заворачивания в скобки, я набираю

$v^

Уверен, есть более быстрое решение, но никак не могу его найти.
    


Ответы

Ответ 1



Поправка: чтобы переместиться к последнему непробельному символу, надо использовать g_, а не $. В вашем примере сработает viW (inner WORD, см. :help text-objects). Однако, в общем случае, когда в середине строки могут встречаться пробельные символы, это работать не будет. К сожалению в Vim нет стандартного text-object-а для того, что нам нужно. Тут нам на помощь придут mapping-и. Будем использовать для нашего «объекта» буквосочетание il (inner line). Никто не мешает использовать один символ, но тогда скорее придется пожертвовать соответствующей стандартной командой. Следующий mapping для visual mode позволяет сделать то, что нам нужно: :vnoremap il :normal! ^vg_ Теперь при нажатии vil будет выделена «важная» часть строки. Опционально: сейчас il работает только в visual mode. Можно заставить его работать со всеми командами Vim, которые ожидают на вход movement или text-object (d, y, c, и т.д.). Для этого используются mapping-и для Operator-pending mode (см. :help omap-info): " внимание, в правой части используется mapping il, который мы определили выше :onoremap il :normal vil Теперь, в частности, yil копирует «важную» часть строки, а dil — удаляет ее. Подробнее почитать, как и почему это работает можно в: Главе Operator-Pending Mappings (и след.) в книге Learn Vimscript the Hard Way Статье Creating new text objects Стандартном :help

понедельник, 30 марта 2020 г.

vim как перейти на новую строку

#vim


Никак не могу нагуглить, как можно перейти на новую строку в vim в Insert mode, если
курсор находиться посреди выражения

print('Example. Cursor here|')


Вим изучаю паралельно с python. 
Для PHP пользуюсь Netbeans, там есть хоткей Shift + Enter, очень не хватает этой
возможности. 
    


Ответы

Ответ 1



Если верно понял суть вопроса, то в vimrc можно задать exe "set =\eo" nnoremap o inoremap o В итоге по Alt+o можно переводить курсов на новую строку.

Ответ 2



В Insert mode возможны следующие комбинации для перехода на начало нижней строки: Ctrl+o, Enter - переход на начало следующей сроки Ctrl+o, o - переход на начало вновь созданной следующей сроки

суббота, 21 марта 2020 г.

Открыть из консоли вкладку с терминалом и вкладку с файлом в Vim 8

#консоль #vim


В Vim 8 добавили терминал, который вызывается командой :terminal. Вопрос: как из
командной строки вызвать vim, чтобы в первой вкладке сразу открылся терминал, а во
второй — файл? Что-то типа такого (не работает):

$ vim -p :terminal readme.txt

    


Ответы

Ответ 1



vim -c ':tab terminal' -c 'tabm 0' -p readme.txt После загрузки буфера, выполняется открытие новой вкладки с терминалом, перемещение текущей вкладки в начало. vim -c ':tab terminal' -c 'tabm 0' -c ':tabn' -p readme.txt Покажет содержимое файла, после загрузки.

среда, 26 февраля 2020 г.

VIM без конфигурации как редактор по умолчанию для Git

#git #vim


Мне бы хотелось использовать Vim в качестве редактора по умолчанию при создании коммитов.
Но он у меня нагружен некоторым количеством плагинов (нужных) и его запуск занимает
секунду-другую. Соответстенно, для того, чтобы написать пару строк в сообщеннии коммита
не хочется ждать загрузки VIM и старта всех плагинов.

Я знаю, как установить редактор по умолчанию в Git:

git config --global core.editor vim


Запустить Vim без плагинов можно, например, так:

vim -u NONE


Увы, но первое, что приходит в голову: git config --global core.editor vim -u NONE
не работает. Что нужно сделать?
    


Ответы

Ответ 1



Вариант 1 Решение: создаем свой скрипт, который прописываем как редактор. Это можно сделать из консоли так: sudo tee /usr/local/bin/bare-vim > /dev/null <<\EOF !#/bin/sh vim -u NONE "$@" EOF sudo chmod +x /usr/local/bin/bare-vim git config --global core.editor bare-vim Вариант 2 git config --global core.editor 'vim -u NONE' это тоже работает: ps -aux | grep vim ... /bin/sh -c vim -u NONE "$@" vim -u NONE

понедельник, 24 февраля 2020 г.

В Vim не отображается название текущего режима

#vim


При работе в Vim (на xubuntu 16.04 LTS) в левом нижнем углу не отображается в каком
режиме происходит работа. Например, при нажатии "i" vim переходит в режим вставки,
но внизу не написано: "--ВСТАВКА--".

Программа vim (по крайней мере запускаю её такой командой), установил с помощью apt-get
install vim

$ vim --version
VIM - Vi IMproved 7.4 (2013 Aug 10, compiled Apr 08 2016 11:38:28)
Заплатки: 1-1689
С изменениями, внесёнными pkg-vim-maintainers@lists.alioth.debian.org
Скомпилирован  pkg-vim-maintainers@lists.alioth.debian.org
Огромная версия без графического интерфейса.  Включённые (+) и отключённые (-) особенности:
+acl             +farsi           +mouse_netterm   +tag_binary
+arabic          +file_in_path    +mouse_sgr       +tag_old_static
+autocmd         +find_in_path    -mouse_sysmouse  -tag_any_white
-balloon_eval    +float           +mouse_urxvt     -tcl
-browse          +folding         +mouse_xterm     +terminfo
++builtin_terms  -footer          +multi_byte      +termresponse
+byte_offset     +fork()          +multi_lang      +textobjects
+channel         +gettext         -mzscheme        +timers
+cindent         -hangul_input    +netbeans_intg   +title
-clientserver    +iconv           +packages        -toolbar
-clipboard       +insert_expand   +path_extra      +user_commands
+cmdline_compl   +job             -perl            +vertsplit
+cmdline_hist    +jumplist        +persistent_undo +virtualedit
+cmdline_info    +keymap          +postscript      +visual
+comments        +langmap         +printer         +visualextra
+conceal         +libcall         +profile         +viminfo
+cryptv          +linebreak       -python          +vreplace
+cscope          +lispindent      -python3         +wildignore
+cursorbind      +listcmds        +quickfix        +wildmenu
+cursorshape     +localmap        +reltime         +windows
+dialog_con      -lua             +rightleft       +writebackup
+diff            +menu            -ruby            -X11
+digraphs        +mksession       +scrollbind      -xfontset
-dnd             +modify_fname    +signs           -xim
-ebcdic          +mouse           +smartindent     -xsmp
+emacs_tags      -mouseshape      +startuptime     -xterm_clipboard
+eval            +mouse_dec       +statusline      -xterm_save
+ex_extra        +mouse_gpm       -sun_workshop    -xpm
+extra_search    -mouse_jsbterm   +syntax          
            общесистемный файл vimrc: "$VIM/vimrc"
         пользовательский файл vimrc: "$HOME/.vimrc"
  второй пользовательский файл vimrc: "~/.vim/vimrc"
          пользовательский файл exrc: "$HOME/.exrc"
          значение $VIM по умолчанию: "/usr/share/vim"
Параметры компиляции: gcc -c -I. -Iproto -DHAVE_CONFIG_H   -Wdate-time  -g -O2 -fPIE
-fstack-protector-strong -Wformat -Werror=format-security -U_FORTIFY_SOURCE -D_FORTIFY_SOURCE=1
     
Сборка: gcc   -Wl,-Bsymbolic-functions -fPIE -pie -Wl,-z,relro -Wl,-z,now -Wl,--as-needed
-o vim        -lm -ltinfo -lnsl  -lselinux -lacl -lattr -lgpm -ldl    

    


Ответы

Ответ 1



Предыдущий ответ ot @Yaroslav правильный: :set showmode Если он не помог, значит с цветом строки состояния что-то не так - или белым-по-белому, или черным-по-черному. Попробуйте временно установить цветовую схему по-умолчанию: :colorscheme default

Ответ 2



Для отображения режима вставки установите set showmode чтобы не отображать режим вставки установите set noshowmode

четверг, 13 февраля 2020 г.

Vim: Почти полная замена всех клавиш для команд

#vim #vi


Здравствуйте, я с вимом немного знаком, умею из него выходить, но всеми возможностями
пока не пользуюсь. И у меня назрел такой вопрос: 

А нормально ли заменить почти все комбинации клавиш, хоткеи и тд?
Не скажется ли это на чем-то в дальнейшем и могут ли появится на этом пути какие-то
проблемы, как техничные, так и другие (привычка, невозможность пользоваться "нормальным"
вимом)?
И пробовал ли кто-то идти таким путем?

Вот у меня ноутбук, на клавиатуре стрелки и всякие Home/End находятся близко, так
что нужды в hjkl и подобном нет. 
Далее, w и b находятся далеко, и мне кажется, что удобнее было бы, что б клавиши
скачек по словам находились рядом (типа q и w). Ctrl + fbduye что бы листать текст
тоже как-то можно оптимизировать. И все в таком духе. 

Что скажете, насколько это труЪ и если ли смысл в тексте выше, или конфигурировать
такие базовые вещи не стоит?
    


Ответы

Ответ 1



Я как-то пытался так сделать (долго работал с SlickEdit). Бонусов особых не получил. Вернулся к стандартной конфигурации. Магия вима в неких магических сочетаниях клавиш, именно на которые заточены маны и туториалы. К примеру - v i t = - форматирует блок внутри тега. И таких комбинаций много. Переопределив комбинации клавиш сложно будет такие вещи 1 - воспроизводить; 2 - запомнить.

Ответ 2



Что касается конфигурации: представьте, что вам нужно решить какую-то задачу удаленно на чужой машине с помощью Vim (конфиги какие-нибудь отредактировать, например). Вам придется залить свою конфигурацию, потом работать, потом вернуть конфигурацию «как было». Во-первых, вы потратите дополнительное время. Во-вторых, не факт, что вам дадут доступ. И тогда вам придется работать на абсолютно непривычной раскладке. В-третьих, вы можете сломать конфигурацию, которая была. Например, окажется, что там тоже какая-то нестандартная, а бэкап сделать забыли. Так что на такое стоит идти только в случае, если это сразу приносит вам значительное повышение производительности или какое-то другое существенное преимущество. Вообще, вопрос достаточно неопределенный и зависит от того, с чем вы работаете. Если это современные высокоуровневые языки, то, на мой взгляд, наилучшая производительность будет с полнофункциональной IDE.

Ответ 3



Возьмите EMACS, с ним именно так и поступают обычно, полно примеров. Vim действительно хорош такой, как он есть.

Ответ 4



Думаю что стэк из: YouCompleteMe SnipMate ctags Vim и еще нескольких языкозависимых плагинов по вкусу на данный момент лучше, понятнее, проще, быстрее, дешевле и эффективнее, чем любая профессиональная коммерческая IDE существующая на рынке. А редактировать что-то на другой удаленной системе через встроенный vi по SSH это вообще бредовая идея. Просто используйте для этой цели частный репозиторий какой-нибудь VCS. Редактируйте нужный файл в локальном репозитории со своей удобной конфигурацией Vim. Коммитите в глобальный. С удаленной машины просто обновляете одной командой. Все. По поводу переопределения клавиш, то я использую такую схему: hjkl -> jkl; Ctrl + hjkl -> Ctrl +jkl; CapsLock -> Esc Tab -> Ctrl+k. Alt -> Ctrl Очень удобно, т.к. читерски позволяет вообще не нажимать оригинальные кнопки Esc, Enter, Tab, Backspace и Ctrl, которые расположены слишком далеко на китайских клавиатурах, установленных на большинстве домашних компьютеров.

Как выполнить make, находясь в другой дирректории?

#linux #vim #make


Возможно ли это? Не хочу тратить время на выход из vim, команду cd. Также не хочу
держать открытыми несколько окон.
    


Ответы

Ответ 1



Ключи: -C КАТАЛОГ, --directory=КАТАЛОГ Перейти в КАТАЛОГ перед выполнением действий. make -C /путь/к/каталогу

вторник, 28 января 2020 г.

Комментирование куска текста в vim

#vim


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


Ответы

Ответ 1



Плагином пользоваться не хотелось бы по той простой причине - что нужна универсальность) Частенько приходится работать с разных машин, в том числе и чужих - поэтому только чистый vim) Для себя нарыл сейчас такой вариант: ctr+v дальше } - до конца абзаца либо j,k выделение. Дальше I , # и

Ответ 2



Я для этого пользуюсь плагином tComment. С ним можно выделить текст, нажать комбинацию клавиш (горячие клавиши настраиваются), и нужные строки будут закомментарены. Раскомментаривание происходит так же. Плюс есть ещ несколько полезных горячих клавиш.

Ответ 3



Можно использовать The NERD Commenter или аналоги. Комментирование в нажатие двух-трех кнопок. Предварительно они требуют выделить текст, а это уже отдельное действие и в некоторых случаях может быть выполненно и за одно-два нажатия.

Ответ 4



Этот ответ годится только для однострочных комментариев, но тем не менее. Для комментирования C++-кода можно так сделать: ^Ctrl+v5jI// где ^ - Shift+6, 5 - количество строк вниз, I - Shift+i. Возможны любые перемещения вместо 5j, например, }. Для другого языка можно заменить // на соответствующий символ комментария (#, -- и т.п.) Upd: Спасибо @Dofri и @KoVadim за замечания. Dofri более прав оказался относительно Ctrl+v.

Ответ 5



Для комментирования блока я всегда использовал режим визуального выделения, который вызывается по ctrl+v (в gvim для windows по умолчанию ctrl+q). Нужно поставить курсор, например, в начале строки наверху выделяемого блока, нажать ctrl+v , переместить курсор в конец параграфа, нажав } , затем нажать I (shift+i) , ввести символ комментария (например, #) и нажать ESC. детальнее: https://lisakov.com/blog/vim-comment-block/

Ответ 6



У меня было желание не просто быстро комментировать/раскомментировать кусок текста, но чтобы еще и символ комментария автоматически выбирался верный. И из любопытства я написал плагин, которым вот уж пару лет как пользуюсь и сильно привык, надо сказать ) Работает оно так: выделяю кусок текста и нажимаю hh. Если выделить закомментированный кусок и нажать hh, то кусок раскомментируется. .vimrc: nmap hh :LinesCommentNextState vmap hh :LinesCommentNextState код плагина: function! s:LinesCommentNextState() range let l:extension = expand('%:e') let l:comment_symbol = "#" if l:extension == "c" let l:comment_symbol = "\/\/" elseif l:extension == "cpp" let l:comment_symbol = "\/\/" elseif l:extension == "h" let l:comment_symbol = "\/\/" elseif l:extension == "hpp" let l:comment_symbol = "\/\/" elseif l:extension == "xs" let l:comment_symbol = "\/\/" elseif l:extension == "vim" let l:comment_symbol = "\"" elseif l:extension == "lua" let l:comment_symbol = "--" else "default '#' endif let l:first_line = getline(a:firstline) let l:need_comment = 1 " if string already commented, no need comment twice if l:first_line =~ '\v^(\s)*' . l:comment_symbol let l:need_comment = 0 endif for n in range (a:firstline, a:lastline) let l:line = getline (n) if len(l:line) == 0 continue endif if l:need_comment == 1 " comment it! let l:new_line = l:comment_symbol . l:line " but if beginning from space, need save all spaces if l:line =~ '\v^\s' let l:matches = matchlist(l:line, '\v^(\s+)(.*)') let l:new_line = l:matches[1] . l:comment_symbol . l:matches[2] endif else let l:new_line = l:line if l:line =~ '\v^(\s*)' . l:comment_symbol let l:matches = matchlist(l:line, '\v^(\s*)' . l:comment_symbol . '(.*)') let l:new_line = l:matches[1] . l:matches[2] endif endif call setline (n, l:new_line) endfor endfunction function! SaveCursor() let s:cursor = getpos('.') endfunction function! RestoreCursor() call setpos('.', s:cursor) unlet s:cursor endfunction command! -range LinesCommentNextState call SaveCursor() | ,call s:LinesCommentNextState() | call RestoreCursor()

пятница, 24 января 2020 г.

vim: открыть файл через контекстное меню

#vim


Как сделать чтобы vim (не gvim) открывал файлы через контекстное меню в новых вкладках
подобно sublime, не открывая новое окно для каждого открытого файла? Подобная запись
для vim.desktop не работает:

Exec=vim -p --remote-tab-silent %F
Terminal=true

    


Ответы

Ответ 1



«имя сервера» надо указать. чтобы было к чему подключаться (если экземпляра программы с таким именем ещё не было запущено, то текущий экземпляр будет считаться «сервером» с указанным именем). запускаем редактирование файла файл1 и присваиваем этому экземпляру «имя сервера» имя1: $ vim --servername имя1 --remote-tab-silent файл1 смотрим список запущенных «серверов»: $ vim --serverlist имя1 подключить к тому же «серверу» ещё и файл2: $ vim --servername имя1 --remote-tab-silent файл2

Умные отступы в vim

#vim


Есть ли какой-нибудь способ заставить vim реагировать на tab двумя различными способами?

Вставлять обычный tab, если курсор находится в районе отступов (до первого символа
в строке).
Вставлять пробелы, если курсор находится в зоне выравнивания.

В итоге должна получаться следующая картина (табы помечены как "--->", пробелы, как "_").
foo() {
--->int_a_____=_2;
--->int_count_=_12;
}
    


Ответы

Ответ 1



Если цель этого - выравнивание в коде по какимто символам(= , ; и т.д.) ТО предлагаю к использованию вот такой плагин Скринкаст и Github

суббота, 11 января 2020 г.

Vim превратил табулатор в пробелы после отключения expandtab

#linux #vim


Вот здесь я спрашивал про одну ошибку. Причиной ошибки оказалось, что вместо 
табулятора ввелись пробелы.

Я выполнил в viм - :set noexpandtab, чтобы не было пробелов.
Ввёл клавишей табулятор и затем EOF. 

А в файле после сохранения действительно пробелы:

~$ xd tabs
000000 20 20 20 20 45 4f 46 0d 0a                       > EOF..<


Устранил ошибку с Ctrl-V+Tab.

Почему viм превратил табулятор в пробелы после noexpandtab?
    


Ответы

Ответ 1



В вашем случае просто получился такой вариант: softwidth < tabstop. Смотрите! На ввод пробельных символов (которые обычно отображатся в виде пропуска в тексте) клавишей TAB в Vim влияют упомянутый вами параметр expandtab, но также softwidth и tabstop следующим образом. При активированном noexpandtab (это ваш случай) при нажатии на клавишу табуляции редактор вычисляет ближайшую позицию для вставляемого отступа, которой задаётся настройкой softwidth, затем вставляет столько символов табуляции, чтобы не выйти за новую рассчитанную позицию курсора, считая при этом '\t' (U+0009) по ширине эквивалентным tabstop пробелам. Остальное пространство заполняется обычными пробелами. Возможно, это выглядит слишком замудрёно, но рассмотрим пример. Допустим, softwidth=2, tabstop=4, ваш редактор находится в режиме вставки, а курсор стоит в начале строки (в колонке №1). Вы нажимаете на клавиатуре клавишу TAB и вставляются два обычных пробела ' ' (U+0020), а курсор переходит в колонку №3. Вы второй раз нажимаете на табуляцию — эти пробелы заменяются на одну '\t' (курсор в 4 колонке). Нажмите в третий раз — получите одну табуляцию, а за ней два пробела (теперь курсор в 6 колонке). Четвёртое нажатие приведёт к вводу двух символов табуляции и т.д. Иными словами, нажатие TAB заставляет редактор увеличить отступ курсора на единицу, но ширина одного отступа задаётся настройкой softwidth. А ширина одного символа табуляции настраивается с помощью tabstop. Поэкспериментируйте с конфигурацией Vim, а легко различать табулиции '\t' от пробелов ' ' вам поможет примерно такая команда для подсветки пробельных символов. set list lcs=tab:>\ ,space:.

Переключить буфер без движения экрана

#vim


Допустим, есть два файла, первый выглядит как-то так (как выглядит второй неважно):

001 #include 
002
003 int main(void)
004 {
005     puts("hello world");
006     return 0;
007 }


При этом, высота терминала, например, три строки. Я перемещаю курсор на третью строку
и делаю zt. В терминале получаю:

003 int main(void)
004 {
005     puts("hello world");


Всё отлично. Но после перемещения на второй файл командой :bnext и возвращения через
:bprev, экран смещается так, что строка с курсором становится посередине. То есть,
в терминале я получаю:

002 
003 int main(void)
004 {


Вопрос: Как перемещаться между буферами, не трогая положение экрана относительно курсора?
    


Ответы

Ответ 1



Для решения можно воспользоваться следующим способом: Прежде чем перейти в другой buffer, сохраняем текущие настройки окна. Как только переходим (возвращаемся) в buffer, восстанавливаем ранее сохранённые для него настройки. Готовое решение находим здесь https://vim.fandom.com/wiki/Avoid_scrolling_when_switch_buffers и добавляем его в ~/.vimrc: " Save current view settings on a per-window, per-buffer basis. function! AutoSaveWinView() if !exists("w:SavedBufView") let w:SavedBufView = {} endif let w:SavedBufView[bufnr("%")] = winsaveview() endfunction " Restore current view settings. function! AutoRestoreWinView() let buf = bufnr("%") if exists("w:SavedBufView") && has_key(w:SavedBufView, buf) let v = winsaveview() let atStartOfFile = v.lnum == 1 && v.col == 0 if atStartOfFile && !&diff call winrestview(w:SavedBufView[buf]) endif unlet w:SavedBufView[buf] endif endfunction " When switching buffers, preserve window view. if v:version >= 700 autocmd BufLeave * call AutoSaveWinView() autocmd BufEnter * call AutoRestoreWinView() endif

пятница, 10 января 2020 г.

Как установить цветовую схему vim?

#vim


https://github.com/daylerees/colour-schemes/blob/master/vim-themes/colors/Iceberg.vim
достаточно ли просто скопипастить это в конкретную папку, а затем подключить :colorscheme
themename?
При таком подходе дефолтовые темы у меня отображаются верно, но кастомные отображаются
абсолютно не так, например конкретно та что выше, представляет из себя полностью белый
текст    


Ответы

Ответ 1



Во-первых, да, достаточно положить тему в папку. Обычно это .vim/colors/ и потом прописать, например, color wombat256. Во-вторых, самое главное - нормальные темы для своей работы требуют 256-колор режим, без него вы не сможете насладиться темой в полной мере. Чтобы включить 256-й режим, надо прописать в .vimrc: " 256-color terminal set t_Co=256 " тему можно также поставить прямо в .vimrc color wombat256 И не забыть после этого перезапустить vim.

Ответ 2



При запуске Вима в терминалах вроде Gnome Terminal, Konsole следует использовать :colorsheme default и настраивать цветовую схему при помощи средств самого терминала (настройки профиля - цвета). Все остальные темы в терминале чаще всего отображаются некорректно. А за интересную ссылку на множество тем для Вима очень большое спасибо :)

вторник, 7 января 2020 г.

Редактор с разбиением окна на буферы как в vim или emacs

#редактор_текста #vim #emacs #linux


Интересует вопрос - существуют ли редакторы, под Linux, в которых есть возможность
разбить одно окно редактирования файла, на два, как это можно в vim или emacs, потому
что очень часто полезно видеть перед собой одновременно два исходника. 
И ещё хотел бы узнать, чтобы не создавать новый вопрос - чем emacs или vim лучше
(особенно в наше время)? Все говорят, что они настраиваемы до неузнаваемости, но в
чем выражаются эти настройки. Что можно полезного извлечь (для веб-мастера к примеру)
из этих редакторов, чего нет в других? 
P.S. Для себя я пока усвоил только разбиение окна на буферы.    


Ответы

Ответ 1



Из известных мне редакторов под линукс это умеют делать ещё два - QtCreator и Code::Blocks. Это конечно грубо, назвать IDE редактором, но мы же на форуме программистов, здесь в основном для кода и используются редакторы. Эти два умеют как просто сделать "два (и более) окна просмотра одного файла", так и разделить рабочее пространство для редактирования нескольких файлов. Также это умеет делать SublimeText (он платный, если что). Но там эта функция немного специфичная. Нужно в меню View->Layout выбрать способ разделения рабочего пространства, а после этого можно перетаскивать вкладки. Кстати, IDEA также умеет разделять рабочее пространство (меню Window->Editor Tabs). чем emacs или vim лучше (особенно в наше время)? Авторы этих редакторов в свое время поняли, что напихать все в один редактор сложно и не нужно и сделали гибкую систему плугинов (хотя это очень спорный вопрос - в эмаксе это своя модификация лиспа, а в виме ещё до недавно свой язык. Сейчас можно на питоне дописывать, но не полностью все). В других редакторах пытаются втиснуть все и сразу.

понедельник, 6 января 2020 г.

Vim Ресурсы По Изучению [закрыт]

#vim


        
             
                
                    
                        
                            Закрыт. Данный вопрос необходимо конкретизировать. Ответы
на него в данный момент не принимаются.
                            
                        
                    
                
                            
                                
                
                        
                            
                        
                    
                        
                            Хотите улучшить этот вопрос? Переформулируйте вопрос,
чтобы он был сосредоточен только на одной проблеме, отредактировав его.
                        
                        Закрыт 2 года назад.
                                                                                
           
                
        
Вчера открыл для себя Vim. Хочу попробовать его в качестве IDE (Java, Python, PHP),
но сомневаюсь в ссылках, которые нахожу.

Какие ресурсы использовади Вы, чтобы выучить Vim досконально?

Хотелось бы, чтобы описывалось все: как ставить темы, плагины, какие ставить лучше,
и т.д.
    


Ответы

Ответ 1



если вчера открыли, то до «досконального знания» вам ещё не один год изучать эту программу. а чтобы начать пользоваться, пройдите «быстрый курс»: $ vimtutor ru следующий шаг: освоение пользованием встроенной справкой. для этого запустите программу, введите :help и нажмите enter. и, конечно, никаких «тем, плагинов», пока хоть немножко не освоитесь.

вторник, 31 декабря 2019 г.

QT, C++, Linux и Vim

#cpp #linux #qt #vim


Недавно решил перейти к изучению С++ и QT (до этого изучал Си) и хотел прояснить
несколько вещей для себя. Прошу не ругать меня строго, так как я только-только начинаю:
всего-то пока скачал книгу Прата по С++, а про QT знаю только по страничке в Википедии. 

Вообщем:

1) Что нужно для программирования с помощью QT на линуксе?

2) Нужен ли для этого обязательно QTCreator?

3) Вопрос вытекает из предыдущих двух: можно ли использовать QT пользуясь vim-ом
в качестве редактора, clang-ом для компиляции и make-ом для сборки проектов?

Не то, чтобы я априори не любил IDE, но мне больше нравится другой вариант (чисто
субъективно). Программирование для меня просто хобби.
    


Ответы

Ответ 1



Что нужно для программирования с помощью QT на линуксе? Минимальный набор стандартен: компилятор, редактор, собственно Qt с его инструментами (moc, uic, qmake), хедерами и прочей dev-мишурой и, конечно, собственные знания. Кроме того желательно: Высокоуровневая система сборки с поддержкой Qt (можно и вручную писать Makefile'ы, но это дело тем менее благодарное, чем сложнее организация проекта); основные варианты: qmake, родной, требует минимального изучения, но не универсальный и не очень гибкий cmake, универсальный, требует отдельного (хотя бы минимального) изучения. Autotools — инструмент матёрых GNU'шников. Сложен. Если нет желания прописывать создание формочек в коде, а пользоваться Qt'шным генератором то крайне желателен designer. Плагины для редактора в меру своей испорченности. Для автодополнения vim/плюсов хороша будет комбинация YCM+clang+cmake. Отладчик. Если с голым gdb чувствуешь себя комфортно/готов разбираться, то его хватит. Если нет, то придётся пользоваться IDE т.к. нормального лёгкого гуя к нему не существует. Также крайне полезно стащить из kdevelop pretty-printer'ы для Qt. Нужен ли для этого обязательно QTCreator? Нет. Вопрос вытекает из предыдущих двух: можно ли использовать QT пользуясь vim-ом в качестве редактора, clang-ом для компиляции и make-ом для сборки проектов? Да. С оговорками про make.

Ответ 2



можно ли использовать QT пользуясь vim-ом в качестве редактора, clang-ом для компиляции и make-ом для сборки проектов? Да, причём спокойно. Единственное, что вам потребуется — это: заголовочные (.h) файлы, динамические библиотеки самого Qt, статические библиотеки, чтобы можно было при компоновке добавить импорты из вышеуказанных динамических библиотек. Также существует несколько утилит, необходимость в которых зависит исключительно от используемых вами возможностей Qt: moc — если у вас есть прямые или косвенные наследники от QObject, в теле которых встречаются сущности вида Q_* (Q_OBJECT, Q_INVOKABLE и т. д.), вам надо пропустить через эту утилиту .hpp-файлы с объявлением этих классов. На выходе будет дополнительный .cpp-файл, который надо скормить компоновщику вместе с остальными. rcc — если у вас есть файлы ресурсов (.rc), то их тоже надо преобразовать в .cpp с помощью этой утилиты. uic — всё то же самое, только для файлов Qt Designer (.ui). Это, по сути, необходимый минимум для использования Qt. Всё остальное — лишь упрощающая жизнь обвязка поверх этой базы. То есть вы можете спокойно пользоваться make, вызывая все эти утилиты из Makefile вручную. Например так: # * win_main.o — получен из win_main.cpp # * win_main_ui.o — получен из win_main.ui your_app: win_main.o win_main_ui.o # Вызов компоновщика %.o: %.cpp # Вызов компилятора %_ui.cpp: %.ui uic -o "$@" $^

Можно ли в vim заменить Esc на сочетание клавиш?

#vim #клавиатура #linux


Заметил, что в vim часто приходится нажимать на Esc для перехода между режимами.
Можно ли Esc заменить в данном случае на сочетание клавиш?    


Ответы

Ответ 1



Вообще я лично пользуюсь сочетанием клавиш jj. Добавте это в ваш .vimrc " exit to normal mode with 'jj' inoremap jj Это хак используют сотни vimer'ов, просто посмотрите на .dotfiles репозитории на github.com. Причина очень проста, вы постоянно держите палец на кнопке j для навигации по тексту. А для нажатия любой другой кнопки вам потребуется переместить палец. Попробуйте ;)

Ответ 2



Есть ещё встроенные Ctrl+C, Ctrl+[. Если всё равно хочется своё, используй :map

Ответ 3



Еще если используется vim в терминале, то дефолтное поведение терминала часто такое: alt+буква посылает , затем букву. Так можно одновременно выйти из insert-mode и сделать следующее действие.

вторник, 24 декабря 2019 г.

Vim - Перенос кода между двумя окнами

#vim


Делаю :vsplit в vim, хотелось бы, чтобы второе содержало продолжение буфера с последней
отображаемой строки в первом окне - как две страницы открытой книги. Можно ли такое
сделать, и как?
    


Ответы

Ответ 1



можно синхронизировать листание в нескольких окнах с помощью команды :set scb (scb — это сокращённо, полностью — scrollbind). выполнить её нужно в каждом синхронизируемом окне (чтобы отключить окно от синхронизации, добавьте no — :set noscb). можно выполнить сразу во всех открытых окнах командой :windo set scb для реализации задуманного вами надо после разбиения на два окна пролистать одно из них на одну страницу. например, нажав z+ в нормальном режиме, а затем включить синхронизацию окон командой :windo set scb при желании можете эти действия свести в макрос и добавить его в ~/.vimrc.

Ответ 2



В коммандной строке: :exe 'right vsplit'|exe 'normal z+' Лучше замапить клавишу: :map :right vsplitz+ Т.к. в книге страницы нумеруются слева на право и читаем мы сверху вниз, а Vim создаёт новые окна поумолчанию слева и вверху, рекомендую это поправить в vimrc: set splitbelow set splitright Тогда нет необходимости right перед vsplit.

пятница, 20 декабря 2019 г.

vim - экспанд слова под курсором

#vim


Чтобы искать по файлу в vim'e, я обычно делаю так:


Нажимаю /
Ввожу требуемый паттерн поиска - например, слово function
Нажимаю enter, и дальше уже двигаюсь по результатам поиска.


Как бы исключить из этого списка пункт2 :)
Допустим, у меня курсор стоит на первой букве слова function, требуется комбинация
(биндинг в .vimrc), которую можно нажать - и слово автоматом добавится в буфер поиска.
    


Ответы

Ответ 1



Алгоритм следующий: Наводите курсор на слово Нажимаете * vim переходит к его следующему вхождению. Как справедливо отметил KoVadim, вместо * можно использовать #, тогда поиск будет идти в обратном направлении. Также тут описан способ по поиску и замене слова под курсором.

Ответ 2



Дополнительно. Если нужно перетащить слово под курсором в командную строку (строку поиска), то нужно нажать Ctrl-R Ctrl-W Соответствено, слово под курсором будет в командной строке. Удобно, если делаем какие-нибудь изменения в исходном слове.

суббота, 14 декабря 2019 г.

Emacs. Можно ли переназначить “без последствий” часть клавиатурных сокращений?

#vim #emacs #hotkeys


Можно ли в Emacs переназначить часть операций с текстом/файлами под более привычные(удобные)
для себя комбинации клавиш, без конфликтов с другими командами? Или стоит изучить те
которые по умолчанию? Пробовал Vim, но там ІМНО не стоит изменять хоткеи по умолчанию,
да и там все довольно логично,да и много команд реализуются одной клавишей, так что
не увидел особой необходимости в замене.
    


Ответы

Ответ 1



Стандартные сочетания архаичны и загадочны, существует несколько подходов в основе. Хорошие примеры: Evil Mode (vim-аддиктам), Spacemacs, Ergo Emacs, Boon, fingers. Технической проблемы тут нет, это вопрос эргономики и управления сложностью конфигурации. Вот из Vim на EMACS можно перейти только благодаря Evil-mode, ценой громоздкого конфига, однако с божьей помощью можно отказаться от Evil-mode, сохранив при том модальность. К вопросу, HJKL по-умолчанию в EMACS выполняют несущественные функции (С-h дублируется ), следовательно, такое можно и перемапить. FBNP-навигацию же, естественную для EMACS, и C-x-... M-x-..., C-c-..., повсеместно используемое - проще оставить нетронутым: (use-package god-mode :bind ( ( "M-i" . god-local-mode ) ( "" . god-local-mode ) ( "C-j" . next-line ) ( "C-k" . previous-line ) ( "C-h" . backward-char ) ( "C-l" . forward-char ) ( "C-d C-f" . delete-forward-char ) ( "C-d C-b" . backward-delete-char-untabify ) ( "C-d C-e" . kill-line ) ( "C-d C-w" . delete-trailing-whitespace ) ( "C-d C-a" . delete-to-begin ) ) ) В стиле Vi, одну клавишу можно использовать для целого ряда действий. Например, удаление строки dd, до конца строки: de, до начала строки: da, вперёд: df, назад: db etc. См. также Hydras. Хороший стиль - повторные нажатия одной клавиши + модификатор: v - старт выделения слова, повторное v - expand-region (увеличить выделение), M-v - contract-region (уменьшить выделение), Shift-V - выделение строки, но и стандартный C-Space продолжает работать. Вариант простого конфига в этом духе Есть альтернативы god-mode, например Modalka.

Ответ 2



Попробовал различные варианты. IMHO стоит изучить клавиатурные комбинации установленные по умолчанию, т.к. и в справке и разной документации везде идут именно они. Как вариант можно назначать неиспользуюмые комбинации или клавиши под свои задачи. Ну, а насчет переназначения стандартных клавиатурных сокращений, то как писал в комментариях @avp, просто потом нужно переназначить и ту функцию, комбинацию которой переназначили другой функции. Например, хотим функцию undo включать по C-z. Смотрим чем занято C-z, нажимаем C-h k C-z: C-z runs the command suspend-frame, which is an interactive compiled Назначаем этой функции другую комбинацию.

Ответ 3



CUA-mode остальное как угодно.