mirror of
https://github.com/joaotavora/yasnippet.git
synced 2025-10-13 21:13:04 +00:00
merge: bring in recent changes in trunk
Conflicts: snippets
This commit is contained in:
commit
fb0d84f679
15
.gitmodules
vendored
15
.gitmodules
vendored
@ -1,9 +1,6 @@
|
||||
[submodule "extras/bundles/ruby-tmbundle"]
|
||||
path = extras/bundles/ruby-tmbundle
|
||||
url = http://github.com/drnic/ruby-tmbundle.git
|
||||
[submodule "extras/bundles/html-tmbundle"]
|
||||
path = extras/bundles/html-tmbundle
|
||||
url = http://github.com/drnic/html-tmbundle.git
|
||||
[submodule "extras/bundles/rails-tmbundle"]
|
||||
path = extras/bundles/rails-tmbundle
|
||||
url = http://github.com/drnic/ruby-on-rails-tmbundle.git
|
||||
[submodule "snippets"]
|
||||
path = snippets
|
||||
url = git@github.com:AndreaCrotti/yasnippet-snippets.git
|
||||
[submodule "yasmate"]
|
||||
path = yasmate
|
||||
url = git@github.com:capitaomorte/yasmate.git
|
||||
|
98
README.mdown
98
README.mdown
@ -5,12 +5,11 @@ type an abbreviation and automatically expand it into function
|
||||
templates. Bundled language templates include: C, C++, C#, Perl,
|
||||
Python, Ruby, SQL, LaTeX, HTML, CSS and more. The snippet syntax
|
||||
is inspired from [TextMate's][textmate-snippets] syntax, you can
|
||||
even [import][import-docs] most TextMate templates to
|
||||
even [import](#import) most TextMate templates to
|
||||
YASnippet. Watch [a demo on YouTube][youtube-demo] or download a
|
||||
[higher resolution version][high-res-demo].
|
||||
|
||||
[textmate-snippets]: http://manual.macromates.com/en/snippets
|
||||
[import-docs]: http://yasnippet.googlecode.com/svn/trunk/doc/snippet-development.html#importing-textmate-snippets
|
||||
[youtube-demo]: http://www.youtube.com/watch?v=ZCGmZK4V7Sg
|
||||
[high-res-demo]: http://yasnippet.googlecode.com/files/yas_demo.avi
|
||||
|
||||
@ -21,7 +20,7 @@ YASnippet. Watch [a demo on YouTube][youtube-demo] or download a
|
||||
Clone this repository somewhere
|
||||
|
||||
$ cd ~/.emacs.d/plugins
|
||||
$ git clone https://github.com/capitaomorte/yasnippet
|
||||
$ git clone --recursive https://github.com/capitaomorte/yasnippet
|
||||
|
||||
Add the following in your `.emacs` file:
|
||||
|
||||
@ -63,66 +62,51 @@ To use YASnippet as a non-global minor mode, replace `(yas-global-mode 1)` with
|
||||
'(lambda ()
|
||||
(yas-minor-mode)))
|
||||
|
||||
# (NOT) Contributing snippets
|
||||
# Where are the snippets?
|
||||
|
||||
Please **do not** open pull requests or ask me to add snippets to
|
||||
YASnippet.
|
||||
<a name="import"></a>
|
||||
|
||||
The bundled collection under `/snippets` is considered frozen: **I
|
||||
will not add more snippets to it**.
|
||||
Yasnippet no longer bundles snippets directly, but it's very easy to
|
||||
get some!
|
||||
|
||||
You can point `yas-snippet-dirs` to good snippet collections out
|
||||
If you git-cloned yasnippet with the `--recursive` option you'll also
|
||||
download "git submodules" and find two subdirs under the main tree.
|
||||
|
||||
1. `snippets/`
|
||||
|
||||
Points to [yasnippet-snippets][yasnippet-snippets] the snippet
|
||||
collection of [AndreaCrotti](https://github.com/AndreaCrotti).
|
||||
|
||||
The default configuraiton already points to this dir, so to use
|
||||
them, just make sure the submodule really was downloaded
|
||||
(i.e. there are some files under `snippets/`)
|
||||
|
||||
2. `yasmate/`
|
||||
|
||||
Points to a github repo of the [yasmate][yasmate] tool, which is
|
||||
dedicated to converting textmate bundles into yasnippet snippets.
|
||||
|
||||
To use these snippets you have to run the tool first, so
|
||||
[see its doc][yasmate]), and then point the `yas-snippet-dirs`
|
||||
variable to the `.../yasmate/snippets` subdir.
|
||||
|
||||
If you have a working ruby environment, you can probably get lucky
|
||||
directly with `rake convert-bundles`.
|
||||
|
||||
Naturally, you can point `yas-snippet-dirs` to good snippet collections out
|
||||
there. If you have created snippets for a mode, or multiple modes,
|
||||
consider creating a repository to host them, then tell users that it
|
||||
should be added like this to `yas-snippet-dirs`:
|
||||
|
||||
(setq yas-snippet-dirs
|
||||
'("~/.emacs.d/snippets" ;; personal snippets
|
||||
"/path/to/some/collection/" ;; just some foo-mode snippets
|
||||
"/path/to/some/othercollection/" ;; some more foo-mode and a complete baz-mode
|
||||
"/path/to/yasnippet/snippets" ;; the default collection
|
||||
'("~/.emacs.d/snippets" ;; personal snippets
|
||||
"/path/to/some/collection/" ;; foo-mode and bar-mode snippet collection
|
||||
"/path/to/yasnippet/yasmate/snippets" ;; the yasmate collection
|
||||
"/path/to/yasnippet/snippets" ;; the default collection
|
||||
))
|
||||
|
||||
(yas-global-mode 1) ;; or M-x yas-reload-all if you've started YASnippet already.
|
||||
|
||||
# Importing TextMate snippets
|
||||
|
||||
There is a tool `extras/textmate-import.rb` than can import many
|
||||
actual TextMate snippets. These can be quite complex so the
|
||||
`extras/imported/*-mode/.yas-setup.el` files help it with the more
|
||||
difficult importation.
|
||||
|
||||
I'm focusing on developing `textmate-import.rb` tool and some
|
||||
`yas-setup.el` files. In the future `/snippets` snippets will be
|
||||
deprecated and might be replaced with `extras/imported`.
|
||||
|
||||
## Example importation of rails snippets
|
||||
|
||||
To start using [drnic's](https://github.com/drnic) snippets for rails
|
||||
development, follow this example. It will convert `ruby`, `rails` and
|
||||
`html` bundles from github repositories. The importation will be
|
||||
guided by the `.yas-setup.el` files.
|
||||
|
||||
After cloning this repository to `~/.emacs.d/plugins/yasnippet`
|
||||
|
||||
cd ~/.emacs.d/plugins/yasnippet
|
||||
git submodule init
|
||||
git submodule update
|
||||
gem install plist trollop
|
||||
rake convert_bundles # will convert ruby, rails and html bundles
|
||||
|
||||
Then, in your `.emacs` file
|
||||
|
||||
(add-to-list 'load-path
|
||||
"~/.emacs.d/plugins/yasnippet")
|
||||
(require 'yasnippet)
|
||||
(setq yas-snippet-dirs '("~/.emacs.d/snippets" "~/.emacs.d/plugins/yasnippet/extras/imported"))
|
||||
(yas-global-mode 1)
|
||||
|
||||
Open some rails file (model, app, etc) and start using the textmate
|
||||
snippets. Note that in the example above we have abandoned the
|
||||
default snippet collection on `~/.emacs.d/plugins/yasnippet/snippets`
|
||||
|
||||
# Documentation, issues, etc
|
||||
|
||||
Please refer to the comprehensive (albeit slightly outdated)
|
||||
@ -133,20 +117,20 @@ and support. If you find a bug, please report it on
|
||||
|
||||
## Important note regarding bug reporting
|
||||
If you think have found a bug, please report it clearly. Yasnippet
|
||||
does have (lots of) bugs and your reports are very valuable. Here's
|
||||
a [great example](https://github.com/capitaomorte/yasnippet/issues/318)
|
||||
of a bug report. It has everything needed for a sucessfull analysis and
|
||||
does have (lots of) bugs and your reports are very valuable. Here's
|
||||
a [great example](https://github.com/capitaomorte/yasnippet/issues/318)
|
||||
of a bug report. It has everything needed for a sucessfull analysis and
|
||||
speedy resolution:
|
||||
|
||||
*Before* reporting try to reproduce the bug **without** your usual
|
||||
`.emacs` (or whatever startup file you use). Do so either by starting
|
||||
emacs from the command line with the `-Q` switch, or by temporarily
|
||||
moving away your `.emacs` and creating a new smaller one just for
|
||||
reproducing the bug. Paste that file in your bug report. Paste any sequence
|
||||
reproducing the bug. Paste that file in your bug report. Paste any sequence
|
||||
of relevant shell commands before you launch Emacs.
|
||||
|
||||
*Then*, describe steps taken to reproduce from an
|
||||
end-user perspective. Try to be as unambiguous as possible.
|
||||
end-user perspective. Try to be as unambiguous as possible.
|
||||
|
||||
Also, don't forget to state the Emacs version (use `M-x emacs-version`) and
|
||||
the yasnippet version you are using (if using the latest from github,
|
||||
@ -169,3 +153,5 @@ Finally, thank you very much for using YASnippet!
|
||||
[googlecode tracker]: http://code.google.com/p/yasnippet/issues/list
|
||||
[forum]: http://groups.google.com/group/smart-snippet
|
||||
[melpa]: http://melpa.milkbox.net/
|
||||
[yasmate]: http://github.com/capitaomorte/yasmate
|
||||
[yasnippet-snippets]: http://github.com/AndreaCrotti/yasnippet-snippets
|
||||
|
34
Rakefile
34
Rakefile
@ -13,19 +13,9 @@ FileUtils.mkdir_p('pkg')
|
||||
|
||||
desc "run tests in batch mode"
|
||||
task :tests do
|
||||
sh "#{$EMACS} -Q -L . -l yasnippet-tests.el -nw --batch -e yas-batch-run-tests"
|
||||
end
|
||||
|
||||
desc "convert some textmate bundles to yasnippets"
|
||||
task :convert_bundles do
|
||||
Dir.glob "extras/bundles/*-tmbundle" do |bundle_dir|
|
||||
puts "Converting from #{bundle_dir}"
|
||||
mode_prefix = File.basename(bundle_dir).match(/[^-]*/)[0]
|
||||
raise "Couldn't guess mode name for #{bundle_dir}" unless mode_prefix
|
||||
output = "./extras/imported/#{mode_prefix}-mode"
|
||||
FileUtils.mkdir_p output
|
||||
sh "./extras/textmate_import.rb -d #{bundle_dir} -o #{output} -q"
|
||||
end
|
||||
batch_run_line = "(yas-batch-run-tests t)"
|
||||
sh "#{$EMACS} -Q -L . -l yasnippet-tests.el -nw" +
|
||||
" --batch --eval '#{batch_run_line}'"
|
||||
end
|
||||
|
||||
desc "create a release package"
|
||||
@ -52,11 +42,11 @@ task :release => [:package, 'doc:archive'] do
|
||||
raise "Not implemented for github yet!"
|
||||
end
|
||||
|
||||
rule '.html' => '.rst' do |t|
|
||||
sh "doc/compile-doc.py #{t.source} > #{t.name}"
|
||||
end
|
||||
desc "Generate document"
|
||||
task :doc => FileList['doc/*.rst'].ext('html')
|
||||
task :doc do
|
||||
sh "#{$EMACS} -Q -L . --batch -l doc/yas-doc-helper.el" +
|
||||
" -f yas--generate-html-batch"
|
||||
end
|
||||
|
||||
namespace :doc do
|
||||
task :archive do
|
||||
@ -77,8 +67,10 @@ namespace :doc do
|
||||
Dir.glob("doc/images/*").each do |file|
|
||||
FileUtils.cp file, 'doc/gh-pages/images'
|
||||
end
|
||||
rev = `git rev-parse --verify HEAD`
|
||||
Dir.chdir 'doc/gh-pages' do
|
||||
sh "git commit -a -m 'Automatic documentation update.'"
|
||||
sh "git commit -a -m 'Automatic documentation update.\n\n" +
|
||||
"From #{rev.chomp()}'"
|
||||
sh "git push"
|
||||
end
|
||||
end
|
||||
@ -93,3 +85,9 @@ end
|
||||
task :compile => FileList["yasnippet.el"].ext('elc')
|
||||
|
||||
task :default => :doc
|
||||
|
||||
desc "use yasmate to convert textmate bundles"
|
||||
task :convert_bundles do
|
||||
cd "yasmate"
|
||||
sh "rake convert_bundles"
|
||||
end
|
||||
|
159
doc/faq.org
Normal file
159
doc/faq.org
Normal file
@ -0,0 +1,159 @@
|
||||
#+SETUPFILE: org-setup.inc
|
||||
|
||||
#+TITLE: Frequently Asked Questions
|
||||
|
||||
* Why is there an extra newline?
|
||||
|
||||
If you have a newline at the end of the snippet definition file, then
|
||||
YASnippet will add a newline when you expanding a snippet. Please don't
|
||||
add a newline at the end if you don't want it when you saving the
|
||||
snippet file.
|
||||
|
||||
Note some editors will automatically add a newline for you. In Emacs, if
|
||||
you set =require-final-newline= to =t=, it will add the final newline
|
||||
for you automatically.
|
||||
|
||||
* Why doesn't TAB expand a snippet?
|
||||
|
||||
First check the mode line to see if there's =yas=. If not, then try
|
||||
=M-x yas-minor-mode= to manually turn on the minor mode and try to
|
||||
expand the snippet again. If it works, then, you can add the following
|
||||
code to your =.emacs= /before/ loading YASnippet:
|
||||
|
||||
#+BEGIN_SRC emacs-lisp
|
||||
(add-hook 'the-major-mode-hook 'yas-minor-mode-on)
|
||||
#+END_SRC
|
||||
|
||||
where =the-major-mode= is the major mode in which [[sym:yas-minor-mode][=yas-minor-mode=]] isn't
|
||||
enabled by default.
|
||||
|
||||
From YASnippet 0.6 you can also use the command =M-x yas-global-mode= to
|
||||
turn on YASnippet automatically for /all/ major modes.
|
||||
|
||||
If [[sym:yas-minor-mode][=yas-minor-mode=]] is on but the snippet still not expanded. Then try
|
||||
to see what command is bound to the =TAB= key: press =C-h k= and then
|
||||
press =TAB=. Emacs will show you the result.
|
||||
|
||||
You'll see a buffer prompted by Emacs saying that
|
||||
=TAB runs the command ...=. Alternatively, you might see
|
||||
=<tab> runs the command ...=, note the difference between =TAB= and
|
||||
=<tab>= where the latter has priority. If you see =<tab>= bound to a
|
||||
command other than [[sym:yas-expand][=yas-expand=]], (e.g. in =org-mode=) you can try the
|
||||
following code to work around:
|
||||
|
||||
#+BEGIN_SRC emacs-lisp
|
||||
(add-hook 'org-mode-hook
|
||||
(let ((original-command (lookup-key org-mode-map [tab])))
|
||||
`(lambda ()
|
||||
(setq yas-fallback-behavior
|
||||
'(apply ,original-command))
|
||||
(local-set-key [tab] 'yas-expand))))
|
||||
#+END_SRC
|
||||
|
||||
replace =org-mode-hook= and =org-mode-map= with the major mode hook you
|
||||
are dealing with (Use =C-h m= to see what major mode you are in).
|
||||
|
||||
As an alternative, you can also try
|
||||
|
||||
#+BEGIN_SRC emacs-lisp
|
||||
(defun yas-advise-indent-function (function-symbol)
|
||||
(eval `(defadvice ,function-symbol (around yas-try-expand-first activate)
|
||||
,(format
|
||||
"Try to expand a snippet before point, then call `%s' as usual"
|
||||
function-symbol)
|
||||
(let ((yas-fallback-behavior nil))
|
||||
(unless (and (interactive-p)
|
||||
(yas-expand))
|
||||
ad-do-it)))))
|
||||
|
||||
(yas-advise-indent-function 'ruby-indent-line)
|
||||
#+END_SRC
|
||||
|
||||
To /advise/ the modes indentation function bound to TAB, (in this case
|
||||
=ruby-indent-line=) to first try to run [[sym:yas-expand][=yas-expand=]].
|
||||
|
||||
If the output of =C-h k RET <tab>= tells you that =<tab>= is indeed
|
||||
bound to [[sym:yas-expand][=yas-expand=]] but YASnippet still doesn't work, check your
|
||||
configuration and you may also ask for help on the [[http://groups.google.com/group/smart-snippet][discussion group]].
|
||||
See this particular [[http://code.google.com/p/yasnippet/issues/detail?id=93&can=1][thread]] for quite some solutions and alternatives.
|
||||
|
||||
Don't forget to attach the information on what command is bound to TAB
|
||||
as well as the mode information (Can be obtained by =C-h m=).
|
||||
|
||||
* Why doesn't TAB navigation work with flyspell
|
||||
|
||||
A workaround is to inhibit flyspell overlays while the snippet is
|
||||
active:
|
||||
|
||||
#+BEGIN_SRC emacs-lisp
|
||||
(add-hook 'flyspell-incorrect-hook
|
||||
#'(lambda (dummy1 dummy2 dymmy3)
|
||||
(and yas-active-field-overlay
|
||||
(overlay-buffer yas-active-field-overlay))))
|
||||
#+END_SRC
|
||||
|
||||
This is apparently related to overlay priorities. For some reason, the
|
||||
=keymap= property of flyspell's overlays always takes priority over the
|
||||
same property in YASnippet's overlays, even if one sets the latter's
|
||||
=priority= property to something big. If you know emacs-lisp and can
|
||||
solve this problem, drop a line in the
|
||||
[[http://groups.google.com/group/smart-snippet][discussion group]].
|
||||
|
||||
* How to I use alternative keys, i.e. not TAB?
|
||||
|
||||
Edit the keymaps [[sym:yas-minor-mode-map][=yas-minor-mode-map=]] and
|
||||
[[sym:yas-keymap][=yas-keymap=]] as you would any other keymap:
|
||||
|
||||
#+begin_src emacs-lisp :exports code
|
||||
(define-key yas-minor-mode-map (kbd "<tab>") nil)
|
||||
(define-key yas-minor-mode-map (kbd "TAB") nil)
|
||||
(define-key yas-minor-mode-map (kbd "<the new key>") 'yas-expand)
|
||||
|
||||
;;keys for navigation
|
||||
(define-key yas-keymap [(tab)] nil)
|
||||
(define-key yas-keymap (kbd "TAB") nil)
|
||||
(define-key yas-keymap [(shift tab)] nil)
|
||||
(define-key yas-keymap [backtab] nil)
|
||||
(define-key yas-keymap (kbd "<new-next-field-key>") 'yas-next-field-or-maybe-expand)
|
||||
(define-key yas-keymap (kbd "<new-prev-field-key>") 'yas-prev)
|
||||
#+end_src
|
||||
|
||||
* How do I turn off the minor mode where in some buffers?
|
||||
|
||||
The best way, since version 0.6.1c, is to set the default value of the
|
||||
variable [[sym:yas-dont-activate][=yas-dont-activate=]] to a lambda function like so:
|
||||
|
||||
#+BEGIN_SRC emacs-lisp
|
||||
(set-default 'yas-dont-activate
|
||||
#'(lambda ()
|
||||
(and yas-root-directory
|
||||
(null (yas-get-snippet-tables)))))
|
||||
#+END_SRC
|
||||
|
||||
This is also the default value starting for that version. It skips the
|
||||
minor mode in buffers where it is not applicable (no snippet tables),
|
||||
but only once you have setup your yas-root-directory.
|
||||
|
||||
* How do I define an abbrev key containing characters not supported by
|
||||
the filesystem?
|
||||
|
||||
- *Note*: This question applies if you're still defining snippets
|
||||
whose key /is/ the filename. This is behavior still provided by
|
||||
version 0.6 for backward compatibilty, but is somewhat
|
||||
deprecated...
|
||||
|
||||
For example, you want to define a snippet by the key =<= which is not a
|
||||
valid character for filename on Windows. This means you can't use the
|
||||
filename as a trigger key in this case.
|
||||
|
||||
You should rather use the =# key:= directive to specify the key of the
|
||||
defined snippet explicitly and name your snippet with an arbitrary valid
|
||||
filename, =lt.YASnippet= for example, using =<= for the =# key:=
|
||||
directive:
|
||||
|
||||
#+BEGIN_SRC snippet
|
||||
# key: <
|
||||
# name: <...></...>
|
||||
# --
|
||||
<${1:div}>$0</$1>
|
||||
#+END_SRC
|
47
doc/index.org
Normal file
47
doc/index.org
Normal file
@ -0,0 +1,47 @@
|
||||
#+SETUPFILE: org-setup.inc
|
||||
#+TITLE: Yet another snippet extension
|
||||
|
||||
The YASnippet documentation has been split into separate parts:
|
||||
|
||||
0. [[https://github.com/capitaomorte/yasnippet/blob/master/README.mdown][README]]
|
||||
|
||||
Contains an introduction, installation instructions and other important
|
||||
notes.
|
||||
|
||||
1. [[file:snippet-organization.org][Organizing Snippets]]
|
||||
|
||||
Describes ways to organize your snippets in the hard disk.
|
||||
|
||||
2. [[file:snippet-expansion.org][Expanding Snippets]]
|
||||
|
||||
Describes how YASnippet chooses snippets for expansion at point.
|
||||
|
||||
Maybe, you'll want some snippets to be expanded in a particular mode,
|
||||
or only under certain conditions, or be prompted using =ido=, etc...
|
||||
|
||||
3. [[file:snippet-development.org][Writing Snippets]]
|
||||
|
||||
Describes the YASnippet definition syntax, which is very close (but
|
||||
not equivalent) to Textmate's. Includes a section about converting
|
||||
TextMate snippets.
|
||||
|
||||
4. [[file:snippet-menu.org][The YASnippet menu]]
|
||||
|
||||
Explains how to use the YASnippet menu to explore, learn and modify
|
||||
snippets.
|
||||
|
||||
5. [[file:faq.org][Frequently asked questions]]
|
||||
|
||||
Answers to frequently asked questions.
|
||||
|
||||
6. [[file:snippet-reference.org][YASnippet Symbol Reference]]
|
||||
|
||||
An automatically generated listing of all YASnippet commands,
|
||||
(customization) variables, and functions.
|
||||
|
||||
|
||||
# Local Variables:
|
||||
# mode: org
|
||||
# fill-column: 80
|
||||
# coding: utf-8
|
||||
# End:
|
257
doc/manual.mdown
257
doc/manual.mdown
@ -1,257 +0,0 @@
|
||||
Quick start
|
||||
===========
|
||||
|
||||
*YASnippet* is a template system for Emacs. It allows you to type an
|
||||
abbreviation and automatically expand it into function templates. Bundled
|
||||
language templates includes: C, C++, C#, Perl, Python, Ruby, SQL, LaTeX, HTML,
|
||||
CSS and more. The snippet syntax is inspired from TextMate's syntax, you can
|
||||
even [import most TextMate snippets](#import-textmate)
|
||||
|
||||
YASnippet is an original creation of [pluskid][pluskid] who also wrote its predecessor
|
||||
[smart-snippet][smart-snippet].
|
||||
|
||||
Watch a demo
|
||||
------------
|
||||
|
||||
Do so on [youtube][youtube]
|
||||
|
||||
Installation
|
||||
------------
|
||||
|
||||
Clone this repository somewhere
|
||||
|
||||
$ cd ~/.emacs.d/plugins
|
||||
$ git clone https://github.com/capitaomorte/yasnippet
|
||||
|
||||
Add the following in your =.emacs= file:
|
||||
|
||||
(add-to-list 'load-path
|
||||
"~/.emacs.d/plugins/yasnippet")
|
||||
(require 'yasnippet)
|
||||
(yas/global-mode 1)
|
||||
|
||||
Add your own snippets to `~/.emacs.d/snippets` by placing files there or
|
||||
invoking `yas-new-snippet`.
|
||||
|
||||
Import textmate snippets (rails example)
|
||||
----------------------------------------
|
||||
|
||||
YASnippet lets you use TextMate bundles directly:
|
||||
|
||||
$ cd ~/.emacs.d/plugins
|
||||
$ git clone https://github.com/capitaomorte/yasnippet
|
||||
$ cd yasnippet
|
||||
$ git submodule init
|
||||
$ git submodule update
|
||||
$ gem install plist trollop
|
||||
$ rake convert_bundles # will convert ruby, rails and html bundles from drnic
|
||||
|
||||
Then, in your `.emacs` file
|
||||
|
||||
|
||||
(add-to-list 'load-path
|
||||
"~/.emacs.d/plugins/yasnippet")
|
||||
(require 'yasnippet)
|
||||
(setq yas/snippet-dirs '("~/.emacs.d/snippets" "~/.emacs.d/extras/imported"))
|
||||
(yas/global-mode 1)
|
||||
|
||||
Open some rails file (model, app, etc) and start using the textmate
|
||||
snippets. Consider that this is a work-in-progress and many snippets/commands
|
||||
might not work. Patches welcome!
|
||||
|
||||
Contributing snippets
|
||||
---------------------
|
||||
|
||||
Please *do not ask me* to add snippets to the default collection under
|
||||
`/snippets`. This collection is considered frozen. By customizing
|
||||
`yas-snippet-dirs` you can point yasnippet to good snippet collections out
|
||||
there.
|
||||
|
||||
The `extras/textmate-import.rb` tool can import many actual Textmate snippets.
|
||||
I'm focusing on developing it and the accompanying `yas-setup.el` files that
|
||||
guide it with more difficult importations. The idea is to deprecate `/snippets=
|
||||
and replace it with =extras/imported`.
|
||||
|
||||
Documentation, issues, etc
|
||||
--------------------------
|
||||
|
||||
Please refer to the comprehensive [documentation](docs) for full
|
||||
customization and support. If you think you've found a bug, please report it
|
||||
on [the GitHub issue tracker](issues). (please **do not** submit new
|
||||
issues to the old [googlecode tracker](googlecode-tracker))
|
||||
|
||||
If you run into problems using YASnippet, or have snippets to contribute,
|
||||
post to the [yasnippet forum](forum). Thank you very much for using
|
||||
YASnippet!
|
||||
|
||||
Organizing snippets
|
||||
===================
|
||||
|
||||
Basic structure
|
||||
---------------
|
||||
|
||||
Snippet collections can be stored in plain text files. They are arranged by
|
||||
sub-directories naming *snippet tables*. These mostly name Emacs major names.
|
||||
|
||||
.
|
||||
|-- c-mode
|
||||
| `-- printf
|
||||
|-- java-mode
|
||||
| `-- println
|
||||
`-- text-mode
|
||||
|-- email
|
||||
`-- time
|
||||
|
||||
The collections are loaded into *snippet tables* which the triggering
|
||||
mechanism (see [Expanding snippets](#expand-snippets)) looks up and
|
||||
(hopefully) cause the right snippet to be expanded for you.
|
||||
|
||||
Setting up `yas-snippet-dirs`
|
||||
-----------------------------
|
||||
|
||||
The emacs variable `yas-snippet-dirs` tells YASnippet
|
||||
which collections to consider. It's used when you activate
|
||||
`yas-global-mode` or call
|
||||
`yas-reload-all` interactively.
|
||||
|
||||
The default considers:
|
||||
|
||||
- a personal collection that lives in `~/.emacs.d/snippets`
|
||||
- the bundled collection, taken as a relative path to `yasnippet.el` localtion
|
||||
|
||||
When you come across other snippet collections, do the following to try them
|
||||
out:
|
||||
|
||||
;; Develop in ~/emacs.d/mysnippets, but also
|
||||
;; try out snippets in ~/Downloads/interesting-snippets
|
||||
(setq yas/snippet-dirs '("~/emacs.d/mysnippets"
|
||||
"~/Downloads/interesting-snippets"))
|
||||
|
||||
;; OR, keeping yasnippet's defaults try out ~/Downloads/interesting-snippets
|
||||
(setq yas/snippet-dirs (append yas/snippet-dirs
|
||||
'("~/Downloads/interesting-snippets")))
|
||||
|
||||
Collections appearing earlier in the list shadow snippets with same names
|
||||
appearing in collections later in the list. `yas-new-snippet` always stores
|
||||
snippets in the first collection.
|
||||
|
||||
The `.yas-parents` file
|
||||
-----------------------
|
||||
|
||||
It's very useful to have certain modes share snippets between themselves. To do
|
||||
this, choose a mode subdirectory and place a `.yas-parents` containing a
|
||||
whitespace-separated list of other mode names. When you reload those modes
|
||||
become parents of the original mode.
|
||||
|
||||
.
|
||||
|-- c-mode
|
||||
| |-- .yas-parents # contains "cc-mode text-mode"
|
||||
| `-- printf
|
||||
|-- cc-mode
|
||||
| |-- for
|
||||
| `-- while
|
||||
|-- java-mode
|
||||
| |-- .yas-parents # contains "cc-mode text-mode"
|
||||
| `-- println
|
||||
`-- text-mode
|
||||
|-- email
|
||||
`-- time
|
||||
|
||||
The `.yas-make-groups` file
|
||||
---------------------------
|
||||
|
||||
If you place an empty plain text file `.yas-make-groups` inside one of the mode
|
||||
directories, the names of these sub-directories are considered groups of
|
||||
snippets and [the menu](snippet-menu) is organized much more cleanly:
|
||||
|
||||
(TODO image)
|
||||
|
||||
Another alternative way to achieve this is to place a `# group:` directive
|
||||
inside the snippet definition. See [Writing Snippets](#writing-snippets)
|
||||
|
||||
|
||||
$ tree ruby-mode/
|
||||
ruby-mode/
|
||||
|-- .yas-make-groups
|
||||
|-- collections
|
||||
| |-- each
|
||||
| `-- ...
|
||||
|-- control structure
|
||||
| |-- forin
|
||||
| `-- ...
|
||||
|-- definitions
|
||||
| `-- ...
|
||||
`-- general
|
||||
`-- ...
|
||||
|
||||
|
||||
Yet another way to create a nice snippet menu is to write into
|
||||
`.yas-make-groups` a menu definition. TODO
|
||||
|
||||
TODO The `.yas-setup.el` file
|
||||
-----------------------------
|
||||
|
||||
*** TODO
|
||||
|
||||
TODO The `.yas-compiled-snippet.el` file
|
||||
----------------------------------------
|
||||
|
||||
*** TODO
|
||||
|
||||
The `.yas-skip` file
|
||||
--------------------
|
||||
|
||||
Expanding Snippets
|
||||
==================
|
||||
|
||||
This section describes how YASnippet chooses snippets for expansion at point.
|
||||
|
||||
Maybe, you'll want some snippets to be expanded in a particular
|
||||
mode, or only under certain conditions, or be prompted using
|
||||
|
||||
Triggering expansion
|
||||
--------------------
|
||||
|
||||
To make a snippet expand after the cursor:
|
||||
|
||||
* Type an the snippet's *trigger key* then press the key defined in
|
||||
`yas-trigger-key`.
|
||||
|
||||
* Use the snippet's *keybinding*.
|
||||
|
||||
* Call [`yas-insert-snippet=](#yas-insert-snippet) (use `M-x
|
||||
yas-insert-snippet`= or its keybinding =C-c & C-s`).
|
||||
|
||||
* By expanding directly from the "YASnippet" menu in the menu-bar
|
||||
|
||||
* Using hippie-expand
|
||||
|
||||
* Use m2m's excellent [auto-complete](http://github.com/m2m/autocomplete)
|
||||
|
||||
Reference
|
||||
=========
|
||||
|
||||
(yas--document-symbols 2 `("Interactive functions" . ,#'interactive-form)
|
||||
`("Customization variables" . ,#'(lambda (sym)
|
||||
(and (boundp sym)
|
||||
(get sym 'standard-value))))
|
||||
`("Useful functions" . ,#'fboundp)
|
||||
`("Useful variables" . ,#'boundp))
|
||||
|
||||
[smart-snippet]: http://code.google.com/p/smart-snippet
|
||||
[pluskid]: http://pluskid.lifegoo.org
|
||||
[screencast]: http://www.youtube.com/watch?v=ZCGmZK4V7Sg
|
||||
[docs]: http://capitaomorte.github.com/yasnippet
|
||||
[issues]: https://github.com/capitaomorte/yasnippet/issues
|
||||
[googlecode-tracker]: http://code.google.com/p/yasnippet/issues/list
|
||||
[forum]: http://groups.google.com/group/smart-snippet
|
||||
|
||||
|
||||
|
||||
<!--
|
||||
!-- Local Variables:
|
||||
!-- mode: markdown
|
||||
!-- fill-column: 80
|
||||
!-- coding: utf-8
|
||||
!-- End:
|
||||
!-- -->
|
9
doc/org-setup.inc
Normal file
9
doc/org-setup.inc
Normal file
@ -0,0 +1,9 @@
|
||||
# -*- mode: org -*-
|
||||
|
||||
#+STARTUP: showall
|
||||
|
||||
#+LINK: sym file:snippet-reference.org::#%s
|
||||
|
||||
#+LINK_HOME: ./index.html
|
||||
#+OPTIONS: author:nil num:nil
|
||||
#+AUTHOR:
|
402
doc/snippet-development.org
Normal file
402
doc/snippet-development.org
Normal file
@ -0,0 +1,402 @@
|
||||
#+SETUPFILE: org-setup.inc
|
||||
|
||||
#+TITLE: Writing snippets
|
||||
|
||||
* Snippet development
|
||||
|
||||
** Quickly finding snippets
|
||||
|
||||
There are some ways you can quickly find a snippet file:
|
||||
|
||||
- =M-x yas-new-snippet=
|
||||
|
||||
Prompts you for a snippet name, then tries to guess a suitable
|
||||
directory to store it, prompting you for creation if it does not
|
||||
exist. Finally, places you in a new buffer set to =snippet-mode= so
|
||||
you can write your snippet.
|
||||
|
||||
- =M-x yas-find-snippets=
|
||||
|
||||
Lets you find the snippet file in the directory the snippet was
|
||||
loaded from (if it exists) like =find-file-other-window=. The
|
||||
directory searching logic is similar to =M-x yas-new-snippet=.
|
||||
|
||||
- =M-x yas-visit-snippet-file=
|
||||
|
||||
Prompts you for possible snippet expansions like
|
||||
[[sym:yas-insert-snippet][=yas-insert-snippet=]], but instead of expanding it, takes you directly
|
||||
to the snippet definition's file, if it exists.
|
||||
|
||||
Once you find this file it will be set to =snippet-mode= (see ahead) and
|
||||
you can start editing your snippet.
|
||||
|
||||
** Using the =snippet-mode= major mode
|
||||
|
||||
There is a major mode =snippet-mode= to edit snippets. You can set the
|
||||
buffer to this mode with =M-x snippet-mode=. It provides reasonably
|
||||
useful syntax highlighting.
|
||||
|
||||
Two commands are defined in this mode:
|
||||
|
||||
- =M-x yas-load-snippet-buffer=
|
||||
|
||||
When editing a snippet, this loads the snippet into the correct
|
||||
mode and menu. Bound to =C-c C-c= by default while in
|
||||
=snippet-mode=.
|
||||
|
||||
- =M-x yas-tryout-snippet=
|
||||
|
||||
When editing a snippet, this opens a new empty buffer, sets it to
|
||||
the appropriate major mode and inserts the snippet there, so you
|
||||
can see what it looks like. This is bound to =C-c C-t= while in
|
||||
=snippet-mode=.
|
||||
|
||||
There are also /snippets for writing snippets/: =vars=, =$f= and =$m=
|
||||
:-).
|
||||
|
||||
* File content
|
||||
|
||||
A file defining a snippet generally contains the template to be
|
||||
expanded.
|
||||
|
||||
Optionally, if the file contains a line of =# --=, the lines above it
|
||||
count as comments, some of which can be /directives/ (or meta data).
|
||||
Snippet directives look like =# property: value= and tweak certain
|
||||
snippets properties described below. If no =# --= is found, the whole
|
||||
file is considered the snippet template.
|
||||
|
||||
Here's a typical example:
|
||||
|
||||
#+BEGIN_SRC snippet
|
||||
# contributor: pluskid <pluskid@gmail.com>
|
||||
# name: __...__
|
||||
# --
|
||||
__${init}__
|
||||
#+END_SRC
|
||||
|
||||
Here's a list of currently supported directives:
|
||||
|
||||
** =# key:= snippet abbrev
|
||||
|
||||
This is the probably the most important directive, it's the
|
||||
abbreviation you type to expand a snippet just before hitting the key
|
||||
that runs [[sym:yas-expand][=yas-expand=]]. If you don't specify this
|
||||
the snippet will not be expandable through the trigger mechanism.
|
||||
|
||||
** =# name:= snippet name
|
||||
|
||||
This is a one-line description of the snippet. It will be displayed in
|
||||
the menu. It's a good idea to select a descriptive name for a snippet --
|
||||
especially distinguishable among similar snippets.
|
||||
|
||||
If you omit this name it will default to the file name the snippet was
|
||||
loaded from.
|
||||
|
||||
** =# condition:= snippet condition
|
||||
|
||||
This is a piece of Emacs-lisp code. If a snippet has a condition, then
|
||||
it will only be expanded when the condition code evaluate to some
|
||||
non-nil value.
|
||||
|
||||
See also [[sym:yas-buffer-local-condition][=yas-buffer-local-condition=]] in
|
||||
[[./snippet-expansion.org][Expanding snippets]]
|
||||
|
||||
** =# group:= snippet menu grouping
|
||||
|
||||
When expanding/visiting snippets from the menu-bar menu, snippets for a
|
||||
given mode can be grouped into sub-menus . This is useful if one has too
|
||||
many snippets for a mode which will make the menu too long.
|
||||
|
||||
The =# group:= property only affect menu construction (See
|
||||
[[./snippet-menu.org][the YASnippet menu]]) and the same effect can be
|
||||
achieved by grouping snippets into sub-directories and using the
|
||||
=.yas-make-groups= special file (for this see
|
||||
[[./snippet-organization.org][Organizing Snippets]]
|
||||
|
||||
Refer to the bundled snippets for =ruby-mode= for examples on the
|
||||
=# group:= directive. Group can also be nested, e.g.
|
||||
=control structure.loops= tells that the snippet is under the =loops=
|
||||
group which is under the =control structure= group.
|
||||
|
||||
** =# expand-env:= expand environment
|
||||
|
||||
This is another piece of Emacs-lisp code in the form of a =let= /varlist
|
||||
form/, i.e. a list of lists assigning values to variables. It can be
|
||||
used to override variable values while the snippet is being expanded.
|
||||
|
||||
Interesting variables to override are [[sym:yas-wrap-around-region][=yas-wrap-around-region=]] and
|
||||
[[sym:yas-indent-line][=yas-indent-line=]] (see [[./snippet-expansion.org][Expanding Snippets]]).
|
||||
|
||||
As an example, you might normally have [[sym:yas-indent-line][=yas-indent-line=]] set to '=auto=
|
||||
and [[sym:yas-wrap-around-region][=yas-wrap-around-region=]] set to =t=, but for this particularly
|
||||
brilliant piece of ASCII art these values would mess up your hard work.
|
||||
You can then use:
|
||||
|
||||
#+BEGIN_SRC snippet
|
||||
# name: ASCII home
|
||||
# expand-env: ((yas-indent-line 'fixed) (yas-wrap-around-region 'nil))
|
||||
# --
|
||||
welcome to my
|
||||
X humble
|
||||
/ \ home,
|
||||
/ \ $0
|
||||
/ \
|
||||
/-------\
|
||||
| |
|
||||
| +-+ |
|
||||
| | | |
|
||||
+--+-+--+
|
||||
#+END_SRC
|
||||
|
||||
** =# binding:= direct keybinding
|
||||
|
||||
You can use this directive to expand a snippet directly from a normal
|
||||
Emacs keybinding. The keybinding will be registered in the Emacs keymap
|
||||
named after the major mode the snippet is active for.
|
||||
|
||||
Additionally a variable [[sym:yas-prefix][=yas-prefix=]] is set to to the prefix argument
|
||||
you normally use for a command. This allows for small variations on the
|
||||
same snippet, for example in this "html-mode" snippet.
|
||||
|
||||
#+BEGIN_SRC snippet
|
||||
# name: <p>...</p>
|
||||
# binding: C-c C-c C-m
|
||||
# --
|
||||
<p>`(when yas-prefix "\n")`$0`(when yas-prefix "\n")`</p>
|
||||
#+END_SRC
|
||||
|
||||
This binding will be recorded in the keymap =html-mode-map=. To expand a
|
||||
paragraph tag newlines, just press =C-u C-c C-c C-m=. Omitting the =C-u=
|
||||
will expand the paragraph tag without newlines.
|
||||
|
||||
** =# contributor:= snippet author
|
||||
|
||||
This is optional and has no effect whatsoever on snippet functionality,
|
||||
but it looks nice.
|
||||
|
||||
* Template syntax
|
||||
|
||||
The syntax of the snippet template is simple but powerful, very similar
|
||||
to TextMate's.
|
||||
|
||||
** Plain Text
|
||||
|
||||
Arbitrary text can be included as the content of a template. They are
|
||||
usually interpreted as plain text, except =$= and ==. You need to
|
||||
use \` to escape them: =\$= and =\=. The \` itself may also needed to be
|
||||
escaped as =\\= sometimes.
|
||||
|
||||
** Embedded Emacs-lisp code
|
||||
|
||||
Emacs-Lisp code can be embedded inside the template, written inside
|
||||
back-quotes (==). The lisp forms are evaluated when the snippet is
|
||||
being expanded. The evaluation is done in the same buffer as the
|
||||
snippet being expanded.
|
||||
|
||||
Here's an example for c-mode` to calculate the header file guard
|
||||
dynamically:
|
||||
|
||||
#+BEGIN_SRC snippet
|
||||
#ifndef ${1:_`(upcase (file-name-nondirectory (file-name-sans-extension (buffer-file-name))))`_H_}
|
||||
#define $1
|
||||
|
||||
$0
|
||||
|
||||
#endif /* $1 */
|
||||
#+END_SRC
|
||||
|
||||
From version 0.6, snippets expansions are run with some special
|
||||
Emacs-lisp variables bound. One of this is [[sym:yas-selected-text][=yas-selected-text=]]. You can
|
||||
therefore define a snippet like:
|
||||
|
||||
#+BEGIN_SRC snippet
|
||||
for ($1;$2;$3) {
|
||||
`yas-selected-text`$0
|
||||
}
|
||||
#+END_SRC
|
||||
|
||||
to "wrap" the selected region inside your recently inserted snippet.
|
||||
Alternatively, you can also customize the variable
|
||||
[[sym:yas-wrap-around-region][=yas-wrap-around-region=]] to =t= which will do this automatically.
|
||||
|
||||
** Tab stop fields
|
||||
|
||||
Tab stops are fields that you can navigate back and forth by =TAB= and
|
||||
=S-TAB=. They are written by =$= followed with a number. =$0= has the
|
||||
special meaning of the /exit point/ of a snippet. That is the last place
|
||||
to go when you've traveled all the fields. Here's a typical example:
|
||||
|
||||
#+BEGIN_SRC snippet
|
||||
<div$1>
|
||||
$0
|
||||
</div>
|
||||
#+END_SRC
|
||||
** Placeholder fields
|
||||
|
||||
Tab stops can have default values -- a.k.a placeholders. The syntax is
|
||||
like this:
|
||||
|
||||
#+BEGIN_SRC snippet
|
||||
${N:default value}
|
||||
#+END_SRC
|
||||
|
||||
They acts as the default value for a tab stop. But when you firstly
|
||||
type at a tab stop, the default value will be replaced by your typing.
|
||||
The number can be omitted if you don't want to create [[mirrors]] or
|
||||
[[transformations]] for this field.
|
||||
|
||||
** <<Mirrors>>
|
||||
|
||||
We refer the tab stops with placeholders as a /field/. A field can have
|
||||
mirrors. Its mirrors will get updated when you change the text of a
|
||||
field. Here's an example:
|
||||
|
||||
#+BEGIN_SRC snippet
|
||||
\begin{${1:enumerate}}
|
||||
$0
|
||||
\end{$1}
|
||||
#+END_SRC
|
||||
|
||||
When you type "document" at =${1:enumerate}=, the word "document" will
|
||||
also be inserted at =\end{$1}=. The best explanation is to see the
|
||||
screencast([[http://www.youtube.com/watch?v=vOj7btx3ATg][YouTube]] or [[http://yasnippet.googlecode.com/files/yasnippet.avi][avi video]]).
|
||||
|
||||
The tab stops with the same number to the field act as its mirrors. If
|
||||
none of the tab stops has an initial value, the first one is selected as
|
||||
the field and others mirrors.
|
||||
|
||||
** Mirrors with <<transformations>>
|
||||
|
||||
If the value of an =${n:=-construct starts with and contains =$(=, then
|
||||
it is interpreted as a mirror for field =n= with a transformation. The
|
||||
mirror's text content is calculated according to this transformation,
|
||||
which is Emacs-lisp code that gets evaluated in an environment where the
|
||||
variable =text= (or [[sym:yas-text][=yas-text=]]) is bound to the text content (string)
|
||||
contained in the field =n=.Here's an example for Objective-C:
|
||||
|
||||
#+BEGIN_SRC snippet
|
||||
- (${1:id})${2:foo}
|
||||
{
|
||||
return $2;
|
||||
}
|
||||
|
||||
- (void)set${2:$(capitalize text)}:($1)aValue
|
||||
{
|
||||
[$2 autorelease];
|
||||
$2 = [aValue retain];
|
||||
}
|
||||
$0
|
||||
#+END_SRC
|
||||
|
||||
Look at =${2:$(capitalize text)}=, it is a mirror with transformation
|
||||
instead of a field. The actual field is at the first line: =${2:foo}=.
|
||||
When you type text in =${2:foo}=, the transformation will be evaluated
|
||||
and the result will be placed there as the transformed text. So in this
|
||||
example, if you type "baz" in the field, the transformed text will be
|
||||
"Baz". This example is also available in the screencast.
|
||||
|
||||
Another example is for =rst-mode=. In reStructuredText, the document
|
||||
title can be some text surrounded by "===" below and above. The "==="
|
||||
should be at least as long as the text. So
|
||||
|
||||
#+BEGIN_SRC rst
|
||||
=====
|
||||
Title
|
||||
=====
|
||||
#+END_SRC
|
||||
|
||||
is a valid title but
|
||||
|
||||
#+BEGIN_SRC rst
|
||||
===
|
||||
Title
|
||||
===
|
||||
#+END_SRC
|
||||
|
||||
is not. Here's an snippet for rst title:
|
||||
|
||||
#+BEGIN_SRC snippet
|
||||
${1:$(make-string (string-width text) ?\=)}
|
||||
${1:Title}
|
||||
${1:$(make-string (string-width text) ?\=)}
|
||||
|
||||
$0
|
||||
#+END_SRC
|
||||
|
||||
** Fields with transformations
|
||||
|
||||
From version 0.6 on, you can also have lisp transformation inside
|
||||
fields. These work mostly mirror transformations but are evaluated when
|
||||
you first enter the field, after each change you make to the field and
|
||||
also just before you exit the field.
|
||||
|
||||
The syntax is also a tiny bit different, so that the parser can
|
||||
distinguish between fields and mirrors. In the following example
|
||||
|
||||
: #define "${1:mydefine$(upcase yas-text)}"
|
||||
|
||||
=mydefine= gets automatically upcased to =MYDEFINE= once you enter the
|
||||
field. As you type text, it gets filtered through the transformation
|
||||
every time.
|
||||
|
||||
Note that to tell this kind of expression from a mirror with a
|
||||
transformation, YASnippet needs extra text between the =:= and the
|
||||
transformation's =$=. If you don't want this extra-text, you can use two
|
||||
=$='s instead.
|
||||
|
||||
: #define "${1:$$(upcase yas-text)}"
|
||||
|
||||
Please note that as soon as a transformation takes place, it changes the
|
||||
value of the field and sets it its internal modification state to
|
||||
=true=. As a consequence, the auto-deletion behaviour of normal fields
|
||||
does not take place. This is by design.
|
||||
|
||||
** Choosing fields value from a list and other tricks
|
||||
|
||||
As mentioned, the field transformation is invoked just after you enter
|
||||
the field, and with some useful variables bound, notably
|
||||
[[sym:yas-modified-p][=yas-modified-p=]] and [[sym:yas-moving-away-p][=yas-moving-away-p=]]. Because of this feature you
|
||||
can place a transformation in the primary field that lets you select
|
||||
default values for it.
|
||||
|
||||
The [[sym:yas-choose-value][=yas-choose-value=]] does this work for you. For example:
|
||||
|
||||
#+BEGIN_SRC snippet
|
||||
<div align="${2:$$(yas-choose-value '("right" "center" "left"))}">
|
||||
$0
|
||||
</div>
|
||||
#+END_SRC
|
||||
|
||||
See the definition of [[sym:yas-choose-value][=yas-choose-value=]] to see how it was written using
|
||||
the two variables.
|
||||
|
||||
Here's another use, for LaTeX-mode, which calls reftex-label just as you
|
||||
enter snippet field 2. This one makes use of [[sym:yas-modified-p][=yas-modified-p=]] directly.
|
||||
|
||||
#+BEGIN_SRC snippet
|
||||
\section{${1:"Titel der Tour"}}%
|
||||
\index{$1}%
|
||||
\label{{2:"waiting for reftex-label call..."$(unless yas-modified-p (reftex-label nil 'dont-
|
||||
insert))}}%
|
||||
#+END_SRC
|
||||
|
||||
The function [[sym:yas-verify-value][=yas-verify-value=]] has another neat trick, and makes use
|
||||
of [[sym:yas-moving-away-p][=yas-moving-away-p=]]. Try it and see! Also, check out this [[http://groups.google.com/group/smart-snippet/browse_thread/thread/282a90a118e1b662][thread]]
|
||||
|
||||
** Nested placeholder fields
|
||||
|
||||
From version 0.6 on, you can also have nested placeholders of the type:
|
||||
|
||||
#+BEGIN_SRC snippet
|
||||
<div${1: id="${2:some_id}"}>$0</div>
|
||||
#+END_SRC
|
||||
|
||||
This allows you to choose if you want to give this =div= an =id=
|
||||
attribute. If you tab forward after expanding it will let you change
|
||||
"some\_id" to whatever you like. Alternatively, you can just press =C-d=
|
||||
(which executes [[sym:yas-skip-and-clear-or-delete-char][=yas-skip-and-clear-or-delete-char=]]) and go straight to
|
||||
the exit marker.
|
||||
|
||||
By the way, =C-d= will only clear the field if you cursor is at the
|
||||
beginning of the field /and/ it hasn't been changed yet. Otherwise, it
|
||||
performs the normal Emacs =delete-char= command.
|
262
doc/snippet-expansion.org
Normal file
262
doc/snippet-expansion.org
Normal file
@ -0,0 +1,262 @@
|
||||
#+SETUPFILE: org-setup.inc
|
||||
|
||||
#+TITLE: Expanding snippets
|
||||
|
||||
This section describes how YASnippet chooses snippets for expansion at point.
|
||||
|
||||
Maybe, you'll want some snippets to be expanded in a particular
|
||||
mode, or only under certain conditions, or be prompted using
|
||||
|
||||
* Triggering expansion
|
||||
|
||||
You can use YASnippet to expand snippets in different ways:
|
||||
|
||||
- When [[sym:yas-minor-mode][=yas-minor-mode=]] is active:
|
||||
- Type the snippet's *trigger key* then calling [[sym:yas-expand][=yas-expand=]]
|
||||
(bound to =TAB= by default).
|
||||
|
||||
- Use the snippet's *keybinding*.
|
||||
|
||||
- By expanding directly from the "YASnippet" menu in the menu-bar
|
||||
|
||||
- Using hippie-expand
|
||||
|
||||
- Call [[sym:yas-insert-snippet][=yas-insert-snippet=]] (use =M-x yas-insert-snippet== or its
|
||||
keybinding =C-c & C-s=).
|
||||
|
||||
- Use m2m's excellent auto-complete
|
||||
TODO: example for this
|
||||
|
||||
- Expanding from emacs-lisp code
|
||||
|
||||
** Trigger key
|
||||
|
||||
[[sym:yas-expand][=yas-expand=]] tries to expand a /snippet abbrev/ (also known as
|
||||
/snippet key/) before point.
|
||||
|
||||
When [[sym:yas-minor-mode][=yas-minor-mode=]] is enabled, it binds [[sym:yas-expand][=yas-expand=]] to =TAB= and
|
||||
=<tab>= by default, however, you can freely set it to some other key:
|
||||
|
||||
#+begin_src emacs-lisp :exports code
|
||||
(define-key yas-minor-mode-map (kbd "<tab>") nil)
|
||||
(define-key yas-minor-mode-map (kbd "TAB") nil)
|
||||
(define-key yas-minor-mode-map (kbd "<the new key>") 'yas-expand)
|
||||
#+end_src
|
||||
|
||||
To enable the YASnippet minor mode in all buffers globally use the
|
||||
command [[sym:yas-global-mode][=yas-global-mode=]]. This will enable a modeline indicator,
|
||||
=yas=:
|
||||
|
||||
[[./images/minor-mode-indicator.png]]
|
||||
|
||||
When you use [[sym:yas-global-mode][=yas-global-mode=]] you can also selectively disable
|
||||
YASnippet in some buffers by setting the buffer-local variable
|
||||
[[sym:yas-dont-active][=yas-dont-active=]] in the buffer's mode hook.
|
||||
|
||||
*** Fallback bahaviour
|
||||
|
||||
[[sym:yas-fallback-behaviour][=yas-fallback-behaviour=]] is a customization variable bound to
|
||||
'=call-other-command= by default. If [[sym:yas-expand][=yas-expand=]] failed to find any
|
||||
suitable snippet to expand, it will disable the minor mode temporarily
|
||||
and find if there's any other command bound to the same key.
|
||||
|
||||
If found, the command will be called. Usually this works very well
|
||||
--when there's a snippet, expand it, otherwise, call whatever command
|
||||
originally bind to the trigger key.
|
||||
|
||||
However, you can change this behavior by customizing the
|
||||
[[sym:yas-fallback-behavior][=yas-fallback-behavior=]] variable. If you set this variable to
|
||||
'=return-nil=, it will return =nil= instead of trying to call the
|
||||
/original/ command when no snippet is found.
|
||||
|
||||
** Insert at point
|
||||
|
||||
The command [[#yas-insert-snippet][=yas-insert-snippet=]] lets you insert snippets at point
|
||||
/for your current major mode/. It prompts you for the snippet key
|
||||
first, and then for a snippet template if more than one template
|
||||
exists for the same key.
|
||||
|
||||
The list presented contains the snippets that can be inserted at point,
|
||||
according to the condition system. If you want to see all applicable
|
||||
snippets for the major mode, prefix this command with =C-u=.
|
||||
|
||||
The prompting methods used are again controlled by
|
||||
[[sym:yas-prompt-functions][=yas-prompt-functions=]].
|
||||
|
||||
** Snippet keybinding
|
||||
|
||||
See the section of the =# binding:= directive in
|
||||
[[./snippet-development.org][Writing Snippets]].
|
||||
|
||||
** Expanding from the menu
|
||||
|
||||
See [[./snippet-menu.org][the YASnippet Menu]].
|
||||
|
||||
** Expanding with =hippie-expand=
|
||||
|
||||
To integrate with =hippie-expand=, just put
|
||||
[[sym:yas-hippie-try-expand][=yas-hippie-try-expand=]] in
|
||||
=hippie-expand-try-functions-list=. This probably makes more sense
|
||||
when placed at the top of the list, but it can be put anywhere you
|
||||
prefer.
|
||||
|
||||
** Expanding from emacs-lisp code
|
||||
|
||||
Sometimes you might want to expand a snippet directly from you own
|
||||
elisp code. You should call
|
||||
[[sym:yas-expand-snippet][=yas-expand-snippet=]] instead of
|
||||
[[sym:yas-expand][=yas-expand=]] in this case.
|
||||
|
||||
As with expanding from the menubar, the condition system and multiple
|
||||
candidates doesn't affect expansion. In fact, expanding from the
|
||||
YASnippet menu has the same effect of evaluating the follow code:
|
||||
|
||||
#+BEGIN_SRC emacs-lisp
|
||||
(yas-expand-snippet template)
|
||||
#+END_SRC
|
||||
|
||||
See the internal documentation on [[sym:yas-expand-snippet][=yas-expand-snippet=]] for more
|
||||
information.
|
||||
|
||||
* Controlling expansion
|
||||
|
||||
** Eligible snippets
|
||||
|
||||
YASnippet does quite a bit of filtering to find out which snippets are
|
||||
eligible for expanding at the current cursor position.
|
||||
|
||||
In particular, the following things matter:
|
||||
|
||||
- Currently loaded snippets tables
|
||||
|
||||
These are loaded from a directory hierarchy in your file system. See
|
||||
[[./snippet-organization.org][Organizing Snippets]]. They are named
|
||||
after major modes like =html-mode=, =ruby-mode=, etc...
|
||||
|
||||
- Major mode of the current buffer
|
||||
|
||||
If the currrent major mode matches one of the loaded snippet tables,
|
||||
then all that table's snippets are considered for expansion. Use
|
||||
=M-x describe-variable RET major-mode RET= to find out which major
|
||||
mode you are in currently.
|
||||
|
||||
- Parent tables
|
||||
|
||||
Snippet tables defined as the parent of some other eligible table are
|
||||
also considered. This works recursively, i.e. parents of parents of
|
||||
eligible tables are also considered.
|
||||
|
||||
- Buffer-local list of extra modes
|
||||
|
||||
Use [[#yas-activate-extra-mode][=yas-activate-extra-mode=]] to
|
||||
consider snippet tables whose name does not correspond to a major
|
||||
mode. Typically, you call this from a minor mode hook, for example:
|
||||
|
||||
#+BEGIN_SRC emacs-lisp
|
||||
;; When entering rinari-minor-mode, consider also the snippets in the
|
||||
;; snippet table "rails-mode"
|
||||
(add-hook 'rinari-minor-mode-hook
|
||||
#'(lambda ()
|
||||
(yas-activate-extra-mode 'rails-mode)))
|
||||
#+END_SRC
|
||||
|
||||
- Buffer-local
|
||||
[[sym:yas-buffer-local-condition][=yas-buffer-local-condition=]]
|
||||
variable
|
||||
|
||||
This variable provides finer grained control over what snippets can
|
||||
be expanded in the current buffer. The default value won't let you
|
||||
expand snippets inside comments or string literals for example. See
|
||||
The condition system\_ for more info.
|
||||
|
||||
** The condition system
|
||||
|
||||
Consider this scenario: you are an old Emacs hacker. You like the
|
||||
abbrev-way and bind [[sym:yas-expand][=yas-expand=]] to =SPC=. However, you don't want
|
||||
=if= to be expanded as a snippet when you are typing in a comment
|
||||
block or a string (e.g. in =python-mode=).
|
||||
|
||||
If you use the =# condition := directive (see
|
||||
[[./snippet-development.org][Writing Snippets]]) you could just specify
|
||||
the condition for =if= to be =(not (python-in-string/comment))=. But how
|
||||
about =while=, =for=, etc. ? Writing the same condition for all the
|
||||
snippets is just boring. So has a buffer local variable
|
||||
[[sym:yas-buffer-local-condition][=yas-buffer-local-condition=]]. You can set this variable to
|
||||
=(not (python-in-string/comment))= in =python-mode-hook=.
|
||||
|
||||
Then, what if you really want some particular snippet to expand even
|
||||
inside a comment? Set [[sym:yas-buffer-local-condition][=yas-buffer-local-condition=]] like this
|
||||
|
||||
#+BEGIN_SRC emacs-lisp
|
||||
(add-hook 'python-mode-hook
|
||||
(lambda ()
|
||||
(setq yas-buffer-local-condition
|
||||
'(if (python-in-string/comment)
|
||||
'(require-snippet-condition . force-in-comment)
|
||||
t))))
|
||||
#+END_SRC
|
||||
|
||||
... and specify the condition for a snippet that you're going to expand
|
||||
in comment to be evaluated to the symbol =force-in-comment=. Then it can
|
||||
be expanded as you expected, while other snippets like =if= still can't
|
||||
expanded in comment.
|
||||
|
||||
For the full set of possible conditions, see the documentation for
|
||||
[[sym:yas-buffer-local-condition][=yas-buffer-local-condition=]].
|
||||
|
||||
** Multiples snippet with the same key
|
||||
|
||||
The rules outlined [[Eligible%20snippets][above]] can return more than
|
||||
one snippet to be expanded at point.
|
||||
|
||||
When there are multiple candidates, YASnippet will let you select one.
|
||||
The UI for selecting multiple candidate can be customized through
|
||||
[[sym:yas-prompt-functions][=yas-prompt-functions=]] , which defines your preferred methods of being
|
||||
prompted for snippets.
|
||||
|
||||
You can customize it with
|
||||
=M-x customize-variable RET yas-prompt-functions RET=. Alternatively you
|
||||
can put in your emacs-file:
|
||||
|
||||
#+BEGIN_SRC emacs-lisp
|
||||
(setq yas-prompt-functions '(yas-x-prompt yas-dropdown-prompt))
|
||||
#+END_SRC
|
||||
|
||||
Currently there are some alternatives solution with YASnippet.
|
||||
|
||||
*** Use the X window system
|
||||
|
||||
[[./images/x-menu.png]]
|
||||
|
||||
The function [[sym:yas-x-prompt][=yas-x-prompt=]] can be used to show a popup menu for you to
|
||||
select. This menu will be part of you native window system widget, which
|
||||
means:
|
||||
|
||||
- It usually looks beautiful. E.g. when you compile Emacs with gtk
|
||||
support, this menu will be rendered with your gtk theme.
|
||||
- Your window system may or may not allow to you use =C-n=, =C-p= to
|
||||
navigate this menu.
|
||||
- This function can't be used when in a terminal.
|
||||
|
||||
*** Minibuffer prompting
|
||||
|
||||
[[./images/ido-menu.png]]
|
||||
|
||||
You can use functions [[sym:yas-completing-prompt][=yas-completing-prompt=]] for the classic emacs
|
||||
completion method or [[sym:yas-ido-prompt][=yas-ido-prompt=]] for a much nicer looking method.
|
||||
The best way is to try it. This works in a terminal.
|
||||
|
||||
*** Use =dropdown-menu.el=
|
||||
|
||||
[[./images/dropdown-menu.png]]
|
||||
|
||||
The function [[sym:yas-dropdown-prompt][=yas-dropdown-prompt=]] can also be placed in the
|
||||
[[sym:yas-prompt-functions][=yas-prompt-functions=]] list.
|
||||
|
||||
This works in both window system and terminal and is customizable, you
|
||||
can use =C-n=, =C-p= to navigate, =q= to quit and even press =6= as a
|
||||
shortcut to select the 6th candidate.
|
||||
|
||||
*** Roll your own
|
||||
|
||||
See the documentation on variable [[sym:yas-prompt-functions][=yas-prompt-functions=]]
|
69
doc/snippet-menu.org
Normal file
69
doc/snippet-menu.org
Normal file
@ -0,0 +1,69 @@
|
||||
#+SETUPFILE: org-setup.inc
|
||||
|
||||
#+TITLE: YASnippet menu
|
||||
|
||||
When [[sym:yas-minor-mode][=yas-minor-mode=]] is active, YASnippet will setup a menu just after
|
||||
the "Buffers" menu in the menubar.
|
||||
|
||||
In this menu, you can find
|
||||
|
||||
- The currently loaded snippet definitions, organized by major mode,
|
||||
and optional grouping.
|
||||
|
||||
- A rundown of the most common commands, (followed by their
|
||||
keybindings) including commands to load directories and reload all
|
||||
snippet definitions.
|
||||
|
||||
- A series of submenus for customizing and exploring YASnippet
|
||||
behavior.
|
||||
|
||||
[[./images/menu-1.png]]
|
||||
|
||||
* Loading snippets from menu
|
||||
|
||||
Invoking "Load snippets..." from the menu invokes [[sym:yas-load-directory][=yas-load-directory=]]
|
||||
and prompts you for a snippet directory hierarchy to load.
|
||||
|
||||
Also useful is the "Reload everything" item to invoke [[#yas-reload-all][=yas-reload-all=]]
|
||||
which uncondionally reloads all the snippets directories defined in
|
||||
[[sym:yas-snippet-dirs][=yas-snippet-dirs=]] and rebuilds the menus.
|
||||
|
||||
* Snippet menu behavior
|
||||
|
||||
YASnippet will list in this section all the loaded snippet definitions
|
||||
organized by snippet table name.
|
||||
|
||||
You can use this section to explore currently loaded snippets. If you
|
||||
click on one of them, the default behavior is to expand it,
|
||||
unconditionally, inside the current buffer.
|
||||
|
||||
You can however, customize variable [[sym:yas-visit-from-menu][=yas-visit-from-menu=]] to be =t=
|
||||
which will take you to the snippet definition file when you select it
|
||||
from the menu.
|
||||
|
||||
If you want the menu show only snippet tables whose name corresponds to
|
||||
a "real" major mode. You do this by setting [[sym:yas-use-menu][=yas-use-menu=]] to
|
||||
'=real-modes=.
|
||||
|
||||
Finally, to have the menu show only the tables for the currently active
|
||||
mode, set [[sym:yas-use-menu][=yas-use-menu=]] to =abbreviate=.
|
||||
|
||||
These customizations can also be found in the menu itself, under the
|
||||
"Snippet menu behavior" submenu.
|
||||
|
||||
* Controlling indenting
|
||||
|
||||
The "Indenting" submenu contains options to control the values of
|
||||
[[sym:yas-indent-line][=yas-indent-line=]] and [[sym:yas-also-auto-indent-first-line][=yas-also-auto-indent-first-line=]]. See
|
||||
[[./snippet-development.org][Writing snippets]] .
|
||||
|
||||
* Prompting method
|
||||
|
||||
The "Prompting method" submenu contains options to control the value of
|
||||
[[sym:yas-prompt-functions][=yas-prompt-functions=]]. See [[./snippet-expansion.org][Expanding
|
||||
snippets]] .
|
||||
|
||||
* Misc
|
||||
|
||||
The "Misc" submenu contains options to control the values of more
|
||||
variables.
|
121
doc/snippet-organization.org
Normal file
121
doc/snippet-organization.org
Normal file
@ -0,0 +1,121 @@
|
||||
#+SETUPFILE: org-setup.inc
|
||||
|
||||
#+TITLE: Organizing snippets
|
||||
|
||||
* Basic structure
|
||||
|
||||
Snippet collections can be stored in plain text files. They are arranged by
|
||||
sub-directories naming *snippet tables*. These mostly name Emacs major names.
|
||||
|
||||
#+begin_example
|
||||
.
|
||||
|-- c-mode
|
||||
| `-- printf
|
||||
|-- java-mode
|
||||
| `-- println
|
||||
`-- text-mode
|
||||
|-- email
|
||||
`-- time
|
||||
#+end_example
|
||||
|
||||
The collections are loaded into *snippet tables* which the
|
||||
triggering mechanism (see [[file:snippet-expansion.org][Expanding Snippets]]) looks up and
|
||||
(hopefully) causes the right snippet to be expanded for you.
|
||||
|
||||
* Setting up =yas-snippet-dirs=
|
||||
|
||||
The emacs variable [[sym:yas-snippet-dirs][=yas-snippet-dirs=]] tells YASnippet
|
||||
which collections to consider. It's used when you activate
|
||||
[[sym:yas-global-mode][=yas-global-mode=]] or call
|
||||
[[sym:yas-reload-all][=yas-reload-all=]] interactively.
|
||||
|
||||
The default considers:
|
||||
|
||||
- a personal collection that lives in =~/.emacs.d/snippets=
|
||||
- the bundled collection, taken as a relative path to =yasnippet.el= localtion
|
||||
|
||||
When you come across other snippet collections, do the following to try them
|
||||
out:
|
||||
|
||||
#+begin_src emacs-lisp :exports code
|
||||
;; Develop in ~/emacs.d/mysnippets, but also
|
||||
;; try out snippets in ~/Downloads/interesting-snippets
|
||||
(setq yas-snippet-dirs '("~/emacs.d/mysnippets"
|
||||
"~/Downloads/interesting-snippets"))
|
||||
|
||||
;; OR, keeping YASnippet defaults try out ~/Downloads/interesting-snippets
|
||||
(setq yas-snippet-dirs (append yas-snippet-dirs
|
||||
'("~/Downloads/interesting-snippets")))
|
||||
#+end_src
|
||||
|
||||
Collections appearing earlier in the list shadow snippets with same names
|
||||
appearing in collections later in the list. [[sym:yas-new-snippet][=yas-new-snippet=]] always stores
|
||||
snippets in the first collection.
|
||||
|
||||
* The =.yas-parents= file
|
||||
|
||||
It's very useful to have certain modes share snippets between
|
||||
themselves. To do this, choose a mode subdirectory and place a
|
||||
=.yas-parents= containing a whitespace-separated list of other mode
|
||||
names. When you reload those modes become parents of the original
|
||||
mode.
|
||||
|
||||
#+begin_example
|
||||
.
|
||||
|-- c-mode
|
||||
| |-- .yas-parents # contains "cc-mode text-mode"
|
||||
| `-- printf
|
||||
|-- cc-mode
|
||||
| |-- for
|
||||
| `-- while
|
||||
|-- java-mode
|
||||
| |-- .yas-parents # contains "cc-mode text-mode"
|
||||
| `-- println
|
||||
`-- text-mode
|
||||
|-- email
|
||||
`-- time
|
||||
#+end_example
|
||||
|
||||
|
||||
* TODO The =.yas-make-groups= file
|
||||
|
||||
If you place an empty plain text file =.yas-make-groups= inside one
|
||||
of the mode directories, the names of these sub-directories are
|
||||
considered groups of snippets and [[snippet-menu.org][the menu]] is organized much more
|
||||
cleanly:
|
||||
|
||||
[[./images/menu-groups.png]]
|
||||
|
||||
Another way to achieve this is to place a =# group:= directive
|
||||
inside the snippet definition. See [[./snippet-development.org][Writing Snippets]].
|
||||
|
||||
#+begin_example
|
||||
$ tree ruby-mode/
|
||||
ruby-mode/
|
||||
|-- .yas-make-groups
|
||||
|-- collections
|
||||
| |-- each
|
||||
| `-- ...
|
||||
|-- control structure
|
||||
| |-- forin
|
||||
| `-- ...
|
||||
|-- definitions
|
||||
| `-- ...
|
||||
`-- general
|
||||
`-- ...
|
||||
#+end_example
|
||||
|
||||
Yet another way to create a nice snippet menu is to write into
|
||||
=.yas-make-groups= a menu definition. TODO
|
||||
|
||||
* TODO The =.yas-setup.el= file
|
||||
|
||||
** TODO
|
||||
|
||||
* TODO The =.yas-compiled-snippet.el= file
|
||||
|
||||
** TODO
|
||||
|
||||
* TODO The =.yas-skip= file
|
||||
|
||||
** TODO
|
15
doc/snippet-reference.org
Normal file
15
doc/snippet-reference.org
Normal file
@ -0,0 +1,15 @@
|
||||
#+SETUPFILE: org-setup.inc
|
||||
|
||||
#+TITLE: Reference
|
||||
|
||||
* Reference
|
||||
|
||||
#+BEGIN_SRC emacs-lisp :exports results :results value raw
|
||||
(yas--document-symbols 2 `("Interactive functions" . ,#'interactive-form)
|
||||
`("Customization variables" . ,#'(lambda (sym)
|
||||
(and (boundp sym)
|
||||
(get sym 'standard-value))))
|
||||
`("Useful functions" . ,#'fboundp)
|
||||
`("Useful variables" . ,#'boundp))
|
||||
#+END_SRC
|
||||
|
@ -24,47 +24,66 @@
|
||||
|
||||
;;; Code:
|
||||
|
||||
(eval-when-compile
|
||||
(require 'cl))
|
||||
(require 'org)
|
||||
(require 'org-publish)
|
||||
(require 'yasnippet) ; docstrings must be loaded
|
||||
|
||||
(defun yas--document-symbol (symbol level)
|
||||
(flet ((concat-lines (&rest lines)
|
||||
(mapconcat #'identity lines "\n")))
|
||||
(let* ((stars (make-string level ?*))
|
||||
(args (and (fboundp symbol)
|
||||
(mapcar #'symbol-name (help-function-arglist symbol t))))
|
||||
(heading (cond ((fboundp symbol)
|
||||
(format "%s =%s= (%s)"
|
||||
stars
|
||||
symbol
|
||||
(mapconcat #'symbol-name
|
||||
(help-function-arglist symbol t) " ")))
|
||||
(format
|
||||
"%s =%s= (%s)" stars symbol
|
||||
(mapconcat (lambda (a)
|
||||
(format (if (string-prefix-p "&" a)
|
||||
"/%s/" "=%s=") a))
|
||||
args " ")))
|
||||
(t
|
||||
(format "%s =%s=\n" stars symbol))))
|
||||
(after-heading
|
||||
(concat-lines ":PROPERTIES:"
|
||||
(format ":CUSTOM_ID: %s" symbol)
|
||||
":END:"))
|
||||
(body (or (cond ((boundp symbol)
|
||||
(body (or (cond ((fboundp symbol)
|
||||
(let ((doc-synth (car-safe (get symbol 'function-documentation))))
|
||||
(if (functionp doc-synth)
|
||||
(funcall doc-synth nil)
|
||||
(documentation symbol t))))
|
||||
((boundp symbol)
|
||||
(documentation-property symbol 'variable-documentation t))
|
||||
((fboundp symbol)
|
||||
(documentation-property symbol 'function-documentation t))
|
||||
(t
|
||||
(format "*WARNING*: no symbol named =%s=" symbol)))
|
||||
(format "*WARNING*: no doc for symbol =%s=" symbol)))
|
||||
(case-fold-search nil))
|
||||
;; do some transformations on the body: FOO becomes /foo/ and
|
||||
;; do some transformations on the body:
|
||||
;; ARGxxx becomes @<code>arg@</code>xxx
|
||||
;; FOO becomes /foo/
|
||||
;; `bar' becomes [[#bar][=bar=]]
|
||||
(setq body (replace-regexp-in-string
|
||||
"[A-Z][A-Z-]+" #'(lambda (match)
|
||||
(format "/%s/" (downcase match)))
|
||||
body)
|
||||
body (replace-regexp-in-string "`\\([a-z-]+\\)'" #'(lambda (match)
|
||||
(let* ((name (downcase (match-string 1 match)))
|
||||
(sym (intern name)))
|
||||
(if (and (or (boundp sym)
|
||||
(fboundp sym))
|
||||
(save-match-data
|
||||
(string-match "^yas-" name)))
|
||||
(format "[[#%s][=%s=]]"
|
||||
name name)
|
||||
(format "=%s=" name))))
|
||||
body))
|
||||
"\\<\\([A-Z][-A-Z0-9]+\\)\\(\\sw+\\)?\\>"
|
||||
#'(lambda (match)
|
||||
(let* ((match1 (downcase (match-string 1 match)))
|
||||
(suffix (match-string 2 match))
|
||||
(fmt (cond
|
||||
((member match1 args) "@<code>%s@</code>")
|
||||
((null suffix) "/%s/"))))
|
||||
(if fmt (format fmt match1)
|
||||
match)))
|
||||
body t t 1)
|
||||
body (replace-regexp-in-string
|
||||
"`\\([a-z-]+\\)'"
|
||||
#'(lambda (match)
|
||||
(let* ((name (downcase (match-string 1 match)))
|
||||
(sym (intern name)))
|
||||
(if (memq sym yas--exported-syms)
|
||||
(format "[[#%s][=%s=]]" name name)
|
||||
(format "=%s=" name))))
|
||||
body t))
|
||||
;; output the paragraph
|
||||
;;
|
||||
(concat-lines heading
|
||||
@ -72,8 +91,7 @@
|
||||
body))))
|
||||
|
||||
(defun yas--document-symbols (level &rest names-and-predicates)
|
||||
(let ((sym-lists (make-vector (length names-and-predicates) (list)))
|
||||
(retval ""))
|
||||
(let ((sym-lists (make-vector (length names-and-predicates) nil)))
|
||||
(loop for sym in yas--exported-syms
|
||||
do (loop for test in (mapcar #'cdr names-and-predicates)
|
||||
for i from 0
|
||||
@ -82,12 +100,10 @@
|
||||
(return))))
|
||||
(loop for slist across sym-lists
|
||||
for name in (mapcar #'car names-and-predicates)
|
||||
do (progn
|
||||
(setq retval
|
||||
(concat retval
|
||||
(format "\n** %s\n" name)
|
||||
(mapconcat #'yas--document-symbol slist "\n\n")))))
|
||||
retval))
|
||||
concat (format "\n** %s\n" name)
|
||||
concat (mapconcat (lambda (sym)
|
||||
(yas--document-symbol sym (1+ level)))
|
||||
slist "\n\n"))))
|
||||
|
||||
(defun yas--internal-link-snippet ()
|
||||
(interactive)
|
||||
@ -95,6 +111,38 @@
|
||||
|
||||
(define-key org-mode-map [M-f8] 'yas--internal-link-snippet)
|
||||
|
||||
;; This lets all the org files be exported to HTML with
|
||||
;; `org-publish-current-project' (C-c C-e P).
|
||||
|
||||
(let* ((rev (or (with-temp-buffer
|
||||
(when (eq (call-process "git" nil t nil
|
||||
"rev-parse" "--verify" "HEAD") 0)
|
||||
(buffer-string)))
|
||||
yas--version))
|
||||
(dir (if load-file-name (file-name-directory load-file-name)
|
||||
default-directory))
|
||||
(proj-plist
|
||||
(list
|
||||
:base-directory dir :publishing-directory dir
|
||||
:html-postamble
|
||||
(concat "<hr><p class='creator'>Generated by %c on %d from "
|
||||
rev "</p>\n"
|
||||
"<p class='xhtml-validation'>%v</p>\n")))
|
||||
(project (assoc "yasnippet" org-publish-project-alist)))
|
||||
(if project
|
||||
(setcdr project proj-plist)
|
||||
(push `("yasnippet" . ,proj-plist)
|
||||
org-publish-project-alist)))
|
||||
|
||||
(defun yas--generate-html-batch ()
|
||||
(let ((org-publish-use-timestamps-flag nil)
|
||||
(org-export-copy-to-kill-ring nil)
|
||||
(org-confirm-babel-evaluate nil)
|
||||
(make-backup-files nil))
|
||||
(org-publish "yasnippet" 'force)))
|
||||
|
||||
|
||||
|
||||
(provide 'yas-doc-helper)
|
||||
;;; yas-doc-helper.el ends here
|
||||
;; Local Variables:
|
||||
|
@ -1 +0,0 @@
|
||||
Subproject commit 0bab270103ce27ebd896f80ba303859c549ad3c5
|
@ -1 +0,0 @@
|
||||
Subproject commit 683f6e652cc467e0007f80aa11f174a4d9189f3c
|
@ -1 +0,0 @@
|
||||
Subproject commit 74683ecbb353bd39bb942a6f9c82026f82696cd6
|
@ -1,690 +0,0 @@
|
||||
;; .yas-setup.el for html-mode
|
||||
|
||||
(defvar yas-html-default-tag "p")
|
||||
|
||||
(defvar yas-html-xhtml-attr "")
|
||||
|
||||
(defvar yas-html-just-like-tm nil
|
||||
"Html-mode snippets behave as close to TextMate as possible.")
|
||||
|
||||
(defun yas-html-activate ()
|
||||
(add-to-list (make-local-variable 'yas-extra-modes) 'html-mode))
|
||||
|
||||
(add-hook 'nxml-mode-hook 'yas-html-activate)
|
||||
(add-hook 'rhtml-mode-hook 'yas-html-activate)
|
||||
|
||||
(defun yas-html-remove-preceding-word ()
|
||||
(interactive)
|
||||
(let (word-begin
|
||||
word-end
|
||||
(line-beginning-position (line-beginning-position))
|
||||
(orig-point (point))
|
||||
retval)
|
||||
(save-excursion
|
||||
(when (and (forward-word -1)
|
||||
(setq word-begin (point))
|
||||
(forward-word 1)
|
||||
(setq word-end (point))
|
||||
(< word-begin orig-point)
|
||||
(>= word-end orig-point)
|
||||
(<= (line-beginning-position) word-begin)
|
||||
;; (not (string-match "^[\s\t]+$" " "))
|
||||
)
|
||||
(setq retval
|
||||
(cons
|
||||
(buffer-substring-no-properties word-begin orig-point)
|
||||
(buffer-substring-no-properties word-end orig-point)))
|
||||
(delete-region word-begin word-end)
|
||||
retval))))
|
||||
|
||||
|
||||
(defun yas-html-first-word (string)
|
||||
(replace-regexp-in-string "\\\W.*" "" string))
|
||||
|
||||
(defun yas-html-insert-tag-pair-snippet ()
|
||||
(let* ((tag-and-suffix (or (and yas-selected-text
|
||||
(cons yas-selected-text nil))
|
||||
(yas-html-remove-preceding-word)))
|
||||
(tag (car tag-and-suffix))
|
||||
(suffix (or (cdr tag-and-suffix) ""))
|
||||
(single-no-arg "\\(br\\|hr\\)")
|
||||
(single "\\(img\\|meta\\|link\\|input\\|base\\|area\\|col\\|frame\\|param\\)"))
|
||||
(cond ((null tag)
|
||||
(yas-expand-snippet (format "<${1:%s}>%s</${1:$(yas-html-first-word yas-text)}>%s"
|
||||
(or yas-html-default-tag
|
||||
"p")
|
||||
(if yas-html-just-like-tm "$2" "$0")
|
||||
suffix)))
|
||||
((string-match single-no-arg tag)
|
||||
(insert (format "<%s%s/>%s" tag yas-html-xhtml-attr suffix)))
|
||||
((string-match single tag)
|
||||
(yas-expand-snippet (format "<%s $1%s/>%s" tag yas-html-xhtml-attr suffix)))
|
||||
(t
|
||||
(yas-expand-snippet (format "<%s>%s</%s>%s"
|
||||
tag
|
||||
(if yas-html-just-like-tm "$1" "$0")
|
||||
(replace-regexp-in-string "\\\W.*" "" tag)
|
||||
suffix))))))
|
||||
|
||||
(defun yas-html-wrap-each-line-in-openclose-tag ()
|
||||
(let* ((mirror "${1:$(yas-html-first-word yas-text)}")
|
||||
(yas-html-wrap-newline (when (string-match "\n" yas-selected-text) "\n"))
|
||||
(template (concat (format "<${1:%s}>" (or yas-html-default-tag "p"))
|
||||
yas-selected-text
|
||||
"</" mirror ">")))
|
||||
(setq template (replace-regexp-in-string "\n" (concat "</" mirror ">\n<$1>") template))
|
||||
(yas-expand-snippet template)))
|
||||
|
||||
(defun yas-html-toggle-wrap (string wrap)
|
||||
(or (and string
|
||||
(string-match (format "<%s>\\(.*\\)</%s>" wrap wrap)
|
||||
string)
|
||||
(match-string 1 string))
|
||||
(concat wrap string wrap)))
|
||||
|
||||
(defun yas-html-between-tag-pair-p ()
|
||||
(save-excursion
|
||||
(backward-word)
|
||||
(looking-at "\\\w+></\\\w+>")))
|
||||
|
||||
(defun yas-html-id-from-string (string)
|
||||
(replace-regexp-in-string " " "_" (downcase string)))
|
||||
|
||||
(defun yas-html-tidy ()
|
||||
(interactive)
|
||||
(let ((start (or (and mark-active
|
||||
(region-beginning))
|
||||
(point-min)))
|
||||
(end (or (and mark-active
|
||||
(region-end))
|
||||
(point-max)))
|
||||
(orig (point))
|
||||
(orig-line (count-screen-lines (window-start) (line-beginning-position))))
|
||||
(shell-command-on-region start end "tidy" (current-buffer) t (get-buffer-create "*tidy errors*") t)
|
||||
(goto-char (min (point-max) orig))
|
||||
(recenter (1- orig-line))))
|
||||
|
||||
(defun yas-html-tag-description ()
|
||||
(interactive)
|
||||
(let* ((tag-at-point (sgml-beginning-of-tag))
|
||||
(fragment (and tag-at-point
|
||||
(cdr (assoc (upcase tag-at-point) yas-html-tag-description-urls)))))
|
||||
(if fragment
|
||||
(browse-url (concat "http://www.w3.org/TR/html4/index/"
|
||||
fragment))
|
||||
(if tag-at-point
|
||||
(message "No documentation for " tag-at-point)
|
||||
(message "Not on a HTML tag.")))))
|
||||
|
||||
(defvar yas-html-tag-description-urls
|
||||
'(("A" . "../struct/links.html#edef-A")
|
||||
("ABBR" . "../struct/text.html#edef-ABBR")
|
||||
("ACRONYM" . "../struct/text.html#edef-ACRONYM")
|
||||
("ADDRESS" . "../struct/global.html#edef-ADDRESS")
|
||||
("APPLET" . "../struct/objects.html#edef-APPLET")
|
||||
("AREA" . "../struct/objects.html#edef-AREA")
|
||||
("B" . "../present/graphics.html#edef-B")
|
||||
("BASE" . "../struct/links.html#edef-BASE")
|
||||
("BASEFONT" . "../present/graphics.html#edef-BASEFONT")
|
||||
("BDO" . "../struct/dirlang.html#edef-BDO")
|
||||
("BIG" . "../present/graphics.html#edef-BIG")
|
||||
("BLOCKQUOTE" . "../struct/text.html#edef-BLOCKQUOTE")
|
||||
("BODY" . "../struct/global.html#edef-BODY")
|
||||
("BR" . "../struct/text.html#edef-BR")
|
||||
("BUTTON" . "../interact/forms.html#edef-BUTTON")
|
||||
("CAPTION" . "../struct/tables.html#edef-CAPTION")
|
||||
("CENTER" . "../present/graphics.html#edef-CENTER")
|
||||
("CITE" . "../struct/text.html#edef-CITE")
|
||||
("CODE" . "../struct/text.html#edef-CODE")
|
||||
("COL" . "../struct/tables.html#edef-COL")
|
||||
("COLGROUP" . "../struct/tables.html#edef-COLGROUP")
|
||||
("DD" . "../struct/lists.html#edef-DD")
|
||||
("DEL" . "../struct/text.html#edef-del")
|
||||
("DFN" . "../struct/text.html#edef-DFN")
|
||||
("DIR" . "../struct/lists.html#edef-DIR")
|
||||
("DIV" . "../struct/global.html#edef-DIV")
|
||||
("DL" . "../struct/lists.html#edef-DL")
|
||||
("DT" . "../struct/lists.html#edef-DT")
|
||||
("EM" . "../struct/text.html#edef-EM")
|
||||
("FIELDSET" . "../interact/forms.html#edef-FIELDSET")
|
||||
("FONT" . "../present/graphics.html#edef-FONT")
|
||||
("FORM" . "../interact/forms.html#edef-FORM")
|
||||
("FRAME" . "../present/frames.html#edef-FRAME")
|
||||
("FRAMESET" . "../present/frames.html#edef-FRAMESET")
|
||||
("H1" . "../struct/global.html#edef-H1")
|
||||
("H2" . "../struct/global.html#edef-H2")
|
||||
("H3" . "../struct/global.html#edef-H3")
|
||||
("H4" . "../struct/global.html#edef-H4")
|
||||
("H5" . "../struct/global.html#edef-H5")
|
||||
("H6" . "../struct/global.html#edef-H6")
|
||||
("HEAD" . "../struct/global.html#edef-HEAD")
|
||||
("HR" . "../present/graphics.html#edef-HR")
|
||||
("HTML" . "../struct/global.html#edef-HTML")
|
||||
("I" . "../present/graphics.html#edef-I")
|
||||
("IFRAME" . "../present/frames.html#edef-IFRAME")
|
||||
("IMG" . "../struct/objects.html#edef-IMG")
|
||||
("INPUT" . "../interact/forms.html#edef-INPUT")
|
||||
("INS" . "../struct/text.html#edef-ins")
|
||||
("ISINDEX" . "../interact/forms.html#edef-ISINDEX")
|
||||
("KBD" . "../struct/text.html#edef-KBD")
|
||||
("LABEL" . "../interact/forms.html#edef-LABEL")
|
||||
("LEGEND" . "../interact/forms.html#edef-LEGEND")
|
||||
("LI" . "../struct/lists.html#edef-LI")
|
||||
("LINK" . "../struct/links.html#edef-LINK")
|
||||
("MAP" . "../struct/objects.html#edef-MAP")
|
||||
("MENU" . "../struct/lists.html#edef-MENU")
|
||||
("META" . "../struct/global.html#edef-META")
|
||||
("NOFRAMES" . "../present/frames.html#edef-NOFRAMES")
|
||||
("NOSCRIPT" . "../interact/scripts.html#edef-NOSCRIPT")
|
||||
("OBJECT" . "../struct/objects.html#edef-OBJECT")
|
||||
("OL" . "../struct/lists.html#edef-OL")
|
||||
("OPTGROUP" . "../interact/forms.html#edef-OPTGROUP")
|
||||
("OPTION" . "../interact/forms.html#edef-OPTION")
|
||||
("P" . "../struct/text.html#edef-P")
|
||||
("PARAM" . "../struct/objects.html#edef-PARAM")
|
||||
("PRE" . "../struct/text.html#edef-PRE")
|
||||
("Q" . "../struct/text.html#edef-Q")
|
||||
("S" . "../present/graphics.html#edef-S")
|
||||
("SAMP" . "../struct/text.html#edef-SAMP")
|
||||
("SCRIPT" . "../interact/scripts.html#edef-SCRIPT")
|
||||
("SELECT" . "../interact/forms.html#edef-SELECT")
|
||||
("SMALL" . "../present/graphics.html#edef-SMALL")
|
||||
("SPAN" . "../struct/global.html#edef-SPAN")
|
||||
("STRIKE" . "../present/graphics.html#edef-STRIKE")
|
||||
("STRONG" . "../struct/text.html#edef-STRONG")
|
||||
("STYLE" . "../present/styles.html#edef-STYLE")
|
||||
("SUB" . "../struct/text.html#edef-SUB")
|
||||
("SUP" . "../struct/text.html#edef-SUP")
|
||||
("TABLE" . "../struct/tables.html#edef-TABLE")
|
||||
("TBODY" . "../struct/tables.html#edef-TBODY")
|
||||
("TD" . "../struct/tables.html#edef-TD")
|
||||
("TEXTAREA" . "../interact/forms.html#edef-TEXTAREA")
|
||||
("TFOOT" . "../struct/tables.html#edef-TFOOT")
|
||||
("TH" . "../struct/tables.html#edef-TH")
|
||||
("THEAD" . "../struct/tables.html#edef-THEAD")
|
||||
("TITLE" . "../struct/global.html#edef-TITLE")
|
||||
("TR" . "../struct/tables.html#edef-TR")
|
||||
("TT" . "../present/graphics.html#edef-TT")
|
||||
("U" . "../present/graphics.html#edef-U")
|
||||
("UL" . "../struct/lists.html#edef-UL")
|
||||
("VAR" . "../struct/text.html#edef-VAR")))
|
||||
|
||||
;;
|
||||
;;
|
||||
;; Substitutions for: content
|
||||
;; # as in Snippets/Emphasize.yasnippet
|
||||
;; ${TM_SELECTED_TEXT/\A<em>(.*)<\/em>\z|.*/(?1:$1:<em>$0<\/em>)/m} =yyas> `(yas-html-toggle-wrap yas-selected-text "em")`
|
||||
;; ${TM_SELECTED_TEXT/\A<strong>(.*)<\/strong>\z|.*/(?1:$1:<strong>$0<\/strong>)/m} =yyas> `(yas-html-toggle-wrap yas-selected-text "strong")`
|
||||
;; ${1/\s.*//} =yyas> ${1:$(replace-regexp-in-string "[\s\t\n].*" "" yas-text)}
|
||||
;; ${1/[[:alpha:]]+|( )/(?1:_:\L$0)/g} =yyas> ${1:$(replace-regexp-in-string " " "_" (downcase yas-text))}
|
||||
;; ${TM_XHTML} =yyas> `yas-html-xhtml-attr`
|
||||
|
||||
|
||||
;; # as in Commands/Preview in All Active Browsers.yasnippet
|
||||
;; 970EE6B4-A091-11D9-A5A2-000D93C8BE28 =yyas> (browse-url-of-buffer)
|
||||
;; 637CEA2B-578C-429C-BB74-30E8D42BFA22 =yyas> (yas-html-tag-description)
|
||||
;; 2ED44A32-C353-447F-BAE4-E3522DB6944D =yyas> (yas-html-insert-tag-pair-snippet)
|
||||
;; 991E7EBD-F3F5-469A-BA01-DC30E04AD472 =yyas> (yas-html-wrap-each-line-in-openclose-tag)
|
||||
|
||||
;; Substitutions for: binding
|
||||
;;
|
||||
;; # as in Snippets/Strong.yasnippet
|
||||
;; @b =yyas> s-b
|
||||
;;
|
||||
;; # as in Snippets/Emphasize.yasnippet
|
||||
;; ^@i =yyas>
|
||||
;; @i =yyas> s-i
|
||||
;;
|
||||
;; # as in Snippets/Wrap Selection In Tag.yasnippet
|
||||
;; ^W =yyas> C-c M-w
|
||||
;;
|
||||
;; # as in Commands/Insert Tag Pair.yasnippet
|
||||
;; ^< =yyas> C-<
|
||||
;;
|
||||
;; # as in Commands/Documentation for Tag.yasnippet
|
||||
;; ^h =yyas> C-c M-h
|
||||
;;
|
||||
;; # as in Commands/Wrap Each Selected Line in OpenClose Tag.yasnippet
|
||||
;; ^@W =yyas> C-c M-W
|
||||
;;
|
||||
;; # as in Snippets/XHTML   NonBreakingSpace.yasnippet
|
||||
;; ~ =yyas> (yas-unknown)
|
||||
;;
|
||||
;; # as in Commands/Insert Entity.yasnippet
|
||||
;; @& =yyas> (yas-unknown)
|
||||
;;
|
||||
;; # as in Commands/Refresh All Active Browsers.yasnippet
|
||||
;; @r =yyas> (yas-unknown)
|
||||
;;
|
||||
;; # as in Commands/Persistent Include.yasnippet
|
||||
;; ^@i =yyas> (yas-unknown)
|
||||
;;
|
||||
;; # as in Commands/CodeCompletion HTML Tags.yasnippet
|
||||
;; ~ =yyas> (yas-unknown)
|
||||
;;
|
||||
;; # as in Commands/Update Includes.yasnippet
|
||||
;; ^@u =yyas> (yas-unknown)
|
||||
;;
|
||||
;; # as in Macros/Delete whitespace between tags.yasnippet
|
||||
;; ^~ =yyas> (yas-unknown)
|
||||
;;
|
||||
;; # as in Commands/Tidy.yasnippet
|
||||
;; ^H =yyas> (yas-unknown)
|
||||
;;
|
||||
;;
|
||||
;; --**--
|
||||
;; Automatically generated code, do not edit this part
|
||||
;;
|
||||
;; Translated menu
|
||||
;;
|
||||
(yas-define-menu 'html-mode
|
||||
'(;; Documentation for Tag
|
||||
(yas-item "637CEA2B-578C-429C-BB74-30E8D42BFA22")
|
||||
;; Ignoring Validate Syntax (W3C)
|
||||
(yas-ignore-item "3F26240E-6E4A-11D9-B411-000D93589AF6")
|
||||
|
||||
;; Open Document in Running Browser(s)
|
||||
(yas-item "970EE6B4-A091-11D9-A5A2-000D93C8BE28")
|
||||
;; Ignoring Refresh Running Browser(s)
|
||||
(yas-ignore-item "B8651C6E-A05E-11D9-86AC-000D93C8BE28")
|
||||
|
||||
(yas-submenu "Entities"
|
||||
(;; Ignoring Convert Character / Selection to Entities
|
||||
(yas-ignore-item "3DD8406C-A116-11D9-A5A2-000D93C8BE28")
|
||||
;; Ignoring Convert Character / Selection to Entities Excl. Tags
|
||||
(yas-ignore-item "43C9E8AE-3E53-4B82-A1AF-56697BB3EF09")
|
||||
;; Ignoring Decode Entities in Line / Selection
|
||||
(yas-ignore-item "C183920D-A126-11D9-A5A2-000D93C8BE28")
|
||||
|
||||
;; Non-Breaking Space
|
||||
(yas-item "73B40BAE-A295-11D9-87F7-000D93C8BE28")
|
||||
;; →
|
||||
(yas-item "C70BB693-0954-4440-AEB4-F2ADD6D923F0")
|
||||
;; ←
|
||||
(yas-item "C0418A4A-7E42-4D49-8F86-6E339296CB84")
|
||||
;; ⇤
|
||||
(yas-item "7F102705-27D8-4029-BF61-2F042FB61E06")
|
||||
;; ⌅
|
||||
(yas-item "7062316B-4236-4793-AD35-05E4A6577393")
|
||||
;; ⌃
|
||||
(yas-item "B4987DA5-9C2F-4D2D-AC14-678115079205")
|
||||
;; ⌦
|
||||
(yas-item "44E448B6-37CE-4BFE-8611-C5113593B74B")
|
||||
;; ↩
|
||||
(yas-item "9B216475-D73D-4518-851F-CACD0066A909")
|
||||
;; ⇥
|
||||
(yas-item "ADC78A82-40C2-4AAC-8968-93AF0ED98DF0")
|
||||
;; ⌫
|
||||
(yas-item "38E50882-27AF-4246-A039-355C3E1A699E")
|
||||
;; ⌘
|
||||
(yas-item "7214ACD1-93D9-4D3F-A428-8A7302E0A35E")
|
||||
;; ↓
|
||||
(yas-item "35654B4E-2D76-4CD3-8FBB-2DA1F314BA19")
|
||||
;; →
|
||||
(yas-item "AC15621A-8A16-40DD-A671-EA4C37637215")
|
||||
;; ↑
|
||||
(yas-item "0E2F4A47-EADE-4A05-931E-FC874FA28FC3")
|
||||
;; ⇧
|
||||
(yas-item "1B8D58B9-D9DB-484C-AACD-5D5DF5385308")
|
||||
;; ⎋
|
||||
(yas-item "D7CC7C7C-CD01-4357-AF91-AEFFD914DF98")
|
||||
;; ⌥
|
||||
(yas-item "980A8D39-CA8B-4EC2-9739-DC36A262F28E")
|
||||
(yas-separator)
|
||||
;; Ignoring Insert Entity…
|
||||
(yas-ignore-item "89E5CC0A-3EFF-4DEF-A299-2E9651DE6529")))
|
||||
(yas-submenu "URL Escapes"
|
||||
(;; Ignoring URL Escape Line / Selection
|
||||
(yas-ignore-item "6B024865-6095-4CE3-8EDD-DC6F2230C2FF")
|
||||
;; Ignoring URL Unescape Line / Selection
|
||||
(yas-ignore-item "2C4C9673-B166-432A-8938-75A5CA622481")))
|
||||
;; Ignoring Encrypt Line / Selection (ROT 13)
|
||||
(yas-ignore-item "9B13543F-8356-443C-B6E7-D9259B604927")
|
||||
|
||||
;; Ignoring CodeCompletion HTML Attributes
|
||||
(yas-ignore-item "CBD82CF3-74E9-4E7A-B3F6-9348754EB5AA")
|
||||
;; Insert Open/Close Tag (With Current Word)
|
||||
(yas-item "2ED44A32-C353-447F-BAE4-E3522DB6944D")
|
||||
;; Ignoring Insert Close Tag
|
||||
(yas-ignore-item "0658019F-3635-462E-AAC2-74E4FE508A9B")
|
||||
(yas-submenu "Insert DocType"
|
||||
(;; HTML — 4.01 Strict
|
||||
(yas-item "944F1410-188C-4D70-8340-CECAA56FC7F2")
|
||||
;; HTML — 4.01 Transitional
|
||||
(yas-item "B2AAEE56-42D8-42C3-8F67-865473F50E8D")
|
||||
(yas-separator)
|
||||
;; XHTML — 1.0 Frameset
|
||||
(yas-item "9ED6ABBE-A802-11D9-BFC8-000D93C8BE28")
|
||||
;; XHTML — 1.0 Strict
|
||||
(yas-item "C8B83564-A802-11D9-BFC8-000D93C8BE28")
|
||||
;; XHTML — 1.0 Transitional
|
||||
(yas-item "7D8C2F74-A802-11D9-BFC8-000D93C8BE28")
|
||||
;; XHTML — 1.1
|
||||
(yas-item "5CE8FC6E-A802-11D9-BFC8-000D93C8BE28")))
|
||||
(yas-submenu "Insert Tag"
|
||||
(;; Ignoring CodeCompletion HTML Tags
|
||||
(yas-ignore-item "3463E85F-F500-49A0-8631-D78ED85F9D60")
|
||||
|
||||
;; Base
|
||||
(yas-item "4462A6B8-A08A-11D9-A5A2-000D93C8BE28")
|
||||
;; Body
|
||||
(yas-item "4905D47B-A08B-11D9-A5A2-000D93C8BE28")
|
||||
;; Br
|
||||
(yas-item "3E008E42-A5C9-11D9-9BCD-000D93C8BE28")
|
||||
;; Div
|
||||
(yas-item "576036C0-A60E-11D9-ABD6-000D93C8BE28")
|
||||
;; Embed QT Movie
|
||||
(yas-item "42F15753-9B6D-4DD8-984C-807B94363277")
|
||||
;; Fieldset
|
||||
(yas-item "9BD2BE01-A854-4D55-B584-725D04C075C0")
|
||||
;; Form
|
||||
(yas-item "232C2E8B-A08E-11D9-A5A2-000D93C8BE28")
|
||||
;; Head
|
||||
(yas-item "9CF008C4-A086-11D9-A5A2-000D93C8BE28")
|
||||
;; Heading
|
||||
(yas-item "65BA66DC-A07F-11D9-A5A2-000D93C8BE28")
|
||||
;; Input
|
||||
(yas-item "44180979-A08E-11D9-A5A2-000D93C8BE28")
|
||||
;; Input with Label
|
||||
(yas-item "D8DCCC81-749A-4E2A-B4BC-D109D5799CAA")
|
||||
;; Link
|
||||
(yas-item "77BFD0C0-A08A-11D9-A5A2-000D93C8BE28")
|
||||
;; Mail Anchor
|
||||
(yas-item "81DA4C74-A530-11D9-9BCD-000D93C8BE28")
|
||||
;; Meta
|
||||
(yas-item "DA99AC44-A083-11D9-A5A2-000D93C8BE28")
|
||||
;; Option
|
||||
(yas-item "5820372E-A093-4F38-B25C-B0CCC50A0FC4")
|
||||
;; Script
|
||||
(yas-item "6592050A-A087-11D9-A5A2-000D93C8BE28")
|
||||
;; Script With External Source
|
||||
(yas-item "7D676C4C-A087-11D9-A5A2-000D93C8BE28")
|
||||
;; Select Box
|
||||
(yas-item "26023CFF-C73F-4EF5-9803-E4DBA2CBEADD")
|
||||
;; Style
|
||||
(yas-item "3C518074-A088-11D9-A5A2-000D93C8BE28")
|
||||
;; Table
|
||||
(yas-item "57176082-A12F-11D9-A5A2-000D93C8BE28")
|
||||
;; Text Area
|
||||
(yas-item "AAC9D7B8-A12C-11D9-A5A2-000D93C8BE28")
|
||||
;; Title
|
||||
(yas-item "B62ECABE-A086-11D9-A5A2-000D93C8BE28")))
|
||||
|
||||
(yas-submenu "Includes"
|
||||
(;; Ignoring Add Persistent Include
|
||||
(yas-ignore-item "0D814247-7A00-46EE-A2A4-45FBBF4B1181")
|
||||
;; Ignoring Update Document
|
||||
(yas-ignore-item "4400BCE9-20E3-426E-B1D7-2C0BCA53BCF8")
|
||||
;; Ignoring Help: Persistent Includes
|
||||
(yas-ignore-item "9AFDEB2C-D9F0-423E-8211-EBB089F51F0C")))
|
||||
(yas-submenu "Format"
|
||||
(;; Strong
|
||||
(yas-item "4117D930-B6FA-4022-97E7-ECCAF4E70F63")
|
||||
;; Emphasize
|
||||
(yas-item "EBB98620-3292-4621-BA38-D8A9A65D9551")))
|
||||
(yas-submenu "Conditional Comments"
|
||||
(;; IE Conditional Comment: Internet Explorer
|
||||
(yas-item "0ED6DA73-F38F-4A65-B18F-3379D2BA9387")
|
||||
;; IE Conditional Comment: Internet Explorer 5.0 only
|
||||
(yas-item "3A517A94-001E-464D-8184-1FE56D0D0D70")
|
||||
;; IE Conditional Comment: Internet Explorer 5.5 only
|
||||
(yas-item "E3F8984E-7269-4981-9D30-967AB56A6ACE")
|
||||
;; IE Conditional Comment: Internet Explorer 5.x
|
||||
(yas-item "F3512848-7889-45DA-993B-0547976C8E6D")
|
||||
;; IE Conditional Comment: Internet Explorer 6 and below
|
||||
(yas-item "32BBB9AB-8732-4F91-A587-354941A27B69")
|
||||
;; IE Conditional Comment: Internet Explorer 6 only
|
||||
(yas-item "48DF7485-52EA-49B3-88AF-3A41F933F325")
|
||||
;; IE Conditional Comment: Internet Explorer 7 and above
|
||||
(yas-item "CBC24AF4-88E0-498B-BE50-934B9CF29EC7")
|
||||
;; IE Conditional Comment: NOT Internet Explorer
|
||||
(yas-item "F00170EE-4A82-413F-A88B-85293E69A88B")))
|
||||
|
||||
;; Wrap Selection in Open/Close Tag
|
||||
(yas-item "BC8B8AE2-5F16-11D9-B9C3-000D93589AF6")
|
||||
;; Wrap Each Selected Line in Open/Close Tag
|
||||
(yas-item "991E7EBD-F3F5-469A-BA01-DC30E04AD472")
|
||||
;; Wrap in <?= … ?>
|
||||
(yas-item "912906A0-9A29-434B-AE98-E9DFDE6E48B4")
|
||||
(yas-separator)
|
||||
;; Ignoring Strip HTML Tags from Document / Selection
|
||||
(yas-ignore-item "20D760B5-A127-11D9-A5A2-000D93C8BE28")
|
||||
;; Ignoring Tidy
|
||||
(yas-ignore-item "45F92B81-6F0E-11D9-A1E4-000D9332809C"))
|
||||
'("7B7E945E-A112-11D9-A5A2-000D93C8BE28"
|
||||
"3C44EABE-8D6F-4B1B-AB91-F419FAD1A0AD"
|
||||
"9AFDEB2C-D9F0-423E-8211-EBB089F51F0C"
|
||||
"CBD82CF3-74E9-4E7A-B3F6-9348754EB5AA"
|
||||
"3463E85F-F500-49A0-8631-D78ED85F9D60"
|
||||
"9B13543F-8356-443C-B6E7-D9259B604927"
|
||||
"0D814247-7A00-46EE-A2A4-45FBBF4B1181"
|
||||
"4400BCE9-20E3-426E-B1D7-2C0BCA53BCF8"
|
||||
"6B024865-6095-4CE3-8EDD-DC6F2230C2FF"
|
||||
"3DD8406C-A116-11D9-A5A2-000D93C8BE28"
|
||||
"43C9E8AE-3E53-4B82-A1AF-56697BB3EF09"
|
||||
"C183920D-A126-11D9-A5A2-000D93C8BE28"
|
||||
"2C4C9673-B166-432A-8938-75A5CA622481"
|
||||
"0658019F-3635-462E-AAC2-74E4FE508A9B"
|
||||
"89E5CC0A-3EFF-4DEF-A299-2E9651DE6529"
|
||||
"B8651C6E-A05E-11D9-86AC-000D93C8BE28"
|
||||
"20D760B5-A127-11D9-A5A2-000D93C8BE28"
|
||||
"45F92B81-6F0E-11D9-A1E4-000D9332809C"
|
||||
"3F26240E-6E4A-11D9-B411-000D93589AF6"
|
||||
"B23D6E15-6B33-11D9-86C1-000D93589AF6"
|
||||
"C8B717C2-6B33-11D9-BB47-000D93589AF6"
|
||||
"CD6D2CC6-6B33-11D9-BDFD-000D93589AF6"
|
||||
"7B7E945E-A112-11D9-A5A2-000D93C8BE28"
|
||||
"04332FA8-8157-46C4-9854-8C190FFD96C6"
|
||||
"E6F19171-F664-4B4F-92DA-3E15E6CAD35C"
|
||||
"26068A55-4C84-409D-BA00-162B55AF6961"
|
||||
"EBEE6B51-29C7-4362-818F-A190CACD5296"
|
||||
"65D38039-6B0A-48E9-9E49-43832ECC4107"
|
||||
"CDE8EFD6-9DE2-4E8C-BB6A-52E8CCD2E977"))
|
||||
|
||||
;; Unknown substitutions
|
||||
;;
|
||||
;; Substitutions for: content
|
||||
;;
|
||||
;; # as in Snippets/Emphasize.yasnippet
|
||||
;; `(yas-html-toggle-wrap yas-selected-text "em")` =yyas> (yas-unknown)
|
||||
;;
|
||||
;; # as in Snippets/XHTML h1.yasnippet
|
||||
;; `yas-selected-text` =yyas> (yas-unknown)
|
||||
;;
|
||||
;; # as in Snippets/IE Conditional Comment Internet Explorer 5_0 only.yasnippet
|
||||
;; `(or (yas-selected-text) " IE Conditional Comment: Internet Explorer 5.0 only ")` =yyas> (yas-unknown)
|
||||
;;
|
||||
;; # as in Snippets/IE Conditional Comment Internet Explorer 5_5 only.yasnippet
|
||||
;; `(or (yas-selected-text) " IE Conditional Comment: Internet Explorer 5.5 only ")` =yyas> (yas-unknown)
|
||||
;;
|
||||
;; # as in Snippets/IE Conditional Comment Internet Explorer 5_x.yasnippet
|
||||
;; `(or (yas-selected-text) " IE Conditional Comment: Internet Explorer 5.x ")` =yyas> (yas-unknown)
|
||||
;;
|
||||
;; # as in Snippets/IE Conditional Comment Internet Explorer 6 and below.yasnippet
|
||||
;; `(or (yas-selected-text) " IE Conditional Comment: Internet Explorer 6 and below ")` =yyas> (yas-unknown)
|
||||
;;
|
||||
;; # as in Snippets/IE Conditional Comment Internet Explorer 6 only.yasnippet
|
||||
;; `(or (yas-selected-text) " IE Conditional Comment: Internet Explorer 6 only ")` =yyas> (yas-unknown)
|
||||
;;
|
||||
;; # as in Snippets/IE Conditional Comment Internet Explorer 7+.yasnippet
|
||||
;; `(or (yas-selected-text) " IE Conditional Comment: Internet Explorer 7 and above ")` =yyas> (yas-unknown)
|
||||
;;
|
||||
;; # as in Snippets/IE Conditional Comment Internet Explorer.yasnippet
|
||||
;; `(or (yas-selected-text) " IE Conditional Comment: Internet Explorer ")` =yyas> (yas-unknown)
|
||||
;;
|
||||
;; # as in Snippets/IE Conditional Comment NOT Internet Explorer.yasnippet
|
||||
;; `(or (yas-selected-text) " IE Conditional Comment: NOT Internet Explorer ")` =yyas> (yas-unknown)
|
||||
;;
|
||||
;; # as in Snippets/XHTML meta.yasnippet
|
||||
;; `yas-html-xhtml-attr` =yyas> (yas-unknown)
|
||||
;;
|
||||
;; # as in Snippets/Strong.yasnippet
|
||||
;; `(yas-html-toggle-wrap yas-selected-text "strong")` =yyas> (yas-unknown)
|
||||
;;
|
||||
;; # as in Commands/About Persistent Includes.yasnippet
|
||||
;; 9AFDEB2C-D9F0-423E-8211-EBB089F51F0C =yyas> (yas-unknown)
|
||||
;;
|
||||
;; # as in Commands/CodeCompletion HTML Attributes.yasnippet
|
||||
;; CBD82CF3-74E9-4E7A-B3F6-9348754EB5AA =yyas> (yas-unknown)
|
||||
;;
|
||||
;; # as in Commands/CodeCompletion HTML Tags.yasnippet
|
||||
;; 3463E85F-F500-49A0-8631-D78ED85F9D60 =yyas> (yas-unknown)
|
||||
;;
|
||||
;; # as in Commands/Encrypt Line Selection (ROT 13).yasnippet
|
||||
;; 9B13543F-8356-443C-B6E7-D9259B604927 =yyas> (yas-unknown)
|
||||
;;
|
||||
;; # as in Commands/Persistent Include.yasnippet
|
||||
;; 0D814247-7A00-46EE-A2A4-45FBBF4B1181 =yyas> (yas-unknown)
|
||||
;;
|
||||
;; # as in Commands/Update Includes.yasnippet
|
||||
;; 4400BCE9-20E3-426E-B1D7-2C0BCA53BCF8 =yyas> (yas-unknown)
|
||||
;;
|
||||
;; # as in Commands/Convert Line Selection to URL Escapes.yasnippet
|
||||
;; 6B024865-6095-4CE3-8EDD-DC6F2230C2FF =yyas> (yas-unknown)
|
||||
;;
|
||||
;; # as in Commands/Convert to HTML Entities.yasnippet
|
||||
;; 3DD8406C-A116-11D9-A5A2-000D93C8BE28 =yyas> (yas-unknown)
|
||||
;;
|
||||
;; # as in Commands/Convert to named entities excl tags.yasnippet
|
||||
;; 43C9E8AE-3E53-4B82-A1AF-56697BB3EF09 =yyas> (yas-unknown)
|
||||
;;
|
||||
;; # as in Commands/Decode HTML Entities.yasnippet
|
||||
;; C183920D-A126-11D9-A5A2-000D93C8BE28 =yyas> (yas-unknown)
|
||||
;;
|
||||
;; # as in Commands/Decode Numeric URL Escapes in Line Selection.yasnippet
|
||||
;; 2C4C9673-B166-432A-8938-75A5CA622481 =yyas> (yas-unknown)
|
||||
;;
|
||||
;; # as in Commands/Insert Close Tag.yasnippet
|
||||
;; 0658019F-3635-462E-AAC2-74E4FE508A9B =yyas> (yas-unknown)
|
||||
;;
|
||||
;; # as in Commands/Insert Entity.yasnippet
|
||||
;; 89E5CC0A-3EFF-4DEF-A299-2E9651DE6529 =yyas> (yas-unknown)
|
||||
;;
|
||||
;; # as in Commands/Refresh All Active Browsers.yasnippet
|
||||
;; B8651C6E-A05E-11D9-86AC-000D93C8BE28 =yyas> (yas-unknown)
|
||||
;;
|
||||
;; # as in Commands/Strip HTML tags.yasnippet
|
||||
;; 20D760B5-A127-11D9-A5A2-000D93C8BE28 =yyas> (yas-unknown)
|
||||
;;
|
||||
;; # as in Commands/Tidy.yasnippet
|
||||
;; 45F92B81-6F0E-11D9-A1E4-000D9332809C =yyas> (yas-unknown)
|
||||
;;
|
||||
;; # as in Commands/W3C validation.yasnippet
|
||||
;; 3F26240E-6E4A-11D9-B411-000D93589AF6 =yyas> (yas-unknown)
|
||||
;;
|
||||
;; # as in DragCommands/Anchor Tag.yasnippet
|
||||
;; B23D6E15-6B33-11D9-86C1-000D93589AF6 =yyas> (yas-unknown)
|
||||
;;
|
||||
;; # as in DragCommands/CSS Link.yasnippet
|
||||
;; C8B717C2-6B33-11D9-BB47-000D93589AF6 =yyas> (yas-unknown)
|
||||
;;
|
||||
;; # as in DragCommands/Image Tag.yasnippet
|
||||
;; CD6D2CC6-6B33-11D9-BDFD-000D93589AF6 =yyas> (yas-unknown)
|
||||
;;
|
||||
;; # as in Macros/Delete whitespace between tags.yasnippet
|
||||
;; 7B7E945E-A112-11D9-A5A2-000D93C8BE28 =yyas> (yas-unknown)
|
||||
;;
|
||||
;; # as in Snippets/XHTML body.yasnippet
|
||||
;; ${TM_FILENAME/(.*)\..*/\L$1/} =yyas> (yas-unknown)
|
||||
;;
|
||||
;; # as in Snippets/XHTML form.yasnippet
|
||||
;; ${TM_FILENAME/(.*?)\..*/$1_submit/} =yyas> (yas-unknown)
|
||||
;;
|
||||
;; # as in Snippets/XHTML title.yasnippet
|
||||
;; ${TM_FILENAME/((.+)\..*)?/(?2:$2:Page Title)/} =yyas> (yas-unknown)
|
||||
;;
|
||||
;; # as in Templates/HTML 4.0 Strict/info.yasnippet
|
||||
;; 04332FA8-8157-46C4-9854-8C190FFD96C6 =yyas> (yas-unknown)
|
||||
;;
|
||||
;; # as in Templates/HTML 4.0 Transitional/info.yasnippet
|
||||
;; E6F19171-F664-4B4F-92DA-3E15E6CAD35C =yyas> (yas-unknown)
|
||||
;;
|
||||
;; # as in Templates/XHTML 1.0 Frameset/info.yasnippet
|
||||
;; 26068A55-4C84-409D-BA00-162B55AF6961 =yyas> (yas-unknown)
|
||||
;;
|
||||
;; # as in Templates/XHTML 1.0 Strict/info.yasnippet
|
||||
;; EBEE6B51-29C7-4362-818F-A190CACD5296 =yyas> (yas-unknown)
|
||||
;;
|
||||
;; # as in Templates/XHTML 1.0 Transitional/info.yasnippet
|
||||
;; 65D38039-6B0A-48E9-9E49-43832ECC4107 =yyas> (yas-unknown)
|
||||
;;
|
||||
;; # as in Templates/XHTML 1.1/info.yasnippet
|
||||
;; CDE8EFD6-9DE2-4E8C-BB6A-52E8CCD2E977 =yyas> (yas-unknown)
|
||||
;;
|
||||
;;
|
||||
|
||||
;; Substitutions for: condition
|
||||
;;
|
||||
;; # as in Templates/XHTML 1.1/info.yasnippet
|
||||
;; text.html =yyas> (yas-unknown)
|
||||
;;
|
||||
;; # as in Commands/CodeCompletion HTML Attributes.yasnippet
|
||||
;; text.html punctuation.definition.tag -source, text.html meta.tag -entity.other.attribute-name -source =yyas> (yas-unknown)
|
||||
;;
|
||||
;; # as in Commands/CodeCompletion HTML Tags.yasnippet
|
||||
;; text.html -entity.other.attribute-name -string.quoted, invalid.illegal.incomplete.html =yyas> (yas-unknown)
|
||||
;;
|
||||
;; # as in Commands/Documentation for Tag.yasnippet
|
||||
;; text.html, text.html entity.name.tag =yyas> (yas-unknown)
|
||||
;;
|
||||
;; # as in Commands/Refresh All Active Browsers.yasnippet
|
||||
;; text.html, source.css =yyas> (yas-unknown)
|
||||
;;
|
||||
;; # as in Snippets/Smart returnindent for tag pairs.yasnippet
|
||||
;; meta.scope.between-tag-pair =yyas> (yas-unknown)
|
||||
;;
|
||||
;; # as in Snippets/Wrap Selection In Tag.yasnippet
|
||||
;; text.html, =yyas> (yas-unknown)
|
||||
;;
|
||||
;; # as in Snippets/Wrap in =.yasnippet
|
||||
;; text.html string =yyas> (yas-unknown)
|
||||
;;
|
||||
;; # as in Snippets/XHTML head.yasnippet
|
||||
;; text.html - text.html source =yyas> (yas-unknown)
|
||||
;;
|
||||
;; # as in Snippets/XHTML title.yasnippet
|
||||
;; text.html - text.blog =yyas> (yas-unknown)
|
||||
;;
|
||||
;;
|
||||
|
||||
;; Substitutions for: binding
|
||||
;;
|
||||
;; # as in Commands/CodeCompletion HTML Tags.yasnippet
|
||||
;; ~ =yyas> (yas-unknown)
|
||||
;;
|
||||
;; # as in Commands/Insert Entity.yasnippet
|
||||
;; @& =yyas> (yas-unknown)
|
||||
;;
|
||||
;; # as in Commands/Persistent Include.yasnippet
|
||||
;; =yyas> (yas-unknown)
|
||||
;;
|
||||
;; # as in Commands/Update Includes.yasnippet
|
||||
;; ^@u =yyas> (yas-unknown)
|
||||
;;
|
||||
;; # as in Commands/Insert Close Tag.yasnippet
|
||||
;; ~@. =yyas> (yas-unknown)
|
||||
;;
|
||||
;; # as in Commands/Refresh All Active Browsers.yasnippet
|
||||
;; @r =yyas> (yas-unknown)
|
||||
;;
|
||||
;; # as in Commands/Tidy.yasnippet
|
||||
;; ^H =yyas> (yas-unknown)
|
||||
;;
|
||||
;; # as in Commands/W3C validation.yasnippet
|
||||
;; ^V =yyas> (yas-unknown)
|
||||
;;
|
||||
;; # as in Macros/Delete whitespace between tags.yasnippet
|
||||
;; ^~ =yyas> (yas-unknown)
|
||||
;;
|
||||
;; # as in Snippets/Smart returnindent for tag pairs.yasnippet
|
||||
;;
=yyas> (yas-unknown)
|
||||
;;
|
||||
;; # as in Snippets/XHTML   NonBreakingSpace.yasnippet
|
||||
;; ~ =yyas> (yas-unknown)
|
||||
;;
|
||||
;; # as in Snippets/XHTML br.yasnippet
|
||||
;; ^
=yyas> (yas-unknown)
|
||||
;;
|
||||
;;
|
||||
|
||||
;; .yas-setup.el for html-mode ends here
|
@ -1,88 +0,0 @@
|
||||
(defun yas-objc-docset-query (query)
|
||||
|
||||
)
|
||||
(defvar yas-objc-method-names (make-vector 1023 0))
|
||||
(defvar yas-objc-class-names (make-vector 1023 0))
|
||||
|
||||
(defvar yas-objc-languages (list))
|
||||
(defvar yas-objc-defkinds (list))
|
||||
|
||||
|
||||
(defun yas-objc-extract-super-list ()
|
||||
(interactive)
|
||||
(setq yas-objc-method-names (make-vector 1023 0)
|
||||
yas-objc-class-names (make-vector 1023 0)
|
||||
yas-objc-languages (list)
|
||||
yas-objc-defkinds (list))
|
||||
(with-temp-buffer
|
||||
(shell-command
|
||||
"/Developer/usr/bin/docsetutil dump -skip-text /Developer/Documentation/DocSets/com.apple.adc.documentation.AppleSnowLeopard.CoreReference.docset/"
|
||||
(current-buffer))
|
||||
(goto-char (point-min))
|
||||
(search-forward-regexp "API index contains .* tokens")
|
||||
(while (search-forward-regexp "^\\([^/]*\\)/\\([^/]*\\)/\\([^/]*\\)/\\([^/]*\\)$" nil 'noerror)
|
||||
(intern (match-string 3) yas-objc-class-names)
|
||||
(intern (match-string 4) yas-objc-method-names)
|
||||
(add-to-list 'yas-objc-languages (match-string 1))
|
||||
(add-to-list 'yas-objc-defkinds (match-string 2)))))
|
||||
|
||||
;; (put (intern-soft (setq chosen (completing-read "Method: " yas-objc-method-names)) yas-objc-method-names)
|
||||
;; 'someshit
|
||||
;; 'someday)
|
||||
|
||||
;; (completing-read "Class: " yas-objc-class-names)
|
||||
|
||||
;; (get (intern-soft (setq chosen (completing-read "hey: " yas-objc-method-names)) yas-objc-method-names)
|
||||
;; 'someshit)
|
||||
|
||||
(defun yas-objc-current-method-signature ()
|
||||
(let ((orig-point (point))
|
||||
(start-point nil)
|
||||
sig
|
||||
orig-ppss
|
||||
ppss)
|
||||
(save-excursion
|
||||
(condition-case nil
|
||||
(while (not (eq (point) (point-min))) (backward-sexp))
|
||||
(error nil))
|
||||
(when (eq (preceding-char) ?\[)
|
||||
(setq orig-ppss (syntax-ppss))
|
||||
(forward-sexp)
|
||||
(skip-chars-forward " \t\n")
|
||||
(setq ppss (syntax-ppss))
|
||||
(while (and (>= (car ppss) (car orig-ppss))
|
||||
(search-forward-regexp "[[:alpha:]]+:" nil 'noerror))
|
||||
(setq ppss (syntax-ppss))
|
||||
(when (eq (car ppss) (car orig-ppss))
|
||||
(setq sig
|
||||
(concat (or sig "") (match-string-no-properties 0)))))
|
||||
sig))))
|
||||
|
||||
(defun yas-objc-current-method-signature ()
|
||||
(let ((orig-point (point))
|
||||
(start-point nil)
|
||||
sig
|
||||
orig-ppss
|
||||
ppss)
|
||||
(save-excursion
|
||||
(condition-case nil
|
||||
(while (not (eq (point) (point-max))) (backward-sexp))
|
||||
(error ))
|
||||
(when (eq (preceding-char) ?\[)
|
||||
(setq orig-ppss (syntax-ppss))
|
||||
(forward-sexp)
|
||||
(skip-chars-forward " \t\n")
|
||||
(setq ppss (syntax-ppss))
|
||||
(condition-case nil
|
||||
(while (and (>= (car ppss) (car orig-ppss))
|
||||
(search-forward-regexp "[[:alpha:]]+:" orig-point 'noerror))
|
||||
(setq ppss (syntax-ppss))
|
||||
(when (eq (car ppss) (car orig-ppss))
|
||||
(setq sig
|
||||
(concat (or sig "") (match-string-no-properties 0))))
|
||||
(forward-sexp))
|
||||
(error nil))
|
||||
(save-excursion
|
||||
(backward-word)
|
||||
(concat sig (buffer-substring-no-properties (point) orig-point)))
|
||||
sig))))
|
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@ -1,468 +0,0 @@
|
||||
#!/usr/bin/env ruby
|
||||
# -*- coding: utf-8 -*-
|
||||
# textmate_import.rb --- import textmate snippets
|
||||
#
|
||||
# Copyright (C) 2009 Rob Christie, 2010 João Távora
|
||||
#
|
||||
# This is a quick script to generate YASnippets from TextMate Snippets.
|
||||
#
|
||||
# I based the script off of a python script of a similar nature by
|
||||
# Jeff Wheeler: http://nokrev.com
|
||||
# http://code.nokrev.com/?p=snippet-copier.git;a=blob_plain;f=snippet_copier.py
|
||||
#
|
||||
# Use textmate_import.rb --help to get usage information.
|
||||
|
||||
require 'rubygems'
|
||||
require 'plist'
|
||||
require 'trollop'
|
||||
require 'fileutils'
|
||||
require 'shellwords' # String#shellescape
|
||||
require 'ruby-debug' if $DEBUG
|
||||
|
||||
Encoding.default_external = Encoding::UTF_8 if RUBY_VERSION > '1.8.7'
|
||||
|
||||
opts = Trollop::options do
|
||||
opt :bundle_dir, "TextMate bundle directory", :short => '-d', :type => :string
|
||||
opt :output_dir, "Output directory", :short => '-o', :type => :string
|
||||
opt :glob, "Specific snippet file (or glob) inside <bundle_dir>", :short => '-g', :default => '*.{tmSnippet,tmCommand,plist,tmMacro}'
|
||||
opt :pretty, 'Pretty prints multiple snippets when printing to standard out', :short => '-p'
|
||||
opt :quiet, "Be quiet", :short => '-q'
|
||||
opt :plist_file, "Use a specific plist file to derive menu information from", :type => :string
|
||||
end
|
||||
Trollop::die :bundle_dir, "must be provided" unless opts.bundle_dir
|
||||
Trollop::die :bundle_dir, "must exist" unless File.directory? opts.bundle_dir
|
||||
|
||||
Trollop::die :output_dir, "must be provided" unless opts.output_dir
|
||||
Trollop::die :output_dir, "must exist" unless File.directory? opts.output_dir
|
||||
|
||||
Trollop::die :plist_file, "must exist" if opts.plist_file && File.directory?(opts.plist_file)
|
||||
|
||||
|
||||
# Represents and is capable of outputting the representation of a
|
||||
# TextMate menu in terms of `yas-define-menu'
|
||||
#
|
||||
class TmSubmenu
|
||||
|
||||
@@excluded_items = [];
|
||||
def self.excluded_items; @@excluded_items; end
|
||||
|
||||
attr_reader :items, :name
|
||||
def initialize(name, hash)
|
||||
@items = hash["items"]
|
||||
@name = name
|
||||
end
|
||||
|
||||
def to_lisp(allsubmenus,
|
||||
deleteditems,
|
||||
indent = 0,
|
||||
thingy = ["(", ")"])
|
||||
|
||||
first = true;
|
||||
|
||||
string = ""
|
||||
separator_useless = true;
|
||||
items.each do |uuid|
|
||||
if deleteditems && deleteditems.index(uuid)
|
||||
$stderr.puts "#{uuid} has been deleted!"
|
||||
next
|
||||
end
|
||||
string += "\n"
|
||||
string += " " * indent
|
||||
string += (first ? thingy[0] : (" " * thingy[0].length))
|
||||
|
||||
submenu = allsubmenus[uuid]
|
||||
snippet = TmSnippet::snippets_by_uid[uuid]
|
||||
unimplemented = TmSnippet::unknown_substitutions["content"][uuid]
|
||||
if submenu
|
||||
str = "(yas-submenu "
|
||||
string += str + "\"" + submenu.name + "\""
|
||||
string += submenu.to_lisp(allsubmenus, deleteditems,
|
||||
indent + str.length + thingy[0].length)
|
||||
elsif snippet and not unimplemented
|
||||
string += ";; " + snippet.name + "\n"
|
||||
string += " " * (indent + thingy[0].length)
|
||||
string += "(yas-item \"" + uuid + "\")"
|
||||
separator_useless = false;
|
||||
elsif snippet and unimplemented
|
||||
string += ";; Ignoring " + snippet.name + "\n"
|
||||
string += " " * (indent + thingy[0].length)
|
||||
string += "(yas-ignore-item \"" + uuid + "\")"
|
||||
separator_useless = true;
|
||||
elsif (uuid =~ /---------------------/)
|
||||
string += "(yas-separator)" unless separator_useless
|
||||
end
|
||||
first = false;
|
||||
end
|
||||
string += ")"
|
||||
string += thingy[1]
|
||||
|
||||
return string
|
||||
end
|
||||
|
||||
def self.main_menu_to_lisp (parsed_plist, modename)
|
||||
mainmenu = parsed_plist["mainMenu"]
|
||||
deleted = parsed_plist["deleted"]
|
||||
|
||||
root = TmSubmenu.new("__main_menu__", mainmenu)
|
||||
all = {}
|
||||
|
||||
mainmenu["submenus"].each_pair do |k,v|
|
||||
all[k] = TmSubmenu.new(v["name"], v)
|
||||
end
|
||||
|
||||
excluded = (mainmenu["excludedItems"] || []) + TmSubmenu::excluded_items
|
||||
closing = "\n '("
|
||||
closing+= excluded.collect do |uuid|
|
||||
"\"" + uuid + "\""
|
||||
end.join( "\n ") + "))"
|
||||
|
||||
str = "(yas-define-menu "
|
||||
return str + "'#{modename}" + root.to_lisp(all,
|
||||
deleted,
|
||||
str.length,
|
||||
["'(" , closing])
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
# Represents a textmate snippet
|
||||
#
|
||||
# - @file is the .tmsnippet/.plist file path relative to cwd
|
||||
#
|
||||
# - optional @info is a Plist.parsed info.plist found in the bundle dir
|
||||
#
|
||||
# - @@snippets_by_uid is where one can find all the snippets parsed so
|
||||
# far.
|
||||
#
|
||||
#
|
||||
class SkipSnippet < RuntimeError; end
|
||||
class TmSnippet
|
||||
@@known_substitutions = {
|
||||
"content" => {
|
||||
"${TM_RAILS_TEMPLATE_START_RUBY_EXPR}" => "<%= ",
|
||||
"${TM_RAILS_TEMPLATE_END_RUBY_EXPR}" => " %>",
|
||||
"${TM_RAILS_TEMPLATE_START_RUBY_INLINE}" => "<% ",
|
||||
"${TM_RAILS_TEMPLATE_END_RUBY_INLINE}" => " -%>",
|
||||
"${TM_RAILS_TEMPLATE_END_RUBY_BLOCK}" => "end" ,
|
||||
"${0:$TM_SELECTED_TEXT}" => "${0:`yas-selected-text`}",
|
||||
/\$\{(\d+)\}/ => "$\\1",
|
||||
"${1:$TM_SELECTED_TEXT}" => "${1:`yas-selected-text`}",
|
||||
"${2:$TM_SELECTED_TEXT}" => "${2:`yas-selected-text`}",
|
||||
'$TM_SELECTED_TEXT' => "`yas-selected-text`",
|
||||
%r'\$\{TM_SELECTED_TEXT:([^\}]*)\}' => "`(or (yas-selected-text) \"\\1\")`",
|
||||
%r'`[^`]+\n[^`]`' => Proc.new {|uuid, match| "(yas-multi-line-unknown " + uuid + ")"}},
|
||||
"condition" => {
|
||||
/^source\..*$/ => "" },
|
||||
"binding" => {},
|
||||
"type" => {}
|
||||
}
|
||||
|
||||
def self.extra_substitutions; @@extra_substitutions; end
|
||||
@@extra_substitutions = {
|
||||
"content" => {},
|
||||
"condition" => {},
|
||||
"binding" => {},
|
||||
"type" => {}
|
||||
}
|
||||
|
||||
def self.unknown_substitutions; @@unknown_substitutions; end
|
||||
@@unknown_substitutions = {
|
||||
"content" => {},
|
||||
"condition" => {},
|
||||
"binding" => {},
|
||||
"type" => {}
|
||||
}
|
||||
|
||||
@@snippets_by_uid={}
|
||||
def self.snippets_by_uid; @@snippets_by_uid; end
|
||||
|
||||
def initialize(file,info=nil)
|
||||
@file = file
|
||||
@info = info
|
||||
@snippet = TmSnippet::read_plist(file)
|
||||
@@snippets_by_uid[self.uuid] = self;
|
||||
raise SkipSnippet.new "not a snippet/command/macro." unless (@snippet["scope"] || @snippet["command"])
|
||||
raise SkipSnippet.new "looks like preferences."if @file =~ /Preferences\//
|
||||
raise RuntimeError.new("Cannot convert this snippet #{file}!") unless @snippet;
|
||||
end
|
||||
|
||||
def name
|
||||
@snippet["name"]
|
||||
end
|
||||
|
||||
def uuid
|
||||
@snippet["uuid"]
|
||||
end
|
||||
|
||||
def key
|
||||
@snippet["tabTrigger"]
|
||||
end
|
||||
|
||||
def condition
|
||||
yas_directive "condition"
|
||||
end
|
||||
|
||||
def type
|
||||
override = yas_directive "type"
|
||||
if override
|
||||
return override
|
||||
else
|
||||
return "# type: command\n" if @file =~ /(Commands\/|Macros\/)/
|
||||
end
|
||||
end
|
||||
|
||||
def binding
|
||||
yas_directive "binding"
|
||||
end
|
||||
|
||||
def content
|
||||
known = @@known_substitutions["content"]
|
||||
extra = @@extra_substitutions["content"]
|
||||
if direct = extra[uuid]
|
||||
return direct
|
||||
else
|
||||
ct = @snippet["content"]
|
||||
if ct
|
||||
known.each_pair do |k,v|
|
||||
if v.respond_to? :call
|
||||
ct.gsub!(k) {|match| v.call(uuid, match)}
|
||||
else
|
||||
ct.gsub!(k,v)
|
||||
end
|
||||
end
|
||||
extra.each_pair do |k,v|
|
||||
ct.gsub!(k,v)
|
||||
end
|
||||
# the remaining stuff is an unknown substitution
|
||||
#
|
||||
[ %r'\$\{ [^/\}\{:]* / [^/]* / [^/]* / [^\}]*\}'x ,
|
||||
%r'\$\{[^\d][^}]+\}',
|
||||
%r'`[^`]+`',
|
||||
%r'\$TM_[\w_]+',
|
||||
%r'\(yas-multi-line-unknown [^\)]*\)'
|
||||
].each do |reg|
|
||||
ct.scan(reg) do |match|
|
||||
@@unknown_substitutions["content"][match] = self
|
||||
end
|
||||
end
|
||||
return ct
|
||||
else
|
||||
@@unknown_substitutions["content"][uuid] = self
|
||||
TmSubmenu::excluded_items.push(uuid)
|
||||
return "(yas-unimplemented)"
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
def to_yas
|
||||
doc = "# -*- mode: snippet -*-\n"
|
||||
doc << (self.type || "")
|
||||
doc << "# uuid: #{self.uuid}\n"
|
||||
doc << "# key: #{self.key}\n" if self.key
|
||||
doc << "# contributor: Translated from textmate snippet by PROGRAM_NAME\n"
|
||||
doc << "# name: #{self.name}\n"
|
||||
doc << (self.binding || "")
|
||||
doc << (self.condition || "")
|
||||
doc << "# --\n"
|
||||
doc << (self.content || "(yas-unimplemented)")
|
||||
doc
|
||||
end
|
||||
|
||||
def self.canonicalize(filename)
|
||||
invalid_char = /[^ a-z_0-9.+=~(){}\/'`&#,-]/i
|
||||
|
||||
filename.
|
||||
gsub(invalid_char, ''). # remove invalid characters
|
||||
gsub(/ {2,}/,' '). # squeeze repeated spaces into a single one
|
||||
rstrip # remove trailing whitespaces
|
||||
end
|
||||
|
||||
def yas_file()
|
||||
File.join(TmSnippet::canonicalize(@file[0, @file.length-File.extname(@file).length]) + ".yasnippet")
|
||||
end
|
||||
|
||||
def self.read_plist(xml_or_binary)
|
||||
begin
|
||||
parsed = Plist::parse_xml(xml_or_binary)
|
||||
return parsed if parsed
|
||||
raise ArgumentError.new "Probably in binary format and parse_xml is very quiet..."
|
||||
rescue StandardError => e
|
||||
if (system "plutil -convert xml1 #{xml_or_binary.shellescape} -o /tmp/textmate_import.tmpxml")
|
||||
return Plist::parse_xml("/tmp/textmate_import.tmpxml")
|
||||
else
|
||||
raise RuntimeError.new "plutil failed miserably, check if you have it..."
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
private
|
||||
|
||||
@@yas_to_tm_directives = {"condition" => "scope", "binding" => "keyEquivalent", "key" => "tabTrigger"}
|
||||
def yas_directive(yas_directive)
|
||||
#
|
||||
# Merge "known" hardcoded substitution with "extra" substitutions
|
||||
# provided in the .yas-setup.el file.
|
||||
#
|
||||
merged = @@known_substitutions[yas_directive].
|
||||
merge(@@extra_substitutions[yas_directive])
|
||||
#
|
||||
# First look for an uuid-based direct substitution for this
|
||||
# directive.
|
||||
#
|
||||
if direct = merged[uuid]
|
||||
return "# #{yas_directive}: "+ direct + "\n" unless direct.empty?
|
||||
else
|
||||
tm_directive = @@yas_to_tm_directives[yas_directive]
|
||||
val = tm_directive && @snippet[tm_directive]
|
||||
if val and !val.delete(" ").empty? then
|
||||
#
|
||||
# Sort merged substitutions by length (bigger ones first,
|
||||
# regexps last), and apply them to the value gotten for plist.
|
||||
#
|
||||
allsubs = merged.sort_by do |what, with|
|
||||
if what.respond_to? :length then -what.length else 0 end
|
||||
end
|
||||
allsubs.each do |sub|
|
||||
if val.gsub!(sub[0],sub[1])
|
||||
# puts "SUBBED #{sub[0]} for #{sub[1]}"
|
||||
return "# #{yas_directive}: "+ val + "\n" unless val.empty?
|
||||
end
|
||||
end
|
||||
#
|
||||
# If we get here, no substitution matched, so mark this an
|
||||
# unknown substitution.
|
||||
#
|
||||
@@unknown_substitutions[yas_directive][val] = self
|
||||
return "## #{yas_directive}: \""+ val + "\n"
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
end
|
||||
|
||||
|
||||
if __FILE__ == $PROGRAM_NAME
|
||||
# Read the the bundle's info.plist if can find it/guess it
|
||||
#
|
||||
info_plist_file = opts.plist_file || File.join(opts.bundle_dir,"info.plist")
|
||||
info_plist = TmSnippet::read_plist(info_plist_file) if info_plist_file and File.readable? info_plist_file;
|
||||
|
||||
# Calculate the mode name
|
||||
#
|
||||
modename = File.basename opts.output_dir || "major-mode-name"
|
||||
|
||||
# Read in .yas-setup.el looking for the separator between auto-generated
|
||||
#
|
||||
original_dir = Dir.pwd
|
||||
yas_setup_el_file = File.join(original_dir, opts.output_dir, ".yas-setup.el")
|
||||
separator = ";; --**--"
|
||||
whole, head , tail = "", "", ""
|
||||
if File::exists? yas_setup_el_file
|
||||
File.open yas_setup_el_file, 'r' do |file|
|
||||
whole = file.read
|
||||
head , tail = whole.split(separator)
|
||||
end
|
||||
else
|
||||
head = ";; .yas-setup.el for #{modename}\n" + ";; \n"
|
||||
end
|
||||
|
||||
# Now iterate the tail part to find extra substitutions
|
||||
#
|
||||
tail ||= ""
|
||||
head ||= ""
|
||||
directive = nil
|
||||
# puts "get this head #{head}"
|
||||
head.each_line do |line|
|
||||
case line
|
||||
when /^;; Substitutions for:(.*)$/
|
||||
directive = $~[1].strip
|
||||
# puts "found the directove #{directive}"
|
||||
when /^;;(.*)[ ]+=yyas>(.*)$/
|
||||
replacewith = $~[2].strip
|
||||
lookfor = $~[1]
|
||||
lookfor.gsub!(/^[ ]*/, "")
|
||||
lookfor.gsub!(/[ ]*$/, "")
|
||||
# puts "found this wonderful substitution for #{directive} which is #{lookfor} => #{replacewith}"
|
||||
unless !directive or replacewith =~ /yas-unknown/ then
|
||||
TmSnippet.extra_substitutions[directive][lookfor] = replacewith
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
# Glob snippets into snippet_files, going into subdirs
|
||||
#
|
||||
Dir.chdir opts.bundle_dir
|
||||
snippet_files_glob = File.join("**", opts.glob)
|
||||
snippet_files = Dir.glob(snippet_files_glob)
|
||||
|
||||
# Attempt to convert each snippet files in snippet_files
|
||||
#
|
||||
puts "Will try to convert #{snippet_files.length} snippets...\n" unless opts.quiet
|
||||
|
||||
|
||||
# Iterate the globbed files
|
||||
#
|
||||
snippet_files.each do |file|
|
||||
begin
|
||||
$stdout.print "Processing \"#{File.join(opts.bundle_dir,file)}\"..." unless opts.quiet
|
||||
snippet = TmSnippet.new(file,info_plist)
|
||||
|
||||
file_to_create = File.join(original_dir, opts.output_dir, snippet.yas_file)
|
||||
FileUtils.mkdir_p(File.dirname(file_to_create))
|
||||
File.open(file_to_create, 'w') do |f|
|
||||
f.write(snippet.to_yas)
|
||||
end
|
||||
$stdout.print "done\n" unless opts.quiet
|
||||
rescue SkipSnippet => e
|
||||
$stdout.print "skipped! #{e.message}\n" unless opts.quiet
|
||||
rescue RuntimeError => e
|
||||
$stderr.print "failed! #{e.message}\n"
|
||||
$strerr.print "#{e.backtrace.join("\n")}" unless opts.quiet
|
||||
end
|
||||
end
|
||||
|
||||
# Attempt to decypher the menu
|
||||
#
|
||||
menustr = TmSubmenu::main_menu_to_lisp(info_plist, modename) if info_plist
|
||||
puts menustr if $DEBUG
|
||||
|
||||
# Write some basic .yas-* files
|
||||
#
|
||||
if opts.output_dir
|
||||
FileUtils.mkdir_p opts.output_dir
|
||||
FileUtils.touch File.join(original_dir, opts.output_dir, ".yas-make-groups") unless menustr
|
||||
|
||||
# Now, output head + a new tail in (possibly new) .yas-setup.el
|
||||
# file
|
||||
#
|
||||
File.open yas_setup_el_file, 'w' do |file|
|
||||
file.puts head
|
||||
file.puts separator
|
||||
file.puts ";; Automatically generated code, do not edit this part"
|
||||
file.puts ";; "
|
||||
file.puts ";; Translated menu"
|
||||
file.puts ";; "
|
||||
file.puts menustr
|
||||
file.puts
|
||||
file.puts ";; Unknown substitutions"
|
||||
file.puts ";; "
|
||||
["content", "condition", "binding"].each do |type|
|
||||
file.puts ";; Substitutions for: #{type}"
|
||||
file.puts ";; "
|
||||
# TmSnippet::extra_substitutions[type].
|
||||
# each_pair do |k,v|
|
||||
# file.puts ";; " + k + "" + (" " * [1, 90-k.length].max) + " =yyas> " + v
|
||||
# end
|
||||
unknown = TmSnippet::unknown_substitutions[type];
|
||||
unknown.keys.uniq.each do |k|
|
||||
file.puts ";; # as in " + unknown[k].yas_file
|
||||
file.puts ";; " + k + "" + (" " * [1, 90-k.length].max) + " =yyas> (yas-unknown)"
|
||||
file.puts ";; "
|
||||
end
|
||||
file.puts ";; "
|
||||
file.puts
|
||||
end
|
||||
file.puts ";; .yas-setup.el for #{modename} ends here"
|
||||
end
|
||||
end
|
||||
end
|
1
snippets
Submodule
1
snippets
Submodule
@ -0,0 +1 @@
|
||||
Subproject commit 7638321285cf78a9d075fa63d5ada105aa44752e
|
@ -1 +0,0 @@
|
||||
cc-mode
|
@ -1,4 +0,0 @@
|
||||
# name: v.begin(), v.end()
|
||||
# key: beginend
|
||||
# --
|
||||
${1:v}.begin(), $1.end
|
@ -1,9 +0,0 @@
|
||||
# name: class ... { ... }
|
||||
# key: class
|
||||
# --
|
||||
class ${1:Name}
|
||||
{
|
||||
public:
|
||||
${1:$(yas-substr yas-text "[^: ]*")}($2);
|
||||
virtual ~${1:$(yas-substr yas-text "[^: ]*")}();
|
||||
};
|
@ -1,4 +0,0 @@
|
||||
# name: namespace ...
|
||||
# key: ns
|
||||
# --
|
||||
namespace
|
@ -1,4 +0,0 @@
|
||||
# name: template <typename ...>
|
||||
# key: template
|
||||
# --
|
||||
template <typename ${T}>
|
@ -1,5 +0,0 @@
|
||||
# name: using namespace ...
|
||||
# key: using
|
||||
# --
|
||||
using namespace ${std};
|
||||
$0
|
@ -1 +0,0 @@
|
||||
cc-mode
|
@ -1,4 +0,0 @@
|
||||
# name: FILE *fp = fopen(..., ...);
|
||||
# key: fopen
|
||||
# --
|
||||
FILE *${fp} = fopen(${"file"}, "${r}");
|
@ -1,7 +0,0 @@
|
||||
# -*- mode: snippet -*-
|
||||
# name: printf
|
||||
# contributor: joaotavora
|
||||
# key: printf
|
||||
# --
|
||||
printf ("${1:%s}\\n"${1:$(if (string-match "%" yas-text) "," "\);")
|
||||
}$2${1:$(if (string-match "%" yas-text) "\);" "")}
|
@ -1 +0,0 @@
|
||||
text-mode
|
@ -1,7 +0,0 @@
|
||||
# name: do { ... } while (...)
|
||||
# key: do
|
||||
# --
|
||||
do
|
||||
{
|
||||
$0
|
||||
} while (${1:condition});
|
@ -1,7 +0,0 @@
|
||||
# name: for (...; ...; ...) { ... }
|
||||
# key: for
|
||||
# --
|
||||
for (${1:int i = 0}; ${2:i < N}; ${3:++i})
|
||||
{
|
||||
$0
|
||||
}
|
@ -1,7 +0,0 @@
|
||||
# name: if (...) { ... }
|
||||
# key: if
|
||||
# --
|
||||
if (${1:condition})
|
||||
{
|
||||
$0
|
||||
}
|
@ -1,4 +0,0 @@
|
||||
# name: #include "..."
|
||||
# key: inc
|
||||
# --
|
||||
#include "$1"
|
@ -1,4 +0,0 @@
|
||||
# name: #include <...>
|
||||
# key: inc
|
||||
# --
|
||||
#include <$1>
|
@ -1,8 +0,0 @@
|
||||
# name: int main(argc, argv) { ... }
|
||||
# key: main
|
||||
# --
|
||||
int main(int argc, char *argv[])
|
||||
{
|
||||
$0
|
||||
return 0;
|
||||
}
|
@ -1,9 +0,0 @@
|
||||
# name: #ifndef XXX; #define XXX; #endif
|
||||
# key: once
|
||||
# --
|
||||
#ifndef ${1:_`(upcase (file-name-nondirectory (file-name-sans-extension (buffer-file-name))))`_H_}
|
||||
#define $1
|
||||
|
||||
$0
|
||||
|
||||
#endif /* $1 */
|
@ -1,7 +0,0 @@
|
||||
# name: struct ... { ... }
|
||||
# key: struct
|
||||
# --
|
||||
struct ${1:name}
|
||||
{
|
||||
$0
|
||||
};
|
@ -1 +0,0 @@
|
||||
perl-mode
|
@ -1 +0,0 @@
|
||||
cc-mode
|
@ -1,8 +0,0 @@
|
||||
# contributor: Alejandro Espinoza Esparza <aespinoza@structum.com.mx>
|
||||
# name: private attribute ....;
|
||||
# key: attrib
|
||||
# --
|
||||
/// <summary>
|
||||
/// $3
|
||||
/// </summary>
|
||||
private $1 $2;
|
@ -1,22 +0,0 @@
|
||||
# contributor: Alejandro Espinoza Esparza <aespinoza@structum.com.mx>
|
||||
# name: private attribute ....; public property ... ... { ... }
|
||||
# key: attrib
|
||||
# --
|
||||
/// <summary>
|
||||
/// $3
|
||||
/// </summary>
|
||||
private $1 $2;
|
||||
|
||||
/// <summary>
|
||||
/// $4
|
||||
/// </summary>
|
||||
/// <value>$5</value>
|
||||
public $1 $2
|
||||
{
|
||||
get {
|
||||
return this.$2;
|
||||
}
|
||||
set {
|
||||
this.$2 = value;
|
||||
}
|
||||
}
|
@ -1,22 +0,0 @@
|
||||
# contributor: Alejandro Espinoza Esparza <aespinoza@structum.com.mx>
|
||||
# name: private _attribute ....; public Property ... ... { ... }
|
||||
# key: attrib
|
||||
# --
|
||||
/// <summary>
|
||||
/// $3
|
||||
/// </summary>
|
||||
private $1 ${2:$(if (> (length yas-text) 0) (format "_%s%s" (downcase (substring yas-text 0 1)) (substring yas-text 1 (length yas-text))) "")};
|
||||
|
||||
/// <summary>
|
||||
/// ${3:Description}
|
||||
/// </summary>
|
||||
/// <value><c>$1</c></value>
|
||||
public ${1:Type} ${2:Name}
|
||||
{
|
||||
get {
|
||||
return this.${2:$(if (> (length yas-text) 0) (format "_%s%s" (downcase (substring yas-text 0 1)) (substring yas-text 1 (length yas-text))) "")};
|
||||
}
|
||||
set {
|
||||
this.${2:$(if (> (length yas-text) 0) (format "_%s%s" (downcase (substring yas-text 0 1)) (substring yas-text 1 (length yas-text))) "")} = value;
|
||||
}
|
||||
}
|
@ -1,22 +0,0 @@
|
||||
# contributor: Alejandro Espinoza Esparza <aespinoza@structum.com.mx>
|
||||
# name: class ... { ... }
|
||||
# key: class
|
||||
# --
|
||||
${5:public} class ${1:Name}
|
||||
{
|
||||
#region Ctor & Destructor
|
||||
/// <summary>
|
||||
/// ${3:Standard Constructor}
|
||||
/// </summary>
|
||||
public $1($2)
|
||||
{
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// ${4:Default Destructor}
|
||||
/// </summary>
|
||||
public ~$1()
|
||||
{
|
||||
}
|
||||
#endregion
|
||||
}
|
@ -1,7 +0,0 @@
|
||||
# contributor: Alejandro Espinoza Esparza <aespinoza@structum.com.mx>
|
||||
# name: /// <summary> ... </summary>
|
||||
# key: comment
|
||||
# --
|
||||
/// <summary>
|
||||
/// $1
|
||||
/// </summary>
|
@ -1,5 +0,0 @@
|
||||
# contributor: Alejandro Espinoza Esparza <aespinoza@structum.com.mx>
|
||||
# name: /// <param name="..."> ... </param>
|
||||
# key: comment
|
||||
# --
|
||||
/// <param name="$1">$2</param>
|
@ -1,5 +0,0 @@
|
||||
# contributor: Alejandro Espinoza Esparza <aespinoza@structum.com.mx>
|
||||
# name: /// <param name="..."> ... </param>
|
||||
# key: comment
|
||||
# --
|
||||
/// <returns>$1</returns>
|
@ -1,5 +0,0 @@
|
||||
# contributor: Alejandro Espinoza Esparza <aespinoza@structum.com.mx>
|
||||
# name: /// <exception cref="..."> ... </exception>
|
||||
# key: comment
|
||||
# --
|
||||
/// <exception cref="$1">$2</exception>
|
@ -1,11 +0,0 @@
|
||||
# contributor: Alejandro Espinoza Esparza <aespinoza@structum.com.mx>
|
||||
# name: public void Method { ... }
|
||||
# key: method
|
||||
# --
|
||||
/// <summary>
|
||||
/// ${5:Description}
|
||||
/// </summary>${2:$(if (string= (upcase yas-text) "VOID") "" (format "%s%s%s" "\n/// <returns><c>" yas-text "</c></returns>"))}
|
||||
${1:public} ${2:void} ${3:MethodName}($4)
|
||||
{
|
||||
$0
|
||||
}
|
@ -1,8 +0,0 @@
|
||||
# contributor: Alejandro Espinoza Esparza <aespinoza@structum.com.mx>
|
||||
# name: namespace .. { ... }
|
||||
# key: namespace
|
||||
# --
|
||||
namespace $1
|
||||
{
|
||||
$0
|
||||
}
|
@ -1,17 +0,0 @@
|
||||
# contributor: Alejandro Espinoza Esparza <aespinoza@structum.com.mx>
|
||||
# name: property ... ... { ... }
|
||||
# key: prop
|
||||
# --
|
||||
/// <summary>
|
||||
/// $5
|
||||
/// </summary>
|
||||
/// <value>$6</value>
|
||||
$1 $2 $3
|
||||
{
|
||||
get {
|
||||
return this.$4;
|
||||
}
|
||||
set {
|
||||
this.$4 = value;
|
||||
}
|
||||
}
|
@ -1,7 +0,0 @@
|
||||
# contributor: Alejandro Espinoza Esparza <aespinoza@structum.com.mx>
|
||||
# name: #region ... #endregion
|
||||
# key: region
|
||||
# --
|
||||
#region $1
|
||||
$0
|
||||
#endregion
|
@ -1,5 +0,0 @@
|
||||
# contributor: Alejandro Espinoza Esparza <aespinoza@structum.com.mx>
|
||||
# name: using ...;
|
||||
# key: using
|
||||
# --
|
||||
using $1;
|
@ -1,5 +0,0 @@
|
||||
# contributor: Alejandro Espinoza Esparza <aespinoza@structum.com.mx>
|
||||
# name: using System;
|
||||
# key: using
|
||||
# --
|
||||
using System;
|
@ -1,5 +0,0 @@
|
||||
# contributor: Alejandro Espinoza Esparza <aespinoza@structum.com.mx>
|
||||
# name: using System....;
|
||||
# key: using
|
||||
# --
|
||||
using System.$1;
|
@ -1 +0,0 @@
|
||||
text-mode
|
@ -1,4 +0,0 @@
|
||||
# name: background-color: ...
|
||||
# key: bg
|
||||
# --
|
||||
background-color: #${1:DDD};
|
@ -1,4 +0,0 @@
|
||||
# name: background-image: ...
|
||||
# key: bg
|
||||
# --
|
||||
background-image: url($1);
|
@ -1,4 +0,0 @@
|
||||
# name: border size style color
|
||||
# key: bor
|
||||
# --
|
||||
border: ${1:1px} ${2:solid} #${3:999};
|
@ -1,5 +0,0 @@
|
||||
# contributor: rejeep <johan.rejeep@gmail.com>
|
||||
# name: clear: ...
|
||||
# key: cl
|
||||
# --
|
||||
clear: $1;
|
@ -1,5 +0,0 @@
|
||||
# contributor: rejeep <johan.rejeep@gmail.com>
|
||||
# name: display: block
|
||||
# key: disp
|
||||
# --
|
||||
display: block;
|
@ -1,5 +0,0 @@
|
||||
# contributor: rejeep <johan.rejeep@gmail.com>
|
||||
# name: display: inline
|
||||
# key: disp
|
||||
# --
|
||||
display: inline;
|
@ -1,5 +0,0 @@
|
||||
# contributor: rejeep <johan.rejeep@gmail.com>
|
||||
# name: display: none
|
||||
# key: disp
|
||||
# --
|
||||
display: none;
|
@ -1,5 +0,0 @@
|
||||
# contributor: rejeep <johan.rejeep@gmail.com>
|
||||
# name: font-family: ...
|
||||
# key: ff
|
||||
# --
|
||||
font-family: $1;
|
@ -1,5 +0,0 @@
|
||||
# contributor: rejeep <johan.rejeep@gmail.com>
|
||||
# name: font-size: ...
|
||||
# key: fs
|
||||
# --
|
||||
font-size: ${12px};
|
@ -1,5 +0,0 @@
|
||||
# contributor: rejeep <johan.rejeep@gmail.com>
|
||||
# name: margin-bottom: ...
|
||||
# key: mar
|
||||
# --
|
||||
margin-bottom: $1;
|
@ -1,5 +0,0 @@
|
||||
# contributor: rejeep <johan.rejeep@gmail.com>
|
||||
# name: margin-left: ...
|
||||
# key: mar
|
||||
# --
|
||||
margin-left: $1;
|
@ -1,5 +0,0 @@
|
||||
# contributor: rejeep <johan.rejeep@gmail.com>
|
||||
# name: margin: ...
|
||||
# key: mar
|
||||
# --
|
||||
margin: $1;
|
@ -1,5 +0,0 @@
|
||||
# contributor: rejeep <johan.rejeep@gmail.com>
|
||||
# name: margin top right bottom left
|
||||
# key: mar
|
||||
# --
|
||||
margin: ${top} ${right} ${bottom} ${left};
|
@ -1,5 +0,0 @@
|
||||
# contributor: rejeep <johan.rejeep@gmail.com>
|
||||
# name: margin-right: ...
|
||||
# key: mar
|
||||
# --
|
||||
margin-right: $1;
|
@ -1,5 +0,0 @@
|
||||
# contributor: rejeep <johan.rejeep@gmail.com>
|
||||
# name: margin-top: ...
|
||||
# key: mar
|
||||
# --
|
||||
margin-top: $1;
|
@ -1,5 +0,0 @@
|
||||
# contributor: rejeep <johan.rejeep@gmail.com>
|
||||
# name: padding-bottom: ...
|
||||
# key: pad
|
||||
# --
|
||||
padding-bottom: $1;
|
@ -1,5 +0,0 @@
|
||||
# contributor: rejeep <johan.rejeep@gmail.com>
|
||||
# name: padding-left: ...
|
||||
# key: pad
|
||||
# --
|
||||
padding-left: $1;
|
@ -1,5 +0,0 @@
|
||||
# contributor: rejeep <johan.rejeep@gmail.com>
|
||||
# name: padding: ...
|
||||
# key: pad
|
||||
# --
|
||||
padding: $1;
|
@ -1,5 +0,0 @@
|
||||
# contributor: rejeep <johan.rejeep@gmail.com>
|
||||
# name: padding: top right bottom left
|
||||
# key: pad
|
||||
# --
|
||||
padding: ${top} ${right} ${bottom} ${left};
|
@ -1,5 +0,0 @@
|
||||
# contributor: rejeep <johan.rejeep@gmail.com>
|
||||
# name: padding-right: ...
|
||||
# key: pad
|
||||
# --
|
||||
padding-right: $1;
|
@ -1,5 +0,0 @@
|
||||
# contributor: rejeep <johan.rejeep@gmail.com>
|
||||
# name: padding-top: ...
|
||||
# key: pad
|
||||
# --
|
||||
padding-top: $1;
|
@ -1,7 +0,0 @@
|
||||
-*- coding: utf-8 -*-
|
||||
Originally started by Xah Lee (xahlee.org) on 2009-02-22
|
||||
Released under GPL 3.
|
||||
|
||||
Feel free to add missing ones or modify existing ones to improve.
|
||||
|
||||
Those starting with “x-” are supposed to be idiom templates. Not sure it's very useful. They might start with “i-” or "id-" in the future.
|
@ -1 +0,0 @@
|
||||
text-mode
|
@ -1,6 +0,0 @@
|
||||
# contributor: Xah Lee (XahLee.org)
|
||||
# name: add-hook
|
||||
# key: add-hook
|
||||
# key: ah
|
||||
# --
|
||||
(add-hook HOOK$0 FUNCTION)
|
@ -1,6 +0,0 @@
|
||||
# contributor: Xah Lee (XahLee.org)
|
||||
# name: and
|
||||
# key: and
|
||||
# key: a
|
||||
# --
|
||||
(and $0)
|
@ -1,5 +0,0 @@
|
||||
# contributor: Xah Lee (XahLee.org)
|
||||
# name: append
|
||||
# key: append
|
||||
# --
|
||||
(append $0 )
|
@ -1,5 +0,0 @@
|
||||
# contributor: Xah Lee (XahLee.org)
|
||||
# name: apply
|
||||
# key: apply
|
||||
# --
|
||||
(apply $0 )
|
@ -1,5 +0,0 @@
|
||||
# contributor: Xah Lee (XahLee.org)
|
||||
# name: aref
|
||||
# key: aref
|
||||
# --
|
||||
(aref ARRAY$0 INDEX)
|
@ -1,5 +0,0 @@
|
||||
# contributor: Xah Lee (XahLee.org)
|
||||
# name: aset
|
||||
# key: aset
|
||||
# --
|
||||
(aset ARRAY$0 IDX NEWELT)
|
@ -1,5 +0,0 @@
|
||||
# contributor: Xah Lee (XahLee.org)
|
||||
# name: assq
|
||||
# key: assq
|
||||
# --
|
||||
(assq KEY$0 LIST)
|
@ -1,5 +0,0 @@
|
||||
# contributor: Xah Lee (XahLee.org)
|
||||
# name: autoload
|
||||
# key: autoload
|
||||
# --
|
||||
(autoload 'FUNCNAME$0 "FILENAME" &optional "DOCSTRING" INTERACTIVE TYPE)
|
@ -1,6 +0,0 @@
|
||||
# contributor: Xah Lee (XahLee.org)
|
||||
# name: backward-char
|
||||
# key: backward-char
|
||||
# key: bc
|
||||
# --
|
||||
(backward-char $0)
|
@ -1,6 +0,0 @@
|
||||
# contributor: Xah Lee (XahLee.org)
|
||||
# name: beginning-of-line
|
||||
# key: beginning-of-line
|
||||
# key: bol
|
||||
# --
|
||||
(beginning-of-line)
|
@ -1,6 +0,0 @@
|
||||
# contributor: Xah Lee (XahLee.org)
|
||||
# name: bounds-of-thing-at-point
|
||||
# key: bounds-of-thing-at-point
|
||||
# key: botap
|
||||
# --
|
||||
(bounds-of-thing-at-point '$0) ; symbol, list, sexp, defun, filename, url, email, word, sentence, whitespace, line, page ...
|
@ -1,6 +0,0 @@
|
||||
# contributor: Xah Lee (XahLee.org)
|
||||
# name: buffer-file-name
|
||||
# key: buffer-file-name
|
||||
# key: bfn
|
||||
# --
|
||||
(buffer-file-name)
|
@ -1,6 +0,0 @@
|
||||
# contributor: Xah Lee (XahLee.org)
|
||||
# name: buffer-modified-p
|
||||
# key: buffer-modified-p
|
||||
# key: bmp
|
||||
# --
|
||||
(buffer-modified-p $0)
|
@ -1,6 +0,0 @@
|
||||
# contributor: Xah Lee (XahLee.org)
|
||||
# name: buffer-substring-no-properties
|
||||
# key: buffer-substring-no-properties
|
||||
# key: bsnp
|
||||
# --
|
||||
(buffer-substring-no-properties START$0 END)
|
@ -1,6 +0,0 @@
|
||||
# contributor: Xah Lee (XahLee.org)
|
||||
# name: buffer-substring
|
||||
# key: buffer-substring
|
||||
# key: bs
|
||||
# --
|
||||
(buffer-substring START$0 END)
|
@ -1,5 +0,0 @@
|
||||
# contributor: Xah Lee (XahLee.org)
|
||||
# name: car
|
||||
# key: car
|
||||
# --
|
||||
(car $0)
|
@ -1,5 +0,0 @@
|
||||
# contributor: Xah Lee (XahLee.org)
|
||||
# name: cdr
|
||||
# key: cdr
|
||||
# --
|
||||
(cdr $0)
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
x
Reference in New Issue
Block a user