Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Обсуждение форума > 4 пробела в форуме по питону


Автор: pythonwin 23.8.2006, 10:42
Всем доброго времени суток!

А можно сделать так, чтобы при нажатии "Ctrl+]" в начало строки добавлялось 4 пробела, а при нажатии "Ctrl+[" - удалялось? Желательно чтобы это возможность работала и для целых блоков кода на питоне.


Автор: Cr@$h 23.8.2006, 11:45
Если реализовывать, то сразу для всех форумов. Может, многим пригодиться.

Интересно, а Tab нельзя для этого переиначить... smile 

Автор: pythonwin 23.8.2006, 12:38
Цитата(Cr@$h @  23.8.2006,  18:45 Найти цитируемый пост)
Интересно, а Tab нельзя для этого переиначить... smile  

или хотя бы так, но для питонщиков лучше "Ctrl+[" и "Ctrl+]", т.к. это используется в IDLE для питона. smile

Автор: smartov 23.8.2006, 13:07
Ну собтвенно технических трудоностей я тут не вижу.
Как получить выделенный текст - это на Винграде уже не раз обсуждалось.
Отловить Tab или что-то другое - не проблема

Добавлено @ 13:08 
Могу даже написать за большое спасибо smile

Автор: pythonwin 23.8.2006, 13:26
Цитата(smartov @  23.8.2006,  20:07 Найти цитируемый пост)
Могу даже написать за большое спасибо smile 

за такое дело, я всегда готов сказать "Большущее Спасибо" smile

Автор: Mayk 23.8.2006, 20:50
Цитата(smartov @  23.8.2006,  17:07 Найти цитируемый пост)
Отловить Tab или что-то другое - не проблема

Не надо TAB ловить.  Иначе навигация для любителей клавиатуры осложнится  smile  

Цитата(Cr@$h @  23.8.2006,  15:45 Найти цитируемый пост)
Может, многим пригодиться.

угу

Цитата(pythonwin @  23.8.2006,  17:26 Найти цитируемый пост)

за такое дело, я всегда готов сказать "Большущее Спасибо" 

И даже можно будет поставить Большой Плюс  smile 

Автор: smartov 23.8.2006, 20:53
Делаю 
Тока блин стока проблем с отмеченным текстом
Но вроде порешал
Думаю в тяпницу выложу smile 

Автор: pythonwin 24.8.2006, 06:29
Цитата(smartov @  24.8.2006,  03:53 Найти цитируемый пост)
Думаю в тяпницу выложу smile  

Прекрасно! smile

Автор: LSD 24.8.2006, 11:16
Только не 4 пробела, а 2. Тогда этой фишкой смогут пользоваться и те кто предпочитает "большие" отступы (просто 2 раза нажать) и те кто предпочитает "маленькие".

Автор: smartov 24.8.2006, 13:11
LSD, 2 пробела - кармически неправильно smile человека не смущает вложенность, а так максимум до третей дошел и понимаешь, что надо как-то более модульно к вопросу подходить... функции, классы писать и т.п.

Автор: pythonwin 24.8.2006, 15:04
Цитата(smartov @  24.8.2006,  20:11 Найти цитируемый пост)
SD, 2 пробела - кармически неправильно smile человека не смущает вложенность, а так максимум до третей дошел и понимаешь, что надо как-то более модульно к вопросу подходить... функции, классы писать и т.п. 

Именно так! мне это нужно для того чтобы писать классы, функции, инструкции (в питоне: if else elif, for, while), return и т.д.

Автор: setq 25.8.2006, 00:00
Цитата(LSD @  24.8.2006,  11:16 Найти цитируемый пост)
Только не 4 пробела, а 2.


Три  smile 

Автор: pythonwin 25.8.2006, 07:11
Эти 4 пробела также удобны и для написания более читабельного кода JS и HTML (IMHO) smile

Автор: LSD 25.8.2006, 08:13
Цитата(pythonwin @  25.8.2006,  08:11 Найти цитируемый пост)
Эти 4 пробела также удобны и для написания более читабельного кода JS и HTML (IMHO)

А я ни JS ни HTML не пишу. Зачем мне 4 пробела тогда?

Автор: pythonwin 25.8.2006, 08:24
Цитата(LSD @  25.8.2006,  15:13 Найти цитируемый пост)
А я ни JS ни HTML не пишу. Зачем мне 4 пробела тогда? 


где можно применить 4 пробела для увеличиния читабельности кода:
1) Python (обязательно - основной принцип групировки операторов)
2) JavaScript
3) HTML
4) CSS
5) PHP
6) C++
7) Pascal и Delphi


Автор: LSD 25.8.2006, 10:37
Цитата(pythonwin @  25.8.2006,  09:24 Найти цитируемый пост)
где можно применить 4 пробела для увеличиния читабельности кода:
....

Ты никак не поймешь мою мысль. Я не говорю что отступы это плохо и их никто не использует. Я говорю, что все используют разные отступы, кто-то 2 пробела, кто-то 4, а кто-то 8. И если поставить 8, то данное нововведение будет никому не нужно кроме тех, кто использует 8 пробелов.

Автор: pythonwin 25.8.2006, 11:03
Цитата(LSD @  25.8.2006,  17:37 Найти цитируемый пост)

Ты никак не поймешь мою мысль. Я не говорю что отступы это плохо и их никто не использует. Я говорю, что все используют разные отступы, кто-то 2 пробела, кто-то 4, а кто-то 8. И если поставить 8, то данное нововведение будет никому не нужно кроме тех, кто использует 8 пробелов.

1) сейчас нет даже 4-х пробелов, а мы с тобой получается "делим не убитого медведя"
2) предложи решение с более системным подходом, например - дать пользователю возможность настраивать количество пробелов, которое ему нужно.
smile

Автор: Cr@$h 25.8.2006, 12:03
Цитата(pythonwin @  25.8.2006,  12:03 Найти цитируемый пост)
предложи решение с более системным подходом, например - дать пользователю возможность настраивать количество пробелов, которое ему нужно.

user posted image Осталось это реализовать. Не слишком накручено для пользователей будет...

Автор: pythonwin 25.8.2006, 12:23
Цитата(Cr@$h @  25.8.2006,  19:03 Найти цитируемый пост)
Осталось это реализовать. Не слишком накручено для пользователей будет... 

К сожелению я не знаю как это сделать, да и со временем пока проблемы. smile

Автор: LSD 25.8.2006, 12:28
Цитата(pythonwin @  25.8.2006,  12:03 Найти цитируемый пост)
например - дать пользователю возможность настраивать количество пробелов, которое ему нужно

Это не проблема. Написать 3 варианта скрипта, и генерировать страницу с тем вариантом который выбрал пользователь в профиле.

Автор: pythonwin 25.8.2006, 12:51
я жду решение от smartov... smile

Автор: smartov 25.8.2006, 14:32
Сейчас работаю, но все же планирую сегодня к вечеру выложить

Автор: Cr@$h 25.8.2006, 14:36
Цитата(LSD @  25.8.2006,  13:28 Найти цитируемый пост)
Написать 3 варианта скрипта, и генерировать страницу с тем вариантом который выбрал пользователь в профиле. 

Изменения в профиле принимаются на высоком уровне. Да и вообще, такого рода.
До этой опции в профиле ещё добраться нужно будет...
Нужно хорошенько подумать, надо ли вводить её. В конечном итоге и 2 пробела можно оставить...

Автор: pythonwin 25.8.2006, 14:54
Цитата(smartov @  25.8.2006,  21:32 Найти цитируемый пост)
Сейчас работаю, но все же планирую сегодня к вечеру выложить 

хорошо!

Автор: smartov 25.8.2006, 17:13
В общем нельзя сказать что это идеально законченное решение, но работает.
Работает в IE 6, Firefox.
В Опере пока что не работает, т.к. у нее в силу неясных причин другие коды клавиш.
Так же недостатки:
1. Выделение умирает (чтобы оставлять нужно дополнительный код, и для ИЕ свой... чуть попоздже)
2. В Firefox если хочешь несколько раз проидентировать/анидентировать приходится отпускать клавишу Ctrl
3. При анидентации обязательно выделять строки целиком, до самого начала.

Чтобы поменять 2/4 пробела нужно просто раскомменировать/закомментировать нужную строчку (например "tabSymbol = "    ";//4spaces")

Код

<html>
<body>

<script>

var tabSymbol;

//Change this value to needed

tabSymbol = "    ";//4spaces
//tabSymbol = "  ";//2 spaces

//----------

var cachedEvent;

function indentString($str)
{
    if (!$str)
        return "";
    //return $str.replace(/^(.*)$/gm, tabSymbol+'$1');//no way :( stupid ie
    $str_arr = $str.split(/\n/);
    for (var i=0; $str_arr[i]; i++)
    {
        $str_arr[i] = tabSymbol + $str_arr[i];
    }
    return $str_arr.join("\n");
}

function unindentString($str)
{
    if (!$str)
        return "";
    $str_arr = $str.split(/\n/);
    for (var i=0; $str_arr[i]; i++)
    {
        if ($str_arr[i].indexOf(tabSymbol) == 0)
        {
            $str_arr[i] = $str_arr[i].replace(tabSymbol, '');
        }
    }
    
    return $str_arr.join("\n");
}

function indentSelection(targetTextarea, unindent)
{
    if (document.selection) //IE, Opera 9
    {
        range = document.selection.createRange();
        range.text = unindent ? unindentString(range.text) : indentString(range.text);
    } 
    else //Mozilla
    {
        var selection = targetTextarea.value.substr(targetTextarea.selectionStart, targetTextarea.selectionEnd - targetTextarea.selectionStart);
        selection = unindent ? unindentString(selection) : indentString(selection);

        targetTextarea.value = targetTextarea.value.substr(0, targetTextarea.selectionStart) 
            + selection
            + targetTextarea.value.substr(targetTextarea.selectionEnd);
    }
}

function getEvent(textarea, $event)
{
//219 - [
//221 - ]

    if (cachedEvent == 17 && $event == 219)
    {
        indentSelection(textarea, true);
        cachedEvent = 17;
        return;
    }
    if (cachedEvent == 17 && $event == 221)
    {
        indentSelection(textarea, false);
        cachedEvent = 17;
        return;
    }
    cachedEvent = $event;
}

</script>

<textarea id="asd" style="width:500px;height:500px;" onKeydown="getEvent(this, event.keyCode)">
myarray = new Array();
myarray.push('forum');
myarray.push('vingrad');
myarray.push('ru');
var str;
for (var i=0; i < count(myarray); i++)
{
str += myarray[i];//ident me;
str += '.';//ident me;
}
alert(str);
</textarea>

</body>
</html>

Автор: pythonwin 25.8.2006, 17:22
smartov, а какие клавиши?
"Ctrl+]" "Ctrl+[" ? 
Но тогда у меня ни в IE. ни в FF не работет...  smile 

Автор: pythonwin 25.8.2006, 17:56
smartov, разобрался! smile
Большое тебе спасибо!

Можно ещё просьбу?

А можно, чтобы 4 (или 2 пробела) добавлялись к пустым и не выделеным строкам?
(Главное) а также, чтобы их можно было использовать окне сообщения (блокноте) vingrad.ru?

Автор: smartov 25.8.2006, 19:39
pythonwin, 
Цитата(pythonwin @  25.8.2006,  16:56 Найти цитируемый пост)
А можно, чтобы 4 (или 2 пробела) добавлялись к пустым и не выделеным строкам?

К пустым в IE добавлялись. Поправил чтобы и в FF тоже.
Невыделенным - тут сложнее. Если ты хотя бы 1 символ из строки выделишь -- ее идентирует smile

Цитата(pythonwin @  25.8.2006,  16:56 Найти цитируемый пост)
а также, чтобы их можно было использовать окне сообщения (блокноте) vingrad.ru?

Ну тут вопрос в общем то не ко мне smile Поучавствовать в апгрейде Винграда я не против.

Вот немного исправленный и доработанный код.
Теперь будет сохранятся выделение. 
Среди проблем: нужно выделять строку полностью, т.к. код работает с выделением.

Код

<html>
<body>

<script>

var tabSymbol;

//Change this value to needed

//tabSymbol = "    ";//tabulator
tabSymbol = "    ";//4spaces
//tabSymbol = "  ";//2 spaces

//----------

var cachedEvent;
var linesUpdated;

String.prototype.repeat = function(count) { 
    var tmp = this.valueOf();
    for (var i=1; i < count; i++)
    {
        tmp += this.valueOf();
    }
    return tmp;
};

function indentString($str)
{
    if (!$str)
        return "";
    $str_arr = $str.split(/\n/);
    for (var i=0; i < $str_arr.length; i++)
    {
        $str_arr[i] = tabSymbol + $str_arr[i];
    }
    
    linesUpdated = $str_arr.length;
    return $str_arr.join("\n");
}

function unindentString($str)
{
    if (!$str)
        return "";
    $str_arr = $str.split(/\n/);
    for (var i=0; i < $str_arr.length; i++)
    {
        if ($str_arr[i].indexOf(tabSymbol) == 0)
        {
            $str_arr[i] = $str_arr[i].replace(tabSymbol, '');
        }
    }
    linesUpdated = $str_arr.length;
    return $str_arr.join("\n");
}

function indentSelection(targetTextarea, unindent)
{
    if (document.selection) //IE, Opera 9
    {
        range = document.selection.createRange();
        range.text = unindent ? unindentString(range.text) : indentString(range.text);
    } 
    else //Mozilla
    {
        var selStart = targetTextarea.selectionStart;
        var selEnd = targetTextarea.selectionEnd;
        var selection = targetTextarea.value.substr(targetTextarea.selectionStart, targetTextarea.selectionEnd - targetTextarea.selectionStart);
        selection = unindent ? unindentString(selection) : indentString(selection);

        targetTextarea.value = targetTextarea.value.substr(0, targetTextarea.selectionStart) 
            + selection
            + targetTextarea.value.substr(targetTextarea.selectionEnd);
        
        var chars = tabSymbol.repeat(linesUpdated).length;
        selEnd = unindent ? (selEnd-chars) : (selEnd+chars);
        targetTextarea.setSelectionRange(selStart, selEnd);
    }
}

function getEvent(textarea, $event)
{
//219 - [
//221 - ]

    if (cachedEvent == 17 && $event == 219)
    {
        indentSelection(textarea, true);
        cachedEvent = 17;
        return;
    }
    if (cachedEvent == 17 && $event == 221)
    {
        indentSelection(textarea, false);
        cachedEvent = 17;
        return;
    }
    cachedEvent = $event;
}

</script>

<textarea id="asd" style="width:500px;height:500px;" onKeydown="getEvent(this, event.keyCode)">
myarray = new Array();
myarray.push('forum');
myarray.push('vingrad');
myarray.push('ru');
var str;
for (var i=0; i < count(myarray); i++)
{
str += myarray[i];//ident me;
str += '.';//ident me;
}
alert(str);
</textarea>

</body>
</html>


Добавлено @ 19:41 
Ах да smile Теперь де Ctrl не обязательно отпускать при множественной идентации smile

Автор: pythonwin 26.8.2006, 10:33
Цитата(smartov @  26.8.2006,  02:39 Найти цитируемый пост)
Ну тут вопрос в общем то не ко мне smile Поучавствовать в апгрейде Винграда я не против.

Подскажи, к кому обратиться.

Добавлено @ 10:38 
Цитата(smartov @  26.8.2006,  02:39 Найти цитируемый пост)
Ах да smile Теперь де Ctrl не обязательно отпускать при множественной идентации smile 

Спасибо!

Для для того чтобы разработать код, который полность удовлетворял питонщиков - лучше скачать http://www.python.org/download/releases/2.4.2/

Там есть встроенная IDLE 1.1.2 - лучше ориентироваться на нее, т.к. многие питонщики пишут именно на ней. smile


Автор: smartov 26.8.2006, 10:52
pythonwin, я думаю чтобы проэмулировать идентацию мне не нужен весь IDE smile да и ты расскажешь если что.

Цитата(pythonwin @  26.8.2006,  09:33 Найти цитируемый пост)
Подскажи, к кому обратиться.

По идее админам написать, вот только кому....
Попробуй написать... 12345 он у нас по яваскрипту. Или Exception можт. Да любому активному smile Кто откликнется.

Автор: pythonwin 26.8.2006, 11:23
Цитата(smartov @  26.8.2006,  17:52 Найти цитируемый пост)
pythonwin, я думаю чтобы проэмулировать идентацию мне не нужен весь IDE smile да и ты расскажешь если что.

Хорошо, - подготовлю описание. 

Цитата(smartov @  26.8.2006,  17:52 Найти цитируемый пост)

По идее админам написать, вот только кому....
Попробуй написать... 12345 он у нас по яваскрипту. Или Exception можт. Да любому активному smile Кто откликнется.

Думаю, сначало нужно довести до ума код, а потом уже админов звать.

Автор: smartov 26.8.2006, 17:15
Ну ты спросил к кому обратиться - я подсказал... Я и не предлагал звать админов прямо сейчас...
Единственная текущая проблема кода - то что он работает с выделением а не с линиями.
Поддержку Оперы... это надо посмотреть возможни ли оно вообще.
Если б кто подсказал каким способом наиболее точно можно определить что мы в Опере - это облегчило бы задачу. (я конечно и сам найду, но может у кого есть проверенный способ)

Автор: pythonwin 26.8.2006, 17:59
Цитата(smartov @  27.8.2006,  00:15 Найти цитируемый пост)
Ну ты спросил к кому обратиться - я подсказал... Я и не предлагал звать админов прямо сейчас...

Прошу, прощения, - я что-то не то сказал? Если это так - прошу принять мои извинения. smile
Цитата(smartov @  27.8.2006,  00:15 Найти цитируемый пост)
Единственная текущая проблема кода - то что он работает с выделением а не с линиями.

Это основная.
есть ещё одна - если выделить любой один символ в середине строки и нажать Ctrl+], то пробелы будут добавляться перед этим символом, а не в начало строки.
smile

Автор: smartov 27.8.2006, 01:07
Цитата(pythonwin @  26.8.2006,  16:59 Найти цитируемый пост)
Это основная.

A.. smile


Цитата(pythonwin @  26.8.2006,  16:59 Найти цитируемый пост)
есть ещё одна - если выделить любой один символ в середине строки и нажать Ctrl+], то пробелы будут добавляться перед этим символом, а не в начало строки.

Это та же самая smile Другое ее проявление. Но суть одна - работает с выделением а не со строками.
Сейчас вот думаю как бы так лихо это дело изменить...
Вроде не трудно. Если IE окажется достаточно сообразительным - то все бут ок smile

Автор: pythonwin 27.8.2006, 15:48
smartov, можно ли выложить код для доработки на форуме в http://forum.vingrad.ru/index.php?showforum=74 или в http://forum.vingrad.ru/index.php?showforum=10 ?

ты не возражаешь?

Автор: smartov 28.8.2006, 00:56
Цитата(pythonwin @  27.8.2006,  14:48 Найти цитируемый пост)
ты не возражаешь?

Давай я доделаю работу с линиями - а потом выкладывай где угодно - это opensource.
Ok?

Автор: pythonwin 28.8.2006, 07:12
Цитата(smartov @  28.8.2006,  07:56 Найти цитируемый пост)

Давай я доделаю работу с линиями - а потом выкладывай где угодно - это opensource.
Ok?


Согласен!

Автор: smartov 1.9.2006, 12:03
Так, похоже что я затяну это дело с линиями так что выкладывай куда хочешь smile

Добавлено @ 12:04 
Только не забудь потом результат сюда показать smile Если что-то хорошее поменяют

Автор: pythonwin 4.9.2006, 07:38
Цитата(smartov @  1.9.2006,  19:03 Найти цитируемый пост)
ак, похоже что я затяну это дело с линиями так что выкладывай куда хочешь smile

Добавлено @ 19:04 
Только не забудь потом результат сюда показать smile Если что-то хорошее поменяют 

Хорошо!

Автор: nerezus 15.11.2006, 13:33
А я смысла не вижу. Или, выделив блок текста, и нажав на ctrl+] мы его можем подвинуть? Ну хз, хз )

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)