Упрощаем себе жизнь с помощью Sublime Text 2

image
Недавно открыв для себя Sublime Text 2, я удивился тому, как можно было придумать настолько эффективный инструмент. Тот кто избалован всяческими IDE, обычно не видит никаких достоинств, кроме красивой подсветки кода (хотя именно это меня изначально и привлекло).

Я не стану рассуждать на сколько хорош этот редактор и расписывать весь его функционал — на хабре по этой теме уже есть множество топиков. Я лишь хочу показать как можно сделать из него тот инструмент, за который не жалко тех 59$, которые хотят за него разработчики.


Плагины


Главное преимущество Sublime Text 2 перед остальным зоопарком редакторов и IDE для меня — это возможность писать свои плагины. При этом не нужно изучать тонны литературы, как например если вы собрались писать плагин для Eclipse или Geany. Плагины пишутся на Python и на сайте проекта есть API Reference, которого мне было вполне достаточно для того чтобы начать расширять редактор под свои нужды.

Еще мне очень понравилось то, что в редакторе есть удобная консоль python, которую можно использовать для отладки своего плагина.

Хотелки


Попытаюсь сформулировать некоторые из возможностей, которые мне были очень нужны и готовых решений я не нашел.

Создание бэкапов

Я занимаюсь разработкой на php и работаю с множеством проектов одновременно. Так уж повелось, что система контроля версий у нас по множеству причин не прижилась, поэтому мне был жизненно необходим удобный механизм создания бэкапов.

До Sublime я использовал Geany и в нем была достаточно удобная надстройка, позволяющая делать резервные копии редактируемых файлов в выбранную директорию. Единственный минус данной надстройки был в том, что бэкапы создавались каждый раз при сохранении. Чего-то подобного мне и хотелось в Sublime, но чтобы бэкапы создавались по запросу (например при нажатии горячих клавиш). Справедливости ради отмечу, что среди готовых решений есть подобный плагин AutomaticBackups, но мы напишем свой велосипед. Ради забавы.

Сравнение файлов

Когда работаешь над проектом не один, то бывает необходимо посмотреть те измения, которые внес другой программист (или сравнить файл с ftp с локальной копией). Обычно в данном случае я открывал meld, выбирал там нужные файлики и смотрел разницу. Хотелось данную фунцию тоже возложить на редактор. Представлял я это так: открываю два файла в редакторе, располагаю вкладки одна за другой, нажимаю горячую клавишу и открывается meld с выбранным файлом и с файлом, вкладка которого в редакторе идет следующей. Мне показалось это очень удобным.

Список всех открытых файлов

По специфике работы, мне часто требуется составить список редактированных файлов (да, вот она жизнь без svn). Хотелось бы получать список открытых файлов тоже по нажатию горячей клавишы.

Приступим к работе


Я описал тот небольшой минимум фич, которые мне были необходимы для комфортного перехода на Sublime.

Далее я покажу как писались плагины для моих нужд и на сколько это было просто. Отмечу то, что писал я все под Ubuntu и как оно делается в Windows я даже не представляю.

Плагин Backup

Приступим. Открываем редактор, в меню выбираем Tools->New Plugin… Открывается вкладка с заготовочкой вида:

import sublime, sublime_plugin

class ExampleCommand(sublime_plugin.TextCommand):
	def run(self, edit):
		self.view.insert(edit, 0, "Hello, World!")
	


Нам необходимо правильно назвать класс нашего плагина и сохранить его с правильным именем. Имя класса должно начинаться с большой буквы, если название состоит из нескольких слов, то слова не должны иметь разделителя и каждое новое слово должно начинаться с заглавной буквы. Заканчиваться имя класса должно обязательно на слово Command. Имя файла должно быть написано маленькими буквами и если название плагина состоит из нескольких слов, то слова должны иметь разделитель _

Я получил вот такой скрипт и сохранил его в предложенной директории ~/.config/sublime-text-2/Packages/User/ с именем backup.py:

import sublime, sublime_plugin

class BackupCommand(sublime_plugin.TextCommand):
	def run(self, edit):
		self.view.insert(edit, 0, "Hello, World!")
	


Опишем алгоритм работы нашего будущего плагина:
  • Получить имя файла, который открыт в текущей вкладке;
  • Создать в директории хранения бэкапов директорию с текущей датой (будем разделять бэкапы по дням);
  • Создать в директории с текущей датой дерево директорий до нашего файла (покажу на примере);
  • Скопировать файл в эту директории с префиксом текущего времени;
  • Известить пользователя о том, что бэкап был создан.

Первое что нам необходимо сделать — получить имя открытого файла. Смотрим документацию и вникаем в объект sublime. У объекта sublime есть функйия active_window — которое возвращает объект окна, которое у нас в данный момент активно. У каждого окна есть массив views — это наши вкладки. Нам нужна активная вкладка, поэтому мы можем получить объект активного view, выполнив комманду:

	sublime.active_window().active_view()


У view есть нужная нам функция file_name(), которая и вернет путь до открытого файла. Для того чтобы начать отлаживать наш плагин нужно сделать привязку к какой-нибудь горячей клавише. Для этого откроем в меню Preferences->Key Bindings — User и напишем там бинд комманды backup например к клавише F7:

[
	 { "keys": ["f7"], "command": "backup" }
]


Теперь приводим наш плагин к виду:

import sublime, sublime_plugin

class BuckupCommand(sublime_plugin.TextCommand):
	def run(self, edit):
		print sublime.active_window().active_view().file_name()


Сохраняем файл, открываем консоль Python (ctrl+`) и жмем F7. В консоль выведется полный путь до файла.

Единственное что еще нам нужно узнать из API — это вывод сообщений в строку статуса. Заглядываем в документацию и видим функцию

sublime.status_message('')


Дальнейшие действия уже не требует разбирательств с API и я выкладываю полный код плагина:

# -*- coding: utf-8 -*-
import sublime, sublime_plugin
import os, time, shutil, sys
# Без этой строчки будем иметь проблему с выводом кириллицы и ловить UnicodeDecodeError
sys.setdefaultencoding('utf-8')
# Пока не заморачивался с файлами настройки, поэтому путь до папки бэкапа указывается здесь
backup_dir = "/home/deadlink/backup/"
class BackupCommand(sublime_plugin.TextCommand):
 
    def run(self, edit):        
        self.create(sublime.active_window().active_view().file_name())

    def create(self, filename):
    	# Получаем текущее время
        now = time.localtime()
        # Формируем префикс вида ЧАС_МИНУТА_СЕКУНДА_
        prefix = str(now.tm_hour)+"_"+str(now.tm_min)+"_"+str(now.tm_sec)+"_"
        # Имя папки для сегодняшних бэкапов вида ГОД_МЕСЯЦ_ДЕНЬ
        stamp = str(now.tm_year)+"_"+str(now.tm_mon)+"_"+str(now .tm_mday)
        # Формируем путь вида /путь до папки бэкапов/текущая дата/полынй путь до папки с файлом/
        full_path = backup_dir+stamp+os.path.dirname(filename)
        # Проверяем, может такая директория уже есть
        if not os.path.isdir(full_path):
            os.makedirs(full_path) # если нет, создаем дерево директорий
        # Коипруем туда файл с префиксом
        shutil.copyfile(filename, full_path+"/"+prefix+os.path.basename(filename))
        # Сообщаем себе о том что все прошло успешно
        sublime.status_message("Резервная копия файла " + filename + " успешно создана!")


Теперь создаем директорию, например ~/backup/, прописываем полный путь в плагине, далее открывем SideBar (меню View->SideBar->show). Теперь выбираем File->OpenFolder и открываем нашу папку backup. Теперь у нас всегда слева открыта папка с бэкапами. Нажимаем в любой момент времени F7 и видим как слева появляются бэкапы. Вот как оно выглядит у меня:

image


Плагин Diff

Делаем заготовку нового плагина с именем Diff, аналогично тому, как мы это делали при написании плагина Backup. Логика работы плагина должна быть такая:
  • Получаем путь до файла в активной вкладке;
  • Проверяем есть ли у нас вкладка правее текущей;
  • Получаем имя файла из второй вкладки;
  • Запускаем meld и передаем ему имена двух файлов;

Давайте разберемся как получить объект view, следующий после активного. У нас есть массив всех вкладок активного окна, это:

sublime.active_window().views()


В массиве вкладки упорядочены в том порядке, как мы их видим в редакторе. У каждого view есть свой уникальный id. Тогда для получения вкладки, следующей за активной нам нужно найти номер активного view и взять следующий по номеру. У меня получился такой код:

# -*- coding: utf-8 -*-
import sublime, sublime_plugin
import subprocess

class DiffCommand(sublime_plugin.TextCommand):
	def run(self, edit):
		cur = num = 0
		# Получим массив всех view
		views = sublime.active_window().views()
		# Пройдемся по всем view в поисках активного, сравнивая по id
		for view in views:
			if view.id() == sublime.active_window().active_view().id():
				# Если id совпало, то запомним номер активного view
				cur = num
			num += 1
		# Проверим не является ли активный view последним
		if num-1 != cur:
			# Запустим программу meld с параметрами
			subprocess.Popen([
				'meld', 
				views[cur].file_name(), 
				views[cur+1].file_name()
			]) 


Для работы этого плагина нужно иметь установленную программу meld. Если Вы используете Ubuntu, то ее можно установить выполнив комманду:

	sudo apt-get install meld


Далее нам нужно привязать действие diff к какой-либо горячей клавише. Для этого откроем в меню Preferences->Key Bindings — User и напишем там бинд комманды например к клавише F2:

[
	 { "keys": ["f7"], "command": "backup" },
	 { "keys": ["f2"], "command": "diff" }
]


Открываем два файла, переходим в первый открытый файл и нажимаем F2. Открывается программа meld, в которой сравниваются два открытых файлика. Превосходно!

Список открытых файлов

Я не буду описывать поэтапно создание этого плагина. Принцип работы, думаю, легко понять из кода:

import sublime, sublime_plugin

class OpenedFilesCommand(sublime_plugin.TextCommand):
	def run(self, edit):
		# Получаем массив всех view
		views = sublime.active_window().views()
		files = ""
		# Записываем имя файла из каждого view в переменную files
		for view in views:
			files += view.file_name()+"\n"
		# Создаем новый файл 
		sublime.active_window().new_file()
		# Пишем в новый файл список файлов
		sublime.active_window().active_view().insert(edit, 0, files)



Не забудьте только привязать его к нажатию горячей клавиши, например ctrl+shift+f:

[
	 { "keys": ["f7"], "command": "backup" },
	 { "keys": ["f2"], "command": "diff" },
	 { "keys": ["ctrl+shift+f"], "command": "opened_files" }
]


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

Заключение


В данной статье я хотел показать то, насколько гибко можно настроить и расширить редактор Sublime Text 2. Надеюсь после прочтения у Вас тоже появится интерес и желание сделать что-то свое, ведь это так просто.
Я не силен в программировании на Python, поэтому могу ошибаться в терминах, типа массив это или список. Возможно, что-то можно было сделать проще или иначе.
Share post

Comments 189

    +63
    Вроде бы поставить Git или Mercurial гораздо проще, чем писать свои велосипеды плагины.
      +2
      Вы правы и я сам пользуюсь svn и git когда это возможно. Но есть случаи, для которых оно не то чтобы невозможно, а просто не целесообразно. Например попросили меня срочно поправить по ftp файлик. Ну или когда я писал этот топик, я тоже делал бакапы =)
      А вообще, цель статьи не дать готовый инструмент, а показать как этот инструмент можно сделать самому. На примере своих потребностей.
        +11
        ИМХО все таки git init. в локальной папке — git commit -am 'Backup' — удобнее и даже не важно, что у НИХ git не прижился.
          0
          Я, кстати, предпочитаю оставлять бэкапы на гитхабе, после того, как у них вышел собственный клиент под винду ;)
            –2
            гитхаб дорогой.
              +6
              Информация значительно дороже.
                0
                но гитхаб же не единственное решение, зачем платить больше. Сила гитхаба — это социализация: обсуждение кода, комментарии, свои форки. Если это нужно — тогда да. Но мне не разу этого не нужно было в коммерческих продуктах, только в OpenSource.
                Поэтому, лично я, пользуюсь гитхабом для открытых проектов: когда либо форкаю чей-то проект, либо выкладываю свое.
                Все приватные проекты храню на repositoryhosting.com Проблем за несколько лет не наблюдалось.
                  0
                  6$ за два гигабайта? Это как-то дороговато.
                    0
                    ну смотря как считать. У меня сейчас там лежит около 30-ти проектов, которые занимают один гиг. Каждый дополнительный гиг стоит $1. На гитхабе для хранения такого количества репозиториев мне пришлось бы покупать Gold аккаунт за 100 долларов в месяц. За эти деньги я бы мог на RH докупить еще 84 гига. Помоему более чем достаточно.
                    В любом случае гитхаб получается достаточно дорогим.
                    А что это у вас за проекты такие, что они так много места занимают?
                      0
                      Да они немного места занимают ;) Пока.
                      Просто есть мысль взять папки Documents, Work, Archive и т.д. и сделать из них бэкап одним репозиторием.
                        0
                        Ну такие бэкапы не обязательно держать в облаке. Я для таких бэкапов пользуюсь машиной времени на внешний Thunderbolt Raid диск, все происходит в фоне и можно покапаться в разных версиях документов. Плюс инфрмация дублируется автоматически на двух дисках: если один полетит — на втором останется.
                        Но это под маком, уверен под виндой и линуксом есть подобные решения.
                          0
                          Dropbox вам в помощь.
                            0
                            Дропбокс разве умеет сохранять историю изменений?
                            • UFO just landed and posted this here
                                0
                                А если за деньги — так вообще бесконечную.
                              0
                              Посмотрите в сторону, например, CrashPlan, тем более что для локальных бэкапов может хватить и бесплатной версии, а за $50 в год получаешь unlimited пространство для бэкапов. Версионность тоже поддерживается.

                              Сам пользуюсь уже несколько месяцев, весьма доволен, сделал полный бэкап в их облако + дополнительный бэкап самых нужных файлов на внешний винт, хоть один из бэкапов должен выжить :)
                      +8
                      Не одним гитхабом, есть же совсем бесплатный и безлимитный BitBucket: bitbucket.org/plans/
                        0
                        это пока нужно меньше 5-ти пользователей, а так как я отдаю доступ к репозиторию заказчику, то этот лимит быстро уходит.
                        Как только уходит лимит в 5 пользователей — BitBucket становится дороже RH. Но это конечно у каждого свои требования.
                        +1
                        BitBucket даёт неограниченное количество репозиториев, дискового пространства, и умеет работать с git.
                          0
                          да, но ограничивает на количестве пользователей и при превышении этого лимита (5 пользователей) становится дороже RH.
                            0
                            Ogra в своём комментарии писал:
                            бэкапы на гитхабе
                            Относительно бэкапов через vcs, BitBucket подходит лучше, чем GitHub.
                        0
                        Официальный git под винду тоже весьма не плох был, еще до выхода Github for Windows.
                    0
                    Расскажите, а как отправить на печать текст из этого редактора?
                      +1
                      Как получить имя файла я показал, осталось скормит его утилите печати, например lp
                      • UFO just landed and posted this here
                          0
                          Спасибо!
                          0
                          Бекап на бумаге? Олдскул )
                          0
                          не появилось ли бесплатного плагина для работы по фтп или сфтп?
                            0
                            FTPSync.
                              0
                              Бесплатного не появилось, но платный плагин не создает особых проблем.
                                0
                                Да, сильно не хватает плагина как в Notepad++
                                  0
                                  Некое время мне нужен был плагин NppExport для копирования текста со стилями (copy RTF to clipboard). Вот его действительно тогда очень не хватало.
                                    0
                                    Для этого есть плагин Highlight. Экспортирует в HTML и RTF.
                                      0
                                      Попробовал поставить под вин 7, к сожалению у меня этот плагин не заработал. Выделяю текст, пытаюсь сконвертить, скопировать или просто просмотреть как RTF – ничего не происходит.
                                        0
                                        У меня под win7 отлично всё работает. Может с кем-то конфликтует.
                                        0
                                        А можете кинуться ссылкой, а то не могу найти?.. Спасибо.
                                0
                                Обычный способ с монтированием томов самый простой.
                                В Nautilus, Файл->Подключиться к серверу, выбираете «cохранить пароль».
                                Слева в окне наутилуса в колонке снизу появится примонтированная удаленная папка, щёлкаете правой кнопкой 'добавить закладку', чтобы удобней было подключаться, и ваш сервер доступен легко из любой программы как локальная папка.
                                А в Sublime можно просто перетащить папку в «OPEN FILES».
                                –2
                                Может, не совсем в тему, но что у него с русскими комментариями и синтаксисом PowerShell?
                                  +11
                                  С русскими комментариями ОК у него всё. Пишите их в UTF-8.
                                    –34
                                    Я буду писать их в том виде в котором мне удобно, не всегда можно использовать UTF8.

                                    Здесь, после конвертации, оно открылось как надо, но что делать с кучей уже написанного кода?
                                      +3
                                      File > Reopen with Encoding, и выбираем нужную кодировку.
                                        +1
                                        File → Reopen with Encoding
                                          –18
                                          Друзья, во первых нужно, дабы оно само открывало по умолчанию. Во вторых уже решено правкой конфига.
                                            +4
                                            fallback_encoding в конфиге
                                          +14
                                          Пишите как угодно, мне-то что.
                                        +1
                                        С русским у меня все хорошо. В меню есть пункт Reopen with encoding…
                                          –7
                                          А само оно не умеет?

                                          с Notepad++, с которого я и пытаюсь слезть, с этим проблем нет.
                                            +6
                                            Само оно вроде по умолчанию работает с UTF-8. Ну а для меня это кодировка по умолчанию во всех проектах, поэтому проблем почти не возникает.
                                              0
                                              Умеет, ответил ниже.
                                            +8
                                            Добавьте в пользовательские настройки:

                                            	"fallback_encoding": "Cyrillic (Windows 1251)",
                                            
                                              –5
                                              Осталось с PowerShell разобраться )))
                                                0
                                                Надо добавить синтаксис, первый же результат Гугля по «powershell tmlanguage» (tmlanguage — используемый язык описания):
                                                code.google.com/p/sublime-text-community-packages/source/browse/trunk/PowerShell/
                                                  0
                                                  А далее идёт вот такой проектик на гитхабе:
                                                  github.com/SublimeText/PowerShell

                                                  Я ничего из этого не пробовал, смотрите сам.
                                                    0
                                                    спасибо, я написал комментарий и полез разбираться…

                                                    Нашел путь интересней
                                                    wbond.net/sublime_packages/package_control/installation

                                                    Установил оттуда Powershell, но синтаксис там кривой, по крайней мере мои файлы не тянет:



                                                    Попробовал установку, описанную вами — результат тот-же… Пичаль…
                                                      0
                                                      Можно попробовать и самостоятельно синтаксис подтянут, там вполне разбираемый XML. Больше ничем помочь не могу.
                                                        +1
                                                        Мда, а вроде все хвалят…
                                                        После покупки доработать напильником :-(

                                                        Для истории и справедливости, тот же кусок в Notepad++

                                                        0
                                                        Гитхабовский вариант, вроде, должен получше обработать — там по крайней мере есть вариант «@'…'@». Попробуйте его. (А вариант из Пакадж Контроля удалите.)
                                                          0
                                                          Вот прямо сейчас удалил и (а что надо было сделать еще?) заново поставил (+рестарт сублайма) гитхабовский (качал кнопкой ZIP), результат тот же :-(
                                                            0
                                                            При этом, в пакете есть файл bin\test-file.ps1, там в строке 185-187 есть этот момент и тестовый файл работает… продуктивный нет…
                                                              0
                                                              А проблема в том, что у меня в строке с закрывающимся «тегом» '@ есть еще символы…

                                                              и как это пофиксить?
                                                                0
                                                                Похоже там переборщили в <string>^'@$</string> (Support/PowershellSyntax.tmLanguage), надо убрать как минимум доллар.
                                                                  0
                                                                  Не помогло, вообще без изменений…

                                                                  Строка 188…
                                                                    0
                                                                    При этом такойже баги для @" нету…
                                                                      0
                                                                      Пофиксил, предыдущие мои два коммента считать не действительными
                                                                        0
                                                                        Рад за вас.
                                                                      0
                                                                      Точно ничем не перебивается?
                                                                        0
                                                                        Я не там правил, правил в распакованном скачанном архиве, а не в своем профиле
                                                    –1
                                                    Добавил себе тоже ;)
                                                    Как всегда — комменты на хабре бывают полезнее статей ;)
                                                      0
                                                      Просто по умолчанию стоит "Western (Windows 1252)", я первым делом посмотрел настройки на подобные штуки.
                                                        0
                                                        Кстати, да стояло именно 1252
                                                      0
                                                      Зашёл сюда, чтобы спросить как это сделать! Спасибо огромное!
                                                      0
                                                      С комментариями это не у него, а у кодировки файла, по-видимому он не смог ее определить и открыл как UTF-8.
                                                        0
                                                        Нет, это именно Windows-1251 открытая как Windows-1252
                                                      –7
                                                      клон vim'а?
                                                        +1
                                                        Я бы сказал последователь
                                                          0
                                                          У него кстате есть vintage mode, думаю vim'овцам должно понравиться.
                                                            0
                                                            ага. попробовать, поплеваться, снести нафик.

                                                            какой прикол vintage mode без normal режима)
                                                            +2
                                                            Каким боком он клон вима?
                                                            +4
                                                            слово «бАкап» очень режет глаза.

                                                            backup ['bækʌp] — бэк-ап.
                                                            buck up — [бак' ап] — встряхивать.

                                                            iPad — не «айПад», а «айПэд».

                                                            Mom, please!
                                                              +1
                                                              Поправил =)
                                                                –3
                                                                Да никто не говорит «бэкап» и «айпэд», кроме хипстеров.
                                                                  +11
                                                                  )) А я говорю бэкап и айпад. Я полухипстер?
                                                                    0
                                                                    Зато «все» говорят «Хундай» и «пэ-хэ-пэ» и что в этом хорошего?
                                                                    Лучше сразу правильно говорить. И хипстеры тут не причем…
                                                                      0
                                                                      А ещё «Нью-Йорк» и «Мексика», ну и что?
                                                                        0
                                                                        Это не то, вы бы еще Ганновер или шлакбаум вспомнили…
                                                                          0
                                                                          В чём разница-то?
                                                                    +5
                                                                    æ гораздо ближе к «а», а не к «э». А buck up транслитерировать ещё можно как «бук ап», особенно если учесть кучу акцентов, в которых оно именно так и произносится. Другое дело, что «бекап» уже устоялось. А вот «iPad» — только «айпад», и никак иначе!
                                                                      +1
                                                                      Не забудьте ещё добавить, что: symmetry ['sɪmətrɪ] — «симметри», а не «симметрия». У нас такое количество слов заимствовано… Вы их все предлагаете на английский манер произносить?
                                                                        +1
                                                                        Симметрия — гораздо ближе к оригинальному "συμμετρία", нежели уродское symmetry ['sɪmətrɪ].
                                                                          0
                                                                          согласен, это греческое.

                                                                          Вот пример заимствования из английского:

                                                                          trolleybus ['trɔlɪbʌs] — троллейбус, а не тролибас
                                                                      +4
                                                                      По ходу пора Хаб соответствующий открывать. Всё больше появляется статей о ST2. Хотелось бы их все в одном месте видеть.
                                                                        0
                                                                        Упрощаем себе жизнь с помощью git/svn
                                                                          0
                                                                          Так и не смог им пользоваться: на больших проектах автокомплит и навигация работают их рук вон плохо, даже с плугинами для всяких *tag. А как colorer для сырцов и фар нормально работает.
                                                                            0
                                                                            У кого есть какие пожелание и идеи на счет плагина под ST2? Хочу что-то написать полезное, но все мои потребности вроде покрыли уже существующие плагины.

                                                                            Надо бы сделать какой-то wish список, где пользователи могли бы описывать то, что им не хватает в редакторе и что можно реально сделать с помощь plugin API.
                                                                              +3
                                                                              Неплохо было бы иметь нормальный ftp клиент. С выводом дерева в сайдбаре. Могу посадействовать, т.к. этого не хватает
                                                                                –1
                                                                                Это не линукс-вэй. Не создавая в каждой программе отдельное соединение, можно так: habrahabr.ru/post/148842/#comment_5027707
                                                                                  +1
                                                                                  Поделись, как вылечить то, что при монтировании через fuse соединение разрывается при простое в несколько минут? Это единственная причина, по которой приходится пользоваться сторонними клиентами.
                                                                                    0
                                                                                    Аналогичная проблема. Крайне нестабильная работа. Плюс ко всему иногда бывают зависания соединения, которые лечатся только перезагрузкой.
                                                                                      0
                                                                                      если подключаетесь через sftp, то попробуйте добавить строчку:
                                                                                      ServerAliveInterval 10
                                                                                      в /etc/ssh/ssh_config
                                                                                0
                                                                                habrahabr.ru/post/148324/#comment_5006143 вот моя главная хотелка)
                                                                                  0
                                                                                  Вам вроде ответили в том посте. Чем вам не подходит ColorPicker?
                                                                                    0
                                                                                    Разная суть, ColorPicker подбирает цвета, то о чём я говорю — это блок с уже использованными цветами, которые постоянно видно.
                                                                                      0
                                                                                      Понял. То есть это использованные цвета именно в этом css файле, так?
                                                                                      Можно просто дописать функционал ColorPicker и сделать отдельный таб «Top colors».
                                                                                        0
                                                                                        Да! Вы всё правильно поняли. Буду очень вам благодарен, если реализуете!
                                                                                          0
                                                                                          Ах да, ещё одна хотелка есть! Форматирование сыы, а-ля Aligment для html, чтобы из

                                                                                          .div {width: 50px; height: 50px;}
                                                                                          


                                                                                          получалось

                                                                                          .div {
                                                                                          width: 50px; 
                                                                                          height: 50px;
                                                                                          }
                                                                                          
                                                                                            +1
                                                                                            Попробуй CSStidy
                                                                                    0
                                                                                    Напишите, пожалуйста, плагин, который решит эту задачу.
                                                                                      0
                                                                                      Очень не хватает бандлов для phpdoc и, к сожалению, времени попробовать сделать самому. Было бы очень полезно. То что есть сейчас только рисует пустой комментарий без автокомплита по @. Хочется такой автокомплит, который будет работать внутри комментария в коде (@author, @param и т.д.) и иметь полный список тегов.

                                                                                      Вторая идея — выводить статус репозитория в проводнике. Т.е. делать svn status и раскрашивать имена папок в нужный цвет (иконки не нужны, только минималистичность, только хардкор).

                                                                                      Еще были какие-то идеи, если вспомню напишу.
                                                                                      0
                                                                                      Хочу посоветовать прекрасный инструмент для сравнения — Beyond Compare.
                                                                                      Аналогов по удобству и мощи я еще не встречал.

                                                                                        0
                                                                                        Спасибо, попробую
                                                                                          +2
                                                                                          30$ за сравнивалку файлов? meld мой выбор.
                                                                                            +1
                                                                                            Смешно, ведь статья про текстовый редактор ценой в 59$
                                                                                          0
                                                                                          Мне и WinMerge хватает — неплохая опенсурсная утилита.
                                                                                            +1
                                                                                            # -*- coding: utf-8 -*-
                                                                                            import sublime, sublime_plugin
                                                                                            import subprocess
                                                                                            
                                                                                            class DiffCommand(sublime_plugin.TextCommand):
                                                                                                def run(self, edit):
                                                                                                    cur = num = 0
                                                                                                    views = sublime.active_window().views()
                                                                                                    for view in views:
                                                                                                        if view.id() == sublime.active_window().active_view().id():
                                                                                                            cur = num
                                                                                                        num += 1
                                                                                                    if num-1 != cur:
                                                                                                        subprocess.Popen([
                                                                                                            'C:\Program Files (x86)\WinMerge\WinMergeU.exe', 
                                                                                                            views[cur].file_name(), 
                                                                                                            views[cur+1].file_name()
                                                                                                        ]) 
                                                                                            
                                                                                              0
                                                                                              Ну каждому свое, вот обсуждение на StackOverflow
                                                                                              0
                                                                                              Фигня. Meld лучше.
                                                                                                +1
                                                                                                Фигня ваше высказывание без доказательств.

                                                                                                И что-то я не нахожу Meld под Windows, только какие-то извращения?
                                                                                                  0
                                                                                                  Ну причём здесь доказательства. Вы попользуйте его немножко, и поймёте, что это офигенная вещь. Для начала скриншоты гляньте. А насчёт Windows — видимо, просто покамест не было кому его нормально запакетировать под винды. Займитесь, может? :)
                                                                                                    0
                                                                                                    >>Ну причём здесь доказательства.

                                                                                                    А при том, что так выражаться как минимум некультурно.

                                                                                                    Если Вы считаете, что Meld лучше, то пишите что это Ваше личное мнение:
                                                                                                    «Я считаю что Meld лучше», или «Из того, что я пробовал мне больше понравился Meld»

                                                                                                    Если Вы считаете, что Meld объективно лучше, то тут уже требуются доказательства.

                                                                                                    Вот к примеру список того, чем Beyound Compare лучше:

                                                                                                    * Windows support. I'm sure you can get Meld working on Windows, but I doubt it's easy, and our chief free Windows competitor, WinMerge, doesn't support Linux.
                                                                                                    * Dedicated output panel for merges. Meld uses the merge-to-center approach, which we don't think is as intuitive as ours. WinMerge doesn't support 3-way comparisons at all.
                                                                                                    * Our comparison algorithm can match up similar lines. Pretty much everyone else uses the same algorithm that GNU diff does, which can only do equals/not equals comparisons between lines. You can strip whitespace, or ignore case or a particular regular expression, but that's it. BC actually computes similarity scores for lines, so ones that have had non-trivial changes (renames, added parameters, etc) can be lined up correctly.
                                                                                                    * Saved sessions that you can setup and use later. Workspaces containing multiple sessions.
                                                                                                    FTP, SFTP, FTP over SSL, including support for multiple simultaneous connections. I know numerous people who use BC as their primary FTP client. Meld may support something like this through Gnome's VFS layer, but it wasn't obvious to me.
                                                                                                    * Zip, Tar, GZip, Cab, Rar, 7-zip archives and BCSS snapshots. I don't know of any competitor that has archives files as well integrated as BC does.
                                                                                                    * Data compare (grid) for CSV and tab delimited files.
                                                                                                    * Hex compare for arbitrary binary files.
                                                                                                    * Image compare for most major image formats.
                                                                                                    * Replacements in text compare.
                                                                                                    * Manual align/isolate in text compare.
                                                                                                    * Alignment overrides (replacements) in folder compare.
                                                                                                    * Source control integration (Windows only). Adds check-in/check-out/undo checkout support directly to the file and folder viewers. Supports any version control system that integrates into Visual Studio (pretty much all of them). Meld's version control integration is different and won't support as many Windows vcs's.
                                                                                                    * Syntax highlighting, and file formats that define importance. A lot of competitors just have a single list of regular expressions that you ignore for all file types, without being able to have different ones for C++ files vs. HTML files.
                                                                                                    * Printed/html/plain text differences reports.
                                                                                                    * Command line scripting.
                                                                                                    * Directory comparison supports excluding files based on their names, paths, sizes, last modified times, attributes, and source control status. This combined with sessions is especially powerful.
                                                                                                    * Dedicated sync interface with mirror and update commands.
                                                                                                    * Directory compare includes Copy/Move/Delete/Rename/Touch/SetAttributes. Meld, at least, doesn't have much for manipulating directory compares.
                                                                                                    * Compares binary DFMs as text (only applicable for Delphi programmers).
                                                                                                    * Dedicated support staff available via email, phone, and forums.

                                                                                                    www.scootersoftware.com/vbulletin/showthread.php?t=4776
                                                                                                      –1
                                                                                                      Одно это:
                                                                                                      * Dedicated output panel for merges. Meld uses the merge-to-center approach, which we don't think is as intuitive as ours. WinMerge doesn't support 3-way comparisons at all.

                                                                                                      разом перечёркивает все те преимущества (многие из которых достаточно спорные, а некоторые просто не имеют места) BC, про которые авторы написали.
                                                                                                      0
                                                                                                      Мне не нужен спор о том, какой инструмент «Лучший», каждый выбирает лучший инструмент для себя.
                                                                                                      0
                                                                                                      Под виндовс есть CodeCompare — самое приятное из того что я видел.
                                                                                                      0
                                                                                                      Мне нравится meld, использую его в работе. вот только нехватает фичи типа split diff, как в git add -p. было бы удобно разбить большую разницу на две маленьких, чтобы половину перенести, а половину оставить, например.
                                                                                                        0
                                                                                                        Или слить 10 разниц в одну, пусть даже у них есть одинаковые строки. Эх, мечты, мечты.
                                                                                                          0
                                                                                                          Split diff я делаю в hg crecord/qcrecord/qcrefresh. Ну не все ханки перебрасываю. В общем, с hg mq средств meldа становится более, чем достаточно.
                                                                                                            +1
                                                                                                            вообще если привыкнуть к hg mq, то без них становится совсем тяжко.
                                                                                                            но тем кто с ним хоть какое-то время не работал, объяснить что это самый удобный инструмент на свете — хрен там!
                                                                                                      +1
                                                                                                      Вчера появилась потребность чистить код от trailing spaces. Из коробки sublime умеет их чистить при сохранении, а нужно было по запросу.
                                                                                                      Вот такой плагинчик получился:

                                                                                                      import sublime, sublime_plugin
                                                                                                      
                                                                                                      class TrailingSpacesCleanerCommand(sublime_plugin.TextCommand):
                                                                                                      	def run(self, edit):
                                                                                                      		ws = self.view.find_all("[\t ]+$")
                                                                                                      		ws.reverse()
                                                                                                      		for r in ws:
                                                                                                      			self.view.erase(edit, r)
                                                                                                      
                                                                                                      
                                                                                                        0
                                                                                                        Прикинул, что скорее всего это уже реализовано и юзается при
                                                                                                        "trim_trailing_white_space_on_save": true


                                                                                                        Так и есть. Нашел в Sublime Text 2/Packages/Default/trim_trailing_white_space.py

                                                                                                        class TrimTrailingWhiteSpace(sublime_plugin.EventListener):
                                                                                                            def on_pre_save(self, view):
                                                                                                                if view.settings().get("trim_trailing_white_space_on_save") == True:
                                                                                                                    trailing_white_space = view.find_all("[\t ]+$")
                                                                                                                    trailing_white_space.reverse()
                                                                                                                    edit = view.begin_edit()
                                                                                                                    for r in trailing_white_space:
                                                                                                                        view.erase(edit, r)
                                                                                                                    view.end_edit(edit)
                                                                                                          0
                                                                                                          Я выше написал что оно есть. Но мне это не нужно для всех типов файлов. Я хотел по запросу.
                                                                                                            0
                                                                                                            Я понимаю, но зачем велосипедить? Просто используйте уже созданное. DRY
                                                                                                              0
                                                                                                              Я не велосипедил, я взял этот самый исходник и переделал в плагин, который можно вызывать не по событию сохранения файла, а по нажатию хоткея
                                                                                                                0
                                                                                                                А, понял. Сорри. Там все от EventListener идет. Ок.
                                                                                                                Просто на первый взгляд показалось, что можно как-то использовать уже существующий плагин. Моя ошибка.
                                                                                                          0
                                                                                                          Сможете сделать то же самое, только не по запросу, а когда каретка переставляется в другую строку?

                                                                                                          Т.е. вставляем текст или код, в конце которого есть пробел, ставим каретку в любую другую строку — пробелы в конце строк автоматически удаляются.

                                                                                                          Такая функция есть в редакторе Rapid PHP, очень удобно было. Сейчас ее не хватает в Саблайме.
                                                                                                            0
                                                                                                            Есть событие onSelectionModified, но если повесить на него, тогда пробелы в конце строк будут убираться когда просто текст выделяешь.
                                                                                                              0
                                                                                                              Т.е. при переставлении каретки никак не сделать?
                                                                                                                0
                                                                                                                Вот так сразу не приходит идеи реализации
                                                                                                                  0
                                                                                                                  Вас не затруднит написать пример с событием onSelectionModified?
                                                                                                                    0
                                                                                                                    Какой пример нужен? Обработчик события делаем так:
                                                                                                                    import sublime, sublime_plugin
                                                                                                                    
                                                                                                                    class ExampleOnSelectionModified(sublime_plugin.EventListener):
                                                                                                                    	def on_selection_modified(self, view):
                                                                                                                    		pass
                                                                                                                    

                                                                                                                    А дальше все как обычно
                                                                                                                      +1
                                                                                                                      Пришла идея реализации вашей хотелки. Чистит строку от пробелов, если переставить каретку на другую строку. Если вставлен фрагмент кода, то тоже чистит его весь.

                                                                                                                      # -*- coding: utf-8 -*-
                                                                                                                      import sublime, sublime_plugin
                                                                                                                      
                                                                                                                      class ExampleOnSelectionModified(sublime_plugin.EventListener):
                                                                                                                      	was_selected = False
                                                                                                                      	selection = [0,0]
                                                                                                                      	last_selection = [0,0]
                                                                                                                      	last_line = 0
                                                                                                                      	def on_selection_modified(self, view):
                                                                                                                      		self.selection = [view.sel()[0].begin(), view.sel()[0].end()]
                                                                                                                      		size = abs(self.selection[0] - self.selection[1])
                                                                                                                      		is_selected = size != 0
                                                                                                                      
                                                                                                                      		# Если сейчас нет выделенного фрагмента, а до этого был - чистим его
                                                                                                                      		if not is_selected and self.was_selected:
                                                                                                                      		 	trailing_white_space = view.find_all("[\t ]+$")
                                                                                                                      		 	trailing_white_space.reverse()
                                                                                                                      		 	edit = view.begin_edit()
                                                                                                                      		 	for r in trailing_white_space:
                                                                                                                      		 		if r.begin() >= self.last_selection[0] and r.end() <= self.last_selection[1]:
                                                                                                                      		 			view.erase(edit, r)
                                                                                                                      		 	view.end_edit(edit)
                                                                                                                      
                                                                                                                      		# Если текст не выделен
                                                                                                                      		elif not is_selected:
                                                                                                                      			last_line = view.line(sublime.Region(self.last_selection[0], self.last_selection[1]))
                                                                                                                      			line = view.line(sublime.Region(self.selection[0], self.selection[1]))
                                                                                                                      			# Проверим переместили ли каретку на другую строку
                                                                                                                      			if last_line != line:
                                                                                                                      				edit = view.begin_edit()
                                                                                                                      				r = view.find("[\t ]+$", last_line.begin())
                                                                                                                      				# Если нашли пробелы, то убираем
                                                                                                                      				if r:
                                                                                                                      					view.erase(edit, r)
                                                                                                                      				view.end_edit(edit)
                                                                                                                      		self.was_selected = is_selected
                                                                                                                      		self.last_selection = self.selection
                                                                                                                      
                                                                                                                        0
                                                                                                                        Обалденно! Огромное вам спасибо! То, что нужно =)
                                                                                                                          0
                                                                                                                          А с этим сможете справиться?
                                                                                                                          0
                                                                                                                          Эх. Обнаружился неприятный момент. Перестают работать умные отступы, когда нажимаешь Enter в конце строки.

                                                                                                                          Т.е. должно быть так:

                                                                                                                          image

                                                                                                                          а с плагином получается вот так:

                                                                                                                          image
                                                                                                                            0
                                                                                                                            Это можно решить, например проверив есть ли в строке что-то кроме отступов и если нет, то не чистить. Позже выложу исправленную версию
                                                                                                                              +1
                                                                                                                              Исправил эту проблему и немного улучшил код

                                                                                                                              # -*- coding: utf-8 -*-
                                                                                                                              import sublime, sublime_plugin
                                                                                                                              
                                                                                                                              class TrimTrailingWhiteSpaceOnNewLine(sublime_plugin.EventListener):
                                                                                                                                  was_selected = False
                                                                                                                                  selection = [0,0]
                                                                                                                                  last_selection = [0,0]
                                                                                                                                  def on_selection_modified(self, view):
                                                                                                                                      if view.settings().get("trim_trailing_white_space_on_new_line") == True:
                                                                                                                                          self.selection = [view.sel()[0].begin(), view.sel()[0].end()]
                                                                                                                                          is_selected = not view.sel()[0].empty()
                                                                                                                                          edit = view.begin_edit()
                                                                                                                                          # Если сейчас нет выделенного фрагмента, а до этого был - чистим его
                                                                                                                                          if not is_selected and self.was_selected:
                                                                                                                                              trailing_white_space = view.find_all("[\t ]+$")
                                                                                                                                              trailing_white_space.reverse()
                                                                                                                                              for r in trailing_white_space:
                                                                                                                                                  if r.begin() >= self.last_selection[0] and r.end() <= self.last_selection[1]:
                                                                                                                                                      view.erase(edit, r)
                                                                                                                                          # Если текст не выделен
                                                                                                                                          elif not is_selected:
                                                                                                                                              last_line = view.line(sublime.Region(self.last_selection[0], self.last_selection[1]))
                                                                                                                                              line = view.line(sublime.Region(self.selection[0], self.selection[1]))
                                                                                                                                              # Проверим переместили ли каретку на другую строку
                                                                                                                                              if last_line != line:
                                                                                                                                                  r = view.find("[\t ]+$", last_line.begin())
                                                                                                                                                  if r != None and r.end() < line.begin():
                                                                                                                                                      view.erase(edit, r)
                                                                                                                                          view.end_edit(edit)
                                                                                                                                          self.was_selected = is_selected
                                                                                                                                          self.last_selection = self.selection
                                                                                                                              

                                                                                                                              Для активации плагина нужно в Preferences User добавить:

                                                                                                                              "trim_trailing_white_space_on_new_line": true
                                                                                                                              
                                                                                                                                0
                                                                                                                                Замечательно, работает. Еще раз большое спасибо!

                                                                                                                                Пользуясь случаем, понаглею еще немного — с этим сможете справиться?
                                                                                                                                  0
                                                                                                                                  Не обещаю, но думаю что можно. Попробую на досуге
                                                                                                                                    0
                                                                                                                                    Попробовал реализовать, но столкнулся с такой проблемой: каретка возвращется на строку только полсле потери фокуса. Причем номер строки подсвечивается правильно, а каретка остается на месте. Попробую dev сборку, может они там это поправили.
                                                                                                                                    Жаль нельзя свой обработчик на событие клика по номеру строки поставить. И управлять непосредственно кареткой нельзя. Чтобы переместить каретку нужно создавать новый region и добавлять его через view.sel().add
                                                                                                              0
                                                                                                              А можно ли его с помощью плагинов скрестить с отладчиком, например GDB?
                                                                                                              Тогда получилась бы полноценная среда для многих проектов.
                                                                                                                +1
                                                                                                                SublimeGDB — ставиться пакетным менеджером
                                                                                                                  0
                                                                                                                  Спасибо.
                                                                                                                  +4
                                                                                                                  … занимаюсь разработкой на php и работаю с множеством проектов одновременно. Так уж повелось, что система контроля версий у нас по множеству причин не прижилась...


                                                                                                                  омайнгадбл.
                                                                                                                  всегда косился криво на php-разработчиков… мдаааааааа…
                                                                                                                    0
                                                                                                                    Я не стану вам приводить те множество причин. Замечу, что для своих личных проектов я юзаю git. На работе на тех проектах, где возможно, svn. Не нужно коситься на разработчиков php — они тут не при чем. Проекты бывают разные и для редактирования десятка файлов раз в полгода контроль версий по сути и не нужен — достаточно бэкапов. Чтобы не быть голословным приведу в пример сайт на ModX. Зачем тут контроль версий? Код большей частью в БД, а для картинок оно и ни к чему.
                                                                                                                      0
                                                                                                                      затем что разработчики php тупо не видят всего того, что даёт система контроля версий) И отказываются видеть, глупо объясняя это тем что «такая мощь нам не нужна»
                                                                                                                        0
                                                                                                                        Не встречал таких, честно.
                                                                                                                          0
                                                                                                                          А если действительно не нужна? Я вот в hg (по необходимости git) использую только малую толику их возможностей, с которыми раньше справлялся десяток самописных скриптов (коммиты, ветки/форки, слияния). Стал использовать vcs только потому что это стандарт де-факто.
                                                                                                                      0
                                                                                                                      Статья так и не ответила на вопрос чем оно может облегчить жизнь после vim'а или emacs'а. После Eclipse или Geany — да, очевидно.
                                                                                                                        0
                                                                                                                        чем может облегчить мотоцикл жизнь по сравнению с машиной? :)
                                                                                                                          0
                                                                                                                          Скорее болид формулы-1 и спорткар. Понятно что у болидом куда как дольше учиться управлять, он не по всем дорогам поедет, да еще и настройки нужно настраивать какие-то, но то для чего он предназначен (скоростная езда) — он выполняет куда лучше и функциональней, чем спорткар. Впрочем, некоторым достаточно и спорткара, так что это не наезд, а скорее сравнение :)
                                                                                                                            0
                                                                                                                            Именно =) я пользую vim, но для некоторых вещей к примеру возня с SQL кодом я пользую саблайм.
                                                                                                                          0
                                                                                                                          А такой вопрос и не ставился) Я отношусь к той группе людей, которая не осилила emacs и vim. Остновимся на этом :)
                                                                                                                            +1
                                                                                                                            Ну вот не очевидно, блин… Ох, не хочу устраивать споры с пеной у рта, но постараюсь спокойно обосновать…

                                                                                                                            У меня создаётся впечатление, что все пользователи vim/emacs (теперь и саблайм) попросту работают в небольших вебпроектах c 50-ю, ну в крайнем со 100-а html/js/python/ruby/php файлов, которые вероятно написаны ими, если не полностью, то на 60-70%… Что я этим хочу сказать? То, что в таком случае ориентироваться в таком коде не столь сложно, т.к. объемы небольшие, а знание своего кода хорошее. Тут как говорится не сильно много нужно и vim только во благо идёт…

                                                                                                                            Но когда у тебя ~12000 c++ файлов в проекте, то ты тратишь уйму времени без полноценных call hierarchy, inheritance tree, настоящего(!) контекстного(!!) suggestion + autocompletion, конечно же хорошего отладчика и настоящего рефакторинга… Ну пытался я в vim работать несколько месяцев — не смог… Просто не смог из-за объёма и сложности проекта… Тормознутый и всеми поливаемый грязью, Eclipse, выручает как никто другой в этой ораве кода при этом попутно проводя статический анализ кода. Заметьте, не java/python/php кода, а c++ кода, с которым мало кто хочет связываться в редакторах, ибо парсеры/валидаторы/анализаторы для него на диссертацию порой тянут. Как только вим/емакс/саблайм смогут облегчать работу с С++ кодом на таком уровне — я с удовольствием пересяду первый… А до этого момента не говорите мне vim — rules, eclipse — sux. На спорткаре вы поле не вспашете и уголь из карьера не вывезёте…
                                                                                                                              0
                                                                                                                              9K+ php файлов в проекте. Уйму времени не трачу (но проект знаю), все ок, использую vim и ctags. На 50-100 файлов как-то непохоже.
                                                                                                                                0
                                                                                                                                Мы пишем на Scala, Java — в команде 10 человек, только 3 пользуются Eclipse и IDEA. Никаких трудностей, поверьте. Исходники в с GutHub в zip-архиве — 2 гигабайта.
                                                                                                                                Sublime даже упрощает работу, так как легкий, и бегать, по такому количеству файлов совсем без трудностей.
                                                                                                                                  0
                                                                                                                                  Имхо. Если ты не можешь держать иерархию кода, над которым работаешь в голове — то кодить у тебя не получится. Более того я считаю, что память надо развивать. Если постоянно полагаться на помощь, то никогда ничего и не запомнишь. И печатать быстро не научишься.

                                                                                                                                  Я когда-то сидел на jedit. Потом переехал на vim, основным толчком стало, что при большом кол-ве серверов он становится слишком удобен. Потом в течении нескольких лет vim у меня постепенно обрастал возможностями и сейчас даст фору любому эклипсу. Но у меня основной упор не на супер-автокомлит, а на удобное и быстрое редактирование и навигацию по файлам.

                                                                                                                                  [mocksoul@XXХ ~/svn/trunk]$ svn info | grep Revision
                                                                                                                                  Revision: 849836
                                                                                                                                  
                                                                                                                                  [mocksoul@XXX ~/svn/trunk]$ find . -type f -name '*.cpp' | wc -l
                                                                                                                                     14005
                                                                                                                                  
                                                                                                                                  [mocksoul@XXX ~/svn/trunk]$ find . -type f -name '*.c' | wc -l
                                                                                                                                      5073
                                                                                                                                  
                                                                                                                                  [mocksoul@ХХХ ~/svn/trunk]$ find . -type f -name '*.py' | wc -l
                                                                                                                                     13871
                                                                                                                                  


                                                                                                                                  и ниче, живём =). Вижак на этом объёме требует каких-то чудовищных ресурсов для своей работы. Эклипс кушает 5-6 гб ОЗУ.

                                                                                                                                  Я конечно предположу что я умный, а вы тупой. Но т.к. в это не верю, поэтому и советую обратить внимание на опыт других людей.
                                                                                                                                    0
                                                                                                                                    У Вас сорцы убунты в свн? :D
                                                                                                                                      0
                                                                                                                                      Хотя не так уж и много… Я вполне справлялся, когда пользовался Geany. Навигация по коду и быстрое редактирование? А в линуксах с навигацией проблем нет. Консоль наше все. И что вы понимаете под быстрым редактированием? Я не верю что у вас в проекте все в одной куче огромной что там никак не соориентируешся) Мне порой и mcedit хватает.
                                                                                                                                      deadlink@deadlink-pc:~/dev/android/cyanogen_mod_racer$ find . -type f -name '*.c' | wc -l
                                                                                                                                      12701
                                                                                                                                      deadlink@deadlink-pc:~/dev/android/cyanogen_mod_racer$ find . -type f -name '*.cpp' | wc -l
                                                                                                                                      7477
                                                                                                                                      deadlink@deadlink-pc:~/dev/android/cyanogen_mod_racer$ find . -type f -name '*.java' | wc -l
                                                                                                                                      17146
                                                                                                                                      
                                                                                                                                        0
                                                                                                                                        grep, ack, vim, find, ctags — вот и вся навигация.
                                                                                                                                        0
                                                                                                                                        У нас тысячи разработчиков =)
                                                                                                                                          0
                                                                                                                                          А что за проект, если не секрет, если соизмеримо с сорцами Анройда?
                                                                                                                                            0
                                                                                                                                            один такой поисковик… )
                                                                                                                                            и это только та область, с которой работаю я, а не всё подряд.
                                                                                                                                  0
                                                                                                                                  А где проверка того что файл записался? :)
                                                                                                                                    0
                                                                                                                                    Да, редактор впечатляет. Подумываю перелезть с прикипевшего Fraise/Smultron'а.
                                                                                                                                    За материал — спасибо.
                                                                                                                                      –2
                                                                                                                                      В TextWrangler есть полезная штука Process lines containing..., а как то же сделать с помощью Sublime?
                                                                                                                                        0
                                                                                                                                        ссылку забыли
                                                                                                                                          0
                                                                                                                                          Подскажите, а есть ли плагин для перехода к к местам объявления функций/переменных наподобие того как сделано в visual studio?
                                                                                                                                            0
                                                                                                                                            Есть, называется CTags. Индексация файлов происходит вручную — через хоткей ctrl+t ctrl+r.
                                                                                                                                              0
                                                                                                                                              Не знаю как оно в Visual Studio, но мне хватает ctrl+p @ и ctrl+p #
                                                                                                                                              0
                                                                                                                                              >Так уж повелось, что система контроля версий у нас по множеству причин не прижилась

                                                                                                                                              Мазохисты?
                                                                                                                                              0
                                                                                                                                              А у кого-нибудь сей редактор не крашился внезапно? Пробовал на него переползти, да что-то пару раз он вылетел и я передумал…
                                                                                                                                              Может какие-то плагины виноваты…
                                                                                                                                                0
                                                                                                                                                Под какой ОС у тебя проблема? Если linux, то запусти из консоли и смотри вывод ошибок.
                                                                                                                                                0
                                                                                                                                                А кто-нибудь нашел как делать индексирование файлов в проекте на C++ и statement completion?
                                                                                                                                                  0
                                                                                                                                                  Нашелся SublimeClang который вроде как делает то что нужно.
                                                                                                                                                  0
                                                                                                                                                  Не подскажите, есть ли полноценный автокомплит (для шарпа)?
                                                                                                                                                    0
                                                                                                                                                    Уже нашел, но правда пока так себе плагин :/
                                                                                                                                                    0
                                                                                                                                                    А не подскажете как в python можно определить кодировку? Достаточно просто определить utf8 это или нет. Пробовал chardet — но для всех файлов он показывает просто ascii. Хочу плагинчик для себя написать, чтоб при открытии файлов в windows1251 сам открывал их в правильной кодировке. Бывает откроешь файлик, поправишь что нить и сохранишь. И все. Прощай вся кириллица. Не всегда обращаешь внимание на кодировку, особенно если файл большой, а кириллица где-то в конце.
                                                                                                                                                      0
                                                                                                                                                      Нашел способ определения uncode. Если учесть что кодировка либо utf8, либо win1251 то больше и не нужно. Но… Комманда reopen почему-то не отрабатывает =( В отладке вижу что определяет верно, но файл в нужной кодировке не открывает. Есть идеи?
                                                                                                                                                      # -*- coding: utf-8 -*-
                                                                                                                                                      import sublime, sublime_plugin
                                                                                                                                                      
                                                                                                                                                      class AutoEncoding(sublime_plugin.EventListener):
                                                                                                                                                      	def on_load(self, view):
                                                                                                                                                      		buf = view.substr(sublime.Region(0, view.size()))
                                                                                                                                                      		print view.file_name()
                                                                                                                                                      		try:
                                                                                                                                                      			unicode(buf)
                                                                                                                                                      		except Exception, e:
                                                                                                                                                      			print 'reopen'
                                                                                                                                                      			print view.run_command("reopen", {'encoding': 'Cyrillic (Windows 1251)'})
                                                                                                                                                      		else:
                                                                                                                                                      			print 'unicode'
                                                                                                                                                      
                                                                                                                                                        0
                                                                                                                                                        Вопросы снимаются)
                                                                                                                                                        Проблема решается так:
                                                                                                                                                        "fallback_encoding": "Cyrillic (Windows 1251)",
                                                                                                                                                        

                                                                                                                                                        Выше писали уже про fallback_encoding, но что-то я не понял для чего оно)

                                                                                                                                                    Only users with full accounts can post comments. Log in, please.