Команда textmate "comment" не работает должным образом для кода CSS - PullRequest
2 голосов
/ 06 февраля 2012

У меня возникают некоторые проблемы, когда я переключаю комментарии в TextMate для исходного кода CSS.

Использование ярлыка CMD + / Я активирую команду «Строка комментария / выбор» из пакета «источник».Проблема в том, что он вставляет серию // для всех типов языков.Например, в CSS-файлах предполагается вставить блок /**/, но это не так.В файлах CSS я также попробовал команду «Вставить комментарий к блоку» из исходного пакета со странным результатом, что вместо кода я получаю //.

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

, удаляя код и вставляя.

Я знаю, что должен изменить команду из пакета, но не могу понять, как и что.

Это код команды "Строка / Выбор комментария"из комплекта «Источник»:

#!/usr/bin/env ruby

# by James Edward Gray II <james (at) grayproductions.net>

# 
# To override the operation of this commond for your language add a Preferences
# bundle item that defines the following valiables as appropriate for your
# language:
# 
#   TM_COMMENT_START - the character string that starts comments, e.g. /*
#   TM_COMMENT_END   - the character string that ends comments (if appropriate),
#                      e.g. */
#   TM_COMMENT_MODE  - the type of comment to use - either 'line' or 'block'
# 

require "#{ENV["TM_SUPPORT_PATH"]}/lib/escape"

def out(*args)
  print( *args.map do |arg|
    escaped = e_sn(arg)
    $selected ? escaped.gsub("}", "\\}") : escaped.sub("\0", "${0}")
  end )
end

# find all available comment variables
var_suffixes = [""]
2.upto(1.0/0.0) do |n|
  if ENV.include? "TM_COMMENT_START_#{n}"
    var_suffixes << "_#{n}"
  else
    break
  end
end

text    = STDIN.read
default = nil  # the comment we will insert, if none are removed

# maintain selection
if text == ENV["TM_SELECTED_TEXT"]
  $selected = true
  print "${0:"
  at_exit { print "}" }
else
  $selected = false
end

# try a removal for each comment...
var_suffixes.each do |suffix|
  # build comment
  com = { :start     => ENV["TM_COMMENT_START#{suffix}"] || "# ",
          :end       => ENV["TM_COMMENT_END#{suffix}"]   || "",
          :mode      => ENV["TM_COMMENT_MODE#{suffix}"]  ||
                        (ENV["TM_COMMENT_END#{suffix}"] ? "block" : "line"),
          :no_indent => ENV["TM_COMMENT_DISABLE_INDENT#{suffix}"] }

  com[:esc_start], com[:esc_end] = [com[:start], com[:end]].map do |str|
    str.gsub(/[\\|()\[\].?*+{}^$]/, '\\\\\&').
        gsub(/\A\s+|\s+\z/, '(?:\&)?')
  end

  # save the first one as our insertion default
  default = com if default.nil?

  # try a removal
  case com[:mode]
  when "line"  # line by line comment
    if text !~ /\A[\t ]+\z/ &&
       text.send(text.respond_to?(:lines) ? :lines : :to_s).
            map { |l| !!(l =~ /\A\s*(#{com[:esc_start]}|$)/) }.uniq == [true]
      if $selected
        out text.gsub( /^(\s*)#{com[:esc_start]}(.*?)#{com[:esc_end]}(\s*)$/,
                       '\1\2\3' )
        exit
      else
        r = text.sub( /^(\s*)#{com[:esc_start]}(.*?)#{com[:esc_end]}(\s*)$/,
                      '\1\2\3' )
        i = ENV["TM_LINE_INDEX"].to_i
        i = i > text.index(/#{com[:esc_start]}/)            ?
            [[0, i - com[:start].length].max, r.length].min :
            [i, r.length].min
        r[i, 0] = "\0"
        out r
        exit
      end
    end
  when "block" # block comment
    regex = /\A(\s*)#{com[:esc_start]}(.*?)#{com[:esc_end]}(\s*)\z/m
    if text =~ regex
      if $selected
        out text.sub(regex, '\1\2\3')
        exit
      else
        r = text.sub(regex, '\1\2\3')
        i = ENV["TM_LINE_INDEX"].to_i
        i = i > text.index(/#{com[:esc_start]}/)            ?
            [[0, i - com[:start].length].max, r.length].min :
            [i, r.length].min
        r[i, 0] = "\0"
        out r
        exit
      end
    end
  end
end

# none of our removals worked, so preform an insert (minding indent setting)
text[ENV["TM_LINE_INDEX"].to_i, 0] = "\0" unless $selected or text.empty?
case default[:mode]
when "line"  # apply comment line by line
  if text.empty?
    out "#{default[:start]}\0#{default[:end]}"
  elsif default[:no_indent]
    out text.gsub(/^.*$/, "#{default[:start]}\\&#{default[:end]}")
  elsif text =~ /\A([\t ]*)\0([\t ]*)\z/
    out text.gsub(/^.*$/, "#{$1}#{default[:start]}#{$2}#{default[:end]}")
  else
    indent = text.scan(/^[\t \0]*(?=\S)/).
                  min { |a, b| a.length <=> b.length } || ""
    text.send(text.respond_to?(:lines) ? :lines : :to_s).map do |line|
      if line =~ /^(#{indent})(.*)$(\n?)/ then
        out $1 + default[:start] + $2 + default[:end] + $3
      elsif line =~ /^(.*)$(\n?)/ then
        out indent + default[:start] + $1 + default[:end] + $2
      end
    end
  end
when "block" # apply comment around selection
  if text.empty?
    out default[:start]
    print "${0}"
    out default[:end]
  elsif text =~ /\A([\t ]*)\0([\t ]*)\z/
    out $1, default[:start]
    print "${0}"
    out $2, default[:end]
  elsif default[:no_indent]
    out default[:start], text, default[:end]
  else
    lines = text.to_a
    if lines.empty?
      out default[:start], default[:end]
    else
      lines[-1].sub!(/^(.*)$/, "\\1#{default[:end]}")
      out lines.shift.sub(/^([\s\0]*)(.*)$/, "\\1#{default[:start]}\\2")
      out(*lines) unless lines.empty?
    end
  end
end

Ответы [ 4 ]

4 голосов
/ 20 марта 2013

Убедитесь, что у вас установлен пакет «Source». В последней версии Textmate 2 Alpha на момент написания статьи выберите TextMate -> Preferences -> Bundles -> Check «Source» для установки. Теперь ярлык CMD + / должен работать.

3 голосов
/ 22 апреля 2013

Это небольшая синтаксическая проблема, если вы используете Ruby выше 1.8.7.Вы обнаружите, что метод to_a был удален.Если вы хотите решить проблему, все, что вам нужно сделать, это изменить код, найденный в этом файле.

Для решения проблемы вам нужно найти любое место, которое они называют to_a, и заменить егоArray("string").

В моем случае я сделал это.Это также должно работать для вас:

lines = text.to_a

с

lines = text.lines.to_a

enter image description here

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

2 голосов
/ 27 апреля 2012

У меня была такая же проблема, и оказалось, что у меня был установлен комплект SCSS, для которого было установлено предпочтение использовать "//" для комментариев с помощью селектора области действия для source.css, а также source.scss.

Я бы проверил, чтобы у вас не было одного и того же пакета SCSS, и если вы это сделаете, измените селектор области предпочтения комментариев, чтобы он был просто source.scss.

0 голосов
/ 06 февраля 2012

Cmd / работает годами и продолжает работать. Что ж, моя копия TM2 alpha не работает (не работает с / в числовом блоке, но, ну, в общем, это alpha), но TM 1.5.x работает как надо.

Вы не должны что-либо изменять где угодно. Команда Строка комментария / Выбор достаточно умна, чтобы поместить правильный тип комментария в «любой» тип файла.

Вы связались с определениями языка? Ваш файл распознается как "CSS"? Работает ли он при удалении всех или некоторых плагинов / комплектов?

-- EDIT --

enter image description here

...