LINUX.ORG.RU

vim убить все символы backspace

 


1

2

| - позиция курсора

def aaa():
    aaaaa aaaaa|)

случайно нажимаю<CR> и получаю

def aaa():
    aaaaa aaaaa
    |)
для того, чтобы вернуть ) назад, нужно нажать несколько раз на backspace. А нельзя ли backspace убивать все пробелы за один раз?

PS: не предлагать normal mode --> u и подобное. Решение только в insert mode



Последнее исправление: Xwo (всего исправлений: 3)

Увы, не особый знаток vim'а.
Но, кто тебе мешает забиндить какое-нибудь сочетание кнопок на последовательность типа: <ESC>ui

anonymous
()

Для 'решение только для insert mode' поставь себе notepad++, vim тебе не нужен.

anonymous
()

для того, чтобы вернуть ) назад, нужно нажать несколько раз на backspace

Несколько раз это сколько? В твоём случае у меня достаточно нажать Backspace два раза, первый раз он съедает 4 пробела, второй раз поднимается на строку выше. Два раза это тоже много?

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

Я тоже не понимаю, ему 2 раза бэкспейс нажать в падлу?

anonymous
()

Ctrl-U Ctrl-U или Ctrl-O u.

xaizek ★★★★★
()

для того, чтобы вернуть ) назад, нужно нажать несколько раз на backspace. А нельзя ли backspace убивать все пробелы за один раз?

Два раза Ctrl+U?

PS: не предлагать normal mode --> u и подобное. Решение только в insert mode

Вот здесь у тебя концептуальная ошибка: если тебе не нужен normal mode, то тебе не нужен vim, так как основной функционал vim - в normal mode и command mode. Insert mode - просто чтобы вставлять текст.

Накрайняк можешь забиндить комбинацию normal mode на сочетание клавиш в insert mode: если таких бинингов не много, это ок.

То, что тебе нужно - это (normal mode) kJ: k - курсор на строку выше, J - объединяет две строки: текущую и следующую.
Вот биндинг Ctrl+G для Insert mode (запускать в command mode):

inoremap <buffer> <silent> <C-g> <C-o>k<C-o>J

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

И ждать `timeoutlen` пока твой дурацкий совет с биндингом i_CTRL-G сработает? Лучше вообще ничего не советуй впредь новичкам в виме.

Правильные ответы уже выше дали. Тем более автор спрашивал как `убить` все табы, про символ новой строки он ничего не говорил.

P.S. Автору могу посоветовать, если ему тяжело нажимать в таком случае <C-w><C-w> и не тяжело заучивать новый биндинг какой бы он там не был, не мучать себя и поставить какой-нибудь vscode и мышкой там елозить.

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

Нажмёт 4 раза вместо 2, не надо выдумывать проблемы когда их нет. Случайно нажать интер вообще невозможно, это для начала. Если только ты не дислектик, тогда это явно занятие не для тебя.

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

Зачем нажимать четыре? когда можно нажать <C-w>? Проблема как раз таки есть и если для тебя не проблема нажать 4 раза, то тут уже дело в тебе.

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

объясню специально для тебя

<C-w> тебе тоже придётся 5 раз нажать, и это комбинация: дольше и менее удобно, кроме того есть перспективы случайно удалить ещё несколько слов.

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

:) Я все же настаиваю, чтобы ты попробовал (это если ты не с мезозойской эры и у тебя `set backspace=` в конфиге. Может узнаешь сегодня что-то новое, ведь учиться никогда не поздно.

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

Ладно, может зависит от типа файла, совершенно точно отступы вим маленькими группами удалял. И всё же, если тебе надо отступов на 10 уровней вложенности удалить, то тут конечно без вопросов, но это дольше для 1-2 уровней.

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

Это совершенно не важно. 1 символ ты мизинцем удаляешь, то что тебе надо удалить много разом комбинацией несёт в себе очевидные недостатки. Лучше придумай как настроить удаление всех пробелов бэкспейсом, и уменьшение уровня отступа через shift+tab (удивительно, что в моём виме этого нет), больше пользы будет (хотя доводы против ровно те же, это комбинация). Первое, чтобы помочь с проблемой ОП, и второй с моей.

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

1 символ ты мизинцем удаляешь

Ты же наркоман.

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

Каким мизинцем, дядя?

:h i_CTRL-H
И да уже давно перебиндил в иксах и Esc и Ctrl. Но ты пытайся и дальше умничать о виме когда о нем НИЧЕГО не знаешь.

Ты явно ни только в виме не шаришь. Зачем мне удалять все пробелы? Зачем мне твои шифт-табы (свой мизинец засунь себе знаешь куда, а я свой берегу) если есть <Ctrl-o><, если уж такому знатоку надо зачем-то изменить индентацию в инсерт режиме.

Последний ответ короче тебе в этом треде. Ты даже для анонимуса слишком туп.

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

Лол, напоминает потуги емаксеров. Видимо такие же поехавшие. Я тебе уже несколько раз объяснил что за комбинашки только дауны подобные тебе будут топить, ты почему-то так и не понял. Это _не_ эффективно.

anonymous
()

PS: не предлагать normal mode --> u и подобное. Решение только в insert mode

insert mode только для набора текста, а не для манипуляций его формой

а так

<ESC>kJt)i
и это не надо запоминать, будет набираться на автомате после 1-2 месяца активного использования каждой команды по отдельности.

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

а если вложенных блоков много, то не два раза, а больше двух раз

Xwo
() автор топика

Почему это событие возникает? Набираешь такой some_func(«aaa», «bbb»)

и тут на some_func(«aaa», «bbb| вместо » нажимается break(который прям совсем рядом) и далее на автомате нажимается символ ) и получается вместо some_func(«aaa», «bbb») следующее:

some_func("aaa", "bbb
|)

а ну нас не просто some_func, а

# синтетический пример, чисто показать, что вложенных блоком может быть дофига
if some
    if some
       if some
           some_func("aaa", "bbb
           |)

а за some_func(«aaa», «bbb еще может быть and что-то там. Так вот когда я пишу, я не хочу переходить в режим управления текстом т.е в normal mode, это меня отвлекает. Поэтому поставил за цель найти решение именно в insert mode

Xwo
() автор топика
Последнее исправление: Xwo (всего исправлений: 2)

решение есть!

https://www.reddit.com/r/vim/comments/7gqowu/hungrysmart_backspace_support/

http://vim.wikia.com/wiki/Whitespace_hungry_backspace/delete

http://vim_use.narkive.com/Awoujmbd/hungry-delete-in-vim

Еще бы замутить такое:

if some
    if some
       if some
           some_func("aaa", "bbb
           






           |)

чтобы все пустые строки удалялись - тогда было бы вообще мегаудобно(в emacs'e есть бинд удобный 647. Удалить все пустые строки, кроме одной: C-x C-o, а с помощью бекспейс отпадала бы необходимость в чем-то подобном)

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

Тред не читай, сразу отвечай.

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

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

Ты код пишешь или гуйней какой-то маешься? Это ты на энтер упал, что у тебя 54634543 строк пустых появилось? Если так надо, можно сделать чтобы и все пустые строки удаляло и сразу вставляло «Hello, world!», ты же этим занимаешься?. Вот только ты не мыслишь так как задумано при работе в вим и не понимаешь его преимуществ. Я бы помог, но не хочу учить плохому.

Могу дать только один единственный совет - перебинди Ctrl хотя бы на capslock(есть и более удобные варианты) и поймешь, что два раза нажать <C-w><C-w> удобнее, чем один раз backspace на стандартной клаве.

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

Тред не читай, сразу отвечай.

Я ответил тому, кто не читал тред. Он предложил дичь, я его дичь немного поправил. (%

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

Что именно проверить? И, да, я не пользуюсь Vim, вместо него у меня NeoVim, и они полностью совместимы (но последний как-то не очень совместим с vi).

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

Еще раз повторюсь, зайди и проверь в неовиме, что делает <C-w> в инсерт моде. Эта комбинация в принципе не может определять количество пустых символов (пробелов или табов).

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

C-w удаляет слово. Это бинд из терминала. Если будет пустая строка, с отступом, то C-w будет удалять по 1 таб. Если отступов было пять, то C-w нужно будет нажать 5 раз

Xwo
() автор топика
Ответ на: комментарий от StillSteal

перечитай, прежде, чем учить кого-то жить. Это МНЕ не удобно. Я искал решение. По поводу много пустых строк: не каждый яп по autoformat удаляет много пустых строк. Удобно зайти на пустую строку, раз нажать BS, с целью удалить все пустые строки. Или ты предложишь высчитать кол-во строк, перейти на первую пустую строку и нажать d15d ? Крутецки, чо.

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

Еще один. Вчера только вим запустил, а уже учит кого-то как C-w работает. Ну круто, че.

И ты точно терминалом пользуешься? Или также как и вимом?

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

Ты ничего не считаешь, дядя. Ты в любом месте ПУСТЫХ СТРОК нажимаешь dip, но вопроса это не отменяет, как эти пустые строки появились-то?

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

за dip спасибо. За остальное - ты не совсем прав. Если есть возможность не переходить в normal mode - лучше этого не делать.

вот это решение не оч удобное, кстати

inoremap <silent><expr><bs>
            \ (&indentexpr isnot '' ? &indentkeys : &cinkeys) =~? '!\^F' &&
            \ &backspace =~? '.*eol\&.*start\&.*indent\&' &&
            \ !search('\S','nbW',line('.')) ? (col('.') != 1 ? "\<C-U>" : "") .
            \ "\<bs>" . (getline(line('.')-1) =~ '\S' ? "" : "\<C-F>") : "\<bs>"

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

Что значит я не совсем прав?

Вы с одной палаты тут? C-w и в виме/неовиме и в терминале удаляет любое количество пустых символов до начала (не конца, то есть и слово удаляет если оно есть) слова или до символа новой строки, а потом удаляет символ новой строки (то есть «прыгает» на предыдущую строку). Если у вас че-то не так - пеняйте на свои плагины или руки.

Перебиндив бэкспейс тем более на <expr> - ты потом намучаешься, так как много плагинов его используют (типа автокомплита или автовставки открывающих-закрывающих символов).

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

C-w и в виме/неовиме и в терминале удаляет любое количество пустых символов до начала (не конца, то есть и слово удаляет если оно есть) слова или до символа новой строки, а потом удаляет символ новой строки (то есть «прыгает» на предыдущую строку)

ты прав

Перебиндив бэкспейс тем более на <expr> - ты потом намучаешься, так как много плагинов его используют (типа автокомплита или автовставки открывающих-закрывающих символов).

ты прав

Короче плохая идея

PS: насчет новичков и тд: я под вим 12 лет сижу, обмазался своими функциями, 62 плагина. Как бе.

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

Говорю - самый лучший совет, если у тебя близкая к стандарту клава - это перебиндить в иксах левый ctrl куда тебе удобно. У меня на левом Alt он. И научится все-таки выходить в нормал мод. Вообще даже Enter не использовать, а Esc (или его замену) и `o`.

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

насчет новичков и тд: я под вим 12 лет сижу, обмазался своими функциями, 62 плагина. Как бе.

Ну тогда даже не знаю, почему такие вопросы возникают.

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

лет 10 уже

" fj/jf == exit normal mode
inoremap <silent> fj <Esc>l`^:set iminsert=0<CR>
inoremap <silent> jf <Esc>l`^:set iminsert=0<CR>

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

Как тебе уже сказали, <C-w> удаляет слово с любым предшествующим количеством пробелов/табов, но так как слова перед пробелами/табами нет (перенос строки словом не является, но второй ^W удалит именно его, не затронув слово перед ним), ^W^W удалит все пробелы и перенос строки.

В любом случае это плохой способ отрегулировать автоматическое форматирование в Vim.

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

И ждать `timeoutlen` пока твой дурацкий совет с биндингом i_CTRL-G сработает? Лучше вообще ничего не советуй впредь новичкам в виме.

А ты самозабанься, пожалуйста. В воздухе посвежее станет.
Или хотябы утруди себя проверкой чужих советов прежде чем критиковать их.
И еще: что нужно ТС'у, и насколько ему подходит мой совет, пусть скажет сам TC. Ты пока не научился корректно выражать свое мнение.

Kroz ★★★★★
()

" CTRL-U in insert mode deletes a lot. Use CTRL-G u to first break undo, so that you can undo CTRL-U after inserting a line break.

inoremap <C-U> <C-G>u<C-U>

Xwo
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.